old_contrib// 775 0 0 0 11411737717 116165ustar00pietrosysold_contrib//12 775 0 0 2115 11411736467 11766ustar00pietrosys#!/bin/rc # 12: print time in 12 hour form # by pietro gagliardi - 28-29 nov 2007 # thanks to erik quanstrom for tips on making it better and faster # updated 15 dec 2007 to use getflags(8) and some cosmetic/bug fixes rfork e # process arguments flagfmt='g,u,n,h' args='[time]' if (! ifs=() eval `{ aux/getflags $* }) { aux/usage echo '-g puts time back into date' >[1=2] echo '-u and time are passed to date' >[1=2] echo '-n option of date cannot be used' >[1=2] echo '-h shows help and quits' >[1=2] exit usage } if (! ~ $#flagh 0) { aux/usage >[2=1] echo '-g puts time back into date' echo '-u and time are passed to date' echo '-n option of date cannot be used' echo '-h shows help and quits' exit } if (! ~ $#flagn 0) { echo '-n option of date cannot be used with '$0 >[1=2] exit usage } # convert time nd=`{ date $flagu $* | awk '{ print $4 }' } cd=`{ echo $nd | awk -F: ' BEGIN { OFS=":" } $1 <= 12 { printf "%s AM", $0 } $1 > 12 { $1 -= 12; printf "%s PM", $0 } ' } cd=$"cd # show time if (~ $#flagg 1) date $flagu $* | awk '{ $4=ENVIRON["cd"]; print }' if not echo $cd old_contrib//3d.bundle 664 0 0 14373 11411736451 13341ustar00pietrosys# To unbundle, run this file echo 3d.c sed 's/.//' >3d.c <<'//GO.SYSIN DD 3d.c' -/* 3d drawing library */ -#include -#include -#include -#include -#include "3d.h" - -static double focaldist = 200; -static double rx = 0, ry = 0, rz = 0; - -/* Pt3: make a 3D point */ -Point3 Pt3(double x, double y, double z) -{ - Point3 t; - - t.x = x; - t.y = y; - t.z = z; - t.w = 1; - return t; -} - -void setfocaldist(double x) -{ - focaldist = 200; -} - -/* setrot: set rotation of next object */ -void setrot(double x, double y, double z) -{ - rx += (x * 45); - ry += (y * 45); - rz += (z * 45); -} - -/* Pt3toPt: convert 3D point to 2D point */ -Point Pt3toPt(Point3 p) -{ - double scrnwid, scrnht; - double xf, yf, zf; - Point res; - - scrnwid = (double) (screen->r.max.x - screen->r.min.x); - scrnht = (double) (screen->r.max.y - screen->r.min.y); - xf = p.x; - yf = p.y; - zf = p.z; - /* convert from 3D coordinates to aligned 3D coordinates */ - yf = yf * cos(rx) + zf * sin(rx); - zf = -yf * sin(rx) + zf * cos(rx); - xf = xf * cos(ry) - (zf * sin(ry)); - zf = (xf * sin(ry)) + zf * cos(ry); - xf = xf * cos(rz) - yf * sin(rz); - yf = (xf * sin(rz)) + yf * cos(rz); - zf += 600; - /* convert from 3D aligned to 2D */ - if (!zf) { - res.x = (int) (xf * focaldist + scrnwid / 2); - res.y = (int) (yf * focaldist + scrnwid / 2); - } else { - res.x = (int) (xf * (focaldist / zf) + (scrnwid / 2)); - res.y = (int) (yf * (focaldist / zf) + (scrnwid / 2)); - } - return res; -} - -/* line3: make 3D line */ -void line3(Image *dest, Point3 a, Point3 b, Image *src, Point src_pt) -{ - line(dest, Pt3toPt(a), Pt3toPt(b), Endsquare, Endsquare, 1, src, src_pt); -} - -/* box3: make 3D box */ -void box3(Image *dest, Point3 ul, Point3 br, double depth, Image *src, Point src_pt) -{ - Point3 q, r, s, t, u, v; - - if (ul.z != br.z) /* the z-coords must be equal - use rotation to rotate */ - display->error(display, "z-coordinates not equal"); - s = Pt3(br.x, ul.y, ul.z); - t = Pt3(ul.x, br.y, ul.z); - line3(dest, ul, s, src, src_pt); - line3(dest, s, br, src, src_pt); - line3(dest, br, t, src, src_pt); - line3(dest, t, ul, src, src_pt); - q = ul; - r = br; - u = s; - v = t; - q.x += depth; - q.y += depth; - q.z += depth; - r.x += depth; - r.y += depth; - r.z += depth; - u.x += depth; - u.y += depth; - u.z += depth; - v.x += depth; - v.y += depth; - v.z += depth; - line3(dest, q, u, src, src_pt); - line3(dest, u, r, src, src_pt); - line3(dest, r, v, src, src_pt); - line3(dest, v, q, src, src_pt); - line3(dest, ul, q, src, src_pt); - line3(dest, s, u, src, src_pt); - line3(dest, t, v, src, src_pt); - line3(dest, br, r, src, src_pt); -} //GO.SYSIN DD 3d.c echo 3d.h sed 's/.//' >3d.h <<'//GO.SYSIN DD 3d.h' -/* header for 3D drawing - pietro gagliardi - 23 nov 2007 to ? */ - -/* I assume the following are included: u.h libc.h draw.h geometry.h */ - -Point3 Pt3(double, double, double); -Point Pt3toPt(Point3); - -void line3(Image *, Point3, Point3, Image *, Point); -void box3(Image *, Point3, Point3, double, Image *, Point); //GO.SYSIN DD 3d.h echo 3dboxtest.c sed 's/.//' >3dboxtest.c <<'//GO.SYSIN DD 3dboxtest.c' -#include -#include -#include -#include -#include -#include -#include -#include "3d.h" - -int mainstacksize = 4096; - -void draw_all(void) -{ - Point3 a = Pt3(5, 5, 5); - Point3 b = Pt3(250, 5, 5); - Point3 c = Pt3(250, 250, 5); - Point3 d = Pt3(5, 250, 5); - - box3(screen, a, c, 50, display->black, Pt(0, 0)); - flushimage(display, 1); -} - -void mousethread(void *unused) -{ - for (;;) - if (ecanmouse()) - emouse(); -} - -void eresized(int new) -{ - if (getwindow(display, Refnone) < 0) - sysfatal("resize failed: %r"); - draw_all(); -} - -void threadmain(int argc, char *argv[]) -{ - Event ev; - - if (initdraw(0, 0, "3d test") < 0) - sysfatal("could not initialize graphics: %r"); - einit(Emouse | Ekeyboard); - threadcreate(mousethread, 0, 4096); - draw_all(); - for (;;) - if (event(&ev) == Ekeyboard) - if (ev.kbdc == 'q') - threadexitsall(0); -} //GO.SYSIN DD 3dboxtest.c echo 3dlinetest.c sed 's/.//' >3dlinetest.c <<'//GO.SYSIN DD 3dlinetest.c' -#include -#include -#include -#include -#include -#include -#include -#include "3d.h" - -int mainstacksize = 4096; - -void draw_all(void) -{ - Point3 a = Pt3(5, 5, 5); - Point3 b = Pt3(250, 5, 5); - Point3 c = Pt3(250, 250, 5); - Point3 d = Pt3(5, 250, 5); - Point3 e = a; - Point3 f = b; - Point3 g = c; - Point3 h = d; - - e.x += 50; - f.x += 50; - g.x += 50; - h.x += 50; - e.y += 50; - f.y += 50; - g.y += 50; - h.y += 50; - e.z += 50; - f.z += 50; - g.z += 50; - h.z += 50; - line3(screen, a, b, display->black, Pt(0, 0)); /* face 1 */ - line3(screen, b, c, display->black, Pt(0, 0)); - line3(screen, c, d, display->black, Pt(0, 0)); - line3(screen, d, a, display->black, Pt(0, 0)); - line3(screen, e, f, display->black, Pt(0, 0)); /* face 2 */ - line3(screen, f, g, display->black, Pt(0, 0)); - line3(screen, g, h, display->black, Pt(0, 0)); - line3(screen, h, e, display->black, Pt(0, 0)); - line3(screen, a, e, display->black, Pt(0, 0)); /* connectors */ - line3(screen, b, f, display->black, Pt(0, 0)); - line3(screen, c, g, display->black, Pt(0, 0)); - line3(screen, d, h, display->black, Pt(0, 0)); - flushimage(display, 1); -} - -void mousethread(void *unused) -{ - for (;;) - if (ecanmouse()) - emouse(); -} - -void eresized(int new) -{ - if (getwindow(display, Refnone) < 0) - sysfatal("resize failed: %r"); - draw_all(); -} - -void threadmain(int argc, char *argv[]) -{ - Event ev; - - if (initdraw(0, 0, "3d test") < 0) - sysfatal("could not initialize graphics: %r"); - einit(Emouse | Ekeyboard); - threadcreate(mousethread, 0, 4096); - draw_all(); - for (;;) - if (event(&ev) == Ekeyboard) - if (ev.kbdc == 'q') - threadexitsall(0); -} //GO.SYSIN DD 3dlinetest.c echo mkfile sed 's/.//' >mkfile <<'//GO.SYSIN DD mkfile' -# this file is 80386 centric! please modify to fit needs. - -lib: 3d.c - 8c 3d.c - -boxtest: lib 3dboxtest.c - 8c 3dboxtest.c - 8l -o 3dboxtest 3d.8 3dboxtest.8 - -linetest: lib 3dlinetest.c - 8c 3dlinetest.c - 8l -o 3dlinetest 3d.8 3dlinetest.8 - -clean:V: - rm -f *.8 - -cleanbin:V: - rm -f *.8 3dlinetest 3dboxtest - -bundle:VQ: - bundle *.[ch] mkfile //GO.SYSIN DD mkfile old_contrib//INDEX 664 0 0 3071 11411736511 12400ustar00pietrosys3d.bundle: 3d library - incomplete, but works. So far, only draws lines and boxes. Includes test programs and mkfile. 12: shell script to show time in 12-hour format. -h shows options. Thanks to erik quanstrom for suggestions. - updated 15 dec 2007 art.tgz: some modifications to /n/sources/extra/art; see README.pietro bentley.bundle: Bentley language - a programming language closeall: rc script to close all windows colors.bundle: colors library - gives you easier access to colors - includes man page eqn2png: convert eqn input into a PNG file; based on Eric Raymond's eqn2graph htmlfmt.tgz: updated htmlfmt, with basic table support infernovol1.pdf: Volume 1 of the Inferno Fourth Edition manual, in PDF; made with the set used to make the Plan 9 vol1, so it may not be like the books infernovol1.ps: Volume 1 of the Inferno Fourth Edition manual, in PostScript; made with the set used to make the Plan 9 vol1, so it may not be like the books limbo.tgz: the Limbo compiler, compiled exclusively for Plan 9 mv.pdf: original Bell Labs document describing the mv macro set, thanks to Rick Richardson (rick.richardson@comcast.net) pico9.tgz: rewrite of Bell Labs' pico image manipulation program to Plan 9 shape.c: replacement for X11's /sys/src/X11/programs/Xserver/Xext/shape.c; fixes a small syntax error sieve.c: Doug McIllroy's (slow) Newsqueak Sieve of Erastosthenes, in C transpose.c: rewrite of fb/transpose from Tom Duff's First Edition toolkit vol2.pdf: Volume 2 of the manual, collected from /sys/doc, in PDF vol2.ps: Volume 2 of the manual, collected from /sys/doc, in PostScript '-g puts time back into date' echo '-u and time are passed to date' echo '-n option of date cannot be used' echo '-h shows help and quits' exit } if (! ~ $#flagn 0) { echo '-n option of date cannot be used with '$0 >[1=2] exit usage } # convert time nd=`{ date $flagu $* | awk '{ print $4 }' } cd=`{ echo $nd | awk -F: ' BEGIN { OFS=":" } $1 <= 12 { printf "%s AM", $0 } $1 > 12 { $1 -= 12; printf "%s PM", $0 } ' } cd=$"cd # show time if (~ $#fold_contrib//README 664 0 0 1333 11411736516 12472ustar00pietrosysIn this directory you can find all my Plan 9 related stuffs and some stuff of interest. Note that as I complete a project, I make it available on fgb's contrib system, including fully built binaries for the 386 architecture. You can install it with the command /n/sources/contrib/fgb/root/rc/bin/contrib/install fgb/contrib and then see what I have available with contrib/list pietro For example, to install my 12 program with contrib, you can say conrib/install pietro/12 Things to do: - put colors on contrib (but first, figure out how) - add rest of manual to limbo - update limbo(1) if necessary (asm output, for example) - probably remove 12 from contrib - it is just one file - sam(1) tutorial in vol2 Pietro Gagliardi caldist = 200; -static double rx = 0, ry = 0, rz = 0; - -/* Pt3: make a 3D point */ -Point3 Pt3(double x, double y, double z) -{ - Point3 t; - - t.x = x; - t.y = y; - t.z = z; - t.w = 1; - return t; -} - -void setfocaldist(double x) -{ - focaldist = 200; -} - -/* setrot: set rotation of nexold_contrib//art.tgz 664 0 0 347121 11411736545 13200ustar00pietrosysgǪHx`@eZ(%)$HD$#B"R$$h0KR%ʱE1wYGkM?'{f{KmZm/|V}jsw\{of"e;cb}M Qu10oĶSW#\"@SP$,MV"cM_Fps-m-__9?t3(ZX0!Z P(s{QEz&^ hl๪fyD$6L?>u%ۅisr\O@b*ǴJ`"+)מP 6`dC'TUͪ$9vAk@3ڧY7ՙ024$DnW-vӦnS;߇[ϗ-GVM)bW~l Q?ko$-UeuKU5D<\ :h{t b1+4Hs @5yzc?en/Xqkm612tźc3K6"ٌu3nU#S$ rjb {)MCs<6E!p_s4*uAHߡ4Wצ/˔fx(hJ(yD#R5 t0i4N K6c1WzSRu$y&u(KmA6РLp@UFMMM\"b7()0..yN҅Ȥ"TJ?T.EE\joW%jV8NnDU Mq&TTo c^MHz."SAqRPK- ͇;/ \?&(?$D%C$.t}ӑi@@\ 4!FJ[i_h?rl<VeF%ZQBU `VV^~EB}~BBl4+b' 1pb$J ZnɅW!Wv5rA'T},65"z;{}il&If)FCֆ&,~SZuU6uPCb²%J]Oq Y&I:E,SZ/pywqxچś0JEh@$:<:б^JGl-EX2y L\o2% "3Ie&*ܞЀzypjIh9W4+\/le :o'(mjBY(P?ȅu”.+/oUO#w%q| $g%)4XVĝCV. y݈7) RWT֡y hk c2) II*dlyD,er; hQDW3MFcx`,&4RKM6ڸɖvM476 O* ŃD'?b5o~APԨR iÓf9!lbsS {RЁF藷--͔N%rRޭ'/5 崄9))FM4lJ5DFR$`>nJ%qTj 8)ORe H$L%fzg]G<| EjNl$ecU{;33xm]Q51:ND|jHIJ׬Z RtJTS6: =_Lpb\? D?Z֐A3U bx:r(v"?z:C'6r]>.<׭si"mJ/#%T*N.ҥRf9^*+ ZR.h_WB S Ob#E ֣Es Zh8VcZ>~yfEVGT6m>:ڢb-tӓ9 Tn~An9(7[4#C igTm>V+IZmVzj)4IRJ2dXMjhjZ UQq}@izDX攤SK?Z1$6(±%  aehNq6uliu{A}UF, 3%fcђ*v SgXvVUgWU6 *JL5Ie54i1b"I@6D`.I͉ j^ ?֠%;٘zX9k:㔘VIQ%d{9hS * ^6son1c8JTT*&z: ai:I-D-U>nad\=3>%V|T!Ɇ Љ1٬a'ijM+QPY(HX"(S-GF+ܢRxY~2YQXU4/L9PJ n_?3\t6F;l;|lG]Ebj6H,Ac+6F,IeG`zR'Sh 5DMץH)VM**9Fp1[=hk1c/&dO*e=ڇ]5P+ dʺ>Mx'SDCzUն*/+z4 1_ZhD1ذ QLL^8:FG(\#.{Zs"0NC;Pn\(6IpIhq9m J55 D&E ^ۀ+MTM IstV5.ldPs9nMGIH )Wdg+銎%^ Xe_atf>kOZZjOGWfsY]\*n !6l4իielXHE<]E&S)'iƎ܂p&e˵k&Zb9WiL P4iUl5CE_~9˴AcDYje$I|y!/;/!_f_ A?հD;`"4HڨI%VV}><Ӧ6BA|whl1qZ ZJZPLQ~xdȗVm\Yݤ-n*U%<$ۦ_i˓j}lׯC&=>փ`Ah™ঠ d@*neؒUV  +xuZ Q@=qAdQlpjd^kP2dK6e[#5E]"jX8F^,[ 7̼J?~PYy GGb |,[*Da%ӬN&QRVY˳PtM+sJqlT>J[MeFmOd }eM~QFeKjxB$7e%$R҈xumXM)sب̛Td$NPOӴpԾrx/(!G{1URRJMua6PA4|)~+s#yM]+J+`1FJ݆dFY/mJjl֯ͯwVU5wUMv+m}+R]׾N^F'eoVe] Xl&.ߴ>Mr+W&r/doiq8Z5? v?7t`~GN5ѠY ӍejNGF_!~y%R_ט_ ȅU-MYkYaX 敕Uc'5(]=0^+FcѨ߉l@je^TW1J\$ڏǒ1s $trh`"XV@c6Le.Kf6]%1äʾH0JJd{&&tEX#oukZOY蘶4Qp, V:Ht ᱱr\P}8T>v2ɤ:بIaW%88@-)HFE )gJiYUb4p J(KenRE2\*Jpt,6e&ViyT~n*,dQ]WʑGb@X,$XR=kL8b1Q6xe%g7<1UHEǑXwHX\ITcWgUk񗲃V: Cg*{ѤQpWu|h̄91VЪR@s=em<1 kTYB) Fʚ҈z,Dɦ;1PqVӸDm`ɴ౏i?EYz΂r0Tq2 r,ycB=hl )Î%[>Ut-5CJ& UqA97*;JM*q+LvLŢ"J^\iBE5CɕbgPyYg/_z;7쌏N@?pV6rvAh%CTT +rX[bSEhPɘ^B^5Pij́h@ǕvRD!"=^5AS`c"w ^:4Vr&[TΕGc` jK3rbARґ&aЊqtt@@Yԩ`J+TEٚ5+(\ʵ'Pǂ!̑M-֗[-/_KwNk%5&R[V[kKͺN linVOayM''k|o)ճ\DBhyntRPb *䒺"j]RR#Z%jcYR07΁NWj!1 1yLX11YtGUUCS!uQ! IT QaǦ&k9"U-vE9d88:-p_D9(mBe8MӔNi"NYbŝY]:,E; M/B$KbQuurB$dw4V[QP: Pr5Sè)"5hs\bYPk:xM\/=zp.H^LfdDq шpI.^^.ӳmcfMN\bqd:Ռ""D L txL $FCyӏ+Yr,p2Q&U aẀFE m,J)lRxpc9xRRC5\Z/QviNn7ף¡Q!)5(OuC&8l ZTdc** # 0 i"Hn~Th/ *sīKT\Ԋ]/j,J[MJ4%;M\ d: ӗ_kW$hoPh$u3# jZgn$6)sN%Wj=ʳ%uTK&@FN?LLŜ\pS@lx,Hrsw)׶%GڥaE:_wӢB|_jĨFrf*)-(,FH>bXUtPvKɰLbe9} zZ7ǃ'wѭ۸V!NimhrQYGYy[Xz`UQ 3Qmf]^ul*Yz)*S/Sl&naGcYiu Kid0+d6zI3AS"P^Tm$|kWYxôORxc!5#ߴ&QkE%+EuSF8B2)0@Xb1{a<@H"NѼRhУIV8\Sf쨟"]ApAK#='IutM"d OcL(%9'O^S}7I*DdΘa5ۘFk*JQy[C5jNyF>A:hA5{uF]](mO,Ŧ@J}7:ӭ%!ŷjM?Wֳ}[yH['IP\5(uQO]3ʖPlC‘,;_7*ԦqtHGk_E9t-M{WR,Vb1 F_!~uHDp;M{h>,).JY] sFySo̜ J6&*JP$)S 5F}I"XloWGD@71b)[d󣊡?tT9cIO!Q2d%A˾)R\.HBb1 U7iя[ͩlUȠ "Ƀaͩ/ȋNJO"%Kس *UW/Օ1ʢ -F9Z\9qp pVZ/=/PZ@*ĢHز~\'>ֶLf դRJkȢ ӻMu..p9rɽbCUuD.]WҸ dRR'N*s-Ɂ}_?`La%J"(Y,چ`$T}~ʞՑ ORC2*mXj *#uB\iB1u:뭞(P)MMWvHqCq@lF]HFQRSKcSY%kaРRT* uKPt>FG(n2Գ|Ҿr/UF^!@"'"&ʀ)jIeUl AOʣj3a\-Φ"Pv0%e$i>Y %2GzSb*5'DIfo*uLvi.8!NҎh.~hlؖVb&+*a,$Xu?d eDY'nT%7-7xt0L\d[hBMHMʎPEф8;mp̝=z.@42"7r(V\yАZ j8.ł "Y"m|GDB]SLJyT;#Pf Bt\ExPR惒]^8nFv7.x@4nD]lTyO W;exGK[p?+w9?臲ӎc2O17n{T^n?b?b|2fW3~ag';_\!͠;?}oFEa{{?FӨ7 bw~:s g~2({/.f~ڼ;4 gP_Zg`L[33*@xܛyő@ZhZ?qm?}巻kUg_JlwkA?<ݍ {`G"˿PH=f6}Z|>m['ݼ;Ù֛nt8_?d]ֿ^BywI%?hwf4-=ʃ DВE:XQe*UVhiٿ}Ʀ߭5/EvOtuVoQ_ϰ[eE~vCyaّٱE蘊y}Qg@ꌝN.CB2 Mi:* aX쒩w·}l *+2}B}=]koT(\bFO1s_s^׫ ͹E7H#XZʨ߫騺WYn|՜6N]mm;5"2<YbM>'$K0M,bL&=+>Sd<_V^=]ϋN\*z;Wtzs+\[^ތ]d{wm1z^רlŅ $ɁrHA0 &_H>5˲j<9.0( X^Q3Xܠ^_INgclHB]AhPlvRPJu"l]_vc}^# 3|%t[^~7u c~Nowxuwϵcq_ lO!INW:yϷJ^!W6xu3nf0z>VZ{ c +zE oʫXK͠ڃ*f/!d. 8cߟ zhsyYeA:lNKBM`2]IB]LE:LֵBY_Ȅl85wz46ۓ\ug].ML7eO-8Ӌs;(nŌj5=PSLǶmz43}Ml،n׻ă>l ~\'ZXqO.3i}9ϵ0=L !x#Ho2?܃~ۼջ77z/^oVs`k] Ձ4eKH!Vi+M-fEzkPvxy_rոX|x B_r9=c vwB,BxdL u=ڜۃ"2:fXtXl.qn5zn7woNXumӏ]+9^` ]Dw:ͦ[ݶ?x-5tͦqzg,Fl=AwY:X)?C ņ@Y0N>'.c§2.3cBҩoEW9-1[_#F[7UEO=sm6*̦r)Fq2 aP2qϵp:yy(퉌ڕn6ǛJWW>\]]}]wT +t6Hu/àZ=HW6gumOQez1g杢 HEyNǸ͂f"Y~>޳NX wβ.b0ԡoBR/ Rvm6Ȧ|{oϿrZ鏗Bwײ%2U\-ݝw(A8c${u˛zkQCzW ~5r4 Ld6sz.ÂÁ ~MOH `)^͑mwRMsՕ{+ Bpk?;6 &_39Ps[H3쿾nuNzY/j 6gӏ̅vrN| {@6C]!_(N KH7?$FX&^ߏtYƃt01Ʈ7[]Pҭ[+KK))b_w ƃu۞ܑq~a nbl>#Fb:\:YtvR!`@P1M0>ve]màmytz9?V-<_ҙBٛ?_)ܺ[KK?- yt2'zXfk1骺Q}ͧ?0iE,ڧʬXӓc=x=;5%Ǻv}ۑ57@w.YS[ҡt^ZZʧ)+gwOO3zPp~Ǩu?٭Q嵥vwdssyGM67TtWō"=caJ{dZt<[Yp.6&_ގŶE_7|;}5p@H/ t~˝+?@W* zߝ*,ٹ[ܿK RjZ82 s qU}fC;,G8p:-t0[|yu8Jl=(N{!40;q5T{Sܫ_!ΧRݼcoskĞW t^ai6teiz u-Rb%xMq fd>a031[* &LE՞]/0T^-@wm:1y Ydǁ2>e-:ڱE.5gwSC9/_3Տ@?Yp8;24N |;m[=;Ŝ [ᮿ\mƑJd3S*6ǣq Wxk|z~1m ˾RosDAntB7 R3/2q7LV= ΁ /-MӅinr5{ǫX/b@uwm/V1\g87 ɾ&wۈ:"^?Ogt$!*↪̛0 0/!w(2 rW.; YƉfjSCӅOOi,x67 ۪fm ? iW n77`]+ n4[㚱o"2-r؟=<:)72*kw\'߾<{I vxq-|=2Ndu5>? QAw_e5>g+|.pnh=lO]t|71:LRyJrT04tXjH=[% L1ly_5*$F˜^d`w֩G'r:Ĭk\zu;gX%|UYOW>UZw ҋ8@!? ϳBFg4r558{%7J]LawfOςצ )b!V&bp1 n?| KrBʧfA+]+mP"S.6'B3.ƥ!$j(Iaր=5v3i9n=diJ$YȽˋZ\<iԹhb\m5N9ϻÿ5,k| z؎TWo {31z_yWWm5{ ȴ1^'1'g;@E.d 57xX}!˄=`wv{ tJY.sq_B~;]X|}m>ܚ؆<4!ކG1Ж6 }Fhclz/oq(KKM%$| ?&0CWޅA!~{φ-ٗi  .J,;yվK-zȊnn%{!`%TS}qk~y`hYU/#偣Cx띶zf;^YZu~M\h~^J<ɛ*@qxb7 %Hrܰ*|Cb*22~5+ݮ~|<bk64u"VN=B bObǦLU,Y;yщz&pq" z }qPxlӹ]3L~_@r$}]..T5' hwC>Kh9WZ>-Ke+;epEmP4/}8:\X[q߂Tꔘ2z7,iVNmbcK;e{i] \@Cٜkpo ~lz. Kv_tvXY q{V$@˂ܷvnJA]OI̞L'15H{^}O{fe{vz{!Λ/VV!RJt #rk 4y|Lh^n%yiN:xevgrߴ kՃbl6z;.̓t g] ٦N0 9:uu~Ca`"iku x^8plMNؙ}OpGյkPS˭-=Xa{!*YE;u6m';TcWƆ#`P-ث "͡Blw^֙@M` hwdhB`v9i@"괔]T` ~!Ia{{3Y&eաNW v@S, í-2w fCF{=48L] v7<ߩsdYpL>H07$ou B>ȁ/6q_©OU yIw޽0}S(,w-/__[O?Wk~Π0,CJq[[l”o;Hi҃:zOB_AS?"Ω3֓5aY=1|ᙅ>*Ind`B&OHL;Cpy:1aSNLJVTDmYgк-c>0{O*+k~pT* ׋TyҼQoNht" wKjcm-e!Zgh#KA[w6M~`|&;oof 4JU09ppVKqLv 9I΂f@۠=΍_eWje;5/f|~BK['ࠉ46J0^|~{D{8zyA_/+6x6=ŞFo4 ̻kkv}+_y z6;mOyGûyEK9!|mm]`\<0!h RȲ )vм`sY UaMP믫`u96aU"P/3c_v>WE;/?|J/q>tqmmǛ[ 3c6RhS j DPA@<O mxN<7vi"i0Y?1os d/q}W>d |=p<l!03eOavS?|9 ->zmՠ}kk}3nmX1M[%Þ)2 T~g>=Z]|_ lO/7\W`38f<™s ؊_9*QF2G`g/^ :S0-ȘسyYJ`Rn?s휕:dO/lDܩڃ'3'S_{4z vbjuѣ>PѣW8O&,l#[ DUOc@|i2B}B-cg?Bs$9'[k`02M|zfێJ#9&c{2{e Bk]V~V F1ս,~ۼM4y,>l<pa=W7so-R!.XE_\`!4J %W' 㐭N t8`לo29x7 utdoCϰA {={ӟ*X4ތ]68hh_|꾥Vv\++ܵ@4,@8g]&\7YA 1&i =4g v.FbPlWf띗o<\?\V[{ڃꡭ֡D0vCL<yųNܟK>|T}#uwI9!tb=>~,ߛL~{"ç` ~0d`v/Dⷳfk$>#\E8SAz2fp(/!_GÕ xsĚ?`) 6էYDj{>suu.x \4xᐘ 7icTaj0 :\iuuxxnUbA9F3,~> &o셼! `y=L#],ˋJֵ>wČ`<^ɬmmr6ŋ; j7ß[>{DW ȳPgiU.NܨYcL+MoAC<$H}Qlq `[ eeܑ V/E9 F|PӵOffAM_akQ+,_CW\^e߃ϲ`rZ̈́BgVۢ?` dٴ"}ƊrLm^GqEpQ5s~A2cN3Lx}>,a=>|qjВʯ}h݇]HcR'80z#xQ'h`%خǟ}ga{%C8OBBfeGq v},?Y ȇe;2u  K~s5AH%gh/fOmyqqqyy>?˅n{sF6bJ2\N1d6 oӓ-o?|Xs:gx}7V?1- ?$Weuw=sGq<e:gqwـ֡ݙ[9T4>k`I>ݼ^\ŧ5N+h9fdۖVO ATGD`zѣá?EK4AߕzZA19P#g30E;%]~+Om]>y|^KKOI0WR<*;3r5IKP4vi;ZͿC6D%wzyO:8 "+Z *}%I+Ab~A[Q}o #xSAբPˢ OK6"S?ٗAXY뾷,߆ZHrSݼ%5(w_AOgmsͤlo<W y "dy=bn*Kv\]po yݿlWJ~-[gGdҘ`ά߁Q-x[;룀h'r:[q~Y#d@yӀ'7%'(Z,ˑ{~9a^-ݩݽOq,8OQc:.K5AKgGx%8Rx1(_`۱}VEl̘ pƯ7ig* +8Ћk׳k=s݀_eټ_'d`< z-e۟K222]'ɅTjm C=1[`JY:-A<’wAA]pm ®kn̥i* ~C C,ے1f21ՙ:ڋg2~ֆ{pu: M { i𑔂^g|~Ӹg2@7@Qe;.`W>٭[oz3d> I*n؁oG|NsG@ٍ)GoCoJS`$(kc7fM&I]cU7Vk8}a222B%03`@ga)' $| ̳YwσV6C=ϰF{A?CÅwp+[V~|c_~Q1WFW'"5/Ձ%[#F|jBwSw  ݅|]+YD~d|TyldփS+-?1VNezKkL dfgO&*K++o [Kg5@~n~Z%2kqz.#xNbg R 19Gs>D&r4+&X\b=+L77j='9w?B)XUqς_p}Ub}e2UL~?^@8woJRl%^ZZGK' $z1ynP/y;y1_ޏ>XYMX%!A/O9>~ Y'qLr?qc|68/c'@:>gQˁ[;2>={=nKT*TPj:?>ndw߿:}y[zlh YwpYƻ` (mߏk_/usV03Ļ/:eq`~O֞<̅Hwc{ @",-l(]<l~# i̿yc85Tٝ6O/ZD3%w>*6wy>hwCG\[\^"ν+޽zw0iG`HU aQlAUYQ1_Hw׀:r0ݙYl`}B u5,X,!A,x.˸yyYYbnK` [syWg5Av阶Cb]Mʑ""ܛ7!NZOp$_\D6 1 K KW__heSs| F~N {"EK^{7X:کL!5{qԁuHV#CR)[%@,7ԋoB0Rvf:ue0L =&zG~/ [ opCʒSoNca區ΉԜ:²=wEyWfeK>aOwJ#=k$XJJ\OA"39I;~mn}> n`r+h.3ĘYɁ,|_^z Dma9S/TEO ױJST+2ޖe.4wd -ce{X;@XςboB7ɼA[N| dcmvzs-#S1]5a({ ]I7޲7rOs0V yɩ mw]zK x1bu*(nGo}!D{p`NR ,_\|{.+ղ/A43Jef0F"]umYS4ZƊ?_/GP?@`^۝v\8O =xx6O*:aS 8vwqxt>;3! >욯tgi)EC"?Kdnp}@39|;];KVn4* -PSxXzj ` nUbҫG:N=y2'EWmܓ]t<\Y;?|(t%&K!y!s:3eҩ^3tj+<gI\!ذXy ju伩KgotSbzXqB8̵o ouP5n=0 \dYsH2X*tIlG!.ʹI`P[n1E*%8Zߺ)4e=6c @S\jC*GN=a6m#/D/;hE3wݷW,]>^CO.GRe dl}`w p[2@^ƺL,zdum6 Y䦬rnGu9!Ss:Տ`LSِ)}~57 qݸ=Fnwhmb})`>?g O?}qbBr''A|G21|UvͷxS3BYO`s!6_w+ɂ|mÇ=Cct*{#԰+DN]0,&Fѳ'2tςƱbe4~A䐑n^rwэ}`+~I৆A 8q|[dz߽`K+Vs{|hhX]M㇇w?"l6/)D:BݻwdC}t\Q&\bo!){dn5OjJ9O_?:\]k YH20YK\yF\aɞ %Ų#!c+dL2I'mn&Imn6>Mv~MmsMt6:s= Ƈd P Zx'pcdC/`Q/u':䤡s/p`Sj4Q7:WQNx<5J1p.Qڷ {zM|<߿^"H 8@+W~vl _(sчetRJ/Dڛ;p!&^r/X-m!)jNAk/O_eY),v|-e2 _h<'pWnoo09>"t]w2}L&vk^u_YY鉿_2vkK2o6եn59$& ȨEUK[.ƱwEH*tI7\\irJdkz*MޑBF|vɋ%i*|$xa2$@)'%]_H/`VpoN.r`1^&{.Wf\by}2)j\N^؇KZ[n24$嶠)bj7ŋiPR L܌zkh<|溷*zC[zsKn/hGػ޻~]HHK_{oӼ\|026#9'4>\TSTL@dlgO_h<:[)] Qe0ƓոGчAu?K.2ev"zޭr@,ްk"t9kD0px{Ś tOҷ_{Op[H}xMQcX<T\u MO(`ݬkybi;| QpM-e̓ؽK{ҰR/޾V(4xa!_84f!_y={A&K5rD㢸wo*\o7usWӮhxԸX<6?d naAEm U}85'o);9f')/=RƣHNՊfrqX: (Y*뎘/0]_cNKut+nk<@1|+@ tw&G$+L[$iXXDqOٍ,ƐXO8ԁd eϥqGy+@nT*--xm˴V[_y'֘Crp`]Oy΅˗R0l膆5ua>oyKIR~YhyAv'[LСAYs7kiو0$9 e!<ҽ"pU%([Gܠd(eW RsjHz(|}L6x ޔl*#pw,Ђ*8D`{o zM.+Gq^<.h/ {rUS(RX^T VA.Z[A%EpqJA$X٥Hc9)B O|ͨwzd0PZ(=Awrxk ~sR)8y^z{Vwe.JoV>,"C F9vMkb)L j`&DOa%~HMjl G- fӪ5kZإ#{|g|(.V.8&màbd*]._ކ4,I>{MP`'WK 4>{w#A6dɂ&k 2k}(6$K%ܥtYJ(7Ժ5^ Ft'tO2 sy04`p79{㠸pVĽ!`_0 Fi/#`j|\^|w32> I_89AyAoĔIFzØx[x.>kƆœ)MZѮRn}%]nKؼI7*} JT#r `ق֭CнI ꦟ1sfy\ lH"..ܢwwӱ7Vc>"&Ty˟^r'|!P!K@;]]-0 -L.%)SބEѾy3&%7 F}p4HpPK렏4y \ OpdB [[҇ɝbG{.2]Ёb8Pְ Fo tpXn%$G{0 a_*Aқ`. -~̢5 2h\3)L~yP xpLNMNra Zr_IRHA]/%HA[Gզ+(l7ui#: P'ra>{]Z栋 P8`4NN p,#pPrY0Ng2/7H>}`z\iZ&ox93'n:AQi+mIYX4ZA އkSmA7Ar fz=NbudI)3^\M.f. Dȝ}d3Ѱ8D#e5N@Jw?ԍa7 vmK-;J8;{]S>{oԒ@4=,{aꂖ\Nv.k0+/}l/#rj3(P׉{)ˡpTسlmi'B`'xoa`x ?ʁ:5v;$G?G@Sj4B,ok2ׁ]gir%ڛ|\op*Չn$.MU.D+H]`25] ^x8rɽA!L14] CH?Cnɩ:#i*xE$`JXKŤ {R-"T8C Wd$29>|V䕾·=jpD> H 蝜=.>6 *M/HXv=qqZ}K =(F (Q^Ɔ4Mn!ܟ|)Q:=} `p/R>Y_`$+XK/QT'EJ?h\dG^NL mB)knWtO Q. BX`#XL5FJa|@r},l^p/~fh9%MQA *K|c9|,w:xiX(XRL¨$ T ^6#҄)OR(v\8ó`Uבj#>ttQEb3*3Pi Wˌ6Uye'^w.>v. qx!"hR=hwic|Y_<Ҳ c:r;hJc(9d2RIVO/yzSPJ7 Mu(Z?5O }σ //B>x=Ki;n5J+y&GxQpY<}vvp59I58R|! li\VJi#{gdo7crѨ RQe$GUU.gqJv/(8é5,K[楁>bᅉep+y²{\K[ 'nS`"PwXSڗ;+%*X[/" QLrL&q;4.OP2Yf8)-0 B%7$4RI\AT*St/~L:ɢ$0jOI?W V}w;@E:`f]9.|XEÇ}0h'(R xwڽ{"dޗL)c` C)JgE%VZ.#=uT./^$_!58e*`N)Hw1>U,c/74N 8&t|E<_Օ8IGmɗ_%1>K8$?&Vy`õ/tqWuG/o7YJ()>`<I%S *] n܋90LӢ^|rS/7 r* 2'c z'h ,`S%LRm PFeJoLv_w"VtX.97*({aW=xGw}(y8@I< ~ qi:Z ÍNz .uEF$cȌ$.IQPMK.퀔GJ+v2dz&1E=aD8J 1yxw/ ^(9y[V eCKQp]rkZ#UcU4j,F`tTt0riD!\i9agr?bU-]>^rNf4ueg+_ Qp ^F;G[۩.D> s(pM09!z2޾{&Hҭek卵ӱAr, |,7UPkdqGȽFsd$ǓR= Ү>\ŌdY\,k@R|򥀄uH('eRT -.B>KVuyu.*j‡p>q(Ahtޯar ht5t"`6iwaЭp|Gd7¬xn$!#.)R~{ͻQ hڍ K'8I㒗p$ѡ>Eh$wގQuxѨKז{] 8C=[KHS7$yܫwYdB+w־W,px=Ѵ$6SZez\3# '/T~t0RN@) 160< ~rd+}I&f1K)*xw@ >WZ@ Yoߚ 6}ktr Y~h0h 8"T vؙ:J D)Ү ٔBu/~-Ri"jpCJeBbI˃PIB{xW/ׄzM^N5F[s~PK:qqЋP% McՕGj|HQ_[{wV ѝ~h thWNƂU$cJnJtMBnV g S"%WbJ%.pup?"K R_كT|VRZT@buze0r^Pu܍phr'Œ ̭+|DH` [JFKkw>xeNyޝ5VYl ҽZH?EسŬrQRYiWIJ%An?/_㈮H|FKpxFl%t`{ hI% x5 L wM=8@ =^T{8P:XZK,im^w紑n\pAJ8-$R0?gR0+@W PzMFG  xzq`YXxT#*ɳHԄ0qD}</FKnQ `ޛw~ᣇG=Y&sG}APt7̧ 0. 43TR9 6ſrвH;@xV*g+Y`U:GORMxpQQe鵯.  g@r J\ .T`SP]brj$p%XCڏs^*zq+$<S۹`DYBT|'. jq;nڽH. Ԫ2*h6ⵉ șB /D3;* *0N:}/~e%Թ ṕ0nxxإ=/K#5r _%(Uk5 P;, bw ^{ި@wk!%6 c*F7u>݇kkkIe- "=H }P3$ߥ#A X/Z |7[[x4@UyqeQT@U*@{99llued !%܇aB @~("Ǘ޾-}#;h@1a L0vrtK"ZWЬ Qr6B&D_Өjy Th3#%e= P円՜8p(/-Sb;qg2 pLz I^ZXpomr ou۸flﱚk>Lԡ ܢ#9w\`h eS*Nūx+F._Er38 B [f/_p~N˾QKʹW ;`ؗUН7-hPʅ{5,}4a/ewFoħゑQ-Ʌ)c)렰]A=Yo4;Md`J2pe]#rjt!*i IAb=<%1PܶMX(X&cT.A\@: (X㇮)IC6_HMGJܞv#Ss4H мKjL`D}ŽIVU[֩cnO b8Nk2o,NosJgMK7&SB4ڝn^?<|~ aϑ^ 獞']ݠ`T8US`y|⚉w_Ў w1GORnJ˲&)ϕ(˻,%wqO" : ݇TyS@2('WV}A|ݷrHpV;B8L⹀|a굥0 h!)&})O(ӣPNP~O&̟;ȀHi<]-H@$8 o?xxXe2+,&ηx)4|N7e r h8|ds,ȷ6 h$IT \l Pf\lIHJr1 >; $9@ x;pxYjqoZV),x񥕨 :SKߡ= %p-ܻ-E(HXlFEp{4dE $ElR 'UI]ҊǸ-)fJc+<9 vI.,Շ5kHzVӬQ[&7!ɻ`Y\,(A pjױ8*,kx@3xa>@I wSUTotp5<@8ХCƟB %܃ H$w^5)k o/Y3zQ6yFkk.>wc4uq"h(M\ҐL4(iל}]Sv'9Io*!].O  ~2 8ba=O-^%򮅇gn9ñZW5L2w&:Kˁ`^F%醴|NJph 0RѲcǶrɮW#{[o=H[oqg2^3pdq1n70SWeQ<'hۍU}$~es)p5[kΧ'mY#rץe=R 'tQ>)٦AC~,o"PA52SV5}I/~ʘ0OtlӜj!'7j,I"%UndTP6;܊kZם5]i\߫|N5 ե=߬<^Û=zejz>TZS}/w̤mS?mg٢~_?\^4t68ޫ@ʲjլ_g%%֗q³a۳~39og~L`t\(i7*5{K?/kj6JcSR[uKꞛЕzؕonk&.?&aF? sզR(M#ƪ+֯|Nz*jU֣[[Dg>ԗ/~psMƧC[O0ILV*.RiBWX;xݥO;)+(*dҽJSV7V7iMcY(ݘޏL76PTg8ZJmjJ6};\Y׮mkެ3kjԨjc}ŽsW^aE_[ C5Kud\m'~P2g -_i2*ʚݶ/Am7;ljiY?Q?ܿ*\/M)ԴJ($]t`M^7 uW']ժÇuU gU~l4#Q_wC%Kse߳KMb_XY{~S:wס꒢|Y_4Rt Jwy/Ymw_)'RWJ\3{YR _Q'W+ן@@]+ЅՅ|j*b*>pFYw??ZFJ˫E=#vi/c1l}qOe=wF.$z`PnYvM*/ŚQ %OgmF?**;P }IYS "fb oqFrMmz}1W |{l:G7nuSQI ncq'ob>|;Nr{zo4N?T6ۣMr l8slM fǫˡK^Չ; ?ںQ7a0+_}.s4 oݽS]UY3虦]MjRe.W7Uπ Y;e',k %:nϟU}j^mϨT_SZm<ݭj 07i2}wu;gOz2F|oo&^&?shg+{8c\ u_][TA>bhLlC;Cەkkz'#^Cu^qrBWN载GNU /d޼骟dk2olSLԁn??rc3U*N5jty쇢O}?m>95NsEz> ;|qCF-uFO4F)b6e' ow'E=;d;P%TK+uVx "/DzNɛI9*MdLG!C:seEuoT#C#U abeR]m/}NWSHi3~N!_=wHUR25PE34Eʲ~Kq%!=%}8*PCvaZDom/ZsH=B4*PX!%Ku'Nui{%%F%a}M6ڔ1XeӎJ@$VA}R-A-GęL WA5ydmVL$W(ZVT]T)鵬H8EʕO;Ua-W;\:>xꢣջ_gOSS/%iLSZ+Oʺ)K9ܮL+K~7fƉ`,St5r.5UVK-q aUIZIOAJ2,uC;qWq? QRdB_mc '@vzew0E1#A]Y:鏳L w:ҫ 'S j~5>hӱMO;&޹7|Wegm?=# R5B֤\QUi2JY2~ݙ1'4gdB0@@;Jx̚+JєDKa=Lg@{wJW.+NeͲ+EOMtHc`Z3xN),WORIFUTVf~jr4\0G[%=3P[e=e/;-ct;et;j%ʾRm5ֽ"9UMcޕjxk&5=ǭkVEC'=_PjGzЦ´]/}>Ac,XS?Aɗ?'R7k PPHI2;qw9|]V& $=W6i||:Ps#Xx "He;JS aN$ˑH pR) Z00ItR869x)o&]bMtU4c2^;LKnez}:|oeQ/QDݲgQwRwV#b7엽hVQ0JrL[qOgp=݌nw/u]}+g/>AQ.RZCg>sRG> t%Q@7W0FSԩ8mv}zR&Ole_W^ mKߖHz^ 2ۚʳ-JjiRm_/}OW/H~IgV㝿VSu6ӠK;4YaS*Zԟ*s?*w 9lCEmV.{:X4?_sBS^hӟZ_2/07,dN̂to;zXg dn/)I`fdg*,hB.k=lTʈ#P,ZU{zTo2ju=]?_<~>ͦ E/qw3~bgS L ƨk2+vQV)gSzm:Z6ݹ6ikV/;gUh?A2KthOQWR4RQg}KWtꦃ33qBlTٸ}ߵg{_vn?9A83~~wkmm#ыm֦&;koh|?f63>:?;}??:8{NMpq^3Y.gG/NmG2L͛cV}ܪ l>Gˌ<6lm#n r#&Ax&n2F#1*F1.GFv%gkbQf!(=82b u֋#=ocf`x#㣳c5'ɒBɕioٚI⬹j*̆Q0;}Ao>Xӹ)æ*HH CmLCs-bvK&pc&6f5b$&nC T`fcᯘ.ƒlf䮃epISIż$&(fˌ&J )* L||r<%UC{Mz{}@z>:97fX)xt&(edhnlt8̙ES+Qw\%6~>;t8- ::c`cC~g,>C{6CK6=5aj06666H43fQ: CZHˌKAj!RlMΌ uزy2z)O1Dt@LA@\<'QȨX]6.Fvvf'e#YT ԚuFRg6s+Cx&'uv ;-pL>.{N}JmlV%$>Oqywh>_;T+D%Ð<`U&udZ{l΍Ϟ-cl*jesC-"sϕlhg?yOi[|qk a{C70JSCrVU z-9m~lT2:7ёѩMOuJW82MJhi`RPP˹Ywa(2j6042ǧM^0f`Vaܓ0Sf9dՓb7}a⥋be\[svZa"!Kiw<#!NDfkZ_)'4,[d&"̇fIv\'~H V|ZYt@䙎0=k.=c}cmf_꟯@Egs@!6]?Nj_WxS n/ŋkj+d+̞8~Q ԏeDπ3*efO):'Qb}>#oUf -y$8 ?)4lHz:E<bІy)<1£X<BaR(BIVF,ِ8Jef谭O%Sq=nm/hE(bRήH=Y3̅{SdmNC6GD$!3'hf! \L)""ubFb55tgbRBBFP8`2 wrD",Nݐ#"hcedV7{dvq,uLo3\] 34 --Wֱ8FKs 1L\TTУLŚ6mcl ƋIҺm 56S3DtETl|R2Ei,&imtgj):ܘyj\G_:۳bsFHGc䏹Q˖O+X6!E߱y&\Om6n"֙gɜ'E&7ɒ|n~vh<26%/O  .\mZ:r}vyQ6>u9CC:A'}""$J$k3h]S`/O.h;j>77Ʈ>SŢ͙-!ev]G3i̎|Ń'no*Zi$MƆCz{CP6boeHJ#mzVLijhŠ)v1ILa) v=Dt46BP6v8f.%=W& H?)lN!%-ێ]lG|pqmEO5BJ)74m ҋǓ{j\{QxLeSy#3UH?f0@|bmi>_1E) 4X&1_K)|Jc4mH?Al8oEO4)bJ.icdf'Ng);j6/ '"M" 3ܚOБ'S&Gӆ6NS>|x}JfvZmŔS6W|6);\JSߚxGOY-䟲ߔm)ˣ9(zʆY/zҷxNꋞΕ)zrr! -ަ<} i9+EOp-J'O ),7"o[)2)٘??Aboޜ?jn7er]}3bla`tټ[/c[L}gfƞ}Erq<plGa 9dqr;c|A"uf|=N vRlye+5Ib|xBl4K@eb]3F6\/OX~&kkE%hؼ ̋3d%eBF칬MY6n!ferlW"Wkwi#`/JјO}']{R?Wd@J}4Փpn̏ąC2PXNaЃzr@.,ZfWUDzgCNJY {>~YLXQ!SFS3eCM' DdicntrT<ۖW!cs0+S.ČNіC# se x.UDU| Y?tClfx55ƋkjAuUyꚞwbTWA'CP uf+̋]36亐n/۲"fù!0F L $~.:>n̜yks dO9ǦE͜.QϪ7\C&/Έ{NhvĞ Cz!fԪ}ܺNn۷ ٢;W,9ula7;E[IX&mْ΅nƷL'&'d;W( )ەmH~߶3܎um9mВ¶;޾n6SS 74ib }im;-"u-dcc##Bq%٦&GtFF'ĝ,19WoJ/!kd=)>4$mSq{8$БAڗJ£ ۈwٹעY2[6Le֫}1dd2?Eȴ[Lё 9qF6 ^Dd\L" m$L5S%?Wd-̔p>qtfx!\}$A$ǟG"raS>$4dfpSg'S qd{AW_#]G/P\607pcpndff?'\`  9 эx> !xsoe,X lw+>ϗQ-]ALCXFsB%+`^D)=o~?/8~&cJ-t"'!4ՊA"L '.l|Y+kjUqˊBB%(3XFekxZ.SAln1u/`OӴÈ]0=fF%iBU[M<j xlRNe$ZnR]V6D -o9wgYbnh C̆.rwl8"t}10&zN%XaMy|#m#Ye|@d 'VJőw 8O4bd3<رڞ{deu͛W躪q_γ{@[?Di ^0xW D~fIԫb̨m:r0d0$Zfb|M/"2l$YBJOy 0zF!Fui` !  5 &4eF]@!6߲$,ʘ.jI:dM 핍d$ FyX]647Ǥ[s2<g,5vXt׬Ev\y>cAZ`• $%D*ʿL j“;$CYG&%Xg6IoįXD!ѹsI9ϵ̇K:J|tKL p>H2D~>vje< HưY0 ٚ'ŎUe3yjιrR2IѺaZUjN 0K\_\4飥r3T*$;mo-@X|qgj:|$])lU R#Lk1.k(g@T-ǫm9"*#I/7Es:z3rboŏjWDI1İ2*(ԶKEc64vGop#ycwvO^?!(G[rZYVr9֖tlSs97ir6m4:[1-y_ ^%1qk_nfGI8Zq?ooϽ^ODu><jn?i SXMf(}侰Gt$ /M]r7$ &Dɓsę{bީB Vܫ7#|ShCejAB|{7üfd42m2gYXBogx%Xʮ>L!.UMzIphZm(” GrG1Mxi3ݜ6Sv]o_͕FusűZ¼Wk3472!AdkR f7.n嶆7ʷQŶbų"SCCӘ?MI|9۔(L48uzޔܰcXU Ns'QruB !sg@hEgzл4 G'-<ęTUq M*(5edL@Gܶ6Ankd 4c,y{k uG- 1tX )EJlQ'ovgDRX8mY嬉YYI[c7;l^y @N(8%7M ޥ֧;#jAᏓ;!] pNe.{Ce8[KޟK8/rU_(2w>Deu욁 D:dJV8iSKn1&㙘epWlpjLaƶL`wXSdΪ7|Np114~ էyV^թ1F>DLE[_5?F0cs~t1Ny<+෨S[ɘcݞT o@$WX:,F%cr'?OZ܀|Mqpu@"p&5ؿQ sʓC<n|O%) ,5,ԩ/NZ&h@0"9`R>|{Cb!*.3%NUH MD:D3ٜ[Qkx|( w<$Xi]z%vwBS犾"2[Dy/S{~SJ=GzM LmlJaWՍS2:ՑRUg@ zO&n9HD5wfA fP1[+*,ͽtTNzx{c*=X"r|Mg@Ӹjɼ$|)@UuPiugaQ7$qv/rǫg 1 xi,ypLv;;-qccN3Lb+d:g:puŅl׮msɶF@D(XWt8QɫO%s3H-@k܌WnnYja\`;Wk/0}hBX;s ?I_7їFÓRlf_v|32)gԯvI~X5W3j(Ό:a]+%cuܱlx3kjo=p(r'@_.K|,!qj⸹_ :C rU(-^sjvf<2Ƃ^RAcO1Xp9E7OHKWZ!$ݡPTӆWK_0jVi+W=BUctuל:ښU?k+O+>s- kؼrqcte0*!wfd܃ˤj;ΏzxѼzX'f$U/=/5}+zO~.CHemT4pqs*8TwBՉV%=RW1` a5R>Lxoq' 1φ=lj% /g+z,7`lQ뭵'xĞ=ĸ%.k8:MwvpvB WF~"ȥ\9Ye1Gz?>1-7>7>*V#"P~b`PLfjhXs^hwH{?[f(5y@Kx)wwyLk~^7e"|,zc٨HybofTS\U*\VMovEEu{rU`,Ee`6zȡSJ6l>־$ER?=[zkOJ؛.A{h|[[c֜C˶D7||Ƌ2 (fTr m9U$CS~zjv"\u @)P.x3 ۝ƶܿw^L8Vo Lj |: e( TZfܩ8Δ;4gF~ZxͧﴀFsGɎ4l2/.D7*zz@h 4f1B#YnXC1Is:&ĸm77zzg/H=fVOT>a? P(5}+Rs;1ktP€}˶%Skb*$Bmi"y&RO/Mtr5awkBʑ6ͥtMjϞ+4uDzz$x_$6* Eؑt$qY\@YWĺEJ( 'ck+\\D_RJ8r|%]sp$(9rU * f"Yh޼ y)H \"(SdMDҌ̘|vȟ> >LL$N rOִmyFVѐgc8'lclpd@ 1~m":M$46Ͽ\JyԮXGUu.G BF"Ph Am8UJ1U >yM[aF #Q,!U-(]Ze4!07 anP~`9񷳶&vq΍~ŗWrIDfuc%ӀWIi?Î9KQ?:1L6m,]:(gm Ҽ$ 7??M:{8 /+ ٘d,1cI㵽"~Ŕ~^0΂9q$09TMbFv@kd@gh:)(PTL;{I>̢)L#qAb";h{{X\1)g  m i MUN*-α* &TAS>׮yyբ1byfV♀5N1g{cU;y)yY!aqǦͺ]ߑXpL[dF&@R<5)ISߑbH7 m9֮?NsyOpU7c q y)JVx;+i򍳸 k]E (g_F\lA8W(x׳}-UXNmZQNEA`Ǵ f8wOϓaaXZ bp]`eF #&RC)ֳ^NБ閠7zO|V<0U\Y8#Wubk|6g{[΀@1(cQ״_k qvFyQa*6C Шy5(j{dDie9qTiGM94Iv!I_Y]j~+u+oM{N]=K,$VN-*])ͯoebG(u>67~C1.GJ+S|eK|gR|cLJ|,gxVSeMZؤKP'd=<аXV%ur@Ҙ/82e*K(·h嚓pg2X-E(PFUfj)7gVAos4תaXl.Ј(K4 Ff(@rtImYhX6=W0wW/g_i4R__wWwg{/mXO`&!r>ԮtƓ3""~xH.p[^ǗzVw:]8қbgy]*E]? lM׻-{N5W&C_7^Sܑ6 N8[CK! EkY@e}ZwnjJ'VNҙ~B7nUae2 H;BXtq I~(`T;LŌjTQjn堷Dtyhdk95^_q2."0id:ǰp3/(smx l UJ`84ႋ`xS>cGuQ_lS1zD@Ch_rqf;_[HTvʰ8[V0s:=M@ZEKyqLHp Bߴ x:F+M{nQ\ܛcVQ,[U`Q <_f,c 7ڑq5QJfD f,w ENYh`<96ON 1c(dr8jk5uj"V-B/Kq4]q+NыqGkA~=xa).nX$jb oqIw6 0*fj[X=ʼnT5$Ӆ24Og)ŭ14@}D$I'#8dZ.V[\0m\I]; H.1dهa5,L2&R퇈5⹕;q/ږ<97Nj?Y",sM|)vWLYXjC9қ;JqWj&dpr(" Tɥߚ_khDvD4HB8Dy ;y}B/:ؘȝ9^2Sd@|Zr?,9ޝJ I2i$;r-8&.1QG*M2 z_B(zVVB%HIמq8U|xb<=Ȝ/ԔP[V_+C,ˋ/b֮"W"i>βhDrWl8_|g`z Qk!A/ݞ< 83$ꖧ]ڨʍ\C~hyhJ4xVהi̅Ket^Q|9J^>"j#h]A$ņ,(dN P[ؐW v$]h6;)6dݞB!|cB6SB}(=)}'ņG{k}}?pʸ#WSsFQԌR #t6 ]QF($O!wRl~ 9!q>ǷR'te=džVoCvD$ř22e̹3*A[/F߾~K=NSlHs`CۭCv|M )QZ!JnШ<<ņw;)}^)}mC"l> M㋛Wk޸9hgF^-Υmnv^˓Wn g|fݷ'gDoƪgW37^q-[*82lƻRjVWTVmZ2BG7}eFoRt=\,wsweCl-jPh+nIj]HyGZx<䁏''w6$:YHY-W2krS+'G.m_-xS7ev8Rܶ}\4NEn <>NTa6SqUGXКe5pEΨZS򼼜2I[_?Irz%ܪϖu^;ZbfYnU~WKz{ZuzZl%Ty1(rҾ娦6&ڿ'e޺O7eQc&:xWY'^?z ~_Dũ=TMlwFU$f 2EQJ8=%lQ,h BSg2^w1a+9K>}9vFWW? n|lP#(}r_^ai <>Gӧ{za2i0UZj%9 ׺=904 ehI0 Wl_(MNj,Bb h8 'Z8^@ nU ]Z˷1.Q{5bJC^Z$Ot &AuŽJJ)'܈D )hES3taZ$v^ڬf0Q@f𣡛uKE` S V7 D!uU0pJ7FyOJMYP? ,y^疰 ,\H?5ބӳ0;ixGoU X/.b#-/QOuH5_$C./u$N=-C~wi To.NCfMQxcƛQ5_|"@:6h3퇧atrʾɵ۹y5nqȵRP`> s,nBW`W@8"y: `~qٻMKf! 0dS˜D!v$=HҡQfWeIv㳉}-8H+<>r' ÑM5)܈a|mxSbb*bF?ސ$Y<.a.x/>9L8x0n>pjvienw`x;fTwǨ:JR@E31A|`!MI\f!b5AJ)i $hO}:e :kLc,N؋Oh&mћg?}/!)?$n2UruQ7#ՠ%@Õ~)BոJM.@$)XF7}Pɼwk0M$1 &\@H|IMnZ*y05R e81I̱ R 8,&dLqj(3<ׇ'k[n )i40MI^T5Z4Sseu[ϨA8RmA͋0,BCO-G&zpe2MPtea.R}jy(o]ߺT[ wjw>Unxƣ.5Re=f>Jj>(5,@2p6N{ U]Lگ( 4aW:4WypxZ7ՇB(Ykf0hݵ,J_LtolQ_[/h̖^|`Q D Af"/z}<ޑx)JXɢUݛVVOT!\>eȒ;4@Gl[Mo't/es hCcXUR&2~㒂UF/+aj@b@2^^ثngc7" 坼xpd)\N%4t!Lwz *m({ `b8RWޒb4K3 0 ͋lfu`3Lc 3|Sn4xe]8XW'ꃢn\C̸S;Jƫc&jauQG iMU:`g$]2NTDi6gy $Ћ#)8XH;|B 6w#U#;˕wdJ|S$L*A+\.M"B ӱ E4 7rKn$fs.23 4íӱ3) \엪r+hj \=fN Nsj6}Y5DGػ}ըIwD9X5qBշ ߸ڈCD J {3o-gZ杖T<<:xeI#(_u^֑e;ql iXkKʑjج-[ڏR>}P  N mICƆJ y̝ؕd 4lޙsfΜ9yN↓j YE=ȣ0A9~N˨a:H ! 7O UE4TJ b7^#d+&DbMLM){ sTxb58i3#,1uX&\:c{A㦵fѴd|{L :E4ڡ سݼÕZoY[`Y+GM[be̴ ;! 3喰ʲ1/ 0.gQ[VA#.yeQl>K BnA$6$ A[z9Q}Aq>:Ɇ¢)/qΪ}|#cʂ7RR(|ooku;F (Cu*o,tMhcn,CmKj8=.'Yl00: <쎍pABqU[)3 >k~C7r7llpee-oZ'*{VĬNWcnڛF+aR72nQ H`mwn  XY1ĭi-l5 53:6d4NȴG@'atI}kK{h$i++o \QXu eWs*`] Cƪꃁݫӫ 0X{gvFS 0ݝ!x #v5R^kGbc?svS_/ ?iϑ,ƍGt:4ŏצR42Itahzog`r=Nii (cr ݱᮊ6Civgir5e:bgk# r EH']M &9mB{D?VU!b(L:?3k2T`MfʁtL0@q6 aXb^NڊPuţUVvXXw#]:!p?2Z߈Z~ Y0[vn0Z\SD~cx<7K4>q`_W0*R #uY KkJI jEI D.*U8O*:N%KO1t4dzc%kAE`Ra>Xbh<QczENzq?[)nGϫj_)QI]QWRE #e{Y 1) L`DHkt¡:x 'f'Xģ~I' q}«~G,=e@Mp:;-yO`)w*9ػOں΅>΅/d g8+k2 .Ax؋ #OhNpz"+kY_]E ^&h~v8_aۤx.|]U dK1¥,O7: V 8tZf͸`)(O+fqdELŮ~KE[0` X q=_ <% 1 ̂\W/s:;-D;EyD]pi-;11l-pwQbFSʍI3~uPE㮹Qu!eQ%AZ"d>C;kȳQva0Pa,Q5vpPeAS$s*ᡸQnTO)2T!8h4UDGRj*)5K6}EL#6F@VT76"4/ǠE-8]3J*zp$FH?N ڳP-hq{mJ)$eDQ% "[Pa J|rI**Q >l ◚tLҷn9J\nKγ=6X_66d>fnڍHK)c 8xr=pzQh5GqCl L{SvȀXa}nN052Kv*=XRW!kz%ERj8Un;J)˱qpl1gF$C 2UB0RF ]rV~i#3AA) M([XbȍyㄧZD!96ptQX6UlΒg{aRLW큋QB =:@y%`J)pLyؐ \U- qWp I$ Zx8 K6#p#YF8uЅ,TZkEuW0pn,Q#H9ʆ'{KCv|>pwcQc)9N˷8F'c ,r6`5ڷpuo}qu"|M'͋A8ɋ!L{M.(m%4e$e׃B PD <{Wrn}X8n4Y?=k)|ӗK,L" <ЬE \hrm4,m!'$=׺ujFZTH[q,LsYN©<ĻqAľXQ@܋n(.y= U2:K Ec%gf[2{q񞳝s
Hx8él &|=UMrzEF" \ [E40Qy;-OK,:'_X ^~Ź)Rϵh+8iNso+ D}>1" <%P/`iOu5[H$&*ȵW07K? _b&#V|f7hCu_|Ӆih\āiΙ4LDŽ༮s/;b1率C!{;/ \lZaѢk F(vIO9UrCFΗ8˷ʀe{ixK %K )S !C-%Uz Ӈv 1|9ox`CQV_Ie~u_ys$q־j.tؚOB`<ѹZ{#962(+ցMA>g҂m$"jȦ |6rRn~\=X#y|=8N#qvD3D hXB0?7I  C\uRf,ʨq$aP_ddҡ8r8XE;ڗ6YQ<OG  /4 I_,;RKéQQD ƺ~JsZhh΃e!ZE038g@59"IΘ9 >Wo~8_`W7|dž mdk=amnB?>VՖ1h`Cc;Jyxx.rD5.V"T%4d'806Ș y?4 ov:nXs Yl5 rH#x?C(FG|2= 6IxI-FxaѠ`! [pw'v'.0QPzNau=]E& *^WDM42'Q`Ojo~lp~ zUCد5R7A~(<Ձ`}t0zL6bUJŧ5vDJ =լ3?Cb%6M,DH8#*((eƂ;yZF($BPP;t+ƒ"zS(TMՋħ&D(#5Q E?1yW4wuWVT H*Ș0Rc|W(J}PHV /`Qi AE$p=B7!.u:92TKtwBqS@ a1P}"؇Am{\ո*[A00qlO| 5Ĩn]qj436\0:Cx>8,.)UwvJQ0ʕJPI >Xxa\L 7WmK%b)yAc( P'pDM{eb0U*oA Sԋ=; 7r{h AbaaȲ6󥛢lq??ỳ{D EyQ *AبKq(*a - "LӠD@Oe x$&HH4oGNѵ FF!IQ!1q&ER"y1JD'W-|Pm33fC[i~-=}TC<:ڟ'ɏ ̽%Һm'=6QPy֖*|NF6bg80>Mst4ޱ10{deLj.@,5كtك뉁6=E42 wmRnDܛ61|_^6T@ Q0B 2MN&CB)u8CAOfI R)5 TPPLGg &I`A=7ܪd4t'! m~ DA 44Z'@anMBqbQ&3oc;H`@>5َAv52|e_<4'?^~XHKGlHۂW)"K~Xfi|›3d"2E$_G`"*SuT*%Y1)ė_ qG@kI^`}RXY4:I&2&o7FTZѤ8}8h8tH-M3@RǣNE|PB#rH-hL 1{DL96NЮ묀 歂jI燃"l&FEOD+Գ[ ^U5th<&LL"5dd#y9/uFOS$23 GG >sD,<j@Q%Q¢t&54+.n$vQ-pd#Ӫ"xO{Fc}!& (ctB x?뮳 HR#'/@9hc>暡Vk5`)_M p*d*EU~eo?@9g0۵V悫VdoEJ8M: ~`l"-,s$؝cbn M}9W|Ht8γ7cxh--+2bH !U/e'tbh{`,CuMWVaCq0#<kSx Q@`tEi2zs|U ^5H-qB,X!pp <5G.\L3Dp Ɯ?̶~3t߄؂ pi%liw+CŸE>F>j6cݛsQ>vHQv[zʴ6+7AwfKb4W&L 4ِii\{L%,$Dv@Ĭ⪲ mim3"g^GWZڍVWfp4?NJ#mjdw9!Z[[ !Z.wl]|BCPʻ:^aZhCںڱ@g^h. sD^ߊ qCS4[ZUB4͎Ň'̖HX2m3#cf$Ү4, !OQlT8Ud[lM0JCE䞕"2N!o]c= y+)+pKI-e%gVEf$Y]]IfK 1_<͌*2mE@k8RT Dڋ+H,ddJ"Z.@W+!0K`K?3K>A ^`RJϲSJYJ*< q "䖈6򐨖p8Ɛ["#!!,GrP.Ѿt U yCCn]슠@p!*!-AGG)HmH:[ yء6݋0c!;/6]"p>U强fwf_v(M?x]/>P^xs7 r@az-\UWxn Tɇhϗ_Z ^ z!?+^`~ p k eI)jjd55K.Qf<.TM}oW{~K`43m՟s2_\1ػ D1aELWPz-V Ҟ?2xH' 4|mNG! _ 绰>rٗ/\̵^XCBNNͷO#ª.B>,,\\xUqc^1E~g'oc';ȮsW+ڦ_()BQY& dsg[;J2"0#>b V.w勗SE%fwͿp5D韄.dϗ܆]TQ v5s?̞bZ x`>يЀe{fH7 X骜+ ʭGU@11{fv-r3*o9䙏aF|UXH&7k~)uy.0~Y+z*Sy˞(w|›j^ZKR \ ? IuH2"nlnȄ(—Y: ^ ٍJ wSƾ ,jߡ` <~E>@l1e^XDh~'WN<[Sq2Eo-rOPh[%|f=GOYa1;ë%t˅EdZNې#y<=n\Q%J=d) z9!X|VHL,0k|^},Q}LVTjccmkxueG-7CǮ^<ɝ̞͝<Ђd~:^W(dl!9w#Lzޞ Y\>vg3g rvv'9J~k|\[}jwGu;MQl^R4~j<><X^QYUӠX0=.[N1`CiʟF>q 4#G|X'yB<~o}X\8R~{!/Z}{Q? /Y2g="zkLxy}T?2ѾKaP>ۈxu1YeEmI(); YF:1LcƞYN>FσiTSz{HHB^?x/9"*Yyʺ'GZgU& 0 FlJYec>%uTq[/+|NJیIdC0=/H"6W˪*O 1e@EO{cx<ݧeTD[8ӂu0̡@{>>d$<~$( eg9j4ZuhU!|38zKRMƥ$#KQHz( BZj]lq#aW/`?(JpL3ΉV4jLM&;ІM鈄Wâǯ̮kv> 6!MǞFbj\D>wLfT ۄj<ZB`/DʥԀ-£d5n?FYvkot *!6̝ߞ~HޓaT+.H?rO+;S/>"Sb`% ?zk6}/ ڶ RB'S@*3eƗN-{K`A7iw㗐l/]$q=,R92&vmA@3vNT3eNŝsȯ0@3OVs?{~ˣһRQ-H'pe>ok5ERϦgNvF{G^%a$AH>-+Yk{\ Z7mf;~BB~[a-ݵDJ;lC2-`R: XsK =W …sԽ! Sm`}xN(LyO痋1 zUroi ҩѰ^ ԩ cK?UZ7*f RϫUy`^^[F0oLϫSyU3Dљczv@aC̶0jeti n1Z3rrbmgSk~sSnS8>IƽzCߪUՉdH[8h}T5eۏ ϵKJ (d>u  ^i5m8VJC:%_ߋnz׃LC2_sRdij?1]aϴ4(ɳ S;}[gY}e\ۃT5++M,|g{q-18%?giI>O3G?ĒG#iPzmɝ"OoBjq4As䎓dml/SV>Χ JZת&-QUz"qX/^xr  gT!TtkQ99/1GD.D# ҧ&{`@pu8SՐ}<-=^צcyN>)U5aU{A 718TM%!C4v$dO3:!qmSgrT]. A00'ɞ_Qa]mh&B`B̎.oB+{ c{(놄̚lt#uҵ :rE햙Y'ڱ_5h7 xg=Fؘ/|n>^FF)+`OSC a%H ?izF?m#lo.i=<v~IZXuz`d4dƲYq$zKv&3I$WpR(0xE(8I Mj zZ;˙>23fg` 6H(; >~P#)*tbmCRvJ {H-X@g])TZCU!Y1#9K08yBFE { TqL͵%HU2<9˥ϱ cF}y B`|sO%iZUT瞚9,y(W:w_ _ sk|u^S`UeXQ5C|)cSܷEm >d{}D)x~?6W`"?h>BPKѹ.553}}!VJkЅ@˅}3}~=H09Ŗ˾~00!4w*ΐ380!hmK]߅:-Sz_뻇U:>#) X$늈'A8I[;KqA4h^#?5 |'l_n?!3 zv8z 14tj;Uq w6[0G ._7'͓ Ų g%$kNf (/)cAvVK^ #r>L5l=6^bm *_QZY\hr tϕӹI<ữ 4bfӫR!~9q}dESmΈAF+Y?CYrY%&@J#ԺYkɍ-CDY UG-t<h' m6)URxfcTxmP{37*(FdllJ]!2*hS&zL^Cx7HC N7oK Džۥe ǯYÁ;/o2h5p١>.@-,tRkዚy7y*f)oD~6AkV"G YB4g,kmG<+}WUʓ܏?+gpӄ^ヲ?h?\,;<?T7S 7e_·; /=ah-pꀿ-p{2Le1ȒK' qI S]I|TW5ڈѩK Wx-'9x;B$;ZJ;C=3?j%Kׄn$i-9(!u%O;09 `"L` y\C.^.O)%ʭP,(}? J+>hH ; d 9 gY#j{yx:KfnPhU>_j.يHߗ'y±c}S9J=}SdCpб 0iC9X| =!' |Pݠo7x>b4l='uOj&3u旺BJ3!]:Y_5 ;&g[`Ud" v ›h:VcOú= *3`\IWa;QsK!5!L[aa ›~?) 92}BmM-<ų@șK! tӻ "a\M燸Tpo3oOҠP5uu}O`?{8&0gA*|-@VRNt|5by<8Cֳw"| XnY j(,;x 2#~Nx =!k_5aɝc^mv:i( wA.RlN~i W+rBR>˞/\=и;մMtP)Y]SR[SYPL}RqJLB4q;@@a݄֏4x ym|oJ$Nbܦ37"Ny~8w_웻/ݬ`ឹbb_n[w]!wJRRۥV\>r+GYx\~sԦU~9z s;Om& ÿcsos7s7s7i;nᆹ >_h=rq+/mP4N^j2gq>x-̠gC^S Z"qטzʤͪU1 ע~xjG76_oK6_->~Ɇ,h \Y`kgU;*fgΖ:.nnՏ> jTYT_iH΄gΕWX؄ |O~tk'/jEc3U#>@)=x`8@3Y~&DC`C-0"Վ5\U; oVW8 2N.:{vԁugC4AA[gw3LuKӕ`t\?2D6f_*km?-и%5dvO_ wYS4c~LlL>V/^{;"IU8Gy rSN/SnD3 ϯ[?=x~3-bSXg֕Hivfr4f+Qޒ_QUמ3$0 8#L`"QѠyAcZ>@"0M6hZk{ڋX5}q@I$scs$|}{k9ҙ\"n>>G~&үO o?ҥI&Zeȇom [ Y`U _hSB]7ᚾ9dȞΗhA_?0! tA rć]^QS^Vq^?f2 m3vg?+2a!8a:aTZNNDNb05a̶?}˂ Z?G;x>6*S`t3ϳQrK5V_fX&x~-GIr6zm[~s Jvmt%rm&nEk*1 t#@߬58hx@肱3B[xmٴ#5b8IM#kTOZl83Kv~jLB|GjB7s5TW3iSS"zV)Eo$tst\|ͭOh8NpM*jߕ<vfh+B~;FCP=bըWjnv'v\*^Ka߻u}g/0wa'a{rD8:Wc ZP棖 j"[PcͯH@1?3$L|V2`SwƷJ$Up5>e(5`b339e&uG[+%\aK k^7GEMWk3=P2  K1¼;j<MKYVč`)TYRNjK?8y|U%V}"nbl^l7_\\et&hחc=-z/o:ċCڸ B̨rY ! d~ fzVǒ+Um7s ]\i]4NXYC#% 闢 nmWPMd(Bw5@0~|SDH0M] xϽP0|Nj`Bw5q BDh8+>i 7i .\COzAPWɺ4 4f6]'Ӱ4 4HMJGI!W,Bl v5 V)s|Ev5qKiZJ9DiՑG8.ӶS|%Nkk}X5h!dj@?K)tP_gIIL~pT)?K.\u*H:ت4w]>rDm3*HbdimhaG9/HxP&2йట#W$<] ?rhyCmiQD񐠣Tօ 2_޹ϗFTp7Y{8&4D*Ce[! V }M۽@Y{ZI qcEAgiY:}[Nݨ2.'0+c8bv?t@GßgGnԑZ m Si"_yFƖr,m2c]K,n%uX/ǒ:3DZ"~XR، p,WAg,T0ў>~II"&Q|7Qhh`[I*MdroDDQ},bo-/y:ϓgK"jKjMPZ<(e+J 5_a"IWBq~bf}XQ\f%@O:Mp>5C"4{D_"z!<^fz~X| s~C;wemg A%fL~P)j I)I{1~[Aq_Hq^D;m[]6lnϹiEbͮ}OY!AŇmT|T<ޜ͎z*=G۬h(^gέt`|5D݅6>W^ER\/5w)s ŏ)uy|<*!-UHWG[|:ߺuhm¨9;i Jo!WYmNȇmNݡ[fs؞î1]NBk"M1t97_(q鳤Q.R{HOy XzgK *;fUG̃unQ);)rVOmŒ;*sfϢRJӡ@t@dY,ا]t6xԱ?:QH|zA־4)8`iuۼ-r _1.2lf,>"=w+6]wO$q6W>B|MU,hJ.)Q[/ ^z8EN.5*w8dArb_2Tҟ$9|}t6Ц5-XP%Cʔ4Ħ&>9xErd vPFp!N7fu$5_nj$ճm{ 2yn> ιx&s舆J7fƩ_/eߡH4EVuHHG9QI 3]m'TLxM 9I8V+ʍhj[O;b@\MQL[G@I]3mRg|=cj+Kou }XɸW kp#x( a嘻\u'jnmsoZ6ˠ)>v^"2 !h!>I?RS? RҖvc0}*v@>l6]lsj)L#muqqނ_'ƕ L87LjP9ahM`ɗ%hJ|)E^28=FϞӎ:TJ^X-gkc2uDYV^Yb8Dpg[;F1Z97Vso|m"? G`IN]ȅ꒓sz qP;6PŒ\s^ oQP;9ZG9dV+]QQ藱i\40V/$1/x!1epa59=CiQy΍t·,'l=0۰p6UrhlOg}9{sh; *G<=bs۝Uݚ?|'y;9iDT󳛚iEPb=orVy?5{~kȿI}Y8jh=6+ LP iZ+BIJStlDpj~ {c'q[)!m΃YxZNŽ6@mxuK8۳bPBZkroAPa4΁>ˉ17|􉜼oSka]ʞ,VV4EZj.;^F'y6NX#I! ^{%3/rwmڥP-R@giWOp[4ou ò3;1G[x4.d*u}\$*u&e;b-g7a9X:*Q$$;]E\',>YqHWZq\,6ը Y܅8 fﻰ2ժYEyWR4MQ!ccM ޲g5c>Bxm7={9!7Ps=t/3(Pey _xu98ւ}GP~⛜ݖGVJF.SEf`уND)l5P GBajM9`6M H~OP׸P/)a`]W)ו5`MfM?̚F֢s3}.Uׅ|Hk,:e;123>րƇ sgi<;DWQ5P{HAy2b q@m01v!2^bSfl /o<7%B 3ۡ 5CIo~-D'&+ScX,4B~ ٝ`!Ր{'qY>۽.WP vVi8rRӫOz+:.`ljcN/;Qn>񵰪X#`*V"^|ta>^?dFB'~n}͏2#y TJ姥O%XG/\fI*qzs%3W?ɶξntjO*eBl46=AjJT+&7tt{X)^]^}Sѫ[Uѫnl8=w!_@vs/5z$n<,ū FꭏdJ..P1_l&P؊B~c= ˏKdGhyj7) Gix~P'4و]FCؐGY'ox7]%h6@')'IL.h&B%u7ɜp *I,qJtUI\m~tM{i]J?k%A錄_)>ݖvJXE ~JQڢ~Fy)_a6`wTB&=9}¤nt~MǠ2njf;na_zaq=?SJ'Յ}7PU2*CFCV~ ^[`Aw=ױm3( $צmyz>]!-aejo*ܬ)4J $@U a JPƐ$E~znTҠ0w?"͍:u FIW]&$ru!u@h d(adu8LQ❂K;Y=JdiTݛ$^ՎrԎVn!k?)km+{6~#uV^TE#[sK9(衷.tO%n ,t͡:(-2ϫ^DŜ9B*AOgž0pBZo|_x ';& f^\Z:"QZL\U+`V:VMGgtܽ]zޅ(C5[$7o`ozG qwi}c`zJ# =ؖ,' v54Ňm+R+]Bƺ&!i8ol22bb.L~Oʅyn^g#1Qj%"T*c$Ʈ9IͧǢnNĢ(0pDwu4zﵗ=hF8 WCsfxM!D`yp!Q4✭NR,7{_AUhslfnz"1.e5TV̙idMh TC¥dĥ;<+f= :οߏd1!ʊ:y ;ӳ0Bp8VI055#lKe \!"ү_nmft,J986䶠,1!7tUt> z~axT7z;mNի}]u r)۪ {Nº KV*dT0ji.E4$U͂9 Up^ܱ4( E_%@No9 m5 /rէfuu,q9zQ\O@xb_2fז_KLZHR&j*N~} ~cDL?|Q̋}yf$x1i^XK9fkȁ&fI#gi৵GψBx6E"=O,cIK5N|`Eq,O靤J=fz+T~Kk$!&\KWV ]ZBO&x#9*=#0.V%$[ ̸Yw>5Q ֻ![7!)>~ nm#LV 0{L!kOW|0u_?;^Ά,"=P'%fta*u=!,U=.ΉmK;'* A4!sBWp +0N 5esSqM0$bDO12'EOH2ri)4*馗[~,Y`w\ ?d$;YN{UTPě$pk -iRuZ}P{Sng`ix2ʅ6G[XT`^y$2]g S\\BC9>/=平+zs0T)J/^鹻w !=Jy7;8T|Ds*/dL *k7Bo;$rx=1 v). 9Nv"i5.7'"UoZ4 Y6Z[LoaW_n@J=ջюYڹǜ Guu Φ^~62c8~i]OK Hv $ h[W [!xA\0tTν:=j4njgۀնN˝iWW!.Cy6ֺS;\B^ʏu5nP/Hʵ7v6C$hI Ҭ&ҚgSJ g \[Q:'I%t=#E qi;:`l 0:?U7a]hjz. 1t蚉8{~ q (}DㄨyT3O'U&,_d)q tпWecսS?J{^40b><>K>̜90*nOi=TRXI'H&}LYl Y7qַd#9)/. ӻMJ|lʟ?8 rlyME8@ق5Aym{f%Z/VոZ/=IpU.I55sE.([w a֟r[Wue'y26f*>W=q7&}?֝N&D h+wua9 7ŚJyVü@(^~4 JwW]ZK&V>A&~f=(tC747i[TѕM|';QotkmOo`C[̝FdJk4}ODen5ץJâg~P = $+R3Iav4U笚fL{Nȕ~Mȝ~Y}Hi{}Z_Roi >J^_Nhώk ИkzlO^ѿU30abQm6$=AZ~~ i4 fS/HH_OT4Uso %Y_x?0?|K؞AlTrAԬp +z1u9dA˽-lǙ+qʈ9x5n:qkuWV;&*W:]񴰆Zf:2:'>ƶ 8p%^0yPKDϡ^Eblt8ﺈrnulZ>xKu/4y8=ͤX}Sʾ9w!W93cHF|Q^W?']˸GƷ8#>@.4kUPIVҷ% Dt-A,|>@f<`™W_pD6gnsODAHkL"[۬r$("pο 2V{7ѹTlBk8+ iԋpoSQv*'υf۫7xyqӮO0hJ".E ɧ׸ݰJ#k.BW|w]' "/)Av7qiHHQ@uqw@p|&r޵_ۄ s~Nb2,).R S, j.$XUwIMG7\V+GBWe׆"5yUHz!j2uk7+>D.F7#pF覆y3.pqN-,JVt̆ UHdz Ze.2'ғmÅnϡE\ }#G,@Ժ"}1g䵵S1<.4XH$B}z:w )&L Z/c{vK#ѭxsƥ-p-QvԮ SP"geQCtSjon G$R`&Ž쨄7WڥԒ {&Va0uځuixT~%qZ\;(l;xW'T=4ʼnNB6D !?2ګR{zX=#!1ca?Ft&jRUwB9(m:I "X0G8YQ!89`Ff՞j˱sZZ퍳oo`'NGh=uHjߛ~rJ |CnNxYo!,DӞۑLxN™W2Z2DqiAM -뜍(k:X-}_Ŵ͈{=:Ey$*+recA L? ܈J~s(¥ʩ䣲sön%E'j~yM>*5L-Þ}m˞~Ѭܳ᧨u 9YZMLۆ"jmJ?ЭLerJF6hsEޅ-}`X3ārGtdh6-R\31ǖ8i݃7?&wF>UĪC:MaJP.E*N5ͬI8}Q]_ >et|(USm" in(W :hFb?+JDH`ʤsXULUPo?L;T!jy>SIPmU٪v9\Ri(ڬ0WpXl).,*gV=BFo6,~5#ĝŔ5xѦl>I8: HxP,N* 1>Po!;!&Ȋ<'xX:$ƚ4'pt,bI2~֐y0-'VFV&ў _eK3УNrd9h$zḣdT_/db=4h;'zht7r]C,@Vb nh="VIxS r! ̇%qT{8)WT$!dG>ޥf璞y\".`&J"t"遃 b~0D,E.E z8=`JYAW X-EH̟[,~F["uz_)|yoP\'8N5~@"`]vPľctDϨÏ}9c q _ƾHB~lw;:rPEF\EI- Ȟ^sF|\֋f+kfW/= IayfDl8 JD8?x!Ot BH: f#@DOz4 3.;YsD,jѠ8 %(H P A ۟a? k" #2QD|wE\fUR\/*Plgm1l)q]cXY5hC_xo V: {._LLކIKm+>*rߢ_$n "@d3324j)hfc :)oO|20yyu("7‹WW7G>IѣMTd:t,v|,|$NH(xW [:HX  9H' {7/b;\'>l;ɧ^Wx$]zbx}S jڮ"-mZ5,I ֐ҝc)HG1AJ׍2m d.l,{4馪 6c8ږȻ'i{#٩w[>Q %OC!f=@IlntYtC\>7KP^q,\]X~75sSf/j ow21]aM__UJߨ@gʼr K9--P*Z,Zz7,[ryWΊWݼlepűؒU+!%_9c5gBeKO^SU0=X>c%V(g,]e3V.[XαY|Ҡ+z._rM˔׷,ff r q)s\=bt# 6tW,y[]] 6Z\j ذYexʒKXe+WBYhKGۿ[5,[}غyx7&'v7[r+V'7RWsB]Y.5S.EA׿׿e[8DgfWafؖ!klڰ]ﮄhWl>I8gaq1IYȗ/J6ݙǽN#鮪1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 󏒒 ns7W$7I=ɧW4f6l()ڝkjͅiSdwK)a Yd ^WNw_t gHB!ˡ Galﭢ ||A(^_qRKc6 A&`ʅJaDl:`p^%AF&1;-i  YYF/6X?Ly|[~9s᥊GHLM S14hJa$U|Lp.kǜ)Fi^d{SM!Q.$D)].J6H>.BILIO#Su?>u&OA>dCvhpTf5By4BM=Lʚ #҅+QcNHM64|&ofVxgnT=J髼 ,ӨssF6d7gg[t)nΟb:nހ+!T|U>j|6Lׯ짠=$n4wsG=7gpķJ7o3juTF% 58v!3dzfϞ `Jn>zO({1}\ бurrXAP]vfc4&Lhg0JLi~$%ӔFI>r܉S=qz=q-䰦M㎝4|zui0Zz%y O?t~3?:O|=פ ADV@ BnfOB9& 9T%:[ U>]4ow6xd9LD#[ʝG̙dtXR#6M=:Mʧ%yA,:Ewb Ϝ G+Fuuy֐5ѦŖE0؟&gbgæ]99OrC#܂nD в!N1T.g掽*)tHOL>֒#ﺦ_.)} sƏj}3G%7fiF!sʛq;rks!ش1MrFHn+IjP@P>?*Y`6+B$Q#IC{`ƎKWՔ<ӎ)6BphneR7q[O'OS:{?۴NПO>=. Ʀֽ٣uqe/P̾,K,=|r|lG}|4M?^ gmmyr݌L>9$JNsy'gTXWhW{ģr5Os|#\>bb 9A>Ѧb)ya9Dd]Gd0fVΦo[2XA~U~qos>]sg6yy u|R8!dײG"sٚԑ(O|JH>;O;A)I>G湒 MN #3 }rƍ)[ )06OT #:e8+&VNq''=Ӓ^q˓"ξog@`sQ>gI>]O`s{˺ 4W1NpǏ|GG& v>eV8.d?3%0|% ;_[pc5f hMsv?<;P>V.skItF|D)$k:5٘E.g\=E `7 g|ji^3I@1?Q>Ֆ}M̓9=@pH>[tL>؉%lןth_qǫ3? Q`_cJ=خBL>Y̫Miީ퓍m`'_=|ˋA"`,d|tIuV[q#,ǸcETkF#g>ɹ6>ן~=ǟo*G:>`5ng0&LƅHC?|}wd &Y{eEҟ0 suv.F{otw`i0AnHwe.aMDkƵLzz:ʧr\ߙbi~͋0,۳3w0oz;_>ѽ$'7fTMBυ5/GO0b76}'z΅2gzgGޣ{f͘^2ӝ9#ڂ=0˗d>52r[=FZ܍C6ͱν1}q7fugqa!#}&SaK0o438?1Gϡ]i.o}x>])F+wU䣍'4Am:4|[i~a[#G@>yi XHBSSlE9J!<}Hj; lrO~[7ձ_&/`}ڳ3s|1͛$ csӺLHg^pCb{c?:l'#+-^jh $uRN2zrZ9F>m44 sF% J1ѩ:A6>=BXBj RzJ'S: #JJ~J( #Mot;)J_۔㔾C黔F _('J?$ӑ~R-5$΢|(')7UdRkaJ )BjVv)BA*`PGiRKJR*JI&HL@9KVnӄ< y.NJFi n>AӔ~W)oQz$~J?dtNt lJP`JH0Ӑ>飔W(S! xxP=%oR@DG'JF,1FL4JK(-3"eDNۈ(BmQ-Fp穏Q$PuJC딾M(GJ?s&'aA8J'Rz+ER)R _OJÔntIIo&a゚9FSK*? m$15r0L0&ɵ&WdR&C:ӄ;߄K)]eB:MخÄ=(o4 S7aR JK=&o)944ϛPS|4Q:\J)C"JW&#}t-J7RBiW2Sɋ~PcJJ0JF=E)wJ?ԘJǦOfSI>QZN2JLCKzJCvP>G)8FQ[G'PKAIT6_$ݳo.;O{.vn{rMJ^O^m=tY*g]yp.k˅S3ֿYV.t\x{Ś/ ;O-j /_[<}Ҋa靾,%M}[_/;)bCwj;{[?[zLU_O/Y8HJۙU Nzv. '~ 'O[Z2pчw>v{_E;?o %W>XK+?w݌UZOks/e߹ы>Xݵ /\gM?oݢnqm?IKmXo~n /1o=fd.׷oǴF'/-lW~?_-]AKY~9cK>,{>i*ӿ.ȟnxe>[;vXNa?{%}g>7 8>D69iib;w͈?a㨜>gV`:[{-YE xmUa J{H.AkX(ZV&`^7$~.[~w 6gPs~S?d2QG ,QcgP!c l<GePb/!r O *03fᣣE_s'Yy}<񭭳ױ0./[$~/fo99fkq;B&'u)~g59D1ݲ&'迁W8R߀穃V[jOws9vAzltn_gqŧrhU.-޹`AE|f ۢmJeرr t !q{=@"-9Y#ԨLL2584~{hI9 35f{seN `*+g|3-Mz ,BqnDkpM. ^=>֏Ž[H8z}\,ĆP :i '+UgeQX .X$ cUVUz7"aȻmG;zK0 Q0sziA.2Z Zu 1qŖ‚B(K=Ef "L=h& djkr֓{4=}[1 {:1XbU+U-!L\PD2 WLBLv;XөԊvjսn>Nl;͸Flc&b0;3Ff~ropY @L2k}`vpj4OKwWz,ZVru"]kȨcXyl^KGUp24^ݰUX]%:chf\A炰[txHxKɽuBy#-'ǪC8xM3} E&zN-oJ;L[Njn`B`$*O@*Av؍\i&+nSƫX1=VNWc^~oj?c 9avry#3&DԽxE_c;;g:"m0%.9'2_sݭGC)61&0fEp0$Fyb 6,T4GI/wDfʙLaF7OFjGjrd'>/-D>g '3`Z 1c̣-WIG9ȝ8bZ`l{|>TDEdfVq0cm=xua87 ߡr4g'v~NIcM)}ڕYzj #RN/+eaUŚ3 qQNş:ŶoSg Njh~ SqbGJ717FZ̎"&Gj@̊Z_q$>[1ZQkjQQ_FfqNn:}WNQH06o<'Q9Fn T#+uyWc PA<bmB2~~ 5k$;I~gϛ^Rbp<7jN%S1sHlqjX)K0# ohHJLf3uej MBCjE<4^+g*VnSHF"w /@,Be,DŽxʯUz%Sxc.߰U#QJֺ ~GUkkl "DQ=Ft܁!?;ij}w 8W<2O9%,ڱ,^<)b"GZvYݼ*a1ѵﳖFE)Kb2kK ZE$p |Y,[谱4FI-ِfr;gf^4oTPWEsv40 bNN7|,lψfօF\ܡQ]-:r^"vܣ B/ +XА켍BbjgS'y`OSzFٕ*y\="nXZyaVsZ1pQ$vߌ(: ֱP2;/܄&`әKUzUj (A+ m_)=KY9H:ڔ>6k706r:`x4j#lLNhqy4Yxk.|{ xBZjlNE] <5\FRҢ0C"-3\2\}jދE#:dpsgY}WX=u5N}0S٠GklWJ"?YF4d5Xѽӧ:Ft*t2gUzYQ[s\}"8'idx1279(/93Un?54SCgb :Um݌hֻ9RN_Tc&9Ab~Uz$;s1!rң5MFmlϭdjCd.].s bXnܙoSb|!_Qag]Ĥӯ(6u_P"}S϶o@Q\ֳuM> ӰMh 3X?Pm%hgmW#~}`{ #j|i_Ąu]Bg>%8#Uِ) pϞ޲0ڵ_/NG0,kvđwF IM 9ekm=s;Y|edѻ>aJ-a<>}v64cVu{-jE<#C{v/gk rAu`|q?4*Bhz5Ԩ׍^v]{*`]xJf0tTy|.Rx;@ϼ6KbQNZ#SWwaw"U^&0CUwaЖς.v'3XS|1oCD ``jzo ͎T W9Ap^jupOA{Y~#+5N`C>U ڡ'vPS 5TuaY=CU&!"UPVTP5W`:0~QYC8E\eEiEEV_(T8RU(ꢴTo!žL1^mTs G{4ը>06iTaK:z7a IΦ*3'鈰21N>VJ!Mf`|zn8uQO'G6'Mrp蔾 Es?Pa#i11V~V+y#y`Fr XajPwd`H~,o{"ÂR $lf[%셁z+=8p]0>a_} 8-5R3Y5d8~Qѵ6RUQN#S֋3Y2|kYyCvf7TJ)Q/flZcw,kؓ'vG (`) 0mhdbmFiyeu^l`º7вQ`ΤnvH?2bp;YWUD}RVfE,.B̖#6϶RI5?Ы{ĪSX^ߘ0F4Bh_eɡ10>G`h:O"fQVhQ# ܮI/R3:<uzj0..+18>珡9 q_!|+ ep7V ~z"LLTAyL?,lz)QMݳ8_':q;}ۑ ީM>X"wwmmȺ ?Yw 4i\G(EmQV*괱a{MQޟ@+x??k~C ;? _7yEd+ֳ 26^i :cB\fG"82L ة{z׀Mn`լ/,CT!!p LڶKЫ ?45]O$$<,Hc5\m> x3e;.ZC]Chn_;/BRAtyC/^ݳ#ϸ`^۫B)}[=Uza{ge7!=+!=svh);D7BQW:)śmjTvyK;|K\<ȶ&) m?^CX9ۂʓo 'xBѿ&7A|f5<3']N?> Mźp W3ugGlޓW7Vh4NOL^';XT$\_ӊǚFT`Kis*%<4kү$V/W?wGԵ@Ơt&>[0v%kuThz z7B4^O j:tG Rn%kfȈw,&4D6b/CDcATJH70cw?55T)iW^}~[}7=}<=jhȜ~a$ Q;.<-1mD 9*}_҂X>1*:sGatԣDbXwr$v$ߊ|@ӉIlE !  iȽTN: P|\l3w€"v$Mπ;: [JoK>eRGVEt&oے:*%U%COwiaKZ.WVC+Ɓ%q: "'PQ)m:0F !/A&=Rgm')WmKO{S]Ҷ;1x^L:ٴCO&V_84jHFI}3EP\ hw?("3 ;AROnPMik7(Lsb`J "Wbl;gŭPzz@`ڌ-R Hj7tw05WA [^c$ Z8 vroNz4RFjɁ>I{0hw2f۪j!YSGZ&.mVRvJvn2 xNlY|@T*nqA">]q1|'nA}bxQR0?PQU W|`Q<H0\K(QXAy4e˸I1ܿClMRI_#d`ivtژ'g=\e[2=W)I$f[zKb  !3P{@5- ha0%T FfI Ř|ΰi#=9`>)Ð_2(E:8hFqf>55 4XҰ1B+;b EBJj!Ua D[1W$19Y0KbRl\KMH gp5>o?GnCG_¹2٤SI $Z3^'F)䥰K  Lڝ`V4 ը#SIm;I&uJa6pq!qVw\lAм av ԝ1ͫ#1 ߖRrS]zDխL^bbQY VQ|WE{T J+ :ISh[0Vnv(Y̬,wn2)c mye>ՠqRaPnt.#-\]@pNʵʈ- .&4v@PmYhRp>lR(0;Zp6{] NU܇[NHjKZeZ+YFܲ @XáaS$mdC,')|PXvdvcv䁫[ hX,6`] k!<"Sj'nJeF|CowNܸTl $ruzw(9H]ƅKgAGWHA6ՆLVa 8!0Lh/9݄KR-3T<l Mk}Q7E-|s-!ن?-4U*@e)҄huYф ˈk9/|9i'Ğ07 QaWH]״ `vTt IHi3vWbO([p8?a+YM1ՏA_+""8cxf]cJ!6OQmA`JvԚbąZXb |2vYSv(hú$>C Dem+`aER.,)09V" fUBs]=;q]FTLS 0W2@[lh[ ֥R0Wf) jN.> 0`q토\s<޹Ha L(m"Nm.W ֒B}75>mP$Sz(1n~p(\4+: D c[%ـQ wD`d#K8g?nu-[Lxv)S 2c.Q90z{;nC07MXSoo˞x.@6$LIC+P`?(d E4 =I3y~$ qAV$}' r3._מsڿ"›"[MjH),;u.sb{t[P떝6ξpJz AJ-uܧ.2v/ A$EnvI;+@fp(-;ز@%i-, ǝGvaԒ%Q~ v[w!ðxމ oN(w@a%!ǓR|5IVS-ާ\.%}2wWRlEbiļEm F1_i fXB,y? 8C:G*1D;ʺ]b8r+q?{蚂;k;%]{ZRBПe$_ ]h݉˘7>!e[])0ZLN[)_> Zvӊsԟ/8dY>HfEmN8rbY1)7x6Yl; rMȫƨN,M|kX P+=XBd#Dt'sfd/OoX_y,D6fI|_,?*VpEI K?M+-e{֗gA:;:n5GfTtd꛳gφHůeyYǙ:e͕_I %qXCb1-t} dץy9:'T ds`8N6=HfKn)p;NoGesk񟵉kV~Lcf͂ƴ<$W7C3_\P|| rQ^|9ͥ fa}Q9ͪy%Ei9?hY.΃AvW]ni3=?x0M~/鸘E ?#r-O'/*`md>7W-鸰 ɛfOq|Aj'V˃ VFVx=lH<ً:yz^7Duf;ubCqreF*sZ?3t+ ,.j|*V.VJCxt$}:q*"`=ϙtK!d,Az/,} rfC 9Ԩ=߬@Vj._&U-y㲩^+"[+K_H>{VG˱|5ܸmа׸2عnuU-f`fڰvJ̹k?H́8!q;XO۽.TWW,颥6ɉw<gfȾqGe8k@qs]DjfyWgikC||G9r췁53 Fz7D=ο&{#\ed~m楦F + cGX#$ʆ1v6J3@W3l16Zv̗ e 7jUbx1ru}-!2}f,alA8rwL <ÿ5@·Аgl~aV)2~zkpۿ1Oj|r'xr|0xcSy ԙ3__ZОeNpمw<'nFLc}ށ!jh \$4'HZ% O*/׺=`SN\k5vt6 [=>pd|p; qMKC jX(ϪKF\ܼ罆|Mxsafj` [ֻxQuDŽR;櫭ul赃}9wtvF,֟қ5%_S+xk ܉|. xg̷CTh$CƊD`/(\Κi´g`M~\'0/Ӧ㮩GΊ8I碟 *CQ*>"&gY FؾMY V֫nf[{3λ4tgi8]NeFVVՋ&.Bn*!TDB1]堷J8iVYZdԩ9LZSRͷ#)ߊ!;7f\e3Öu;y\0PHSpZ )`5ƸTPs0"&\L$W5۵`r$f>ӆ=/W X p.*AgzzqQAqBτtޜ1畔`u~,)M(Z] -$hUO(AȘD \1VU%\o1t%x2&1YJhK Lœ`\ifi ME׺mA2?&??k>@m51hJ4׉<b!t%5$a*UdۑDV-M +\Ĭ+h,] I;5:uP++qNs97$fvZ]:ni1 h/Q%әϜ3DM\X4VmZfv7|'DYO?~\?=e7Ŏ >lQ@y3P մ:MnN[8dZD`\ 82~;6O/jqL nCYz|pح} _k6\se͞:юlL\ *hɟevmiٝ:\-kYn ۃtNG<Bv7qv'L V\f?9fA@@hyW&`9͋Wܽl{ԣ\> YtW*;G^| -ʰ_TZ7@V7Ls)@3DAR@KͳJyn,7mypFDѽ%A٩^Gcw/^('gPmNKۘ 1| h]7č1#U$Z Q{'D,L-Xge_o[ヺMskfgOL}*N6{t?Pwr_q H]Lt]tSk^Py$ ,"؛RhX6MZH 4 q ?Gxvқ3#A{2cn}`뀅#R߼-B7.0eWHOr x̌*2 3Λ"ꥱ(-Bmc ;tBTPF t| ܸfQ^sYlVD=aF c|<>lf[%셁z+=8p]0>a_} 8-5R3Y5dold_contrib//bentley.bundle 664 0 0 144746 11411736451 14525ustar00pietrosys# To unbundle, run this file echo 8.c sed 's/.//' >8.c <<'//GO.SYSIN DD 8.c' -#include -#include -#include -#include -#include "bentley.h" - -static int inproc = 0; -static String *curprocname = nil; -static ulong stringcount = 0, ifcount = 0, whilecount = 0, repeatcount = 0, loopcount = 0, forcount = 0; - -extern Biobuf *bsout; /* where asm output goes */ - -static String **strs = nil; -static ulong stringn = 0; -static ulong nstralloc = 0; - -/* addstring: add string to list of strings to print */ -static void addstring(String *s) -{ - if (strs == nil) - strs = emalloc((nstralloc = 1024) * sizeof (String *)); - else if (stringn >= nstralloc) - strs = erealloc(strs, (nstralloc += 1024) * sizeof (String *)); - strs[stringn] = s; - stringn++; -} - -/* printstrings: output all strings in a usable format */ -static void printstrings(void) -{ - ulong i, len; - String *s; - - for (i = 0; i < stringn; i++) { - s = strs[i]; - len = s_len(s); - /* The assemblers only support strings up to eight characters long. - This poses a problem - how do we represent longer strings? - Shorter strings? With shorter strings, we pad with \z, which is - the same as \0 in C. With longer strings, we have to break it - up and then pad the shortest part. We skp the padding if the - length is a multiple of 8. */ - if (len == 0) - Bprint(bsout, "DATA .str%uld<>+0(SB)/8, $\"\\z\\z\\z\\z\\z\\z\\z\\z\"\n", i); - else if (len == 8) - Bprint(bsout, "DATA .str%uld<>+0(SB)/8, $\"%s\"\n", i, s_to_c(s)); - else if (len < 8) { - int l; - - Bprint(bsout, "DATA .str%uld<>+0(SB)/8, $\"%s", i, s_to_c(s)); - for (l = len + 1; l <= 8; l++) - Bprint(bsout, "\\z"); - Bprint(bsout, "\"\n"); - } else { - ulong off, shortlen; - int j; - - shortlen = len; - while (shortlen % 8) /* round down */ - shortlen--; - for (off = 0; off < shortlen; off += 8) { - Bprint(bsout, "DATA .str%uld<>+%uld(SB)/8, $\"", i, off); - for (j = 0; j < 8; j++) - Bprint(bsout, "%c", (s_to_c(s))[off+j]); - Bprint(bsout, "\"\n"); - } - if (off != len) { /* print rest */ - Bprint(bsout, "DATA .str%uld<>+%uld(SB)/8, $\"%s", i, off, &(s_to_c(s))[off]); - for (j = len - off + 1; j <= 8; j++) - Bprint(bsout, "\\z"); - Bprint(bsout, "\"\n"); - } - } - /* round len up to 8 */ - while (len % 8) - len++; - Bprint(bsout, "GLOBL .str%uld<>+0(SB), $%uld\n", i, len); - } -} - -/* toasmname: turn into a valid name */ -char *toasmname(String *s) -{ - int w; - Symbol *sy; - - w = scopeof(s); - if (w == 1) - return smprint("%s+0(SB)", s_to_c(s)); - sy = lookup(s); - for (w = 0; sy != nil; w++, sy = sy->next) - ; - return smprint("%s+%uld(FP)", s_to_c(s), (lookup(curprocname)->type->n - w) * 4); -} - -/* codegen: generate code */ -void codegen(void) -{ - ulong opcode; - String *s; - Type *t; - Symbol *sym; - ulong save; /* saves ifcount, loopcount, etc. in the case that they are nested */ - - if (inproc == 0) { /* first call - begin execution environment and load prerequisite library */ - beginproc(); - Bprint(bsout, "#pragma lib \"libc.a\"\n"); - } - while ((opcode = nextinst()) != OP_STOP) - switch (opcode) { - case OP_NEWVAR: - sym = (Symbol *) nextinst(); - s = sym->name; - t = sym->type; - switch (t->basetype) { - case T_INTEGER: - Bprint(bsout, "DATA %s+0(SB)/4,$0\n", s_to_c(s)); - Bprint(bsout, "GLOBL %s(SB),$4\n", s_to_c(s)); - break; - case T_CHARACTER: - Bprint(bsout, "DATA %s+0(SB)/1,$0\n", s_to_c(s)); - Bprint(bsout, "GLOBL %s(SB),$1\n", s_to_c(s)); - break; - case T_PROCEDURE: - case T_FUNCTION: - break; - default: - sysfatal("can't work with type %Y\n", t); - } - break; - case OP_POP: - Bprint(bsout, "POPL AX\n"); - break; - case OP_PUSHVAL: - Bprint(bsout, "PUSHL $%uld\n", nextinst()); - break; - case OP_PUSHVAR: - s = (String *) nextinst(); - Bprint(bsout, "PUSHL %s\n", toasmname(s)); - break; - case OP_ADD: - Bprint(bsout, "POPL BX; POPL AX; ADDL BX, AX; PUSHL AX\n"); - break; - case OP_SUBTRACT: - Bprint(bsout, "POPL BX; POPL AX; SUBL BX, AX; PUSHL AX\n"); - break; - case OP_MULTIPLY: - /* The MUL instruction takes one opcode: the second factor. AX is always the first! */ - Bprint(bsout, "POPL BX; POPL AX; MULL BX; PUSHL AX\n"); - break; - case OP_DIVIDE: - case OP_INTDIVIDE: - Bprint(bsout, "POPL BX; POPL AX; DIVL BX, AX; PUSHL AX\n"); - break; - case OP_MODULUS: - case OP_INTMODULUS: - sysfatal("remainders not implemented"); - break; - case OP_NEGATE: - Bprint(bsout, "POPL AX; NEGL AX; PUSHL AX\n"); - break; - case OP_COMPL: - Bprint(bsout, "POPL AX; NOTL AX; PUSHL AX\n"); - break; - case OP_EQUAL: - Bprint(bsout, "POPL BX; POPL AX; CMPL BX, AX; SETEQ AX; ANDL $0xFF, AX; PUSHL AX\n"); - break; - case OP_NOTEQUAL: - Bprint(bsout, "POPL BX; POPL AX; CMPL BX, AX; SETNE AX; ANDL $0xFF, AX; PUSHL AX\n"); - break; - case OP_GREATERTHAN: - Bprint(bsout, "POPL BX; POPL AX; CMPL AX, BX; SETGT AX; ANDL $0xFF, AX; PUSHL AX\n"); - break; - case OP_LESSTHAN: - Bprint(bsout, "POPL BX; POPL AX; CMPL AX, BX; SETLT AX; ANDL $0xFF, AX; PUSHL AX\n"); - break; - case OP_GREATEREQUAL: - Bprint(bsout, "POPL BX; POPL AX; CMPL AX, BX; SETGE AX; ANDL $0xFF, AX; PUSHL AX\n"); - break; - case OP_LESSEQUAL: - Bprint(bsout, "POPL BX; POPL AX; CMPL AX, BX; SETLE AX; ANDL $0xFF, AX; PUSHL AX\n"); - break; - case OP_BITAND: - Bprint(bsout, "POPL BX; POPL AX; ANDL BX, AX; PUSHL AX\n"); - break; - case OP_BITOR: - Bprint(bsout, "POPL BX; POPL AX; ORL BX, AX; PUSHL AX\n"); - break; - case OP_BITXOR: - Bprint(bsout, "POPL BX; POPL AX; XORL BX, AX; PUSHL AX\n"); - break; - case OP_SHL: /* SHL, SHR, ROL, ROR need CX, not BX */ - Bprint(bsout, "POPL CX; POPL AX; SHLL CX, AX; PUSHL AX\n"); - break; - case OP_SHR: - Bprint(bsout, "POPL CX; POPL AX; SHRL CX, AX; PUSHL AX\n"); - break; - case OP_ROL: - Bprint(bsout, "POPL CX; POPL AX; ROLL CX, AX; PUSHL AX\n"); - break; - case OP_ROR: - Bprint(bsout, "POPL CX; POPL AX; RORL CX, AX; PUSHL AX\n"); - break; - case OP_ASSIGN: - s = (String *) nextinst(); - t = lookup(s)->type; - Bprint(bsout, "POPL AX; MOV%c AX, %s; PUSHL AX\n", t->basetype == T_INTEGER ? 'L' : 'C', toasmname(s)); - break; - case OP_PRINTEXPR: - Bprint(bsout, "POPL AX; MOVL AX, 4(SP); MOVL $.printexpr<>+0(SB), AX; MOVL AX, (SP); CALL print+0(SB)\n"); - break; - case OP_PRINTSTRING: - Bprint(bsout, "MOVL $.str%uld<>+0(SB), AX; MOVL AX, (SP); CALL print+0(SP)\n", stringcount); - addstring((String *) nextinst()); - stringcount++; - break; - case OP_PRINTNEWLINE: - Bprint(bsout, "MOVL $.printnl<>+0(SB), AX; MOVL AX, (SP); CALL print+0(SB)\n"); - break; - case OP_IF: - /* logic: if not true, jump to else part, otherwise proceed and jump to after else part - the else part is empty if no else was given in the input code */ - nextinst(); nextinst(); nextinst(); /* skip thenloc, elseloc, nextloc */ - save = ifcount; - ifcount++; - Bprint(bsout, "POPL AX; CMPL AX, $0; JE .false%uld\n", save); - inproc++; - codegen(); - inproc--; - Bprint(bsout, "JMP .afterif%uld\n.false%uld:\n", save, save); - inproc++; - codegen(); - inproc--; - Bprint(bsout, ".afterif%uld:\n", save); - break; - case OP_WHILE: - nextinst(); nextinst(); nextinst(); /* skip cond, body, nextloc */ - save = whilecount; - whilecount++; - Bprint(bsout, ".wcond%uld:\n", save); - inproc++; - codegen(); - inproc--; - Bprint(bsout, "POPL AX; CMPL AX, $0; JE .afterwhile%uld\n", save); - inproc++; - codegen(); - inproc--; - Bprint(bsout, "JMP .wcond%uld\n.afterwhile%uld:\n", save, save); - break; - case OP_LOOP: - nextinst(); nextinst(); /* skip loop body and nextloc */ - save = loopcount; - loopcount++; - Bprint(bsout, ".loop%uld:\n", save); - inproc++; - codegen(); - inproc--; - Bprint(bsout, "JMP .loop%uld\n.afterloop%uld:\n", save, save); - break; - case OP_REPEAT: - nextinst(); nextinst(); nextinst(); /* skip body, cond, next */ - save = repeatcount; - repeatcount++; - Bprint(bsout, ".repeat%uld:\n", save); - inproc++; /* body */ - codegen(); - inproc--; - inproc++; /* condition */ - codegen(); - inproc--; - Bprint(bsout, "POPL AX; CMPL AX, $0; JE .repeat%uld\n.afterrepeat%uld:\n", save, save); - break; - case OP_FORTO: - case OP_FORDOWNTO: - /* for is a bit confusing. The syntax in intermediat code is - FOR(TO|DOWNTO) var frompos topos steppos bodypos nextpos - from - to - step -- the cause of problems - body - next - This is due to a problem with the parser. Logically, we do the - step after the body, not before. But the intermediate code - suggests otherwise. Therefore, we have a bit of spaghetti - code: - [ assign from ] - forcompare: - [ compare to value of to ] - if (<|>) then jmp after - jmp body - step: - [ add/subtract ] - jmp forcompare - body: - [ do stuff ] - jmp step - after: - Sorry! */ - s = (String *) nextinst(); - nextinst(); nextinst(); nextinst(); nextinst(); nextinst(); /* skip from, to, step, body, next */ - save = forcount; - forcount++; - inproc++; /* from */ - codegen(); - inproc--; - Bprint(bsout, "POPL AX; MOVL AX, %s+0(SB)\n", s_to_c(s)); - Bprint(bsout, ".fortest%uld:\n", save); /* test to */ - inproc++; - codegen(); - inproc--; - Bprint(bsout, "POPL AX; MOVL %s+0(SB), BX; CMPL BX, AX; J%cT .afterfor%uld\n", s_to_c(s), opcode == OP_FORTO ? 'G' : 'L', save); - Bprint(bsout, "JMP .forbody%uld\n", save); - Bprint(bsout, ".forstep%uld:\n", save); /* step */ - inproc++; - codegen(); - inproc--; - Bprint(bsout, "POPL AX; MOVL %s+0(SB), BX; %s AX, BX; MOVL BX, %s+0(SB); JMP .fortest%uld\n", s_to_c(s), opcode == OP_FORTO ? "ADDL" : "SUBL", s_to_c(s), save); - Bprint(bsout, ".forbody%uld:\n", save); /* body */ - inproc++; - codegen(); - inproc--; - Bprint(bsout, "JMP .forstep%uld\n.afterfor%uld:\n", save, save); - break; - case OP_FUNCTION: - case OP_PROCEDURE: - sym = (Symbol *) nextinst(); - nextinst(); nextinst(); /* skip start of code and next statement pos */ - Bprint(bsout, "TEXT %s(SB), 0, $%uld\n", s_to_c(sym->name), sym->type->nstk * 4 + 4); /* multiply by 4 (length of dword in bytes) and add one more */ - setcurscope(sym->type->arguments); - inproc++; - curprocname = sym->name; - codegen(); - inproc--; - setcurscope(nil); - curprocname = nil; - Bprint(bsout, ".endof%s: RET\n", s_to_c(sym->name)); - break; - case OP_RETVAL: - /* values are returned in AX */ - if (curprocname == nil) - sysfatal("return not in function"); - Bprint(bsout, "POPL AX; JMP .endof%s\n", s_to_c(curprocname)); - break; - case OP_RETURN: - /* to keep expression statements happy, procedures return 0 */ - if (curprocname == nil) - sysfatal("return not in procedure"); - Bprint(bsout, "MOVL $0, AX; JMP .endof%s\n", s_to_c(curprocname)); - break; - case OP_CALL: - Bprint(bsout, "CALL %s+0(SB)\n", s_to_c(s = (String *) nextinst())); - sym = lookup(s); - /* procedures return 0 */ - Bprint(bsout, "MOVL AX, BX\n"); - for (save = 0; save < sym->type->n; save++) - Bprint(bsout, "POPL AX\n"); - Bprint(bsout, "PUSHL BX\n"); - break; - default: - sysfatal("all other operations not implemented"); - break; - } - if (inproc == 0) { /* define print expression and print newline strings */ - Bprint(bsout, "DATA .printexpr<>+0(SB)/8, $\"%%d\\z\\z\\z\\z\\z\\z\"\n"); - Bprint(bsout, "GLOBL .printexpr<>+0(SB), $8\n"); - Bprint(bsout, "DATA .printnl<>+0(SB)/8, $\"\\n\\z\\z\\z\\z\\z\\z\\z\"\n"); - Bprint(bsout, "GLOBL .printnl<>+0(SB), $8\n"); - printstrings(); - Bprint(bsout, "END\n"); - } -} //GO.SYSIN DD 8.c echo asm.b sed 's/.//' >asm.b <<'//GO.SYSIN DD asm.b' -i: integer -procedure putn(n: integer) - print n, " " -procedure product(a: integer, b: integer) - print a, " × ", b, " → ", a * b -function nplus1(n: integer): integer - return n + 1 -procedure blastoff - for i := 4 downto 1 do - putn(i) - putn(nplus1(i)) - print "liftoff", -countup: procedure -procedure main - print "hello, world " - putn(1283 & 41) - putn(1283 | 41) - putn(1283 ^ 41) - putn(4) - putn(~4) - putn(35 << 4) - putn(35 >> 4) - putn(1053 <@ 63) - putn(1053 >@ 63) - print - blastoff - countup - print - product(5, 7) - print -procedure countup - for i := 0 to 100 by 5 do - print i, " " //GO.SYSIN DD asm.b echo bentley.h sed 's/.//' >bentley.h <<'//GO.SYSIN DD bentley.h' -enum { /* names for UTF-8 codes */ - DIV =L'÷', - NE = L'≠', - LE = L'≤', - GE = L'≥', -}; - -enum { /* Token types for lex() - these can't be uvlong for switch, unfortunately :-( */ - ENDFILE = 256, - /* Literals */ - NUMBER, - FLOAT, - IDENTIFIER, - CHARACTER, - STRING, - /* Operators, which represent multi-symbol or rune-based ones */ - O_ASSIGN, - O_DIV, - O_NE, - O_LE, - O_GE, - O_SHL, /* << */ - O_SHR, /* >> */ - O_ROL, /* <@ */ - O_ROR, /* >@ */ - /* Keywords */ - K_INTEGER, - K_REAL, - K_CHARACTER, - K_BITS, - K_POINTER, - K_ARRAY, - K_OF, - K_FUNCTION, - K_PROCEDURE, - K_RECORD, - K_UNION, - K_CONSTANT, - K_ENUMERATION, - K_EXTERNAL, - K_STATIC, - K_PRIVATE, - K_IF, - K_THEN, - K_ELSE, - K_CASE, - K_FALL, - K_OTHER, - K_LOOP, - K_WHILE, - K_DO, - K_FOR, - K_TO, - K_DOWNTO, - K_BY, - K_REPEAT, - K_UNTIL, - K_BREAK, - K_BREAKOUT, - K_CONTINUE, - K_RETURN, - K_DIV, - K_MOD, - K_PRINT, -}; - -typedef struct Lex Lex; -typedef struct Type Type; -typedef struct Symbol Symbol; - -struct Lex { /* must be struct, not union, otherwise some tests in lex.c will be worthless and dangerous (program will commit suicide!) */ - ulong value; - String *ident; - char ch; - struct { - String *raw; - String *escaped; - } string; -}; - -enum { /* visibilities */ - V_AUTOMATIC = 1, /* a visibility of 0 means one was not seen */ - V_STATIC, - V_PRIVATE, - V_EXTERNAL, - V_PUBLIC -}; - -enum { /* base types */ - T_INTEGER = 1, /* a base type of 0 means that no base type was specified */ - T_CHARACTER, - T_REAL, - T_BITS, - T_ARRAY, - T_POINTER, - T_ABSPOINTER, /* equivalent to C's pointer to void (void *) */ - T_PROCEDURE, - T_FUNCTION, - T_RECORD, - T_UNION -}; - -struct Type { - int visibility; - int basetype; /* values of enumeration above */ - Symbol *arguments; /* basetype in [T_FUNCTION, T_PROCEDURE] */ - ulong n; /* number of bits in bit array/elements in array */ - ulong nstk; /* number of items on the stack, for functions and procedures */ - Type *derives; /* array of what, ^what, function:what */ -}; - -struct Symbol { - String *name; - Type *type; - Symbol *next; -}; - -enum { /* Opcodes */ - OP_STOP, - OP_NEWVAR, - OP_POP, - OP_PUSHVAL, - OP_PUSHVAR, - OP_CALL, - OP_ADD, - OP_SUBTRACT, - OP_MULTIPLY, - OP_DIVIDE, - OP_MODULUS, - OP_INTDIVIDE, - OP_INTMODULUS, - OP_NEGATE, - OP_EQUAL, - OP_NOTEQUAL, - OP_GREATERTHAN, - OP_LESSTHAN, - OP_GREATEREQUAL, - OP_LESSEQUAL, - OP_BITAND, - OP_BITOR, - OP_BITXOR, - OP_COMPL, - OP_SHL, - OP_SHR, - OP_ROL, - OP_ROR, - OP_ASSIGN, - OP_PRINTEXPR, - OP_PRINTSTRING, - OP_PRINTNEWLINE, - OP_IF, - OP_WHILE, - OP_LOOP, - OP_REPEAT, - OP_FORTO, - OP_FORDOWNTO, - OP_PROCEDURE, - OP_FUNCTION, - OP_RETURN, - OP_RETVAL, -}; - -#pragma varargck argpos synerr 1 - -/* %T - print as token; %Y - print as type */ -#pragma varargck type "T" ulong -#pragma varargck type "Y" Type * - -extern void initlexstruct(Lex *); -extern ulong getntabs(void); -extern ulong lex(Lex *); -extern void unget(void); -extern int tokfmt(Fmt *); -extern ulong getlineno(void); -extern char *getlexpos(void); -extern void setlexpos(char *); - -extern ulong parse(void); -extern void expect(ulong); -extern void synerr(char *, ...); - -extern ulong iskeyword(String *); -extern char *tokiskeyword(ulong); -extern Symbol *lookup(String *); -extern int scopeof(String *); -extern Symbol *install(String *, Type *); -extern void *emalloc(ulong); -extern void *erealloc(void *, ulong); -extern void setcurscope(Symbol *); - -extern void initprog(void); -extern ulong *emit(ulong); -extern void printprog(void); -extern ulong *getprogpos(void); -extern void beginproc(void); -extern ulong nextinst(void); -extern void setstacksize(ulong); - -extern int expr(void); - -extern Type *gettype(void); -extern void handleargs(Type *); -extern int printtype(Fmt *); - -extern void codegen(void); //GO.SYSIN DD bentley.h echo code.c sed 's/.//' >code.c <<'//GO.SYSIN DD code.c' -#include -#include -#include -#include "bentley.h" - -#define INITPROGSIZE (1024 * 8) -#define PROGSIZEINCREMENT 1024 - -static ulong *prog = nil; -static ulong *progp, *pc; /* progp for emit, pc for nextinst */ -static ulong progsize; - -extern Symbol *curfn; /* for stack calculations */ - -/* initprog: initialize initial program */ -void initprog(void) -{ - prog = (ulong *) emalloc(INITPROGSIZE * sizeof (ulong)); - progp = pc = prog; - progsize = INITPROGSIZE; -} - -/* emit: add instruction to program */ -ulong *emit(ulong opcode) -{ - if (progp == (prog + progsize)) { - prog = (ulong *) erealloc(prog, (progsize + PROGSIZEINCREMENT) * sizeof (ulong)); - progsize += PROGSIZEINCREMENT; - } - *progp++ = opcode; - return progp - 1; -} - -/* getprogpos: get the current progp, used for compound statements */ -ulong *getprogpos(void) -{ - return progp; -} - -/* beginproc: begin code processing */ -void beginproc(void) -{ - pc = prog; -} - -/* nextinst: get next program instruction */ -ulong nextinst(void) -{ - return *pc++; -} - -/* setstacksize: set stack size for current function if new size is greater */ -void setstacksize(ulong newsize) -{ - if (curfn != nil) - if (curfn->type->nstk < newsize) - curfn->type->nstk = newsize; -} - -/* printprog: emit the program in a sensible fashion */ -void printprog(void) -{ - ulong *p; - ulong offset = 0; - ulong opcode; - - for (p = prog; p != progp; p++, offset++) { - print("%08ulx\t", offset); - switch (opcode = *p) { - case OP_STOP: - print("STOP\n"); - break; - case OP_NEWVAR: - print("NEW %s ", s_to_c(((Symbol *) (*++p))->name)); - print("%Y\n", ((Symbol *) (*p))->type); - offset++; - break; - case OP_POP: - print("POP\n"); - break; - case OP_PUSHVAL: - print("PUSH %uld\n", *++p); - offset++; - break; - case OP_PUSHVAR: - print("PUSH %s\n", s_to_c((String *) (*++p))); - offset++; - break; - case OP_ADD: - print("ADD\n"); - break; - case OP_SUBTRACT: - print("SUBTRACT\n"); - break; - case OP_MULTIPLY: - print("MULTIPLY\n"); - break; - case OP_DIVIDE: - print("DIVIDE\n"); - break; - case OP_MODULUS: - print("MODULUS\n"); - break; - case OP_INTDIVIDE: - print("INTDIVIDE\n"); - break; - case OP_INTMODULUS: - print("INTMODULUS\n"); - break; - case OP_NEGATE: - print("NEGATE\n"); - break; - case OP_EQUAL: - print("EQUAL\n"); - break; - case OP_NOTEQUAL: - print("NOTEQUAL\n"); - break; - case OP_LESSTHAN: - print("LESSTHAN\n"); - break; - case OP_LESSEQUAL: - print("LESSTHANOREQUALTO\n"); - break; - case OP_GREATERTHAN: - print("GREATERTHAN\n"); - break; - case OP_GREATEREQUAL: - print("GREATERTHANOREQUALTO\n"); - break; - case OP_ASSIGN: - print("ASSIGN %s\n", s_to_c((String *) (*++p))); - offset++; - break; - case OP_PRINTNEWLINE: - print("PRINT \"\\n\"\n"); - break; - case OP_PRINTEXPR: - print("PRINTEXPR\n"); - break; - case OP_PRINTSTRING: - print("PRINT \"%s\"\n", s_to_c((String *) (*++p))); - offset++; - break; - case OP_IF: - case OP_REPEAT: - print("%s %ulx %ulx %ulx\n", - opcode == OP_IF ? "IF" : "REPEAT", - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog); - offset += 3; - break; - case OP_WHILE: - print("WHILE %ulx %ulx %ulx\n", - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog); - offset += 3; - break; - case OP_LOOP: - print("LOOP %ulx %ulx\n", - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog); - offset += 2; - break; - case OP_FORTO: - case OP_FORDOWNTO: - print("%s %s %ulx %ulx %uld %ulx %ulx\n", - opcode == OP_FORTO ? "FORTO" : "FORDOWNTO", - s_to_c((String *) (*++p)), - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog, - *++p, - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog); - offset += 6; - break; - case OP_RETURN: - print("RETURN\n"); - break; - case OP_RETVAL: - print("RETVAL\n"); - break; - case OP_PROCEDURE: - print("PROCEDURE %s %ulx %ulx\n", - s_to_c(((Symbol *) (*++p))->name), - (ulong *) (*++p) - prog, - (ulong *) (*++p) - prog); - offset += 3; - break; - case OP_CALL: - print("CALL %s\n", - s_to_c((String *) (*++pc))); - offset++; - break; - } - } - print("%08ulx\t\n", offset); - print("true:%ulx found:%ulx\n", offset, p - prog); -} //GO.SYSIN DD code.c echo dates sed 's/.//' >dates <<'//GO.SYSIN DD dates' -Tue Apr 22 22:27:02 EDT 2008 //GO.SYSIN DD dates echo expr.c sed 's/.//' >expr.c <<'//GO.SYSIN DD expr.c' -#include -#include -#include -#include "bentley.h" - -/* The lowest identifier is probably a very radical use of macros. The idea is to alias the name of the lowest operator precedence level so only the name needs to be changed. You can call it like - lowest(); -and can declare it like - static void lowest(void); -This file uses lowest in this method. If you are criticizing me of bad design, feel free to put yourself into a small cage. */ - -#define lowest assignment - -enum { /* bits for exprtype, returned by expr() */ - CONSTEXPR = 001, - LVALUE = 002, -}; - -static int exprtype = 0; -static Lex l; - -static void lowest(void); /* lowest level so far */ - -static ulong nup; -extern Symbol *curfn; - -/* primary: evaluate primary expression */ -static void primary(void) -{ - ulong tok; - - tok = lex(&l); - switch (tok) { - case IDENTIFIER: - exprtype &= ~CONSTEXPR; /* identifier access not constant */ - emit(OP_PUSHVAR); - emit((ulong) s_clone(l.ident)); - nup++; - break; - case NUMBER: - emit(OP_PUSHVAL); - emit(l.value); - nup++; - break; - case CHARACTER: - emit(OP_PUSHVAL); - emit((ulong) l.ch); - nup++; - break; - case '(': - lowest(); /* avoid calling expr directly so as to keep exprtype */ - expect(')'); - break; - } -} - -/* fncall: call a function evaluator */ -static void fncall(void) -{ - ulong tok; - Symbol *s; - - tok = lex(&l); - if (tok == IDENTIFIER) { - s = lookup(l.ident); - if (s == nil) { - unget(); - primary(); - } else if (s->type->basetype == T_FUNCTION || s->type->basetype == T_PROCEDURE) { - exprtype &= ~CONSTEXPR; /* calls not constant */ - nup += s->type->n; - if (s->type->n > 0) { - ulong n = s->type->n; - - expect('('); - for (; n > 0; n--) { - lowest(); - expect(n == 1 ? ')' : ','); - } - } - emit(OP_CALL); - emit((ulong) s->name); - } else { - unget(); - primary(); - } - } else { - unget(); - primary(); - } -} - -/* negate: negation evaluator */ -static void negate(void) -{ - ulong tok; - - tok = lex(&l); - switch (tok) { - case '-': - fncall(); - emit(OP_NEGATE); - break; - case '~': - fncall(); - emit(OP_COMPL); - break; - default: - unget(); - fncall(); - } -} - -/* term: term evaluator */ -static void term(void) -{ - ulong tok; - - negate(); - while ((tok = lex(&l)) == '*' || tok == O_DIV || tok == '%' || tok == K_DIV || tok == K_MOD) { - negate(); - switch (tok) { - case '*': - emit(OP_MULTIPLY); - break; - case O_DIV: - emit(OP_DIVIDE); - break; - case '%': - emit(OP_MODULUS); - break; - case K_DIV: - emit(OP_INTDIVIDE); - break; - case K_MOD: - emit(OP_INTMODULUS); - break; - } - } - unget(); -} - -/* additive: additive operator evaluator */ -static void additive(void) -{ - ulong tok; - - term(); - while ((tok = lex(&l)) == '+' || tok == '-') { - term(); - emit(tok == '+' ? OP_ADD : OP_SUBTRACT); - } - unget(); -} - -/* shifts: shift and roll evaluators */ -static void shifts(void) -{ - ulong tok; - - additive(); - while ((tok = lex(&l)) == O_SHL || tok == O_SHR || tok == O_ROL || tok == O_ROR) { - additive(); - switch (tok) { - case O_SHL: - emit(OP_SHL); - break; - case O_SHR: - emit(OP_SHR); - break; - case O_ROL: - emit(OP_ROL); - break; - case O_ROR: - emit(OP_ROR); - break; - } - } - unget(); -} - -/* relational: relational operator evaluator */ -static void relational(void) -{ - ulong tok; - - shifts(); - while ((tok = lex(&l)) == '<' || tok == O_LE || tok == '>' || tok == O_GE) { - shifts(); - switch (tok) { - case '<': - emit(OP_LESSTHAN); - break; - case '>': - emit(OP_GREATERTHAN); - break; - case O_LE: - emit(OP_LESSEQUAL); - break; - case O_GE: - emit(OP_GREATEREQUAL); - break; - } - } - unget(); -} - -/* equivalence: evaluate equivalence expressions */ -static void equivalence(void) -{ - ulong tok; - - relational(); - while ((tok = lex(&l)) == '=' || tok == O_NE) { - exprtype &= ~CONSTEXPR; /* assignments not constant */ - relational(); - emit(tok == '=' ? OP_EQUAL : OP_NOTEQUAL); - } - unget(); -} - -/* bitand: bitwise and expressions */ -static void bitand(void) -{ - ulong tok; - - equivalence(); - while ((tok = lex(&l)) == '&') { - equivalence(); - emit(OP_BITAND); - } - unget(); -} - -/* bitxor: bitwise xor expressions */ -static void bitxor(void) -{ - ulong tok; - - bitand(); - while ((tok = lex(&l)) == '^') { - bitand(); - emit(OP_BITXOR); - } - unget(); -} - -/* bitor: bitwise or expressions */ -static void bitor(void) -{ - ulong tok; - - bitxor(); - while ((tok = lex(&l)) == '|') { - bitxor(); - emit(OP_BITOR); - } - unget(); -} - -/* assignment: evaluate assignment expressions */ -static void assignment(void) -{ - char *savepos; - ulong tok; - String *identsave; - - savepos = getlexpos(); - tok = lex(&l); - if (tok == IDENTIFIER) { - exprtype &= ~CONSTEXPR; /* identifier access is not constant */ - identsave = s_clone(l.ident); - tok = lex(&l); - if (tok == O_ASSIGN) { - bitor(); - emit(OP_ASSIGN); - emit((ulong) s_clone(identsave)); - s_free(identsave); - return; - } - } - setlexpos(savepos); - bitor(); -} - -/* expr: initiate recursive-descent expression evaluator */ -int expr(void) -{ - nup = (curfn == nil) ? 0 : curfn->type->nstk; - exprtype = CONSTEXPR; /* initial state */ - lowest(); /* chain of calls change exprtype */ - setstacksize(nup); - return exprtype; -} //GO.SYSIN DD expr.c echo lex.c sed 's/.//' >lex.c <<'//GO.SYSIN DD lex.c' -#include -#include -#include -#include -#include -#include "bentley.h" - -#define advance() { curp++; ngotten++; } -#define advancen(n) { curp += n; ngotten += n; } -#define retract() { curp--; ngotten--; } - -static char *curln = nil; -static char *curp = nil; -static ulong ntabs = 0; -static ulong ngotten = 0; -static ulong lineno = 1, sawnewline = 0; - -extern Biobuf *istream; - -/* counttabs: count tabs at beginning of line */ -static void counttabs(void) -{ - ntabs = 0; - while (*curp == '\t') { - curp++; - ntabs++; - } -} - -/* followedby: see if c follows on input */ -static int followedby(char c) -{ - advance(); /* see next character */ - if (*curp == c) { /* if next character matches, skip it */ - advance(); - return 1; - } - retract(); /* otherwise, go back to previous character */ - return 0; -} - -/* escape: handle escape sequences */ -static char escape(char c) -{ - char stdesc[] = "n\nr\rt\tv\va\ab\bf\f"; - char *escpos; - - if ((escpos = strchr(stdesc, c)) != nil) - return *(escpos + 1); - return c; -} - -/* initlexstruct: initialize the Lex structure instance for safe use */ -void initlexstruct(Lex *l) -{ - l->value = 0; - l->ident = nil; - l->string.escaped = nil; -} - -/* getntabs: return number of tabs in current line */ -ulong getntabs(void) -{ - return ntabs; -} - -/* lex: lexer */ -ulong lex(Lex *l) -{ - Rune r; - int ntoskipifr; - char save; - - ngotten = 0; - if (curp != nil && *curp == '\0') { - sawnewline = 0; - free(curln); - curln = nil; - } - if (curln == nil) { - curln = Brdstr(istream, '\n', 0); /* 0 tells Brdstr to not eat '\n' */ - if (curln == nil) - return ENDFILE; - curp = curln; - counttabs(); - } - while (*curp == ' ' || *curp == '\t') - curp++; - if (isdigit(*curp)) { - l->value = 0; - while (isdigit(*curp)) { - l->value = l->value * 10 + (*curp - '0'); - advance(); - } - return NUMBER; - } - if (isalpha(*curp) || *curp == '_') { - ulong toktype; - - if (l->ident != nil) - s_free(l->ident); - l->ident = s_new(); - do { - s_putc(l->ident, *curp); - advance(); - } while (isalpha(*curp) || isdigit(*curp) || *curp == '_'); - s_terminate(l->ident); /* make it plausible for C */ - toktype = iskeyword(l->ident); - return toktype == 0 ? IDENTIFIER : toktype; - } - /* Okay, so we know it CAN contain ÷, ≠, ≤, or ≥. We convert to rune so we can check. */ - ntoskipifr = chartorune(&r, curp); - if (r == DIV || r == NE || r == LE || r == GE) { - advancen(ntoskipifr); - return (r == DIV) ? O_DIV : (r == NE) ? O_NE : ((r == LE) ? O_LE : O_GE); - } - /* Can't be any of those. */ - switch (*curp) { - case ':': - if (followedby('=')) /* := */ - return O_ASSIGN; - advance(); /* : */ - return ':'; - case '!': - if (followedby('=')) /* != */ - return O_NE; - curp++; /* ! */ - ngotten++; - return '!'; - case '<': - if (followedby('>')) /* <> */ - return O_NE; - else if (followedby('=')) /* <= */ - return O_LE; - else if (followedby('<')) /* << */ - return O_SHL; - else if (followedby('@')) /* <@ */ - return O_ROL; - advance(); /* < */ - return '<'; - case '>': - if (followedby('=')) /* >= */ - return O_GE; - else if (followedby('>')) /* >> */ - return O_SHR; - else if (followedby('@')) /* >@ */ - return O_ROR; - advance(); /* > */ - return '>'; - case '/': /* / */ - advance(); - return O_DIV; - case '\'': - advance(); - if (*curp == '\\') { - advance(); - l->ch = escape(*curp); - } else - l->ch = *curp; - advance(); - if (*curp != '\'') - sysfatal("expected \', got %c", *curp); - return CHARACTER; - case '\"': - if (l->string.escaped != nil) - s_free(l->string.escaped); - l->string.escaped = s_new(); - for (curp++, ngotten++; *curp != '\"'; curp++, ngotten++) - s_putc(l->string.escaped, *curp); - s_terminate(l->string.escaped); - advance(); /* eat terminating " */ - return STRING; - case '\n': - if (!sawnewline) { /* in case it was put back, don't count again */ - lineno++; - sawnewline = 1; - } - /* fall through */ - default: /* all other tokens are one character -- return it */ - save = *curp; - advance(); - return save; - } -} - -/* unget: push last token back on input */ -void unget(void) -{ - curp -= ngotten; - ngotten = 0; -} - -/* tokfmt: format a token (%T) */ -int tokfmt(Fmt *f) -{ - ulong tok; - char *c; - - tok = va_arg(f->args, ulong); - if ((c = tokiskeyword(tok)) != nil) /* why it cannot be switch */ - return fmtprint(f, "%s", c); - else if (tok == O_ASSIGN) - return fmtprint(f, ":="); - else if (tok == O_DIV) - return fmtprint(f, "%C", L'÷'); - else if (tok == O_NE) - return fmtprint(f, "%C", L'≠'); - else if (tok == O_LE) - return fmtprint(f, "%C", L'≤'); - else if (tok == O_GE) - return fmtprint(f, "%C", L'≥'); - else if (isprint(tok)) /* also why */ - return fmtprint(f, "%c", (char) tok); - else if (tok == '\n') - return fmtprint(f, "newline"); - else - return fmtprint(f, "%uld", tok); -} - -/* getlineno: get current line number */ -ulong getlineno(void) -{ - return lineno; -} - -/* getlexpos: return current position in input line */ -char *getlexpos(void) -{ - return curp; -} - -/* setlexpos: restore saved position */ -void setlexpos(char *where) -{ - curp = where; - ngotten = 0; -} //GO.SYSIN DD lex.c echo main.c sed 's/.//' >main.c <<'//GO.SYSIN DD main.c' -#include -#include -#include -#include -#include "bentley.h" - -Biobuf *istream = nil, *bsout = nil; -String *filename = nil; -String *outfile = nil; - -static int Sflag = 0; /* -S prints asm to stdout without compiling */ - -/* system: run program */ -void system(char *prgm) -{ - int pid; - char errs[ERRMAX]; - Waitmsg *m; - - pid = fork(); - switch (pid) { - case -1: - sysfatal("couldn't run %ca", argv0[0]); - case 0: - execl("/bin/rc", "rc", "-c", prgm, nil); - rerrstr(errs, ERRMAX); /* otherwise, get errstr as return value */ - exits(errs); - }; - /* parent process - wait and abort if error */ - m = wait(); /* wait calls malloc to get the Waitmsg */ - if (m->pid != pid) - sysfatal("what did we wait for? pid %d?", m->pid); - else if (m->msg[0] != '\0') /* didn't succeed */ - sysfatal("%ca didn't succeed: %s", argv0[0], m->msg); - /* otherwise success */ -} - -/* usage: alert user of bad usage */ -void usage(void) -{ - fprint(2, "usage: %s [-S] [-o file] file\n", argv0); - exits("usage"); -} - -void main(int argc, char *argv[]) -{ - char *t; - ulong nerrs; - char tmpn[] = "/tmp/bentley.s.XXXXXXXXXXX"; - Biobuf btmp; /* this is necessary because Binit requires an allocated Biobuf, not a pointer to random memory (for -S) */ - - ARGBEGIN { - case 'S': - Sflag = 1; - break; - case 'o': - t = EARGF(usage()); /* EARGF -> if not enough args, call usage and abort */ - outfile = s_copy(t); /* this is why we needed to save t */ - break; - default: - usage(); - } ARGEND; - if (argc != 1) /* by now, only input file */ - usage(); - filename = s_copy(argv[0]); - if (outfile == nil) { /* take input name but change .b to .{first letter of argv0} */ - outfile = s_new(); - if (utflen(argv[0]) >= 1) - s_nappend(outfile, argv[0], utflen(argv[0]) - 1); - else - s_append(outfile, argv[0]); - s_putc(outfile, argv0[0]); - s_terminate(outfile); /* make it acceptable for C */ - } - istream = Bopen(argv[0], OREAD); - if (istream == nil) - sysfatal("could not open %s: %r", argv[0]); - initprog(); - fmtinstall('T', tokfmt); - fmtinstall('Y', printtype); - nerrs = parse(); - if (nerrs != 0) - exits("error"); - emit(OP_STOP); - if (Sflag) { - Binit(&btmp, 1, OWRITE); - bsout = &btmp; - } else { - if (!strcmp(mktemp(tmpn), "/")) /* "/" is the error return value of mktemp, unfortunately */ - sysfatal("mktemp"); - bsout = Bopen(tmpn, OWRITE); /* Bopen for OWRITE does create */ - } - codegen(); - Bterm(bsout); - if (!Sflag) - system(smprint("%ca -o %s %s", argv0[0], s_to_c(outfile), tmpn)); -/* printprog();*/ - Bterm(istream); - s_free(outfile); - exits(0); -} //GO.SYSIN DD main.c echo mkfile sed 's/.//' >mkfile <<'//GO.SYSIN DD mkfile' -parse.c <<'//GO.SYSIN DD parse.c' -#include -#include -#include -#include "bentley.h" - -static Lex l; -static int indef = 0; -static String *identsave = nil; -static ulong nerrs = 0; - -extern String *filename; - -Symbol *curfn = nil; - -/* synerr: handle syntax errors */ -void synerr(char *fmt, ...) -{ - va_list ap; - - /* form is filename:lineno error - the same as in the C compilers */ - fprint(2, "%s:%uld ", s_to_c(filename), getlineno()); - va_start(ap, fmt); - vfprint(2, fmt, ap); - va_end(ap); - fprint(2, "\n"); - nerrs++; -} - -/* expect: look for given token, else error */ -void expect(ulong toktype) -{ - ulong got; - - if ((got = lex(&l)) != toktype) - synerr("didn't see expected token (%T, wanted %T)", got, toktype); -} - -/* doastmt: parse a single statement */ -static void doastmt(ulong ntabs) -{ - ulong tok; - ulong *oppos, *thenpos, *elsepos, *bodypos, *condpos, *initpos, *uptopos, *steppos, *nextstmt; - int haselse = 0; - Type *ty; - Symbol *sym; - char *savedpos; - - savedpos = getlexpos(); - tok = lex(&l); - switch (tok) { - case '\n': - case ENDFILE: - return; - case IDENTIFIER: - identsave = s_clone(l.ident); - tok = lex(&l); - switch (tok) { - case ':': - emit(OP_NEWVAR); - ty = gettype(); - sym = install(identsave, ty); - emit((ulong) sym); - break; - default: - setlexpos(savedpos); - expr(); - emit(OP_POP); - break; - } - s_free(identsave); - break; - case K_PRINT: - for (; tok != '\n'; ) { - tok = lex(&l); - switch (tok) { - case STRING: - emit(OP_PRINTSTRING); - emit((ulong) s_clone(l.string.escaped)); - break; - case '\n': - emit(OP_PRINTNEWLINE); - unget(); - break; - default: - unget(); - expr(); - emit(OP_PRINTEXPR); - } - tok = lex(&l); - switch (tok) { - case ',': - continue; - case '\n': - unget(); - break; - default: - synerr("expected , or newline, got %T", tok); - } - } - break; - case K_IF: - expr(); - emit(OP_IF); - thenpos = emit(OP_STOP); - elsepos = emit(OP_STOP); - nextstmt = emit(OP_STOP); - *thenpos = (ulong) getprogpos(); - expect(K_THEN); - expect('\n'); - /* haselse: - -1 no else - 0 not known - 1 else */ - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - break; - else if (haselse == 1 && getntabs() == ntabs + 1) - break; - else if (haselse == -1 && getntabs() > ntabs + 1) - synerr("too many tab indents"); - else if (haselse == 1 && getntabs () > ntabs + 2) - synerr("too many tab indents"); - else if (getntabs() == ntabs + 2) { - if (haselse == -1) - synerr("too many tab indents"); - haselse = 1; - doastmt(ntabs + 2); - } else { - haselse = -1; - doastmt(ntabs + 1); - } - } - emit(OP_STOP); /* show where then ends */ - *elsepos = (ulong) getprogpos(); - if (haselse == 1) { - expect(K_ELSE); - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - break; - else if (getntabs() > ntabs + 2) - synerr("too many tab indents"); - else - doastmt(ntabs + 2); - } - } - emit(OP_STOP); /* either mark end of ELSE or mark no ELSE */ - *nextstmt = (ulong) getprogpos(); - break; - case K_ELSE: - synerr("else without if"); - break; - case K_WHILE: - emit(OP_WHILE); - condpos = emit(OP_STOP); - bodypos = emit(OP_STOP); - nextstmt = emit(OP_STOP); - *bodypos = (ulong) getprogpos(); - *condpos = (ulong) getprogpos(); - expr(); - emit(OP_STOP); - expect(K_DO); - expect('\n'); - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - break; - else if (getntabs() > ntabs + 1) - synerr("too many tab indents"); - else - doastmt(ntabs + 1); - } - emit(OP_STOP); /* mark end of while/loop */ - *nextstmt = (ulong) getprogpos(); - break; - case K_LOOP: - emit(tok == K_WHILE ? OP_WHILE : OP_LOOP); - bodypos = emit(OP_STOP); - nextstmt = emit(OP_STOP); - *bodypos = (ulong) getprogpos(); - expect('\n'); - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - break; - else if (getntabs() > ntabs + 1) - synerr("too many tab indents"); - else - doastmt(ntabs + 1); - } - emit(OP_STOP); /* mark end of while/loop */ - *nextstmt = (ulong) getprogpos(); - break; - case K_REPEAT: - emit(OP_REPEAT); - bodypos = emit(OP_STOP); - condpos = emit(OP_STOP); - nextstmt = emit(OP_STOP); - *bodypos = (ulong) getprogpos(); - expect('\n'); - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - synerr("repeat without until"); - else if (getntabs() == ntabs + 1) - break; - else if (getntabs() > ntabs + 2) - synerr("too many tab indents"); - else - doastmt(ntabs + 2); - } - emit(OP_STOP); - expect(K_UNTIL); - *condpos = (ulong) getprogpos(); - expr(); - expect('\n'); - emit(OP_STOP); - *nextstmt = (ulong) getprogpos(); - break; - case K_UNTIL: - synerr("until without repeat"); - break; - case K_FOR: - oppos = emit(OP_STOP); - expect(IDENTIFIER); - emit((ulong) s_clone(l.ident)); - expect(O_ASSIGN); - initpos = emit(OP_STOP); - uptopos = emit(OP_STOP); - steppos = emit(OP_STOP); - bodypos = emit(OP_STOP); - nextstmt = emit(OP_STOP); - *initpos = (ulong) getprogpos(); - expr(); - emit(OP_STOP); - tok = lex(&l); - if (tok == K_TO) - *oppos = OP_FORTO; - else if (tok == K_DOWNTO) - *oppos = OP_FORDOWNTO; - else - synerr("expected to or downto, got %T", tok); - *uptopos = (ulong) getprogpos(); - expr(); - emit(OP_STOP); - *steppos = (ulong) getprogpos(); - tok = lex(&l); - if (tok == K_BY) - expr(); - else { - unget(); - emit(OP_PUSHVAL); /* default inc/dec == 1 */ - emit((ulong) 1); - } - emit(OP_STOP); - *bodypos = (ulong) getprogpos(); - expect(K_DO); - expect('\n'); - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - break; - else if (getntabs() > ntabs + 1) - synerr("too many tab indents"); - else - doastmt(ntabs + 1); - } - emit(OP_STOP); - *nextstmt = (ulong) getprogpos(); - break; - case K_RETURN: - tok = lex(&l); - unget(); - if (tok == '\n') - emit(OP_RETURN); - else { - expr(); - emit(OP_RETVAL); - } - break; - case K_PROCEDURE: - /* if not already declared, declare it */ - expect(IDENTIFIER); - identsave = s_clone(l.ident); - if ((sym = lookup(identsave)) == nil) { - ty = emalloc(sizeof (Type)); - ty->visibility = 0; - ty->basetype = T_PROCEDURE; - ty->derives = nil; - ty->n = ty->nstk = 0; - tok = lex(&l); - if (tok == '(') - handleargs(ty); - else - unget(); - sym = install(identsave, ty); - emit(OP_NEWVAR); - emit((ulong) sym); - } else if (sym->type->basetype != T_PROCEDURE) - synerr("%s declared as %Y, but defined as procedure", s_to_c(sym->name), sym->type); - curfn = sym; - /* now that we have a declaration, define it */ - emit(OP_PROCEDURE); - emit((ulong) sym); - bodypos = emit(OP_STOP); - nextstmt = emit(OP_STOP); - *bodypos = (ulong) getprogpos(); - expect('\n'); - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - break; - else if (getntabs() > ntabs + 1) - synerr("too many tab indents"); - else - doastmt(ntabs + 1); - } - emit(OP_STOP); - curfn = nil; - *nextstmt = (ulong) getprogpos(); - break; - case K_FUNCTION: - /* if not already declared, declare it */ - expect(IDENTIFIER); - identsave = s_clone(l.ident); - if ((sym = lookup(identsave)) == nil) { - ty = emalloc(sizeof (Type)); - ty->visibility = 0; - ty->basetype = T_FUNCTION; - ty->n = ty->nstk = 0; - tok = lex(&l); - if (tok == '(') - handleargs(ty); - else - unget(); - expect(':'); - ty->derives = gettype(); - sym = install(identsave, ty); - emit(OP_NEWVAR); - emit((ulong) sym); - } else if (sym->type->basetype != T_FUNCTION) - synerr("%s declared as %Y, but defined as function", s_to_c(sym->name), sym->type); - curfn = sym; - /* now that we have a declaration, define it */ - emit(OP_FUNCTION); - emit((ulong) sym); - bodypos = emit(OP_STOP); - nextstmt = emit(OP_STOP); - *bodypos = (ulong) getprogpos(); - expect('\n'); - for (;;) { - tok = lex(&l); - unget(); - if (tok == ENDFILE || getntabs() <= ntabs) - break; - else if (getntabs() > ntabs + 1) - synerr("too many tab indents"); - else - doastmt(ntabs + 1); - } - emit(OP_STOP); - curfn = nil; - *nextstmt = (ulong) getprogpos(); - break; - default: - expr(); - emit(OP_POP); - break; - } -} - -/* parse: the Bentley parser */ -ulong parse(void) -{ - while (lex(&l) != ENDFILE) { - unget(); - doastmt(0); - } - return nerrs; -} //GO.SYSIN DD parse.c echo symtbl.c sed 's/.//' >symtbl.c <<'//GO.SYSIN DD symtbl.c' -#include -#include -#include -#include "bentley.h" - -static Symbol *globals = nil; -static Symbol *curscope = nil; - -static struct { - char *name; - ulong tokval; -} keywords[] = { - "integer", K_INTEGER, - "real", K_REAL, - "character", K_CHARACTER, - "bits", K_BITS, - "pointer", K_POINTER, - "array", K_ARRAY, - "of", K_OF, - "function", K_FUNCTION, - "procedure", K_PROCEDURE, - "record", K_RECORD, - "union", K_UNION, - "constant", K_CONSTANT, - "enumeration", K_ENUMERATION, - "external", K_EXTERNAL, - "static", K_STATIC, - "private", K_PRIVATE, - "if", K_IF, - "then", K_THEN, - "else", K_ELSE, - "case", K_CASE, - "fall", K_FALL, - "other", K_OTHER, - "loop", K_LOOP, - "while", K_WHILE, - "do", K_DO, - "for", K_FOR, - "to", K_TO, - "downto", K_DOWNTO, - "by", K_BY, - "repeat", K_REPEAT, - "until", K_UNTIL, - "break", K_BREAK, - "breakout", K_BREAKOUT, - "continue", K_CONTINUE, - "return", K_RETURN, - "div", K_DIV, - "mod", K_MOD, - "print", K_PRINT, - 0, 0 -}; - -/* iskeyword: see if s is keyword, return token value if so, 0 if not */ -ulong iskeyword(String *n) -{ - int i; - - for (i = 0; keywords[i].name != 0; i++) - if (!strcmp(s_to_c(n), keywords[i].name)) - return keywords[i].tokval; - return 0; -} - -/* tokiskeyword: return string associated with keyword token, nil if not keyword */ -char *tokiskeyword(ulong tok) -{ - int i; - - for (i = 0; keywords[i].name != 0; i++) - if (keywords[i].tokval == tok) - return keywords[i].name; - return nil; -} - -/* lookup: find symbol in symbol table */ -Symbol *lookup(String *s) -{ - Symbol *st; - - for (st = curscope; st != nil; st = st->next) - if (!strcmp(s_to_c(s), s_to_c(st->name))) - return st; - for (st = globals; st != nil; st = st->next) - if (!strcmp(s_to_c(s), s_to_c(st->name))) - return st; - return nil; -} - -/* scopeof: return 0 if not found, 1 if global, -1 if local */ -int scopeof(String *s) -{ - Symbol *st; - - for (st = curscope; st != nil; st = st->next) - if (!strcmp(s_to_c(s), s_to_c(st->name))) - return -1; - for (st = globals; st != nil; st = st->next) - if (!strcmp(s_to_c(s), s_to_c(st->name))) - return 1; - return 0; -} - -/* install: add symbol to symbol table */ -Symbol *install(String *name, Type *type) -{ - Symbol *t; - - t = (Symbol *) malloc(sizeof (Symbol)); - t->name = s_clone(name); - t->type = type; - if (curscope == nil) { - /* global: allocate in reverse */ - t->next = globals; - globals = t; - } else { - /* locals: allocate in same order -- VERY IMPORTANT */ - Symbol *s; - - for (s = curscope; s->next != nil; ) - s = s->next; - s->next = t; - t->next = nil; - } - return t; -} - -/* emalloc: allocate and error-check */ -void *emalloc(ulong n) -{ - void *m; - - m = malloc(n); - if (m == nil) - sysfatal("memory exhausted"); - return m; -} - -/* erealloc: reallocate and error-check */ -void *erealloc(void *m, ulong n) -{ - void *p; - - p = realloc(m, n); - if (p == nil) { - free(m); /* m is still valid */ - sysfatal("memory exhausted"); - } - return p; -} - -/* setcurscope: set current scope */ -void setcurscope(Symbol *scope) -{ - curscope = scope; -} //GO.SYSIN DD symtbl.c echo test.b sed 's/.//' >test.b <<'//GO.SYSIN DD test.b' -procedure main - print "hello, world\n" - i: integer - j: integer - i := 4 - j := i + 3 + 4 - i := j * i / -3 div (4 - 2) mod 6 % 3 - print i - print " " - print j - print - if j = 11 then - print "j is 11!\n" - if j = 11 then - print "j is 11 again!\n" - else - print "can't happen\n" - repeat - if j mod 2 then - print "j is odd\n" - else - print "j is even\n" - j := j - 1 - until j = 0 - for j := 2 to 5 do - print j - print - for j := 5 downto 2 do - print j - print - loop - i := 1 -procedure x - print "hello" - return //GO.SYSIN DD test.b echo type.c sed 's/.//' >type.c <<'//GO.SYSIN DD type.c' -#include -#include -#include -#include "bentley.h" - -static Lex l; - -/* gettype: parse type */ -Type *gettype(void) -{ - ulong tok; - Type *t; - ulong n; - - t = emalloc(sizeof (Type)); - t->visibility = 0; - t->basetype = 0; - t->n = 0; - t->nstk = 0; - t->arguments = nil; - t->derives = nil; - /* visibility */ - tok = lex(&l); - switch (tok) { - case K_STATIC: - t->visibility = V_STATIC; - break; - case K_PRIVATE: - t->visibility = V_PRIVATE; - break; - default: - unget(); - } - /* actual type */ - tok = lex(&l); - switch (tok) { - case K_INTEGER: - t->basetype = T_INTEGER; - break; - case K_REAL: - t->basetype = T_REAL; - break; - case K_CHARACTER: - t->basetype = T_CHARACTER; - break; - case K_POINTER: - tok = lex(&l); - if (tok != K_TO) { /* pointer by itself means pointer to anything */ - t->basetype = T_ABSPOINTER; - unget(); - break; - } - /* fall through - pointer to something is the same as ^something */ - case '^': - t->basetype = T_POINTER; - t->derives = gettype(); - break; - case K_ARRAY: - t->basetype = T_ARRAY; - expect('['); - expect(NUMBER); /* expect modifies parse.c's Lex, unfortunately */ - unget(); - lex(&l); - t->n = l.value; - if (t->n == 0) - synerr("empty array"); - expect(']'); - expect(K_OF); - t->derives = gettype(); - break; - case K_FUNCTION: - t->basetype = T_FUNCTION; - tok = lex(&l); - if (tok == '(') - handleargs(t); - else - unget(); - expect(':'); - t->derives = gettype(); - break; - case K_PROCEDURE: - tok = lex(&l); - if (tok == '(') - handleargs(t); - else - unget(); - t->basetype = T_PROCEDURE; - break; - case K_STATIC: /* repeated visibility */ - case K_PRIVATE: - synerr("visiblity repeated or in wrong place"); - case NUMBER: - n = l.value; - expect(K_BITS); - t->basetype = T_BITS; - t->n = n; - break; - default: - synerr("expected type, got %T", tok); - } - return t; -} - -/* handleargs: handle function arguments */ -void handleargs(Type *t) -{ - String *isave; - Type *td; - ulong tok; - - for (tok = 0; tok != ')'; ) { - tok = lex(&l); - if (tok == IDENTIFIER) { - isave = s_clone(l.ident); - expect(':'); - td = gettype(); - if (t->arguments != nil) - install(isave, td); - else { - t->arguments = (Symbol *) emalloc(sizeof (Symbol)); - t->arguments->name = s_clone(isave); - t->arguments->type = td; - t->arguments->next = nil; - setcurscope(t->arguments); - } - s_free(isave); - t->n++; - tok = lex(&l); - switch (tok) { - case ',': - case ')': - break; - default: - synerr("expected , or ), got %T", tok); - } - } else if (tok == ')') - break; - else - synerr("expected argument or ), got %T", tok); - } - setcurscope(nil); /* restore global scope */ -} - -/* printtype: print type in good way */ -int printtype(Fmt *f) -{ - Type *t; - int x = 1; - - t = va_arg(f->args, Type *); - if (t->visibility) { - switch (t->visibility) { /* save status so we can tally forth */ - case V_STATIC: - x = fmtprint(f, "static "); - break; - case V_PRIVATE: - x = fmtprint(f, "private "); - break; - } - if (x < 0) /* but kill the rider and snag the horse if there was a problem */ - return x; - } - switch (t->basetype) { - case T_INTEGER: - return fmtprint(f, "integer"); - case T_REAL: - return fmtprint(f, "real"); - case T_CHARACTER: - return fmtprint(f, "character"); - case T_ABSPOINTER: - return fmtprint(f, "pointer"); - case T_POINTER: - return fmtprint(f, "^%Y", t->derives); - case T_ARRAY: - return fmtprint(f, "array[%uld] of %Y", t->n, t->derives); - case T_FUNCTION: - return fmtprint(f, "function: %Y", t->derives); - case T_PROCEDURE: - return fmtprint(f, "procedure"); - case T_BITS: - return fmtprint(f, "%uld bits", t->n); - default: /* invalid type specification */ - return -1; - } -} //GO.SYSIN DD type.c declare it */ - expect(IDold_contrib//bentley.profout 664 0 0 6027 11411736762 14704ustar00pietrosys % Time Calls Name 100.04060494.966 127 pooladd 0.0 0.002 54 lex 0.0 0.002 1 main 0.0 0.002 10 doastmt 0.0 0.001 2 negate 0.0 0.001 1 parse 0.0 0.001 4 assignment 0.0 0.000 2 fmtinstall 0.0 0.000 2 _fmtinstall 0.0 0.000 172 unlock 0.0 0.000 173 lock 0.0 0.000 40 memset 0.0 0.000 173 _tas 0.0 0.000 15 strlen 0.0 0.000 14 strcpy 0.0 0.000 1 read 0.0 0.000 8 memmove 0.0 0.000 4 sbrk 0.0 0.000 93 setrealloctag 0.0 0.000 2 term 0.0 0.000 1 setstacksize 0.0 0.000 2 primary 0.0 0.000 16 emit 0.0 0.000 2 fncall 0.0 0.000 2 additive 0.0 0.000 2 bitor 0.0 0.000 2 expr 0.0 0.000 2 bitxor 0.0 0.000 2 bitand 0.0 0.000 2 shifts 0.0 0.000 2 relational 0.0 0.000 2 equivalence 0.0 0.000 1 initprog 0.0 0.000 4 emalloc 0.0 0.000 18 getntabs 0.0 0.000 26 unget 0.0 0.000 6 counttabs 0.0 0.000 6 followedby 0.0 0.000 14 getlexpos 0.0 0.000 2 lookup 0.0 0.000 3 install 0.0 0.000 23 iskeyword 0.0 0.000 4 setlexpos 0.0 0.000 2 expect 0.0 0.000 2 gettype 0.0 0.000 147 plock 0.0 0.000 146 punlock 0.0 0.000 3 sbrkmerge 0.0 0.000 4 sbrkalloc 0.0 0.000 48 malloc 0.0 0.000 136 setmalloctag 0.0 0.000 6 realloc 0.0 0.000 40 mallocz 0.0 0.000 53 free 0.0 0.000 2 utflen 0.0 0.000 738 strcmp 0.0 0.000 27 chartorune 0.0 0.000 2 _fmtunlock 0.0 0.000 2 _fmtlock 0.0 0.000 53 poolfreel 0.0 0.000 6 poolreallocl 0.0 0.000 94 poolallocl 0.0 0.000 93 B2D 0.0 0.000 53 D2B 0.0 0.000 88 poolalloc 0.0 0.000 6 poolrealloc 0.0 0.000 53 poolfree 0.0 0.000 15 s_copy 0.0 0.000 65 s_terminate 0.0 0.000 94 s_putc 0.0 0.000 1 s_nappend 0.0 0.000 1 Bopen 0.0 0.000 7 memchr 0.0 0.000 25 s_new 0.0 0.000 15 s_newalloc 0.0 0.000 24 s_free 0.0 0.000 40 _s_alloc 0.0 0.000 1 Binits 0.0 0.000 6 Brdstr 0.0 0.000 6 badd 0.0 0.000 86 blockcheck 0.0 0.000 142 getcallerpc 0.0 0.000 94 blocksetdsize 0.0 0.000 4 bsize2asize 0.0 0.000 30 blockmerge 0.0 0.000 147 blocksetsize 0.0 0.000 119 treedelete 0.0 0.000 338 dsize2bsize 0.0 0.000 126 pooldel 0.0 0.000 98 treelookupgt 0.0 0.000 126 listdelete 0.0 0.000 56 getdsize 0.0 0.000 95 trim 0.0 0.000 3 arenamerge 0.0 0.000 3 blockgrow 0.0 0.000 7 arenasetsize 0.0 0.000 4 poolnewarena 0.0 0.000 126 listadd 0.0 0.000 126 treeinsert 0.0 0.000 498 ltreewalk ywords[i].name != 0; i++) - if (!strcmp(s_to_c(n), keywords[i].name)) - return keywords[i].tokval; - return 0; -} - -/* tokiskeyword: return string associated with keyword token, nil if not keyword */ -char *tokiskeyword(ulong tok) -{ - int i; - - for (i = 0; keywords[i].name != 0; i++) - if (keywords[i].tokval == tok) - return keywords[i].name; - return nil; -} - -/* lookup: find symbol in symbol table */ -Symbol *lookup(String *s) -{ - Symbol *st; - - for (st = curscope; st old_contrib//closeall 775 0 0 470 11411736763 13323ustar00pietrosys#!/bin/rc # closeall: close all rio windows # pietro gagliardi - 8 aug 2008 rfork e fn sigint{ echo 'can''t be interrupted' >[1=2] } fn sighup{ echo 'can''t be interrupted' >[1=2] } id=`{cat /dev/winid} cd /dev/wsys for(i in *) if(! ~ `{cat $i/winid} $id) echo delete > $i/wctl echo delete > /dev/wctl old_contrib//colors.bundle 664 0 0 11334 11411736451 14326ustar00pietrosys# To unbundle, run this file echo colors sed 's/.//' >colors <<'//GO.SYSIN DD colors' -.TH COLORS 2 -.SH NAME -prepare_colors, get_color, free_colors, color_point \- color access functions -.SH SYNOPSIS -.nf -.PP -.ft L -#include -#include -#include -#include "colors.h" - -.PP -.B -int prepare_colors(void); -.PP -.B -Image *get_color(int color_id); -.PP -.B -void free_colors(void); -.PP -.B -Point color_point; -.fi -.SH DESCRIPTION -The -.I colors -library contains a clean method for accessing solid colors from within Plan 9 programs. -For example, instead of saying -.IP -.EX -Image *red = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, DRed); -Point zero_point = { 0, 0 }; -/* ... */ -line(screen, point_a, point_b, Endsquare, Endsquare, 1, - red, zero_point); -.EE -.PP -you could just say -.IP -.EX -line(screen, point_a, point_b, Endsquare, Endsquare, 1, - get_color(DRed), color_point); -.EE -.PP -This avoids the necessity of working with multiple variables if you are working with multiple colors. -The library uses an array so there is no overhead and each color is allocated once. -.PP -The routine -.I prepare_colors -does the work of doing the -.IR allocimage (2) -calls for you. -It returns 0 on success and -1 on failure. -The routine itself does not set -.IR errstr (2), -although a routine it calls (such as -.IR allocimage (2)) -can. -You should call this routine after you call -.IR initdisplay (2). -.PP -The routine -.I get_color -does the color-grabbing work. -You give it a color from the enumeration described in the man page for -.IR allocimage (2), -and it returns a -.B Image\ * -corresponding to the color of choice. -It returns a null pointer if there was an error. -.PP -The routine -.I end_colors -frees the space that the colors takes up. -Call this at the end of the program to avoid memory leaks. -.PP -Most, if not all, of the drawing routine that take a color also ask for point in the image with the color; this tells the routine where in the picture to get the color. -THe global variable -.I color_point -has this, which is simply (0,0). -Pass this value to a function that needs it. -.SH "COMPILING AND LINKING" -Compile colors.c with one of the -.IR 0c (1) -family of programs; this will result in a library file that is linked with the output program. -Each source file that uses the color routines should include colors.h. -Whether or not the header is in a standard directory depends on the installation. -.SH DIAGNOSTICS -These do not set -.IR errstr (2), -although functions called by the routines can. -.SH "SEE ALSO" -.IR graphics (2), -.IR draw (2), -.IR allocimage (2). -.SH HISTORY -The files colors.c, colors.h, and colors (the man page) were written by Pietro Gagliardi on October 8, 2007. //GO.SYSIN DD colors echo colors.c sed 's/.//' >colors.c <<'//GO.SYSIN DD colors.c' -/* colors: a library to facilitate accessing solid colors in Plan 9 - Pietro Gagliardi - October 8, 2007 */ -#include -#include -#include -#include -#include "colors.h" - -static struct { - int clr_id; - Image *image; -} _colors[] = { - DBlack, 0, - DWhite, 0, - DRed, 0, - DGreen, 0, - DBlue, 0, - DCyan, 0, - DMagenta, 0, - DYellow, 0, - DPaleyellow, 0, - DDarkyellow, 0, - DDarkgreen, 0, - DPalegreen, 0, - DMedgreen, 0, - DDarkblue, 0, - DPalebluegreen, 0, - DPaleblue, 0, - DBluegreen, 0, - DGreygreen, 0, - DPalegreygreen, 0, - DYellowgreen, 0, - DMedblue, 0, - DGreyblue, 0, - DPalegreyblue, 0, - DPurpleblue, 0, - DNotacolor, 0, /* marks the end of the array */ -}; - -Point color_point = { 0, 0 }; /* use to actually get the point */ - -/* prepare_colors: initialize colors */ -int prepare_colors(void) -{ - int i; - Image *p; - - for (i = 0; _colors[i].clr_id != DNotacolor; i++) { - p = allocimage(display, Rect(0, 0, 1, 1), - RGB24, 1, _colors[i].clr_id); - if (p == 0) - return -1; /* allocation failed */ - _colors[i].image = p; - } - return 0; -} - -/* get_color: get the color */ -Image *get_color(int id) -{ - int i; - - for (i = 0; _colors[i].clr_id != DNotacolor; i++) - if (_colors[i].clr_id == id) - return _colors[i].image; - return 0; -} - -/* free_colors: regain memory when done */ -void free_colors(void) -{ - int i; - - for (i = 0; _colors[i].clr_id != DNotacolor; i++) - freeimage(_colors[i].image); -} //GO.SYSIN DD colors.c echo colors.h sed 's/.//' >colors.h <<'//GO.SYSIN DD colors.h' -/* colors: a library to facilitate accessing solid colors in Plan 9 - Pietro Gagliardi - October 8, 2007 */ - -/* I expect that you have included everything already, otherwise there will be - errors. The files are , , and . */ - -extern Point color_point; -extern int prepare_colors(void); -extern Image *get_color(int); -extern void free_colors(void); //GO.SYSIN DD colors.h ustar00pietrosysold_contrib//consolasi.bit 664 0 0 123532 11411736763 14356ustar00pietrosyscompressed k4 0 0 850 1100 76 5932 ||||||||||||4||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8|| |"||||||||||< |,,_||||U|"_|%\|D|<' s |"$(PP    q р 5( S U.5\8#|88i @M/ jׂUe TPXz b%Z 7@2.g'sZj f2c vP,B},|84)R$Z  U( =t$!wU/4< X ЂUn0I'  [ n8|8 =$'DeZ$ hP=\1 S%.a[PU a{%.c>y $|88<T- 3,7 ݂ 1 UP cPC3RY A__U2 l# _ Ё*Lm8#|8a;Q n)CPX0H \ .P.j%@ZL<,N1 ?P vPgP-  D_v5{.||^Nu";;Z||/~|"||\MT||Pπ5 1||xL||| ~P||xgo|?|||j||||L||||||||||||8||||||||||||8||||||||||||8||||PUZUd$4_`-5,$||||0|Y_ EPL 7c    5%UL P@8e5,$ ĄHd|SLf:||X _ (U M  Z %  8<  $UI9 qMۀ|PO>I|`|YU z?s h5x 0 61_(,K .P P DP1 P%m j/# y jU-_}Op|TP FN  5 ^ U*UI $**_ TP_ [U{ < % ր/$S  P ,U yj_g||TU  Ps_q UZ*4P(L2T 1 > {(U3% P j<}x|] # { =׀ U)w3L0T Sp+J$xU lU%-* Q0(|@|T *2M !ց U )D)% 'r_(xb) F IOb Q?}Op|T  d )/  q S 03%,x9P_ :  )  P(|P|POP Tπ u -K -\,S$j 6*"# T %TUzրC ̓ ,|<||3i|"|0KM|(O|H+`||t||,l|| |Rx+`|}||8D||1~|JU KUZ|+|K|D||L|RUH||||||||||||8||||||||||||8||||||||| L U|I||xp|<|||||_)U  %|I||\  =mPC5 ZU2 68U=:OHp:'Q4|D|_* Q0ڀ D <R HSZ-'  :<d,4y|.:|6 PQ*d|MN _=40;  KU)}U PH<_1 +|,}_r||Pvg. Y-<05 =_x-jD|4\ UU U IsH&\1<#```S ɀ PZ) qMp-<- _ZD|4P v ǀ  P? (€ |w#c3`4_  Fj>5U,

<)Z /Qp|T._+ %  </G||8 $ V =PU6 Q' ;P Pc q<jZ)5 -U = R%YUm K_ U _ P U |$|;I ^$ ʀ_ XCEj-_sr<j LU S Tq3#5 u  P /P ǁP_ _$||4r ۂ_P~Ú jP -d:MQM%&A U %C0Z.@ kD< _ U <}8|4   d b .EM %j_|) 50B` U.@_ ÀU s | |4P  8 K~ d_ UL'W`-K`4jt ;U ցZ 2ZB$<U Q AP||?Q#kh ̀ )'  - - * _,c`U _ tP qw+@_ > "U I}8|4 ́ v=Ԁ P h [ - Sj,^ .U &-Ձ; <-<4- - &| |4U_  v k:. .U_U_ P Uq:hh =PI恠Z ׀X  &P  %<4-U s_Z+p||9 c \ dM / P  {5 . lP  : <h   <-2)3 z RP r %<0- Z}f4|9 $~ `; dPS[4siq-0L4 ς z_ U ;[2& -<0- U||4' ) Ҁ_ .`с_ S [ 9lK% % L '#vb`_/2-<0- U||=P( %U _R[ FxQ)zQ8/QU$'X P  P-<0- }8|4 # 5P~P5 xjxS SKS y P j ՂU -<0- _||<|||)<40|||'T||<|v|4ZR|*<G0S|||)(|<|Y || Z Z|*|0Sb|||,z~\||||/|||||||||YT,08kPPc|||||||(|TU,׀U,%ryilS J7`5||"||||D|;IE.4_ ,rL| z R(-ǯ g4U,6 L6tZ|#l|;I3. i_ SUU_ǀUu~U/Z@€;Pg ? %Âa y7 S(Si2,4p , 8IQ#߀ZтUUP)!;||T_1(} %H[R_<  h Y|,b|"   ZX)P||:%)rP:/- s34PFkU 0)||HSm 0N ͂UQ ) U 6h|:/ &}I X -NS_Ec[ ||Hp,l.    ) d|9D_ -d3Xn?:.U_Z Eq,||P퀯,|2 偡) +h|4P ]"F %TG8;D_M̂ac||8sY| Z) 'πZ|S|9DZ h0sH P_ @,"T26.Uo}_4|TPU +Q &h ƁI[ - &rPPj-\\.gLy za nPAp@_΃q}^4|bt||cw||#)|/||h|T+PD||||hb |i,|"|||X|||~|| l|i|||8||||||||||||8 379 5989 ||||||||||||4|0|#|||||||||||4|#|||T|"|P |*|||4_t(Z>,>_ &Z0ILP0&U(.U L U TLK}(|||4Tp'0-c6 9 KCP \U - T,ށU 5Lz||P|4E|% c*&(UP-8y+R U b 5:P Z P(R:UU ΁c(+es||H|(jGh-E|> u0WUULȁU ,KU=@ (y2 9ZU$P >B||QHUM ,,|8 mU 5Pނ 4 J!'+hd."NlP b Ra$||Ձ_HD- )D|;QZ IA U5 PcPEFZN(耯5(RA[2] /dev/null | sed 's/INDEX$//'} for(i in $subdirs ) { cat $i/INDEX | grep '^[^ :]+:.+$' | sed 's%^%INDEX='$i'%' } ls -l $d $subdirs | grep -v '(INDEX|README)' } |grep -v '^$' | awk ' /^INDEX=/ { $0 = substr($0,7) c = index($0,":") idx[substr($0,1,c-1)] = substr($0,c+1) next } { d = "" if (substr($0,1,1) == "d") d = "/" print " * "$10 d" - " idx[$10] " ("$7" "$8" "$9")" } ' | sort if (! ~ $d ../extra) { echo controut=`{ contrib/list $d | sed 1q } if (! ~ $controut $d'/*:') { echo ' From fgb''s contrib:' contrib/list $d | sed 's@^'$d'/@ *@' } } } } | { sed 's%^ \*[^/]*/% *%'; echo -n # Needed to 'commit' the write } > /mnt/wiki/new |||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8||||||||||||8|||||||||old_contrib//eg 755 0 0 21052 11411736763 12155ustar00pietrosys# eg: equation grapher # by pietro gagliardi # started october 24, 2007 # completed ? # usage: eg files... # produces grap output, so use as so: # eg file | grap | pic | troff awk ' BEGIN { in_it = 0 xmin = xmax = ymin = ymax = 0 fwid = fht = lower = upper = step = 0 showxaxis = showyaxis = showxticks = showyticks = 0 showxlabel = showylabel = showgrid = 0 complex = polar = start_drawing = i = 0 pi = "atan2(0, -1)" negpi = "-" pi twopi = "2 * " pi err_to = ">[1=2]" # Plan 9 only; change appropriately (ex. "1>&2" on /bin/sh UNIX systems) } # .EG - begin graph $1 == ".EG" || ($1 == "." && $2 == "EG") { in_it = 1 set_defaults() printf ".G1" for (x = 2; x <= NF; x++) printf " %s", $x printf "\n" next } # .EE - end graph # only counts while in graph in_it && ($1 == ".EE" || ($1 == "." && $2 == "EG")) { finish_it() printf ".G2\n" in_it = 0 next } # not in it - print !in_it { print; next } # From here on in, we assume we are in it # # stuff - comment $1 ~ /^\#/ { next } # . followed by whatever is copied verbatim $1 ~ /^\./ { start_drawing = 1 code[i] = "literal" eqn[i] = $0 i++ next } # grap - print verbatim, without grap $1 == "grap" { start_drawing = 1 s = "" for (x = 2; x <= NF; x++) s = s " " $x mode[i] = "literal" eqn[i] = s i++ next } # pic - print verbatim too (also sent to grap) $1 == "pic" { start_drawing = 1 mode[i] = "literal" eqn[i] = $0 i++ next } # frame - set frame size $1 == "frame" { if (start_drawing) { err("eg: control command cannot be used after draw") next } fht = $2 fwid = $3 next } # window - set coordinates $1 == "window" { if (start_drawing) { err("eg: control command cannot be used after draw") next } xmin = lower = $2 xmax = upper = $3 ymin = lower = $4 ymax = upper = $5 next } # step ( |[-]polar) [] - control drawing $1 == "step" { if (start_drawing) { err("eg: control command cannot be used after draw") next } if ($2 == "polar") { lower = 0 upper = twopi if (NF > 2) step = $3 else step = .01 } else if ($2 == "-polar") { lower = negpi upper = pi if (NF > 2) step = $3 else step = .01 } else { lower = $2 upper = $3 if (NF >= 4) step = $4 else step = .01 } next } # grid (on|off) - control grid $1 == "grid" { if (start_drawing) { err("eg: control command cannot be used after draw") next } showgrid = ($2 == "on") || (NF == 1) next } # axes ([xXyYrRtT]|on|off) - control axes $1 == "axes" { if (start_drawing) { err("eg: control command cannot be used after draw") next } if (($2 == "on") || (NF == 1)) showxaxis = showyaxis = showxlabel = showylabel = showxticks = showyticks = 1 else if ($2 == "off") showxaxis = showyaxis = showxlabel = showylabel = showxticks = showyticks = 0 else { showxaxis = showxlabel = showxticks = ($2 ~ /[xXrR]/) showyaxis = showylabel = showyticks = ($2 ~ /[yYtT]/) } next } # ticks ([xXyYrRtT]|on|off) - control ticks $1 == "ticks" { if (start_drawing) { err("eg: control command cannot be used after draw") next } if (($2 == "on") || (NF == 1)) showxticks = showyticks = 1 else if ($2 == "off") showxticks = showyticks = 0 else { showxticks = ($2 ~ /[xXrR]/) showyticks = ($2 ~ /[yYtT]/) } next } # axislabel ([xXyYrRtT]|on|off) - control labels on axes $1 == "axislabel" { if (start_drawing) { err("eg: control command cannot be used after draw") next } if (($2 == "on") || (NF == 1)) showxlabel = showylabel = 1 else if ($2 == "off") showxlabel = showylabel = 0 else { showxlabel = ($2 ~ /[xXrRtT]/) showylabel = ($2 ~ /[yYrRtT]/) } next } # rect - set rectangular coordinates $1 == "rect" { if (start_drawing) { err("eg: control command cannot be used after draw") next } polar = 0 next } # polar - set polar coordinates $1 == "polar" { if (start_drawing) { err("eg: control command cannot be used after draw") next } polar = 1 next } # real - set real coordinates #$1 == "real" { # if (start_drawing) { # err("eg: control command cannot be used after draw") # next # } # complex = 0 # next #} # complex - set complex coordinates #$1 == "complex" { # if (start_drawing) { # err("eg: control command cannot be used after draw") # next # } # complex = 1 # next #} # [xXyYrRtT] [(=|<|<=|>|>=)] equation - draw on given axis $1 ~ /^[xXyYrRtT]$/ { start_drawing = 1 mode[i] = tolower($1) s = "" start = 2 if ($2 ~ /^(=|<|>|<=|>=)$/) { if (complex) { err("eg: complex inequality\n") next } start = 3 } for (x = start; x <= NF; x++) if (polar) if ($x ~ /^[rR]$/) s = s " rcoord" else if ($x ~ /^[tT]$/) s = s " tcoord" else s = s " " $x else if ($x ~ /^[xX]$/) s = s " xpos" else if ($x ~ /^[yY]$/) s = s " ypos" else s = s " " $x eqn[i] = s if (start == 2) type[i] = "=" else type[i] = $2 i++ next } # pass[xXyYrRtT] macro - draw, using macro(output, input) $1 ~ /^pass[xXyYrRtT]$/ { start_drawing = 1 mode[i] = tolower($1) eqn[i] = $2 i++ next } # empty line or line with whitespace only - ignore NF == 0 { next } # else error { err("eg: bad line: " $0) } END { if (in_it) err("eg: unclosed graph at end of file") } # set_defaults: reset environment function set_defaults() { xmin = ymin = lower = -10 xmax = ymax = upper = 10 fwid = fht = 4 complex = i = start_drawing = 0 showxaxis = showyaxis = showxticks = showyticks = showxlabel = showylabel = showgrid = 1 step = .01 } # finish_it: draw the graph function finish_it() { printf "xmin = %s\n", xmin printf "xmax = %s\n", xmax printf "ymin = %s\n", ymin printf "ymax = %s\n", ymax printf "frame invis ht %s wid %s\n", fht, fwid printf "coord x xmin,xmax y ymin,ymax\n" if (showgrid) { printf "grid bot ticks off from xmin to xmax by 1\n" printf "grid left ticks off from ymin to ymax by 1\n" } if (showxaxis) { printf "arrow solid from xmin,0 to xmax,0\n" printf "arrow solid from xmax,0 to xmin,0\n" } if (showyaxis) { printf "arrow solid from 0,ymin to 0,ymax\n" printf "arrow solid from 0,ymax to 0,ymin\n" } if (showxlabel) { xstr = "x" if (polar) xstr = "r" printf "\" \\fI%s\\fP\" ljust at xmax,0\n", xstr } if (showylabel) { ystr = "y" if (polar) ystr = "\\(*h" if (complex) ystr = ystr "i" printf "\"\\fI%s\\fP\" above at 0,ymax\n", ystr } if (showxticks) { printf "for xticks from (xmin + 1) to (xmax - 1) by 1 do {\n" printf "if xticks != 0 then {\n" printf "line solid from xticks,0 to xticks,.25\n" printf "sprintf(\"%%g\", xticks) above at xticks,.25\n" printf "}\n" printf "}\n" } if (showyticks) { printf "for yticks from (ymin + 1) to (ymax - 1) by 1 do {\n" printf "if yticks != 0 then {\n" printf "line solid from 0,yticks to .25,yticks\n" printf "sprintf(\" %%g\", yticks) ljust at .25,yticks\n" printf "}\n" printf "}\n" } for (x = 0; x < i; x++) { if (mode[x] == "literal") printf "%s\n", eqn[x] else if (mode[x] ~ /^pass/) { s = substr(mode[x], length(mode[x]), 1) printf "for %spos from %s to %s by %s do {\n", ((s == "y" ? "x" : "y"), lower, upper, step if (!polar) { printf "%s ( %spos , %spos )\n", eqn[x], s, ((s == "y" ? "x" : "y") printf "if %spos >= %smin && %spos <= %smax then { ", s, s, s, s printf "next at xpos, ypos }\n" } } else { if (type[x] ~ /=/) drawmode = "solid" else drawmode = "dashed" printf "new %s\n", drawmode printf "for %spos from %s to %s by %s do {\n", ((mode[x] == "y") ? "x" : "y"), lower, upper, step if (!polar) { printf "%spos = %s\n", mode[x], eqn[x] printf "if %spos >= %smin && %spos <= %smax then { ", mode[x], mode[x], mode[x], mode[x] printf "next at xpos, ypos }\n" } else { if (mode[x] == "r") printf "tcoord = %spos\nrcoord = %s\n", mode[x], eqn[x] else printf "rcoord = %spos\ntcoord = %s\n", mode[x], eqn[x] printf "xpoint = rcoord * cos(tcoord)\n" printf "ypoint = rcoord * sin(tcoord)\n" printf "next at xpoint, ypoint\n" } printf "}\n" if (!polar && type[x] ~ /[<>]/) { printf "new solid\n" printf "for xpos from %s to %s by (%s * 100) do {\n", lower, upper, step if (mode[x] == "y") if (type[x] ~ /[1=2] exit usage } base=/tmp/eqn2png$pid$user name=$base^.ps out=$base^.png fn sigint{ rm -f $name $out exit interrupt } { echo .EQ echo $* echo .EN } | eqn | troff | dpost > $name magick/convert -trim -crop 0x0 $name $out # the magic - thanks esr cat $out rm $name $out old_contrib//event3.pdf 664 0 0 125701 11411736764 13564ustar00pietrosys%PDF-1.2 %쏢 5 0 obj <> stream xZ[oH~,0pBfX2ܓE:dѠŶDjH*j9EYRI7v6Ad;wJXG gI nqIg. L(7Qz}>~Uun^_zf$6xz~lze$II/6C*z~];.u.L/h7MI_velYD7o_<>Yqx%ՅIlFOz~aMMt5jGU3Vmt]t-b&Ol'/\y^6zWUW_y"w}g4|Rϟ\ѹˢ 0*t3~-uq^dzw~bzлָ؆}/aѣn7wpR۟/&o, \ ;ث?G?yv9ȩ];xzf”m3qaIhb ^>$Ϊ~^WiV]O8,daeMGΖNa\c`ߊO꧶[a5eJj;Lnm[kՇGggecMq]궡6Qǰ+Գ>>ݍ.ҽ@|R#)ĪLc5&[zfy~P "ލNt2' 'Dk~{8'&jF,jt)^ qO] LR(!@TFͰ:`Qo@ yJր%8`?t瘎܍ԠVL,AM}}u@"ܨT?oeܿoΌ>0E%)Llj Ӯ%>m0)ɌIk'kY8gbF^^lv@@5 )NTtދQ0f-@.ޣ ܞ Dș$^Wŷ,jmĢl){Kndv^B)aۃ7!ɱkwcH, )qyB.)&Uo8>zB6(9^E"?L 3RYd 6H VdxH~KFQ(k+vH> ǶrRUE;V5w2c%M2xɍxԜy)KcHӶk>cpx3jM88* IItEj7fw6\hkBvvK&:z=A]OA2`]>TMИy1/SǦx?_ JUX:GHhYm6wQ5G}Q0[ tgmÙ!HMG4b:%%?KP =V)-RMOKX\b97vTZ%U/h8Bg('k8)\dLhxR憄PDen70QX$/L$ Ӛʌ@Sp*쎌WΨ6=1Ѫ{c\ԿQNaf p+$JTQ+R6];]u'j+Z6I|OS2xv,D9?ǒNA`\>2puMn(b [U]52EIٲP^3; q]FZV_|Ct'BB\& J^ވo\8 2PBPsF%2~!P=ӑ`^ZCh9.ͮ2-BͰrpk#1z>ZS*"_04M=t/'2hv9GLX=kqiW^> 5<_#oV~H% q8ۨnK|r l àxȣ} ;#AX`fe+KXς`8i9w)hp7e{7Pz.p&({~RC5t;O@fNa4E8ԗp{!&S#Q0NPKE r .J!>0zY+<c<-\x {/`E"/v-١`ްE֢i3C=~`R9ف,\;)%{ՊހrT{@#Ȓmt0x qTd#*31RIC 7]Kq1fp> Kn{)Ds{P#WRJl,}` a3/"糒90~{IyLMB+ڿEZL62ю.͟bq?aP+u? MoN77o}ߜD#Nx1QJ~(WkP@ׂ18d%^HoCQ^C,*O@YLZ{F4[2 BeٱI[791 khQQq(ZqrE: ,| Ѯj![oUGs :߳e%luƻ:%'b Jˉ(vIgpK_TMtEf-Ĝ| Emw)jt/EJEͪaZSUL{Pgo{쮄#”{i1.:nu(p~;y?'.s&j26~K-*X"BV?G++2{54ѫfܿ'o^˜Ik"?~f⚥}^+ȫIT7=#b"е"DVQDoy{JOkov7 ᖍ57/_|[;Wx(R.Lt3uNe,&z~:84Fڭ82{z!Zs)G,$.xs'SsuwUH4r^rQOn9nBm)N4z%Փ#rqLa-T`vi%IB96$IBCw/|.:.BE. \;YIsK@HBB9l @Q:U%ń=হvRE\ oJmuuҧ|1Y'7NJ\s;N)N-E龈*7 *DTnRFJMO⸕dUŒ! )c [RW:vҷ Ω 8䲂&NԙiP݅Rk;$I:|qG(yxN yYQ& tY{׳VRW>K'dF_u='f,*pLC|eNt9zmZN$bT!t>Vz(4[0%R^cKBZ:r5>FفB$G베/-nK=* 16+@0xJrvH> p)V!R;]t-4(\)Rjmyϐy,rA/^d(Q!iAҧU>e! f0#B8SuEk3=&I}c oJZdGբyb> M,#o[V`s.NoYHC@| ŘG-Xr͂WnA<’ODQ~L7^T9@t$3WǁdhkAɜ7DWm5}qiOn"A%"cɸAJff _iGD+j!g+&WEH-7\ynHNBz$=ȝ]7Dzif'ю.GKe/xD?B=#R>/endstream endobj 6 0 obj 4561 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 17 0 obj <> endobj 14 0 obj <> endobj 16 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <> endobj 8 0 obj <> endobj 10 0 obj <> endobj 22 0 obj <> endobj 13 0 obj <> endobj 18 0 obj <>stream @@&Ii$h8'tC>O< Z.O)Aup =88ЊLa*D(@M4Ft#lt4l&sAi2̧#.C!Ƒ$ "Wl< Ϥ90EyVAMFX eJ@[_7ۇ>:mt+pMOv5`6g`@nu{ۏt*wc7pwc@AZ{ Ӵ$ ?P~6dx2Cx3H43Ӽ3A`z=0s> gƍvE6E5'7~sq(7~6dA-Cc`}+ؒ 8NJ NQ<; ʓݒdKHBuCL17NEnÛ9A,-e65!5OH}B$GU 9S 4]B VYH^6{HT!UBOl7x59`e\Ie`QI 9-`_ QBf@rx=Cas~;üm=kxHy:NQ=OJt% Qs[ySpvd*RX3=8S״>P`ID>TUGU>wuvi Q)cB-9GW/PՎO TQ<} l0{Q/i8Kg gPqtajNr endstream endobj 15 0 obj <> endobj 19 0 obj <>stream @@&Ii!F4j _:ER&h@}` OrECA4%XJ&6M&3o33y]0 &p@A6#It9̧3)e2 Pq@B7 ISDpx'bP0NPf00h㰉l&}%2e0W8Gp( ^h zIX$:OHGz:OO(T<CVu~g;pΣBy({:C{<|n <4D}A.0ˤ5$âgG-$H :GzC%yL '2M #3+ή8X@y?$KC#`9ͮ T.  > .jV=+S_(Po- +f\k9@E9@pp@F xP^,A9d:R@@to I8a@Dh@t(bĆB+{Q(R(! `z#whxO1 I#5rX . `Mt JtYهahwK끇Fb(ZU?+g':UG~El!L4 B )1,\ 0(sZc$@9@ͅӊb5/W rzԾ@IN|OIVvȃRc4a>#I6 M;dZz ,R-9R*mK_u872 e Ef9u$Ne[f=8p 4+b8$ 0@B u9{!YQ;0|.Z)F [Ȓb>rz`rG0ه,9>2u)"崟~@Εg}iZ)Φ>W!l%6e'^ aj!Z1q̭ UcJwMϧNb-mG_GT9w\#,Wc|zpw9Xtp {4`q̸)Dp=NT2} ßj_ګXt-}c0T= @hq^atX`.J͑,FmZu@#=}URu^@7"Y75sHY IC MmCD:vҼH:C06;t:#'ruVһFGsl6a*ZoMJ @8( nW`|V! ,2&KvB4QmiM#%uvW/:(DPk0q^I1L~CQw$d:ivS+],!AX*)l#IO02bïy4*u@I`T{WsAlꋗ":,X*: |ŦY;Xa-+N.=( aܛkL -+7+5C1D)QÃ*a/ B&_:$_Ɏ_ì^HрTead,i\nOdxB@:!BI!e>:!TD) I-:AB=#D ' ir&\tF2J,XHA2|N $l!M}`9iQ88\ ;.2qeLG0Ra L0YV8$B(dTBNBn:j,~AA ,D:*nA  {@</XXca&> endobj 20 0 obj <>stream @@&Ii q6|O h@}`|{qx@V@2Io9A r8W'CI.MHg4v)r;LT2iDo|B&O&4o2I3D3#9h)2AT$eSx6HX! b2ƣar:E'pF(^ 0$%SpPI T%%&,k `p T8 0  $`(,0 4i 9@ Y !$8(V6&B4Rq`A(jwv$`渚 @V hC` +p"H!<Ɓ4MA" a.M'2{f<=BWCF{EZ)jda'a&aav#CQJ|*ElpuۇsDIj݀9 Uޗntw)n Wd)!y7]_g>d' [ Ws]9u٘eX|gH6:yfje{Evy[-Ǧ9aDMdZ[OV<qZ=}\@8}@98 6nUp7`ya8 |Ecoh̀nDܠ Ja}^΁y^-m@ 8d[Ut@r3H8'@~;x[uqrcw'?_z{ce2LYczMe>+na8 6<[[ѧ 3n$ \(y˰16` c+5eƻ,8Ų׮]$G]:J ynÖR@,ȶWcgDQ2({13_8A #8 n7bp@%q.h}Rن%," ْ,5uDŲ!˛cy8ܳzK-XȠo]8e T{a@( Ѱ93 q>4J&f"/8{pg̰x8&kn}On Z{ߐ̲}5vjG-5G 3>` @`Da%Gf_ HCФ,r=v'PO# /[7-NϷa|Z>_`b8}x. QF.}+Ha0{5S )|vNZWibOF=Sf`&i0"&ohV%,NB @*>vmfAmNx7N2v܀ v?~l1I#qQZ͝3'iaׇ+^˖4c=[vYJXڈ Ϋ ty`ĔwDyukh7r1Hjևa1T ^ 2k-AtpMWZ YXVػ!?nJ*d]:L' Juv+ &(` |AktlAK<JEw>Vŀ+`NNѤV8X:a|&GPE5%n#Qk3PH!elzeGa,E9#(d"L[9&8[k/fsjZ#|A ]/#/9WGQ|ϧflB]zЮهO-xz4?k;-G[&8!C+ m(n9`bۘ9[O?.xsoyWl[k>H҆% {3pGaׇivge :hi'Ŝ0iBzhx&:Y-G% '4e% slːV[+^&_dD:ki4ELMhX>Τ>fŽ(HPeiJu#H ,shGH(rbn$@V*wLn2If pc F e.F`ra ( Nlh k{H\4t a [ _ v3#!,J;Ba?` ',1  ``LmB(P>-꧍ԇFnDZآrlGS ̠s!,heHV찛%hM(\\j6*b;R\d&򥼰f,ja(pp)2L-(踋HF 'p bֲBy. |[Ge̚E5/X!GI%crt&Lʱ"AA*Zn~pS@0\>LHnpe;5ԑJ_N|m,g:_:le;9E9 2oN:P b<,eҀs6c N%;>ltGQN2ik~&o(1oz(gp@C ARq<̜lg,)4a)el^aX4r:eGHeHHDt^aF:gI8SODe"I=tJP lk[N/i@ i ih R+;,%5$…rԜeSoqXG,amR!%Pek0f+&XIk̺亁FYX%RabXtEF;:9ΐpI4o&V &+̙@$]!ocob!źc3ceFn`6F[ iAfhƽ^Yfikevƚ䅺H`Chi}!xA`~k_[3Gkfh@lŲ,K&,0h[6HeK&H;op"gH;qEqem 0` iD[tfԥue 6pvgki ff }7fŻxuVo2_*Gy`@>[ J(Hczr\A-Qk<+*r^A|.t],s?s8`0^a\C$`ϋ&tU/@h32-Fhì>:J_#g hʕMUR^`iA`!``JEr(T*AʼfkpDz?EtX[~e}AKXFY}!i-x$?  F=%&jkt@@reoh @XvT]Jzr]\c_jen]p]!fbxnscB_:&VeIvw\jb/@V,%veEXX@:? 2OXI?,xUfRy[,obiM)A5'h64j MF˨8B'\ _F Mm(d`RX (`蠅I,z,ByXb8fe?u&L]Gݥ'~#̏ԃWլ]H ;MP-!:1̉i ZLz YFb.1[M%..B+' )! 0B1L"E"FvJGp XSdFd( `։CN&:'ޞAؐ󸕝V {Ǒjf wy 4hM%`T , Ӻ s % e a4p,*_=K ;H6_JfR>*FoN4 mj/\iAʼ ] ɋ9t꣆VT.`.ǧft؄DSv0S *'bɾ́C7&:`D`R-mFXX44e=$ٿpXc^Ǩ i.TR,"R  A#ه.\𣞼Z[PAA@a~b!*RlƈJ^<]2R5 qʏWt?*(` ?8Y,V~i&[AȦ sm:sjAseTc$G?ߐ{x P, G:'L 54tIt2 lrpg;%tBht_[ htnM̜4^_F`n, *@ ap@A 1?&!Eh F@qtbb`5O@hp @;^i +$lKTF e)Z-."̊a; Bj37+Rt79‧!BF*.&(`%+Q+21bw-ۉk㷂1o\~؄d(g -!Dܐ\K͠D V Z5ӀHR tNrhfrZ#@Jȝ8b<9+k9GJMv9ՎQą|0oqj`:~g  U[\R (lrq0D$QJ@( !(PFH PNT'|@,}LvcײW2BH0Dbh\NX } GtIh7'A25QP\ @nK! +0H%D2nBRR25g@PB֢ Za[8BMID+"0HPd҉@)@iEԆPaph嬯ģ Le ҘgGpB BaYd`3=!(CB#cÕQ{͓ TW@>ApEctCyv$l([T]8uC /@@@pB#%)(`^Q+`@ !F#* 6A-^8pxVr kCL*X;Ps@P]qn$"&;$-8 '- ,: ˾x\WGR}d l!KpAqvNRqǁ$@ b<BQG`ٟ #?u%d0I j@m@i[Ppu qt Ȅpl8Q3p}Yz 8Ak)TØ^` VY$q:B@Ëp {~H  i)2#阙Aܩ!/з %! CCP L:‘#& ,zġ S @T.8JY5!0DR>E8Q `Ռ4P@^|7CbQH9.l2I* (2ưXN6 k\qE謲H5E!E bG7TzDG*xʇbla) B(|BV9}};  AB.`-ɢ،0p !89@ԣ |HIcħb872)[HJ)< Q1)6 )jI$%  bxEXa)ʀiőxHxblF̒ FpG/ iDѲ0{8ج ŠȍMPM`'ࡁ8 Mɨ`_N n!A8 $ȅ0n H?T雐̎TtNh[<x|{ɟЬU(T`" 0HPX X/eq9}i8D?10C~B`79 }t5zے| ~||2ɛ !@ r! #|`%&F% TKũ4(xV/D8S5 ѐSh}ѨX#GQ?H D(]@Q,L]G(I%5-DWZQ>;TM7UE8.~Ӝ1zِ9Cˣ:C:`EsI!:>әD8U4G@D!0ۈ:zV,P,G}GhT||- z# X}n7ЛCK``{ Ք'I~[QB(D[<D8LBҬDRxA CZ?4Lɲ$ a[-2 ԀĈb`x ĭ# LX\! %ꋠ8tw$_ 1E R xu EDeDV8MA3_ࡳ,8B;8JK #=-xt@ l^8IziZ0X7#yX. EX/IKf&"8*.s _ +#@x{<  (!xIcv,` ; Hc>=xvPwwbB:H@cXi9v= 3KAP݃ o 1Ȇ V=hd;*p_=ep|H$%X ubN(`h ,f hR#g^Mȫଁ81bp5Y-Xׇ!(p e6KҰ13a? =i8A8WFqHM~^H8ȵ`)!K ӗ鍆X݄X_Ȱ R( ڀ8jX)w\ЬIy@fE!HJ9!H `} 1^r\xU U%)0sXe@]UcE^l}_)[D;ρU5av!X89FGaOC"<4G]KG{ 4 `z>,D>r,:; J/"ggےEP`!H'}od AP _C ͨwwL:/4d B|P^𰂤v$@^: t7pcd# |*"cM,QY%*t0GQ<0ȸ@J#|)1LǑ41UXURk+8}&ʴCm FY Hr@Ax"XxL J#e轜K<0 "N3 u Ű[R t&@mB7.Ǹd@$ QC(JS $ Խ./MKH(bd n=X6,ɃsI͑6,q8QZQr=r@rU\ʡ>",E ]φɈ6ؓ4G(&b\}PM Sƚ"c=2`7䥎Bj Ș&q(=( (MDC Ea e 5; h"PUfvC&48@`}*&F J[$rk\mq.-!GA,q#B&6S4zAn$g0VMAiaBmHdL^ZF9[R'mȘ&6aXBnd|h&S`0oh c;Uv`&;Ci<'K/Hafށ@%/ʎ*3H_%Mu >߆A(R60iOD Q4ξ)ML1)CN>'%*Dc'^(,X-&`o8yOx$,^(&X9T`x<#b"N`G4#Ѝ%aCgQ}wp 2y!PĒYG! P6,w4F=nZu p 4ЈѸt܃'AkhJ#qK P`JQzxJFÄo vWTTBYIxrrOy|Jc5m仸ǩ$K(-UiTj{Q,.\VYڹ'*+:?#Y (E*Gj`EM.cJ{\?gU3,}x)u󐞣vUMK",9HB[ݬ@^(+t4 аa" B/0KE!cpf?/:ji H İs  na )B9d+f -s0$F! ADn@0Pp^k> e4S=hpl cTUFUB~uP]#Xew pXDXojn JД&ZpZ帒:[ވ; ]' m q,0\qq`"rvb80~- @P!K 2J#b]8J!M&`6c&̰ʊ|c`ue(0`4b*${"iV~0/F@!`f;HX%"J i|pa0`6R I$¬3#)%0Ta^@D,G'a0 A6@A/ n&/d DbB `+,$")ҩf0`&Hꦑ-,2$bI/,P8):ƍI0HPa.¸^/-a\D] .CFb@<)e (P" "S^/.[̯#7$"aȎ" !8".-"`&M'9kB&.N4!-!)a4!*3 "C2 R/>Z.6"@"+9 D<#! "t"Fpa.I. bX 0ÐCb<3;!+IgD;&,c`+!&boF<$"#BbG4)g #8,.>%2t(F-4pñK%:&:q ij3L3C8P4v2QN\Pҽ ‚3"h$AJ!/ l1J"p :' R.:u:;Tp nRm$D 'oB.`W2>!\0N XI+ UV 'Jɏ Y45\E 9.A 52];S1^UHx備 N"u!B֭`?c;Noan4/wʘn=gTA(oy`P}k0DU‡, / vT`b(Ad>mko9 RPiG?bb(ԍgDjdW3 1f I^lvl0ؒj]֠bv"g.hF$f@a eX/v3G/$.=E8 xU%U"4-!-", yQovv)z&NtmYd "J B|B)a&`sAB<0N"W?rȩ)¤0`><#:.THd Ac0uO#v ;SO BowcwÓ1%W_EZ ׎&V7`欦2{//{vo!Ţ-!%H ؒ< b.#"'b%8/#`-"血d 0Kxf͔iWxm(p4xʐo;wEKb0fa2@Җqiu/mC"f^1g<`-w6c cŭSR3O@ G Ǒ 6OWߖWohBqM~Z${hbn6qA(/*]WbB R&XU),hv>6X/234DpYtlNf7&`&vM({^.~6ʦ# %3k v4e$Z!9՞Pf`m2fKw)^-%*Ux".U`6`kj%D"hc>$ +ɏfdqU1f wNA jj ] |.#%[GpѺ@Ύ^2O[h\DOQOvPOֺ)c0ieZrRsRo9.F<53*gYiD!-10[ \'S3v9:RAz:=VOlۖ"N4OuHOkg4!4{ipCT=,0-c`P%]Eh*y]Q|%$47! AnםxazFa$1 (a =i-d{S4Uwxx<(p9=PX7{UhxmghcfAI_$Ā1ໞSA֚dpa8nE˄AV/Fo$]L9*tPqpB"P4qAmkVbL[:%/R<!cnYCڐw"PI<9r@5tn@ tn.uCGAZ(A 0jڀőD`3B<nhAQfMB%cK)f`ۂ1"emyLy252`ʃʑez@ *`aX''a g e' ePa1d8~!XNg  9 B0pKR`2*^X'N@UW$ "v``] rC8d|EXDA!r U@|b9 Ȅ~\/CQjjp!T/}sV_>j׭^4LmVX' VB?Uzbt|=/!@o ġBG( Cȝ*8ɦ j:hd͸ 5#d4vl *7ǁc rZ cD%MA:ǪmM,tzF8n19@>qzNuB49{N=I/O.+/P?Go,n,qX8@9jpH8d-PtA=ey1,QCjZ RCoB,hV u' 6\3d!Z=[$MF >Ds#T+'b뛌yOPD0VT7S*&b (!'RB~@)ED$^5#uN@$x2*;f&ȢMN9ـn>nkzK efM$}YzطjZ}D( 3HuIQK۶7yxvg?-%<^BtQf>·O:dY 謟XI sYlo'6~`IiճLj2<Τ~12KGPa @ -HA̰A!0]yup 9, |"kSj55PF=ˆ/?dMC"@HBa6$L-QAbQ$-䁀d" ` udLV]/&3hP%H3ܾbH]4i$ ļfGjHRS62r@&["aP2j!!:o-#?Rx u?Hb ih2)`W3h!TS6)CIP=DdV7jiSU#yBdq&5VTW+#D @HA9  jL> ,s=S`Y~5DYkpz֛ratn'g#%CFQ:+1A#\0 FQ#]0 ROx=/ON*)*ʥtRxVRP|;."z8 qG>2q)PԾa"xn(zxWjeg|2QSNhkڑѳ^"OG rwb";グ~ZQ'Z?Sal&* xNb[G> RˑlRlM>3T˔/P|${8*Fc$V|BC k p>[8&$^up \GflabfQq%q@n 1r2FH2Tm ai͍ F>lG` h0sy: 8h@X@hԆ@ A8 (X9htL1gtAT8>8v H hЃ; =XB`9؁H؃xB.?M L CIz*Cr4::T 8KΊ[IP| 9ѻD5 4x7| D(DE({Xs& '9'(qKJtw ; {(:|/1(((RIƘ( !"A#CZ868[1`軁4xGB5 9UT QA£Ю .ج` DBX2@~$X[<]I ۉ_FyF ˡPDIj~iԧ. zX4j HF X FpJΨXG+G0\uGp1Nj bǸGҍъH!XH$*lB7HJH DHԎE8RI$${L=4 DFZIܾLT(dlJm$( +$̧= ddMͰQpXMN (NZdrM LFN؝pNz "s: r||@.!,KtY[B,pKx%n&&b9PJ/b{*Pː3KkmZnBo OhCi0 6}PQFd@L`H;*IU&FС[:u <5@Cy2@BS { '*5 {.ؘcT C~9ʆHE0]hT%2  P0VG TTɣ<0C1UEU845U (;UবMUaT4Va7KA}_ SNPUR-…rl XP3 {5z>i ur0ȦXi Ub@.(A6pX{XSɠKH!So 3ؿj?yY:8O!; z c ӜMPA&jh 8+~CMXgD0}}q.Yp@HͶE |3`p!v-аy [ [ 4D5[PډG}@p U}7ѢUh~٠=40|SHF{ Pu(9գ[:56P{ 鞢j'ӭ\9ۋh0uX( 8E.6E HTesا 'rW!:ҤhL,38ˊ>T J>*A$.!@{p}(hQ2OGĂ{% _ѝ*;*>砺 2`BU*R 83k8N RH`55)\ p||̓ 37 'iFY]ɌB! }ХE>><P&GmRDNIAP*]p]%.U-QATxeXi$[l[8eZ MQf>[/*fɏ5(KFm80]W8s a5@Ss^XCyB;hBliԃ'zny:`iB{Q4.0'' N4y`NJe01fTH!ޙrR 4 ?ǢD0;FeA1kX (@ٻ ce AѺPdi%3"v-x0c}9Iv !ST)S$@ h{A{t ̤!DA;x*oMh Ѽr)@h}AeYTf`@\qpGi$l$?Ɠ Ve1R͕Ǵ_5H .7Vo=fQ!MB =|jaBMR I$A!3F Mwt(}`Ǥ 4IJ*G1B Qxc4|"G;4,nt*̊lN ,+hTEC2"eQ$0QQwfRK<+hV3Wʽ_sZ*窢Tt!\YPdK x0h1I!< Ȟ9Z*?6T,PJO}. Hف*(% i<}@@BD̩_ c2 .h iX<CK28r hXe dky fdƎE*:P FY87\8!=XTX K4[g|V.@֠l٬.x철P$lS?R*l 4T7)EYf%6'I  :*N h}hɨ`˕RT>hҩ0f<k`Q$Z ymsm(,x*|N GkI0/A@XIxb^T1l""8BR@oNX yҰ0[ y@p(/tMxSfԊSc gɥ/B}1 EG٤"CMaRd4rj#AY@ N;E@kŻhl됩q=H})Oh0wa{ WT*> rK,'8A(J)5sZ.*pdc&N)$&"* KhiJgh5(X"J Q<ѮT&!N#~EJ5Nh"R5(,#X$=D̅Ѓ64!OZqt/. I:؊醺2Þ&( +~P3H@Th_&!|so8qˀ( *" (L!2d&THur:Fye& !,)iN¼+qK7!Gc44.65'ZM+H&0Tu1p^/EI, ,ƈI07:HFIzoޒ(g+BtۥNg^<[>B'::\G{d{f CLiQSX ½&+B#$+XAVȄB?b \{){M#Y9i'EĮBb^* 280a4)؍B"7#p$L)%ȁKGVpQA* o.QJr5\X93OlƂ 4>|ښF;(34rB^|`/Gb20*l ѷdI'¦\a`G.++)z KX !R*d*bB8֠ljNvBgƜ0fLc a=)bI% %[T$_$IB>!~NB|B6xI t@+kK+4f*8<-Nz&7gOl~<'taZ.:Y+H, X15h.v:~&׮u1_^dJ3'^x¢[¶x;+HD:{2t|ռ\.'Hur&(0a YXʐWRbp~2eal~Snů*heb 5 Bh (~lǺԄeZ*5%l-%FR$$'V{?bL_hE+?t_÷ʽ^ B*zB ѽE`c5B@ g:1洀n<1<=t@uav ٧B fG|R*m> >a@ T[V d!@CXcz%bq#Dq:G*pFIaqPRR)L.#EADKւb@bPVU8PU:q+Av#Z ^J0Ek*Q\h{BW pNy,rnىϥ1 UuDց5 ~.J*ptzԂ=ȴ~Y>O_q$D'ԇr+~_c2򿈃dnyڝy# Bk);o=)($`FJEJG) 29J388p,I1!. Ѐt2ªHMd1Rj&| ь 9@A2+@B3ЬT0 J+ThG N"L2/dY.6GМ{b3D>VdHtWحHx1F.j+?s-AKnY358\Ktb5A>VYjO)H` .@>6 g@{Dhc 9Q|鹈x=eC t(Rq :2!{l#9Ŗ~ pZݨa\<lGH] (ɬ pW[;ʅpa$,04uVNk鹙 Sajưt7Aa- aH'TJHvllIR#J?yR{_HV|cP`A6!cr(803<$4L' L?,B )<i !)^(80I9;, 0d V+-+В@4C DFR9q BL,6hDwx?ay[a jFcy $0_EQd^ "hmD2A9 0xhOa?պ^AyNP'p]%[J)Y|E *=t:O$@)/d,`pb.ȔDЅZ+SM4RBɻVTfn]8#t M&7dwD RSmsԉ4MXPB6`v#khyc$0h ^¨ݑFFI$2JR= 4Zψ9&H39#14r1P20ȕID1a5Т<UJc%W:{2Yto+Rl%d ƐLGťJC,=D 2k6 Lm74OG=4ͲtcM20q 6blm ZK_pȖ%! A}}Em~rȕ=' IHx & zWJPʠRJCs`=.Px8ED°,.A䊘8pC* R~1ňP9 R˜C,$+ )) (K("\@ S䓀(MT$ SWD1 {{ 2y  (ĀE(ZXkA1 خƙ+`O=8 <}Lllip P{XK(`G` u`Gh{0a`ǀG D endstream endobj 9 0 obj <> endobj 21 0 obj <>stream @@&Ii q6|O !) @-(K%:d8 ;f{h>""l &Lg#yf:f¸a:Mpl6 F9sNfSdBM0az0(d:& 0`y"@ WR`<%׏9NHLE @ {gq\}#k|o=?MosnTw~bwx|(P4/nm&z,8>s`}'N۟9 ۟ƨC6@:ڐj?d)MT"\>؀d&R@$9|dE.$>G@#k8(D5L #{ 6@[jMR#MG͍.OT</8jF E`(qv$;`6+t8d䷱xRP /X!$sz7knz8yFx?9p{iMN~;.u`@'R){^헀@'6TR$)Cq+ZGh1rŭòIYCiHCEY+mB jIDƸM3ٖ885Sr@ $T0 BHtD8UzM=).RxMDTMTg-&VnN eˀXndYSE{cv[GmM=W#sZMȶx79W~_߁-xa- CP1Av1^KF'06@;jE4hg9Me3r i/9}jM VB|pl͡0ڛrn*N*5Jl:XĐCq=c*)#j+1qèHk  `.U+e"H>BhEHd mv+hićP"ȈoH #@MY((7hlڗ]E:T_@1%G1H+(Ba 8'BAy y 8.8I F)Y7YM/Fe)UH28 1MI({G5`yy;3iyh?!0Gm#XJF84%ȆShOE3jUXCmQǺ(. DFޅ7oQD8\a[$: At~*an@FG#46 %oӈ>9G}(\k9~H`qlxUQ(-AކHz+`'Q,#uڡtuiT+ĝu&I6B袚Ye,4 gn9EeRv=.ɨ2x"-82j~BpJ 'x:*V]D]YѕiVo\Mֻ y~,% y,VRYvyEהh Լ{Z&[TnޝSpN@,܊EiȹғPİ%0 endstream endobj 2 0 obj <>endobj xref 0 23 0000000000 65535 f 0000004867 00000 n 0000043200 00000 n 0000004808 00000 n 0000004666 00000 n 0000000015 00000 n 0000004646 00000 n 0000010770 00000 n 0000005494 00000 n 0000041081 00000 n 0000005959 00000 n 0000005427 00000 n 0000005365 00000 n 0000006295 00000 n 0000005000 00000 n 0000007414 00000 n 0000005161 00000 n 0000004915 00000 n 0000006508 00000 n 0000007644 00000 n 0000011223 00000 n 0000041348 00000 n 0000006151 00000 n trailer << /Size 23 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 43355 %%EOF \̈O"Ы8,K.b(E`G3$`:>@Ss^XCold_contrib//fgbx11.errors 664 0 0 5362 11411736764 14153ustar00pietrosyserror: copying /sys/lib/ape/X11/fonts/encodings/large/big5.eten-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/big5.eten-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/big5hkscs-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/big5hkscs-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/cns11643-1.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/cns11643-1.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/cns11643-2.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/cns11643-2.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/cns11643-3.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/cns11643-3.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/encodings.dir: '.../contrib/fgb/root/sys/lib/ape/X11/fonts/encodings/large/encodings.dir' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/gb18030-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/gb18030-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/gb18030.2000-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/gb18030.2000-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/gb18030.2000-1.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/gb18030.2000-1.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/gb2312.1980-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/gb2312.1980-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/gbk-0.enc.gz: '.../contrib/fgb/root/sys/lib/ape/X11/fonts/encodings/large/gbk-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/jisx0201.1976-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/jisx0201.1976-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/jisx0208.1990-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/jisx0208.1990-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/jisx0212.1990-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/jisx0212.1990-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/ksc5601.1987-0.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/ksc5601.1987-0.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/ksc5601.1992-3.enc.gz: '.../fgb/root/sys/lib/ape/X11/fonts/encodings/large/ksc5601.1992-3.enc.gz' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/sun.unicode.india-0.enc.gz: '.../root/sys/lib/ape/X11/fonts/encodings/large/sun.unicode.india-0.enc.gz' does not exist +sB;^Ry uŠ+`Z[²c,kAB;ʿcHX '9I.d)$nЁT6 ޞ#Xmգ:0hHX#2kyGآH+!*ؤۃ:p!t*T"ضG>. I:؊醺2Þ&( +~P3H@Th_&!|so8qˀ( *" (L!2d&Told_contrib//file.funny 664 0 0 5613 11411736764 13624ustar00pietrosysadvp9prog: directory advp9prog/ch1: Ascii advp9prog/ch2: c program advp9prog/dates: short Ascii advp9prog/mkfile: short Ascii algoawk: directory algoawk/book_macros: Ascii algoawk/ch1: Ascii text algoawk/colophon: Ascii algoawk/dates: short Ascii algoawk/intro: Ascii algoawk/mkfile: Ascii algoawk/show: rc executable file bentley.ms: troff -ms input bentley2.ms: Ascii text cod.ms: troff input cod.ms.part: Ascii forloop.ms: Ascii jstut.ms: HTML file luxidejavu.ms: troff input programming.ms: c program school: directory school/critlenscons.ms: Ascii school/critlensconsfixed.ms: Ascii school/edgar.ms: Ascii school/erato.ms: Ascii school/fitzg.ms: Ascii school/gatsby5-unfinished.ms: Ascii text school/jazz.ms: Ascii school/leo: directory school/leo/dates: short Ascii school/leo/myth.ms: Ascii school/leo/stars.ms: Ascii & Greek text school/leo/table.ms: Ascii & Greek text school/lowdim.ms: Ascii school/muckraker.ms: Ascii school/newengland.ms: Ascii school/nytcompare.ms: Ascii text school/raisin5q.ms: Ascii school/saturn: directory school/saturn/alltherings.ps: postscript school/saturn/banner.ms: troff input school/saturn/dates: short Ascii school/saturn/facts.ms: Ascii school/saturn/history.ms: Ascii school/saturn/iapetus.ms: Ascii school/saturn/iapetuspic.ps: postscript school/saturn/mkfile: Ascii school/saturn/pioneer11.ps: postscript school/saturn/rhea.ms: Ascii school/saturn/rings.ms: Ascii school/saturn/saturnhd.ms: Ascii school/saturn/saturnsymbol.ps: postscript school/saturn/tethys.ms: latin ascii school/saturn/titan.ms: Ascii school/saturn/titancassini.ps: postscript school/scips: directory school/scips/about.ms: Ascii school/scips/alex.ps: postscript school/scips/banner.ms: troff input school/scips/conceptmap.ms: Ascii school/scips/dates: English text school/scips/header: short Ascii school/scips/history.ms: Ascii & Greek text school/scips/me.ms: Ascii school/scips/methods.ms: latin ascii school/scips/mkfile: Ascii school/scips/nostra.ps: postscript school/scips/oracle.ps: postscript school/scips/ouija.ps: postscript school/scips/pictures.ms: Ascii school/scips/popculture.ms: English text school/scips/survey.ms: Ascii text P9 R˜C,$+ )) (K("\@ S䓀(MT$ SWD1 {{ 2y  (Āold_contrib//gserrors 664 0 0 7540 11035405361 13402ustar00pietrosysterm% gs -s'DEVICE=inferno' -s'OutputFile=/dev/null' dejavu.ps AFPL Ghostscript 8.53 (2005-10-20) Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. Loading StandardSymL font from /sys/lib/ghostscript/font/s050000l.pfb... 2597392 961803 1516772 226496 1 done. Loading NimbusRomNo9L-Regu font from /sys/lib/ghostscript/font/n021003l.pfb... 2597392 1010083 1536868 234381 1 done. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuSerifBold00. Can't find (or can't open) font file DejaVuSerifBold00. Querying operating system for font files... Didn't find this font on the system! Substituting font Times-Bold for DejaVuSerifBold00. Loading NimbusRomNo9L-Medi font from /sys/lib/ghostscript/font/n021004l.pfb... 2597392 1057222 1536868 246711 2 done. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuSerifOblique00. Can't find (or can't open) font file DejaVuSerifOblique00. Didn't find this font on the system! Substituting font Times-Italic for DejaVuSerifOblique00. Loading NimbusRomNo9L-ReguItal font from /sys/lib/ghostscript/font/n021023l.pfb... 2597392 1106800 1556964 256537 2 done. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuSerif00. Can't find (or can't open) font file DejaVuSerif00. Didn't find this font on the system! Substituting font Times-Roman for DejaVuSerif00. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuMonoSans00. Can't find (or can't open) font file DejaVuMonoSans00. Didn't find this font on the system! Substituting font Courier for DejaVuMonoSans00. Loading NimbusMonL-Regu font from /sys/lib/ghostscript/font/n022003l.pfb... 2597392 1157713 1556964 267611 2 done. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuSerif20. Can't find (or can't open) font file DejaVuSerif20. Didn't find this font on the system! Substituting font Times-Roman for DejaVuSerif20. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuSerifBold20. Can't find (or can't open) font file DejaVuSerifBold20. Didn't find this font on the system! Substituting font Times-Bold for DejaVuSerifBold20. >>showpage, press to continue<< Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuSerif22. Can't find (or can't open) font file DejaVuSerif22. Didn't find this font on the system! Substituting font Times-Roman for DejaVuSerif22. >>showpage, press to continue<< >>showpage, press to continue<< >>showpage, press to continue<< >>showpage, press to continue<< Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuMonoSans20. Can't find (or can't open) font file DejaVuMonoSans20. Didn't find this font on the system! Substituting font Courier for DejaVuMonoSans20. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuMonoSans22. Can't find (or can't open) font file DejaVuMonoSans22. Didn't find this font on the system! Substituting font Courier for DejaVuMonoSans22. Can't find (or can't open) font file /sys/lib/Resource/Font/DejaVuMonoSans03. Can't find (or can't open) font file DejaVuMonoSans03. Didn't find this font on the system! Substituting font Courier for DejaVuMonoSans03. >>showpage, press to continue<< >>showpage, press to continue<< GS>q Error: /undefined in q Operand stack: Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue 2 3 %oparray_pop --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- Dictionary stack: --dict:1121/1686(ro)(G)-- --dict:0/20(G)-- --dict:155/200(L)-- Current allocation mode is local Last OS error: 20 Current file position is 2 GS>quit ngs.dir: '.../contrib/fgb/root/sys/lib/ape/X11/fonts/encodings/large/encodings.dir' does not exist error: copying /sys/lib/ape/X11/fonts/encodings/large/gb1803old_contrib//htmlfmt.tgz 664 0 0 13566 11411736545 14050ustar00pietrosysרG"N p9'\Mw zl~%:}"Cpe+a5rEz߿7֋A\Rdg8 >%mMt531`<̚v  mѩj5 ߠʗ]Kᦾ= N("fg"H |p1y-q]B^Fqt9C1@b@OpƑ->X+H?ٯcř[gqtmG% NꩢfIvA8*hiW)Sy܁;@ٓ D>hCQLbE<%VaQ.x:w^Ӈ)Ttug`2Z@}d `\لH+vg~$H}/EoПh?>H_Ys= rq8 d;HTrŇVPk%[fr6x-b;́ , 4H3VE& XID?:/Snu#B?xǕo|wFvcZ3j$u/5 V#ͪxUаѺ>Kz|",4KТ] XY|*1Ϯ.@^%i &# @9Yu'fر|J $>@菖2`MPv݋~Yl3IWCrHD9צ!0Fds@S;ӏ*!iBBbC90R: }~ #kqq}$  Zg:AO9m fS ͤm"Lqg EYFc`t (kf6Dae9k,^#J"Q\*T7,rl0r-MeBH(P8#[]I3'=Nhc /&ez5 NW;@<OܡdV|,k $oQ8ts/Օ0uɭT-p-Q;i_=jBb$PkMJT\WU#b[@?nġz)U>?=E_$8ۘS YMF[2 NҦa16c6]a +tt>e>( e=ut!r ?}Dpz{` G~Ϡ97މ)h\ jemE-l2hm4tA&'8fKc\[~yeУS"!i("*lYO2ZØT3ưo]ޚ3w޾EDVqBʃЊZ#&$aWxu嘬$H4uxHz~k+G Z%f#6$4RNI{cl%Z9jkVoaʣ( "p|ղq nt8nel6O;\9NZ_kp ա 8 {s.WՖ"O a4"3 _}/Hee_*@44?KV;jԆ1[3@IJ.e~jE-AAy;?Wu`EPTfXD;b->d.$ !)}\1??GVR~ XȱC wEA=|R E @k`[s`// haSH!١WRm  ì,Nq3`jH}z~ (ЖS-OA^5p6K3'*V,,\/q8o"\0aുw7H"qzlecSZ.u엹eN5DfUh5I=i0ZAlRT8I6#V$uPX|&NP?7lKBZp0!ྡྷ[6r%RuSFM붑i((S[fxJxq @fX/RZuqW)+͡Ǣe?h#F=gefdSWZÐK>700c't@LaF:IR(S19.!v}F<1C ,p ߠ6RdU2bʼ9m*˘b.^LZs^PR77Jj_W1DPF$sVp֫b;@96;ze74BmU˶#XMG^H3?bU0ݏ04( pݎ6WC֣ܢ#que[rSOpVj B07>7 xh V\-dQ,P'Sp<^iRJ( wr^ne9H#ѲlO8UgHZ0dE[+iҜ|c,[<@Ư̇BPw  lK/ {m-j*jj[4FT *ldPQ"R= Mљ;b5W]^ZZ$ bf.ᠹMdutW:l.,K#W:N፩ U-*-0Y3@eWi`tlxϪL< EJT_L"Е58E Cgm"Ni /pNqD aVZߠvK7ǧ/V; !XӋ9voEbʯM-,̊*>ՄXk`U^qo@}V=}2ý"+tR ͭ9ļW`++l=9 Odg*JڗP;)Æل_ 솼VJL@c'r0M *w6ܡ\QxdA3iG=F^Ok|>on.3U"_{]JXϥŴwf8:cW-gm/M A2.RhqP56}bIV/LZˆ0gn;8s ^h7Cm)񹤃laIaW>Q51VE:^ f$n7]]z14>ͶhW*ޔWj/f,?9ӟ!: ` ym2v]+#Vb*mTU(PCM1[PC+ R\UC!=ba#o1`tP XUMFxl4 R>]@Yq26m*gѲ98> "tnL2n"u;j!$ttmM98WPyA4k"Q߄L TƷʷ : }A!fkcnlEkg}{[U*,4m*%-\ l7;6'|pP%oqL+?}N ?hrc,MCWC ;8~yߡ+3g.9#6w٣Dɽ?B.1k8̳& V 5ʶ ȱŁ@T w?ե>NNY;0Ksk,ө*nWf+QEHy+r9)ؽ<ء xpSƶx50<æ4< 0~U/SU\S=O8?;9[xQ8#zcY-4grQ³R/ߟ_Qv*w/`<0+vמO*#0C}{Ï!>}O)~(/xSq_/Zm7,mˣ=耇~a:hg]*gõ[dTۻvs=hO׶B-2^@)()xHZ@<?m 6xy0]W6-\mE Gg;fA/kxr9wD#R~&cB3:uz |c¹ɹ -'鞇O+$"zvɦ*z%} ?6h/H]#EB&@Όa; BMw,9f8HGRUPqArRd0<<] AHB?$RP3.U7 Uy^rI *z77xbDdul_i׏. C,o׹!(eL4H,G$QVVlX-?j8ƾdwTLd ʉ ǶdC#j 4K`2#^+$rHq&7 MS$'$z7oWq4rѵM5vaVϢ8#p7W'AO7BcMG:1e$gG붨\Xz~>8;{0 F2$?=8$@ @219  >:8;bVr#=W>Rsi?Zl떐> Ww>ãQx/O..g ^٧Ӌ= Id;}'hЙ xCITW@@ɳ^ϪN?C>7袁݅d,ܗ<ʮ.8FhH u`R^Ux(=T=uUȭZôr[vn~ݚT!TpQG٪UEWL-F}P?6Gfk7z;+^%1MZU0; {[(\a>0:q\B#>V)  sW_ ]?X߉}$cLD !>A'#Tw",;w. AI9Q Pd.0١~L ӽXEF4Ϊ|h7$zAJ>2 PGRy'ZjB% X" %1f!0O'"lTS LWFd}~ BU|wdӉR NhSwƎS0u2:{ ghgN ǜ9k׉o=eYD-t_w,Qit2^y:C6&g0itA:3̇ZׯuMqSd[o{6<;Yy2޼*u7k*sUØO)̂(uH,qaF!t5(`'EwN/.v t!C{2F@FFJFAzy P=!פ0 /m~;kP>d]|j5+z2\2T͏#x$~8}jyp땚.s߾]Mn]s᮳Vؗ%=@ '7i~(Hw` t7ޠ1no!^Q';iS-vwj"iÅ lD-gaBݔĉ6Wev06=&5^ 6e wt.!/"Hhg!'//@&=΀w9tmfwhכ)ttN99gVD\9pQ_RMT@M6,@:1~Џ+lڣ!Z*9FF)F8ݟyX4BP; 'MM&q|59F8]eK~XQPt,M2pW Rp{qe!hmMXu"Њ0?L#@5qS'z/A2]kY}BVG@*OĴI҃ZHxJ8=1O2D: ʼn07^au_;EQH *`f Lδ.V*ͅ _MCxC(b/RVĽ0 5PN;q @b9N2M'Z{$bh6ed*E*N79w&Futz9'U605O5pX|f89fbܿBV>pG+@7ƔRgCNjyp4D# Yozq n;/¢iA0?v̒Cw]+~a^Y" J 'j0o@% U+Q0$m y[+ST;|iI(x0l" eIj 4ff p)X}.n)yc,KEb F0ҼصL9BI28E OJDʁŠQc 5BhQbGiT #sR٩f+|z-@3 e;m6(`P?Yh xl+OTWΔE՞OѤ(0Wx<?x]R0S([8qr1eCRS8D| @C4Q0@ _W qn4Jc=.<Ԕ^JB4Yt1`q^Gϑ0B/?'F1׽y(" dmzfn@4bpsiȀPpm]a\2c]4pMW.<"TY(,)3*EoAgΦ X$-g U(5&% Zpp]gR4]x]dv';`fMKorh$ipFp>2$FhӴ ~Y$m\"Ǹd.1 %ɝ5L x# QuޢīIuIXyn܂/اjiřd%jZsZjQWz'_Ų??Smaj;r Ǣ1lJqy-Sv&>~(vebV2|t"S`4Ʉ&Y\/l.E"hZ]E$eyʥ-FBգ"Eæ=Kz|U,F%ʐYX'."R^fD^3-wNm,ڭ5 LQЮKIѵIVel(wy44KQt;j\|<= |jXo[u񳠧6<^cӓELVa;+>@׼Q 9G;UhZ={IqA u VϕA:_wp ɖ>:`:Pch (W $5SQը,0BijZDUrq['N>Gz/fg>_gɋ%miX9$kӏ !@g'42#%hl“3ujvS ;9lW;s c06; X(nK)u7WRQp] w;cU(C1o&O}Ȝ?ky'?'EU0BHe!QPj M0j?9bXe! G bZ44N P#dE8B@8GPv)'f.ّ?Z`Z.oqL.29Lk(4M_ 1QǙ?= NBAzaN 꼨6J~Qxl&'^&̧Q{&@9@;m׶Hz s:H H&c~Y&AfoŞӤ% CG}89O8?.,#`rvVXEjv%lћc(c (g6" e4Y Vy.R @rCy nb[XLeGF j9 ncc3;"Er M`!z϶ $sM ]Wvrژ Uc~Ew5MgP=ް~.]B1%|-P&V*qz>SV:0}ǧW::tk:}'0W ݘ5]OZɔ$1eQkY.ln 3CZ[̵ Qr ^ UQi%" 팲@.''ggs@){ -^,_b:5K>&#)_/֒7/V/?_o>=Kp08k#zmli)~.r[w ~ /wpWWgr,˩Aq̆cD+Fbdp_^};86>twO^\<2WS\Oё?ͥb`(HC$`Q,J&h緃WA<2bd>!$i"Nc_Q a%as'x=7~a oDm8Cqz(Cχgcya~7v3=V2}#t mi՗hx-?n2ugqYTZNrZWsfNKoZg>0e<)MO5=ddDģ+vN9,Èb' cy+n-}:I%As0Lq gIh \h@TÖBC[uwO&fhWGK)䅆E ?kw'uQGiz.Wg m(?JhEe7;Fz}:d˯6xb B1ɓɖM|c@*EB6.z+I3&+gPMPGel{t_Ir {^.Wi К=R1YոB1]/SPo4.R=sLAqu] rTsy%sg)Ʀ=㆞ @!W6# i?#0y8ѻ6 h14 ƈ6eK0qfWM0ӯ>넲H&Dh p sk@z>><1&h,9:Gy6i976/)U]X͍p4 fi6N ŁY) ^2T8V94X3>2֏WYN8OZ(IoiߴX_юP dkBє%2u]ݚ(qc#Y%d宙bMaYm]l)H&>% < T.Wl ;)ΜY49s&җ:(-(`y@Y ç++9b<^zcgDQ'kRȳj;S$_s⚛_]Ą5vTs^]Y b@+mi-e =Y]+' m<%i.rlNC'MJFX`xsMQM[5B$SS}Z_iC/#F" OZve1 0p/L&K4;ΔLnnsZ=.e۴@~` ReEf>vQ̟e,T|S8QwN0"R-ޢI)7pІCqkV*}Cd]϶o3(n|\OgLo?r׳&˰=՘9l_?z>}krY |C_([yV&ls?6y{!)*y4hSG\ҧ[ȿE/K/\m#5L?mۡΏB ;e_UͼA(tKT+qT7BI% |+{XuUY]yeX ,u=SK\歘o]PM,@ :8V . -ki ~hEq 9NQ]Yvհ$SFL{pcclYPuumrw=SKzl_/}9lFL<΂\ w~A&5DV8Lwķ4OZ& ߓay6ڡo$Z43_y<[8 mym`{¦;GfVE(tcM ˟[Y3&aDp \Ϧ^Ī+ `[.^#hhh>3si)OvP4nDA<mUѶŚ O܃(&/\ӑ?v6Jm}Ɩj~ةņ~=SnVڧem-y4Ĕ|.|@yȭ7$N oLJt}f F/c; &O >f[gmr~W1Ls By,g0;D43sF,4{! ۺ'LK#:W6բpK%мOGGk}nXdf*8~$sNP%L*͇D'B_htn~f@0ilL\$}Nm~yl09bG-U/ix DF>ӈ-PnC(,4&mv. 89跪Ղ6U=7"g`~76͍wskmnW)SjA$J'fRromoBc- ȢZ ]6& `M LA9 ֜딺x6ZxߪemkqB jme⨥mod+@$IGIPLyIvdB(H1L r0 ߦ>ɴRA/-16Ӛ +Hڴ[ ֔L0?;2DμL?v?,G֨HpS1Ȧ>;p=[R@ȶX?D8'kYeSʐC7_kqH*ARlQ6ԟ_ 7Q! ( P9QI8T;ML#:NH`csi)XNo&}规w!ɘEno[rk<+ջKվwp~xd+Gߞ~𮘸7I],>{,&UG F r8NoMg5Pbcrp E8( J6wQB $z] 7[>u2()O90I F`6mz]Yyus]|ȜOw Z8 h@pU?Jѫ58"PvFXžI'qhM7Z,Hee^+/Sj *kD*i,xlϞ~@ ?3zs5T౼uԂV'T*JLG]xHݝj}<Jr /%߬ԛ;%sɉlZ ȸ#J6ϚEuW?Zr0푛ƭ*' aBM3e@ВaU' w!տ6oƽnbpoqtpnŭ ss2 /}@s` ^uhp~{p>QѯoH5Q#pr@8KȚxśq&@4 ETd7"ߗ|HOB|P *00ʴa(e{yL#d5&Ȩ0mYLתB##xbu =E蜌Zk)U}4_}p;8a ٙdSStd]g5kxO<2Y$+AeRr6T ߕ~G^y/}>W0fxA"Zz duK:(_p0}cqCD C%scLy P;ހ0.FA=LAHw0 U:ƸWc]~Zy5kh)DG-m{ >%ȴuR,F"}E*@De S`]vG-=G@6U1JY2n-lkЧ*Ed?-p׊ztG-m[Q_`L#9QKV+Kf X`rROlS^\><̏G1 E+C'5NC^4"7E#?fMnƅ~7>< (;Z}lR.Rِ?N:)W > FrƯw 3L|mwbf@Kذ_0O%B)K5OX7%^?Ъ*-]3QK۾@, ч#j57!vێ7-sݬ<{Ӳm(@dC "-r=],rf*ż\0GRU_$@vAɔu6z~+JPQTLpiLNgҾcG-u29?\-2A/Iꦥʭrkmt}Lίqlwk%|ێZ7j/qҶٵ=ˉzvWiVk;2wV.?M0Ni@y'6M}AOAwFnBk&c:՟N?5%P%xriX :υ&7plt,0n-J7kղ!0wEMۂѺv[rGr$yȼb|;3ῠu|wf9ZῴF#AǕOtr"f7`ȶYῸhܪri .CęH%QܲRoF6o)#6y>aF>~P5 R~]a\a!;шI i23B5m("reE6B~>0-1@ #C3bZb<}^#Y@"=ɍ)ÿT*4[7*O4G`s$ 4AQã6, X6sQ  ňOd4ÍYcYO1#SEYPe?rxq!.|T=>( ĄiCuX@d/oLirO ghx IK"7}[rk<+ᶪWC7 ]U;9:8? Ba/PCGwpt;<:xzy /\‹ o>] e{7oEG#iC}4l8Q7TKܜY\dy|)m"u"%UYM(+7/\g?f&=l0g=˩8GgWzggGF B|l5˷a4>5((;e*wr!r|HqFux=cZ2؜= qԼNE$:.s !1H-j=,llOב}f+xfiA6 leWMGFŽ;Woi盷^F:[DCpWk]/$ԎfOw&H ˜Chn|:t1TȆdZNќ,5 g{ߕ f,Clu۠~C.3[Zr҉kdt [!@YKTt*tvJK Q[Zd&(M C:h [/*'R-ò%+[?# ޅX㐚RYQӰ]`>ˆܳ4ȡdu诃 EDaHOaemU1CtO?b Wb!H"D3`5L] q*4M MlгP$GczHڑ= &- Œe^vJMhI Tu[T3$bo(^aЏ=FX!4deܟ kEU%^_ewYe2]UeYQlpEj$A{B nW4z ׯ ]H`3 GwCư!k.Q4nK֏H[se=hwːm=jmy=͞qLhLHMt8m<lum}xbu;gz~#vo&u`Ll4B kή@=aEa7 ^ZPkD ~T f&ck]~pYWI|x꠺t5'SӍ^yPI Lm] 3vڗH(k R4r֝K q2.4-AQ9}*rk8 y_4&8$`(D HbB r *ǭҸTD?kHVYd97U(ACvqkm)[xKV__EThʆlp|.קpN@h^].oW} D*dc#b ,hlՎt jthM#7L*hmy*hm"ٺ:sںȲWnu[WX +ᣵTӦd*.mɷzJʓ㏑f%?`?YLxt7&GeLXV nB YZ)H-5MGqht\&tby+rL H$4#BN9_) g$Hq!2ɪgB+h /gȽߢ ,ζW\TsMNWJ՜xs8>(u|Q=7PH ml4eI1 ޅ^ёISr5g=y>ٔL="|YAW8oPOharUd/ ?XꙅHA9E01xBFx~kMqs,W{7\oYDVA[X'Vޓ\Ƶ&|44D7)Eyrᝓ{Y@Rw@E%xy05K(hA?hǜɅDdb`c&k&кj SH ,P> /`7^dnUzvSV+Ա]Оd:*/JUSt:҉km΄Wo Z8oTY?XĪ6:V=HAFYg>Y ]>PLLIyRu Yh+Ѓ^ B(VLW J74eҕp_BP2h!GixNX.&861dPGx/n `CM9e; }/4!zH_)M8oȻ435O)_G/l]Gp1MifPPhETo)\NXMą,'KWhkI XL69CPfϽITGN$KH1v&r9%TJo |jS̼~,@jZ,BSq.$ ݑ@EN!"]1uxK\ 5IJOsHy-QT}g1zl3W\!EG" an"[!BI\L'Ʈ@n zX(pE@d "^wT瑦zp9YB)#{WNiwῼ=x.:=О_&F{{p`wEnVkO|^84Ղa/A˘O訓t#ǣ?X-_/~uSJӭ*jQوs؋fWfd5&ϖN4*ҡT$޵ pZ`kSҊph̎UB"9SΨH9 6[㑢A ̦?I-&,8MqM~{VϜG[ؓk݂We-)kNA.o=pЛ#;RG  vg?0帞Rdl#k^ w~,?m+S|vzuOiڂG{6h!)D B[bMDVdkY?9X4]/̂;߳y wɫ; Nv['i,P!uFlTQE6t*PN#+enVi3ZfcK0a5z B׏G~ObsW#-ΰIw o l׹lW/sOo=m/ySҨ|+HA|5IBq.5A/"P 0EN)|[s͢ ߒc:;wx>8a#X 6Z hMmJReb]ۑy7W7Wj wViB9ueQuXsņb!~HV[lt҇ ?L9]{Ӧ"]CuS)3kd|poUOnaq+ cpg"<|0]Bڣ8X:x􏍕Ubh*,Y˳||<5N,&oKvXlf[W8%NO:1/oC .7l~oOߪV  `??*^a'L)6M*,3p6nQ'BxӯmN I:h]+P̯5݁&D"Mڹf%^Bj#"ț>URКE>>E[f|vR[sKZk]pP2 !$R W=35\ f]wp 9`^+U ۚL ={RSMۓQM\ ⽭9@(u/U&orðN;H}k>KaMH>uk1:_d迗>5>_ p 's7Z{nLLh%K RGe;wgD)v;95iPvOI`@S )D|= 9ɭNih4{h֍7 ҝض8d9򠞚)s2(o3e[QPI/F9U,\h;yG!{~׆wpZ9yN{,)Ѻ0{S!>g^v%ԛܸ]ԉO(!~@7+ʹr%j%F #1&埨 lRi_Qbr#ȫl9v[Uz:V,3͋T ւ[UmLÏC˼׆1NXʶF:r"L]f+]jعЌ5-E^-!vIhhjK{\:Lgٖ͌H:ч*ώF=tﷆ`X\h>Z $?}jӑNla${ݿ6# MnY9gs(!W~I݉bqPoafNLJ'Cvk0BSt`j"^E5FS,ATBpbPr΅:-$H$;\o@]9=cVAGţ~!_aiO4s>}n,zf\rݫ%Vs56N:Eĉb}߻̄~Nͼ=Ni6=?I#:1(lUXFNM|ѥ\4*hO\|o#PFJƺIQbS9Kd+c?;ʇ|(ԱPM8 `<'+ g!+jCrDQcF&Oh5Kƺ:핹(n\sKe`pR|jgsAL|?&!f0i.AEls_@"+ͼtfaD 򆽺44G)HiB;+̍S1:0? G .[M#}o^`0׿r[%]֝m8L)fN6<JFmMWsZ= 6s) uzI0eB)W쳈I™%‰M)Y?Ÿ h򶠯[r_$yJVPk5eHEgfTFE!ƥ.Lڹ=!f ! Qo8~s[iq1C7hTȺqu9c(יT 7rUВB͔A$Qxu嶦>|SJu8VN7͍9590cF[ՑULsȹQR t :0[r 5 {*i]kgtib_UnY{.](:ǔX,jgi$I~>ZIV dɶ<3!;!9@}nc/_>4!14IUVfVV>cs3ipYn&u &u qgi1%OlBWR.QDG%42KpI=ӣo/Y\߰yJΧUM%LJr0xX9apT GsT\h~؏v1اxStw#+BW N)z~hzu9>ȶW3?8М/SX;EWn<8+i~~,S\Q[ +yB[~= ߅<=Sm  pJipfŷ%%USJh0eOa*JE4bNBỐAsgOGK)e,rO&ɼ^Ox۵dn5WC+oN6ӄ^x3c⺕ nLzQWg? @!@JQd<{ig BQvkd;RUF_2 e͛k&ꏴ`X)??w>ZCB31{27!n?>HߧLG4ms2)d+kO+~nh8G?xrpQE)13.<"/dOgMh󩔕̋l\z5'W\hpV @joUxrOe@}?LhFkpsupQJ_"a~׆qRhN;c> hbiփg)F瓉 z 4fh^hr7azܛY&<֨5Uc4ƮڍFwmEVjyCA3\+۸7yԵX{' y"q,qLtA+y먒n.N>`3/2i^.i.דoy>ǣ迼)EA3hڡÿqPw1G<$H+#oj-D}x~E%:s&SMvXFMd!` | C<ҀI$Jp&RrWZpn <}TL5`G L4ѡYڎ:Bw<:mJVJ/1(B۵Sp1Pu.I/fU)[VGʖ!KZjR'` 37-Rn _AvXS\Ӎ]:xqY$ܓˋ*V'/C/jhh);\hEC\ע&.sxՀ:7+x\4zV(Z41G%ju`Ga.Mq:R eX>B&a|JԷxl|(Q4”!$+:SA3F%'haIVh>x AAxJ~$h d@/wYە'R3Y)[cƙ3F;g]*m:^|\hMь9&E<)Z1IZd$6RKYUURkF2j?:;7:w)<[*Y q6O#|֝<kQ^puNָ BsNHY܄ˈF!R9ڗnDd/Ru1ehubz{*_dr`f,ϼ8JJ?Z??hA>֯8N8;(!}Y&6O`]stWDe! WN2k U@iyq?}L}Du!eO4cK.[Zѹ`,.ji)} pa-kO9[c } B9 WLI%!~2)V'O ٜV\..7gB+fha6sW,ࡹS= /n%}cBxu-ylhtƭ; ߅-ϥ(ԖPR$@FSgpPJ ^ `nuZrBA n,Z) _YuDQfxzp{ +_o͒N׍˳5(UWvG'p ttU\Uqy8|*9&"#};5GPb@@@@UTU+uZxGbaQܬ Db`9pbH//=vQsGױu{'>'O|=5r_EdF7Na %έQ4 >u3;uН]*ƖjA5R%-qZ2$d6mvzɮ/1bPd j4ԷNw+BG*:3Ս4*y˅AfL A6Es=guMd홤yb">}qSpj R/2UIjE3b" .Ah:]pV ΤX~E,tyzhlx_1:St0 ze={{}?Q|'P(pc(enZ~ܠXFRIL;` BgRVj oB݄_ %iqc;L?6+Sn3W 崧nJu-2]',DYJ0,Ӥ3,8X6ѹ&yS.(17,Tڝ)i}هB#c8 m:ORVZ6(rzk[o=!iPA*(Y4/ ՛ظ܂܀Y*hPx0A}Dhה1(d/vwuݹ-o>R&! D2%}a.X2Fwt@-ǻ|!tbtچh|̞{WG }usۊd0c^ Wn9_Q9wscByA5J@{I-#3N Gb@ɢiG'.HYfj#; Νj-C/eG\^u?aS]v$&`CXTuIY>J6'b/)&~8D+*h,;R]ze|Y2砽@Wb.7n!DUj(j+N~Ycuw})9orܘܶ?P7 -*?|O#u?r{(%59U!%> *]ô$$OQp?fXeMp?|!_؟= w~IFD3Fi{ TG?BL?>uYXX+ ‹GSEv"4~aoK(- PG.Gq='F*dPv$CB#AA nqGhly!}xmte~JxQ@$4]=Nq[*dfOg:[3xۛ`/p1!eJ礙]1`"wbpCT}1#+i~6wH̄Lp&Th' |;Xf,ʹ|?=D7|;=R:6&x/wXU8m]!vW%h~<6EM2}*VxkF1F*Q9I*#ulF"q],I: _ON}.)k:)VZKXb+e@;&Z#ؐk#ч9w@ɛuB-IK+__F"7n:0G]2юNA&ϵ'[¸z!"퀯 O]2\ .MnkO*HNVysQ9Ƽ~m= Kܘh!ho{_T[հTVLpv!waˋرЎ;goE)isu::'kq5@M><{ê`|5@6!m)F'~ZmJӚ■!jfXEv lu2oMxb*ly-߷vOct0M4RI.x2ްK-2Něbɭzd9Y捯FGAXJT:ٜ ?Q] 7v|CޱhCY*H7ag P[;_bA%fPR`* sGH@%h}{!I)+E봻]ZhUDTV_-BoOӪXhiM}?CF{~x;3x[G-iΛѻ'phe-눿u؏S _(*)t$Iso 0^s ЕGxsWT pʀD&H70} $},&Oc|ds(e0r (J ?#mӚwD#-M):sl  |bKDTaS^@S7"na6o؇Z_cd l VՖ>z7^ 9w'[8tit@ Xd֊.FqC/0<\/iag1W똢,$bS Rhha|OSJZh`^ɐIBbqF9>{EnAҎ~RZ:!8DW@}0I`g@&X̓s8ߢV~WC8Ʒ't~d:íI;\r]Oɬ $KծuڀfT!5HGjuLMXD6H {`44(lu s LGag!U E$יMѿ8\%^5(^Qau:k9 ܃~ VS}͗>5$ -dK T87Bq <"uͫ,lĂWn[嫑$Η#R;ef^Y&Ȼ~jX.3AK r{aoψ)fݪ>ӼgWI<23U3_}[4$+Pnd]RA-+m")鼴gXXw+3_tU+HOiPIItp(n-W S*PYyL^,k`T"8@^zaO UCʴn`4tdIҦ9^xd" {*g 0lDܟO+ <㔁9^ MR(fp(nMVr%儹xJMFܳ],Z:+ =2+p"Xs;X^U?T9AjE^@jЊ9Eꏻ*-6n fl n/G[v^a//iy)L&qxWQͥW]ނؿsUsPdr_~_Lza>M??>[|4޳6m$=ZI^J/YBl&zDjhYWu@ e@;uH9ӏ?j=O(H+4Q1^Y m"E; .e!o"B2p!/Sx^4 tppz Yٲ@Tc92Gz Z µ!.APlG{- Kq I*7M-ߦA0XF%,4ULx!lB(4Ngy &zz^U\mz a@;CH3s:'Ix43W렵0/wAύ!>y:Q_&,->Ś}^@kŚsW,Ȁӄi -@p 1ղPc3 Vp0!{{W <@*ޅY[}'𷓽5waOObh^~1I犺{z2ULhFN Ƿs)8yo#$}D 8.q [(n4NvnFcy~ ,ySx&:Dn9c-, *"H6s.k̙ІQ!X{գKMև}hm.>lLan7}h|qIAQ*);6Fg Ԃzw.5JsBUJ0jN a|ni xH`nHU[͐pXaEZtpиḚ.DpPKw81w_skGT6 }"_ {A\sngE =imPJ8IGL<4Bo6'xkחTf^͡hVB@ טC/ )#K!'PAk]0<Pyoƿq v3 hcA\5k|IynXBl^0I3A (sV3b 5tczs:C\ZjDre,?&Uv.s_ xB z2 3&,PH8 ,왋"@5&G|C= '6z^:K|f"Mf=Ij/`@ʒt1i u.rA*<]R1[>dB8B\7j$q=G1N Ezd` 1Wsʔx /Xg 4?f፞|9P~ ZV.oF]h)5<2@{H'I&h谔Z=4dF9ASlNi\>j9qZF(Y .W3Ay. z^P_14`y۱U& ..G[4~ϒ&ӾP,\`Izk=F_ xwQLJ0N/\%$Ac"(^}c{lIxjfYuniVV:\z}g+uW mBDԋw>u]Ȣ`pmoZ~.XQ<~e(>\<,'%vNu*eи] dâO"z2 #,.|xa>žZFHwЪtLIzi8986+ >T8}i49ԃ4LR}UtY&]˯˚f/Ƃ{i[*Η/ArV3` v]/4ge"N8 'Ym&=Hֆ{m5QX3 B'"{/Obp[sT8cIognP*F0= iatߦy -z MҎfC:BK(N,('\g k5qEOA9H7Itϒ:{f Er0tjNTNkOĦhȇO%Yp1.:\MD.7oS w὏V#,j\Ȕ2ZT߸bxolb?ê]&ua\vQ17t~G!XeV8^ke#פlBqPU8`9!4i/v'c9vfQm^+ L=fO򦶲1WT\\PvާKڳu:[%-rTu  LGy[]T! c: DQDTTfS+PţDP_ ޑOn^mA6 9Hɶk4ƨCw3ׁsX7HkSg:y2f*/5dǿB@*R('ܞ*-G/ԝ)GYd?mkFяgy!M"Jc$.64,[d_"WӣPwo9 ;?tYpz6 .y0:YhNĒ=HWԋ}sY-cޖS3+{)9UV`-VM`wf' g<. O'j.u\,'@X`Ew2b?|(Z]Ȥ'[ %0jѴ ~:þo+ knq=$JE*3yB>+hbAc۬%^{e8ZޗÃ߰iQdi!ّZDfW  $i%f{C}51FCuK;J+ηuHW80NM{tw{ǔ|_ˍ"B'QE8ې[oC6IzZis;PZ(ΰ+UhMӳ a%lr:Tz~ȉ [ A=a<$$ 2lzM۱Jڶ+Aka⾆z+}7̟j%֗,/:?Pm@s)u9QXC=/?cH +&G*n{VέQf wO $l1*_lQa4#fTvTtWAOvVjV̽ a3Ydʂt JH\5 hw7i'ABOJwy)z%eCϿ=ل~b~R'"9kn4K%Ž`KGf,{euߘ\VnjdpۻXfQodr֚ KJs}JR $*veSh_/$oŃ_۸|s*q@]Bc2ӱ/^KZс8uV\kƿZZMJ]p*y1}-bjxm;0cMHy͕\Kb_3Fxs9bO=eWhXQ7F=t=0hpᑎVf7XR ߃87!w P@ݖ&M9-NmD^Tp.0iOzz[ yL>7.k[xViᶑDh}bd> X(EV"⥑nX]yJᭃ?B`TN;xNt]Iz =xAtF]'"3; i_tgT tFe+vrPwm/I*.| E2:iXΊJJ}8ti,0Pn/y#Վv/ӏH:T.viG̔k毃b Δv]J-%b/&ܔR1Ep +6ki+& JD'޸ve> sjQC{`+ EŤ9cFWWB6+k?sA L^.kT_m)/_ So+G[s ֞ ެ*̧3?a"ܡd`ҞeIEg+Jg~K}"+*RPORV(Ԇ+=˅)Ea"sݬH(D bs,sit{Ȫ< 2hz$W >)q>ě.q&%Hfhz>[uKwWP;cR3Nv;pqW,Xq"9Yy-h1W7Q$,v[FP !S-,@ C$#J9~-!wi<56aS]@)B!۩P´&!K[j2$()te-@)2٬TK6}UdʃUeptMƞ+Q uJv0)'aCyV`oWW7 M-/U Yt \)nska(`›׷_( x-Hˊ^Vi2AT%8Ќ1'YCՍpl +~eC!=OλJbHKpn;`u0(3 ږO[u*-YMezѲ9dʄIkkqYtဩ)=&3o9yS~{tҶLa'OCNt1O/;$D@[!D.*Y$zAjhvҶ)߶ uJ:E" h" B0?ije 0O'R+f 81uޯ.mcJsKn,{Sm|:Nd[Z kd~y\VnhkZ;ۀwv'K3vkƾMsDnU+j4sbOMH4 A$82\cu3eŏ_^9pyHԹJhė+&*׉!MlFld_!1k0:spҍ+>rI"* =6sξc9XG4Ra}FhRأ qUostCֆ=TmY xkTf${T^[<6bIJRv#g2lO%OeО%?'UAL<$v7ߪoa0@B[*fMsP % /qj%>aYuvp|xh4n~K, =08W r8%k2*qiF3brVT v7P3t>Fw'}#z_cQ瀆3fsGZ *]ɵ4Ip"/K@+lލnvAɦe@: и \&ÁM|ɡN&Q8,hw:1iދwܲM|g T` _S.t f ~lkuULN 1ݹ(_Yu ]Ws65eͿARC=wD.s&t$Դ=7Iۘ0T пqf|0[6'Vx3M@ANO։-'Md[}](N` 33:[[mh]8J>b 4lcn(9ble7:Zi۱LC %]E zV#tir`(5S! #ᝡxaHSTGxRvbu(ㄆKkP+=G*zفط <6P[}UJ|ĩm}UMK{m{޶lWY`xEw[DDeJ~RhD-Iv/sPN@,G8sޏ! oͰʦBfS)# #hGR&M|9YNɑ=3iWTSI7b As 3'fɥб{uCMN[GSȎXT={DLϧ,[qHK,h2hL>΍-rt%F)ָLhqA+bGvvr /b A4Y;jgy<+tBÒ"آWuY 1UqLYF[Ŗ,se˄2-j+Dm6$g:\Ű`jr[_ap)9zlSyZQ =JfB`:WmӍ*'M2Kit!߆&$r B@<U`50cg#<);͵ 7qv5h=ȹB#Jٲ\1-\ xM:?26)zٲQhF]Οo2è$~j.* &C)ƄF5c(P&Uv M޺Vn䤍r=)d\ì4D!a!k4HEu8"U;72 %/֔uI\_i= c{7tK%'zj&4YRc>rce3>!Q/,OL5*lhܓgԁN!#=z5ƪ=p?WA({ߔxV)QDB h#fOHJoCW2АV*έ o7LZ#@3e:GAf/T~O 3aj9|fA/yKVBk`K5ᐂX 07굔c 6IVɼ..RV\~S~$b!@$|Lz\o DEFIJ ֤)XX`V Bn4 V)pwr!OZϳO8h,ʓD^k}Ha3b $ea~h*^L+^G S![VQZtrlB'Gƅl+c bO9ݣہv6: Inh.fזfPkկ@U9 Tqu(RDA+vkط!<%A>om,σX&qҦEaZ7"ƹtBBJaJnF NFMp5}qؚ N?G-W.оȶYHjMS3XL]+[]XDXSNA^> ϔQhrS:Jbg^>Vtv#JVbc] -NS,TAGǃ oqUxڷy8nS%hϓrx Qʛ|ZiL,S# ]Xa lh:W\?J99ZW^kaY1''l:_:) s ru^ey9:6TB4DKTN52OeoOɩCi|ˤ";@֞PD.r~JGR,pcc)Q2OT%L\vUR\&Vً[&Kȕ3T))",A.Ml6ϲq:k?$W1oqlw:YNR = f0w<&bB;*/,ŏ: 5N 5}ƜR6z߳U*æz0 ֬'K>:N\T.FY˃%1deb-. ^s$iA?T im\V(/)^qK`rN9/R8E窚W|K Ҕ{a_HxqXCWq^x#oW0[Ϥd7˨JYU_1XZك;+%wlzQygy2WBx·bχ߽7x|g ~:'My=n7OF/.?ց!dd!F Fe~RĎo]F}ŏ0Z? ڠQϾK^(yT ᜞$ʌ ?ШKPDoiAĚ*^k2F)pSI{wW f#2鍷oB߿ŚO$EJ@:)8Kk 8Ḵb1Ԏ)#ԪzaLT4BJΌR:( +EۥIDsC0fC1;יJoi UVќB:8#)Kf`9L#Z? ̗&ߖr7#JFqD6{Oئ/BRt)[xtoXP)q)؀FEVF`ջRIXvDw3}6U=JpbM@B(XdlrSgʾҸѶQ=0Uh/2B4TɌ;],*acDY%x! SyiTb=1^,6zz[Էoy]Sݧm<Ǒ~s:ti+p;DιPIݏ/ Nwչ}7,ln|\(}Xq7]+5(o~y˛>z>N4-51ĜvkiA2"K {-(=d7? nᕢ5RD[X EV]:; {1diCTP=~T=A9;lG"(JЈT݁PH)Z JkJF`'_9ӦRGᎺ?ԣƱ.Uڐzڐz9$'#.ep&L@]HH/ VA 9/k]M2жp WC<=^|_úχ[ڿL~({xss)BH8aq"e҇WDFE!w,ؾ5>:2X1$n~ b8Ckb.9OGr:laqnH*;iJٽ&۷f}v *gN n#A1ĵS(CZ"+L?yN~87i;~:KyIhk'S6( IAw-[>^HrG!270`=)m[Â8bH=}eRۻ{ 1NQ^x:ڷZӣ`9ݚn5PˬC͕{U+!kM&3b)2e*i(r1m2m0N|&0P(?CtZm#ͯcmYvgwfv0>.2%Q6JԐyxuUu7y"kvD-T(@TcaXA|}/UIaqTy5-t,Bsliw%L؞~ִQslmxS= /״Tyށ?Y"BpD O6@RfbH&cClTuDm%GC(\e]8{ 66 ll1 =8gc?\\..b`V#U-G~#* t- ol|<@R Vc3W N>/xyGDo]õcA3e]#@uV. |2@ y w+/ëe?( iATU+a&7hXĚbMEd،䂔hmg)!R4(GX9lb61a@MD*ϝ,]rsrE5]MBJIae8^]J%`v6/]\k:FӚ:mgR'5УJDT(N`g<TDmk$?sa\::t ߮2,Ѽ$ c' #8!;{wJ?@x:A-!>Pn'ed fMl9 O"̶^ITjF<,SVS1ט:Gk66G$3GVn* 'ID [j2 2Wc C6܆:u:AƮCW~>kָ&=͹MG<-Jq_Vq̢P',FfZaDąn 'i,E?8$ZxS+f J)P dS`0cy8~xvzy=|9;I?'uY=`k,_o[i4Ld,<}[P59]gΛ&b_9JRҖ(} =#ƄctVA@R95guhޜrFmPtGuNo?ޘ7ab CJN+4st_p^zOHx3uucz`B_D8C~ (-,'Fn170ûb^9LWˤ:ƵԇѼNcQRveeAl%wDmrӴn&ف֑-WT揩|L30LncXcǒė,#ɪ?Ċf[U`e>fѼE;JH#HW.ed--#)h)JӰ)Iݥ20QJ|l4-c-*̔vFp< $ߗ+hS (-hZ]j.IS޶T6&O3rҏ̔m'k2:}U@/,6 L4'X孖I~c#JmFm/Wf?"y S@ʍ} 810Kd7 =Q>TXxw Dc^݊dg'4Փϴ^հQ&t)RX| Va<xt3Ap1V֗-jO &..'B.1*B3rn\3y_ZPƦ;fxf rҼ+`vNn"iUr4o. 1 +I\͍8S*T4EM`ϧĈ  5m6g+'sP,dt:61.lat T^4l[E0V~ZEYҝYT#VE( M*Yc'gky{$7oV $|x>WlШ0mAa+r8K}6hp޲f—BRݝ,WvezVۈBBhbbAORū,|H:-g!l0m!MLG~ ļaaѭt]AZʵѺ4QHw}*20U*ݝI0[iw4o :Ф3` yѼ5JT;t[/Z&stPۢ }~V# 0ؾD\~-v jb; (^ eu/@/>y\NҦ$S:8.*dقg;8,r LC{{M6C [ vֶ+&6IR^? %N*>T?d%۵Oу2vU`ūgz[/I_@eh"Z%*פ ~SO}JE"c,bO Ӱ%uAt$ NVE,H< ?O.,ұt |Hx:K?AZ{Ujw P//?c?eZ,5 X[A7 6Z׽$(//؃jQOMV`'}R.wi%0ڧ|,HҧKw=@YCO%h^jp0?SjTUk=?nS|£H[ Gھ5)4\AQ':bNVF%Q8M}G!9+p9f;ݿoH)ڣyPe)!npMN8y8.猅QCpc6~0VYNЊSrxaѿ@ƹd`D&ANin͈qCΛ~8l\5BNb+ l]]WSWUi'GW@}h041DԝKwz*ExF*)k[ULG*QS_Ar KeH^/S|y*zL158~d![?=uB7;|?G@_a?Y ~oISܠkB # G>8Xjq*l)Ns`Sf[f!'UY4"Zc'X ls&C:$8#jaLm͛kN6=(S:UTsDp2d_lmP:ddvxx l3R`cKFVrSUƜQꘑya,CL%'cC -3NK07o|赮a8㣆-, HtꓤF[Ķ,-U=[4{AMl@QK( b$, .i)ĈH^19T7Q8lfHѢ* | ^yzptիA5oݓ/|c0wsBzV70Mpк v_vwv{;7}]5` k'Qs}R{ ֎8mtp26ua8J SH9aؽq {A_:Ԫ^% o{;6܂6vpy} %AAx퇣 }}RJb_YZIA. tS#?nP[(:AJ{x#"B 2>z- .>vOϏ[ssp cx*Bu ~c^[(YoX,\{7 L(71'P̊[}a8]kjEnLK q5~O^-cp-Hi{*|τ(zԊYb1 lr+ЕQRh;J<)I4 ,o2iR16; ؿ!(Ӡ>^t~|=9=kҴ+z{W#V]$n4v©j|TC_s5-~ܺj^Wo94lYo1n͛w޾f} ?mڿ74 PXU)ϊ5'c[jK}?F4}F<'˾˵jD4=7$6΂3 &>?)L7Iի?@OR==4ح&!5_szC0f&k¸qPuB-kg*CCV/٧p\>8~9Ue˃?F \Pj  tq{&D#WQjP6CIj B\Xr\8nEʅ Iנp!?_݀j|7 :( 8HG"DBM1 _e "*VɯRJcՂ1,_πKB]\{vC6+G^=hؾ538bRc2@P*RQj; i66vyn}謋rik\+xqВov46b46CD}iDl{&@'c;Nkj D|t 8oBe3vmKɓvmCpqրbGvܦ8~QycJT-;pYBgJ?`|$;GlO9 }곎 в'@C.x@R"ET+{izvQ!ḱOٯ#K罾 sCbD3Cm@?p F^c+uJ7N*|ُԊY (P\BdC` d _Ig~OPIf?19 KWjY Q 3wԍ||;6{-,b#F`iyhof 2giKjKlMV{W̃/C_óBcmQXbky/tacC)< =ڝO{MIuDm߇/`4Y*D 5^odaR˞?G2zR{$-IӚD ͛n{ev?yc/TLlFc'i!Yc޺mmL>FDwYv}Cl6)_F#o)>UQh`b.\A 6 [UCcl6A`qMP"TbkVnUVbk. vVbkDJm՞uv9dĎO:ySl5 m&PmR;Rddw0o@x#O. ?b R;a͂hHֶHk&B>jM/cc1LYs'1IU@ڙIQ v{Z|yx2/s!'f4leu>J'e)ߑ<]yl zrWnl!~6!\aQmI=?ѫ#QȽ"d 2`v2_CF'J<:H{f( l f#*ʥus7!ْҤA ؛H@xﳊE/lӓ l&;d3dEIdgO #<՟WJa@+lC?;\Sӓ=o4z8^XqsW(Í|Ce7{7=/2ڴ!8;{_XY>%'uzҪJ7)czKJ/};as{f9ڂP#J>]L%/.vٍ'ŬjI5Fqw_ա5n%h]?74zͩL]3D]T d~m0ԛ%+9M/RQWqc}//S4[dW+m67f#JK=n>?6h+xcT:nCɆL丼`() { 7J@|Re>|( R|z=LidOZ{, ]#M-ϊq)аI0ֹ(B=c6@n-CUW7EwCvvqGv-Yӑtge&͂/ū6 :UPTs&L~={1I^\՚<ҮQtT>n ]bGsZ=2ULF?. @Y Iq0[/v@OuҺeej򲃲X(Z^Y紻w\b>O|J^CFjhN(|&"gMBFYO"N&%|z%4X)]ފ@mMoa_&Y+[w _h I:7/_>/jY~b!IߌYNV]?5}`Nk |9c#Z wzOϩq8{k9z;8~' Coi ?1^N)FcBpDPPI:tګ)lFl @v4aB6Qcdύ.cpِ (y|H""8ƷulwU0~cvg1%7MmDR (_X 83Pfs3 `zY o 辵WذN&Yh< KB@dK૒3;J1)EpizS:fåirS'C_/N{N wRYg2͓,ʭYșP&IA(ƤͲ xWFXojx̒GF?(X<|CoҺk_Q¤!t(БC2NdHѫ MA4@f_LdJW&JY0oNjh|h09gj,cb2۾ynR汕bzS&c4-YHLR; g  6z+k3vZZ r^s(P(SM% 5{훗52 ?OCn7("]0 z G'Mz[tk~^Ek靱Zzgw 9 QY,C(VC@S4bM8,h>-ƬJ.O0´0MͬC\uta&]E)NYPHTxmhZc,x aYrxbQQJBX&v䂮 WR\A/ZJ}$BU9ގE)1 GсJ}#b,AfRF<-a8T.lvbQv"6̀Ў6*bFϬQW7b&C);<7IGFWS~]&,!kBwfu7P ZMG^u_7o@Y~Y'*;ü?#+ܠgIY["!/zsb%?fݮ|g߄-@ pfޛv\y/z#6'}LƁ;[w/nc_Po{s0ݵYsreVBYQ^?BUqJ߷Q\Q* y|}~}# 3 p]Ѡ)cIR{_5nӡc1 ZǞ0hE)g o. `i s ]5>&IQlbsckn: _ә(ഞњ/ޝy{zҍp[ z;8oL![~@ pE>z+z݀q{Ȼ-bP06yhhSyq= #=ے|7bozOs[S[ഉ-/RALg͏b'Tp"j<c%$1dHvY^-m^Le qCM%V)efU1dR\;C >m.V6(4J5f=?OO.!L!+uΊ5@0.|A[_ -FGE ItMU;'0 Wj9ήU9ee[VMq" _dpHdKeTz֝ 404{o{'` A+YuGa\ Uqx'Y忠$]~+ϔ~wKaB432hϤ3xh_e'%d󿳽b)/~օH0֜M9%0ҬH<k u7C*IZ9ݝOVd AV'fA@#n]%U_ Y4Ŵkv`}hң1q 3uxKL{NREeѹN#,2 [Y~H VeP*?C~9uIq66YX 4̇Ǔ丟fEJ;Z^v?n]뷿Y:R(>(6?L] ںIi_Nd玻ʊ6QAPGvRH~'t2ൈU)qE EIŤ8ȃe0 kq7v-Bpr D%K`tEgH` l`yc Kt5@v&EoYI6t:H1hcιOd?J'J@Q+(l+bc5>PY|Vx7wLm`Gv?TWeUTFB Z\>%ل2AZ 1V*Va)鈹<\j-,' CI-3y&< i#{eh%?FO{o4gVYRoQ@IjA:hENoOh8ryF['#HJЊF@tg9Ĺ)w1wrpc qcVHg?7rdK9h46}2ī(;g ^ =@iMc.rSofDvԣ@Aq*K?3z34?Ï?4:>;:=?p31tIE7ЊM&I1U^4fe. p=jFDssij[Ea>.Kn7+}ٽawS2=NaX;<C9jx B>e6ŞEG|7l8;^#q孋#J\bqeڻE6ui`ܖw.%|>|`R\̟7]+ ƍm LXǓlƇʱS3yGɔD٬PIvLI7 jG"[htM,xn.\^`ʇ$_2)5??s{r]8<ӓ e%JWK`~ؔE};߮ '\+A@$lwsTԼæI +ZYǽi"%ʁi ZU1Ï/{4bh.[xgvCՄJx)iT*oCÐ^& bLΆ@~r"I>&g ,O-  mU[KE[QWiJF*g'|*㤅k|Pڇ|W斎2/Lh2b>Q<"K =}nX͆vqe}%3`KdRk_)KF G Ud9#˔dC+GiY3+= /ZIM!}AnU,x!hqmڶؾrN6]-"Vӭ@ĩ -u{TPBPM?i] ORhk/Erw= 0.=S2ҘM7G~d`iJ{9 yGkUq~*=1***sGC9V[b?RT ̇pTa ^)chQPLUcSnÄeiP92@FU@?!pA6~8;VNhaӠ6 Bv⊓zV- Ct3Oa?ȋ]@Xe'B<cL!C2a?y֨TxSU0}`S쑔&t#@_H_ę/5(SI?Th]#566mx”aIPymzEeJ3=Ђ˱i14`ں'fb݈@NvbZH{T(oh1NS<[YFKdMt k2P0۷7rY7>N@)Nt$؃mbAens؀)O7 \: |X~@*s&^ase".i R387! z7LaoQ" 0t\qxϵoU N߸C@C2zܾ ^sOUU U{д-wnL^!7n;J414h @[zwd$HRC cC6" YUdvt\Zt-rpbNקꓵFg*LuONOެϚsͭ ahK v+@̗R! fW2 "&6͵0fcm&XЪg8蚣P}A(Yg= Z/-_Su+)ˢ `9E9U&E:ܺ*0ZQtAa!RMTJ:;mќa@P9+B ٫/8VqD71-$jm㺵0 hvfĵ3qh( 5T1`nhKжЕWgXЈ_9z#֐}G,>\1a^C4L t_t eq|c:+qyY\xU+UueWcs[rWMy[]aBTGa;nbQ+G\?かj8(467vYЖ{E~[J -πKn&d_{0}!y`y1d^paR?&%akwU-hKp F*.CU/0m|Lsm-Om `l7~X.rO7a<Mc73v'. TLDDHz)'{´mQ>(0(Hu O-H{Nb:nh- @`>60Du)N\a6^ xx$ʪ4gǪX?Qe󦖰%4 B2F~%O-j5X~f}&NL O}x|gX"kJ=Mpv&C[s0=?Yc8-тykY [K4ټK Na~݆vflݟv4B/ۓ(,!)b&jp4Ɉso/sc XDxW^da0y2I5P j*e v|B ²Hŷa<`!|N1>dToyd*K,Mt<4>U иF|-$"NѨ?>E2j-!ܣk~ŀG0;=9]v7>^9|@_L1w3tt:Ba !72xT9h΀$~pb[8&' 5ƍ:{i{\Q>~ !AQ۟Fp_|}^{aə_ZFQn O^EEBۛ8y.QU_σ~?K!&X'fi'L۾ɑӖ(k`+y_E(_*b* x]~- xXJk4 a(::%ԽhoAБ<^сC(cRj݆D OΔ~A Ha,j X\G0R< ?a`g@0(Ddp%3$CEA郢3qFm |n&`ZPm@ut꜅w)'5~ EY@ Up 3 Vӓ8,7 췎7Rp= `kOh@ fT50HGF. (?I!Q?v'4DQ7ՀO$/u{5_Yl)0x=J; SLKT@ɧPV @lgw4m3??o`87cx&O0EJ䘎.hRTi /֤ccw{{aOkҟ֤MB^$:e :b Z"MתͲ`ְM't+6SD.ΎNϺ=XaTGM<=Yg_Deà2}"z.jf٭]xtai6S$ʘ|w)@ٯ HXWiдMT3U\0}t96Bч o::(@rUBMUbq iŷQ3e 0m{mN n/+5Ds qSuk|pqKjxP"b^X^ vϨ?nw+FjQOz#qCUJn/0L5bmhIcjǁl:9m0B{\lxBB *V8J*Tـf2?MKͬE:w k:MT^E+yۃ6r̊tȢZuGH:ckྃȕG@6n2/m+W=2\E'L[?(‹p*nP*957ɛC"= `u7!! h ‡ OT ;,N|ޝw{gg]1Bc es &>W ׺1wgazin3hE'ۉDAXf?,HpGwV™?5W/lk|**kpS牨%h .Rb-Ω68xQ̀HP"-Q9I1g 6X?eN(tX "(0WhrhZ*ǾĚCiߥs+O B(kL (g@{Kz CF KC&4g@ 0KV (N$ JPQ q=<27Ђ8:5OuDtuiD/>w\V.8?dU80),h *1Ekǰ@.(~64tmϓg+.bgar rGz_y , A/Fī&Ӽt@m#iI~&C BZ׽댏T<,V;Ys֟ͬv)tͭQŔ>o /i,hP)=eI؜D?D,AW& FD\BG$9CΎW5m ׃4N4^adg?T`w8pEqs^qoTZu:@]|B\=٧})+q6QEer JXIYaAS%,i6%=HNY^5ȨoQ,V^?2jpo38753Vi>b%+dڹTk+k" "ņQ\Nބf(7%ROZI\o Y ?~F+3>2ׂ/Q!_gelhOdLb|:N aN#_dlqpuūf\PWibłlV ϸq%Uۺ)Fk2rOsÅ#]b0g)^m_ xdTފ%AZh+C%+(S hOcHX JQDJ$0%oC|%~D Kd܀{rn[]QPJ>tKR0M̹mWT'd(YJ񿥂{ Sds\>w=Un QOǭk[6$U,Ԁd-z[dKI'8Ҍx_/$DOIA;cV=ϊ:O5%K qm9Hsb^6Ec82 Fڵ 9=[!"NO*1iSfE(gISTe㹕@Tr:M] îVШ?+#+Rˑ⏊wc)4L-n9إPy#BI!tΏ{ONOrწܑFQi M>4ـF\l6)AKYߘYuCslC,,*S5kk@*x4"O@ Nԋˮ$y4 K 0\~,GEX ]UfU+zM}jyvJ9#EVCg6~8qN0:凚=lPU\Ý9aא5&w!q+ݣ$߰Ech\z-S`"?b9Mνp;8?FZ)spTfd6-5& #3wאqYĩPU."V5q5M "%h$r\iAEuQ(f by D!)iv܆P$st47NHi M 51I >xݢ/z}LCE,QqMTO½'goNɽԯ8- mU]Gd C9'gQ@c_QԽRmjrL?΃jYS4)9T ɐYR61a *96]ܺZkh7tCLku)7VP"kKCGn~کo@$ٻ޶%_y](iAUk'1Ԇ'O2EQ2ZH*ϯ?sɥLZ$>^83;)|!bRXeCŋvoqmNKa >3M,ߺ=?d˚a% HLfo1gz+A>`hthzq:U2 I2H\!Mi`\k}Qd~ti? exDHOzinnRa\F+BP?4KQȌs^OeIZ\DaP&9Cҝi(4.p(2$U3`sz1udT8 s0WN_XCx= sьa mqۙdr|rL&O+\,! MA׌i#ص!hzKfm:F:@aKbQ!5HÚ0 -&k#qIiU 74aD"H`ǒj6aԠblik\P-vv(>RP,H %  ,, E,jM1@jN{I(fND@DrẒPA,x?P{Y=k]*7IKn oft&n҉m%i䦜60`7@?iJ3lK6`E4d<5d4v3p;q,pb7D& 6T}|ν&m$AyR"Rϱ80inGP[6^@7$bZXn2V KhJoUKI3%J7$nP\\r//DDKǵϋ/>P 7*;PJh&VB^/zoC1څ/'Ey|^6}nhJnfWd4O7d ׋RWo`{FQfc`+i*OeaB0&J$.#|dcR6F)s,n[ې] wxv y o#S.7Z;tXcН"ym;Bmw[Mdwh^4!VтVvҰj\0$TdT1J/'d=za>=Ե+ֳ|2X+#"O-vVQ5RN)7AFtF̎U[670w[lֱQ 6r4_0.ч q{'EsTd%6)vLw;Y[[͜MęE'LBۅQ<_K G-jܚɎ9g6T@ٚthtOY * Efy$*0Ƨ9FMnAeתZq;Yp_xc;ҥfjōSsm k}7Y(KV6{O*9k 7:|cBoEtdgK~O l|:fItXwJ)@z؅_0y:1(tK6i-!,Dls+2ޮ Æ l}-O#Wq-TỲSA/H98V&YfCOטh?bjc͹4(;H m[e3dplV0#3͹!z\ɛ&& 31C]כ;YΣiٙl')ux!iWFBqs5['ł:LO4R­J)9c⪭>9m/~rBtHB{@#Y^n|iL`ֽ|ՓvJImΡyGܼN.^zaRA h֒TO}+MIߑ51D0kS<®EGO[hv06ˑP0.T# <kZ1l2VIi"Gd*BCx ` *.cq.cW~ѱ-fƑq*z2N5liK-XȔR/̂07UP4{Wr7Mx}~V?;=j[7oV[1? 06T.j=."iaY"TerʊGQ Bn|FY.llMe47 9J,i0H UYus7c[U,rf7_#;ȬfN#ESSe B)5h1)6PBк($iau P9WQ4p`4íx8C ycdͫİm+VYwѰ;8Y. $$׶[s?b XM:"sj+&Y0Bsxby0nfZMOaGXgOD(.LFTb]t=#w"`N*  Ƽ@#IۺZk#}4Fƺl} GIy,Qjl9cKA F %GF^gf-<Ib ҎzIs#ټ6,}rVvk!  Ƴ7)*D МLl@Æ,< +rk v]'y' ֶ8G0  4iSnlhS,f/5^1;s_Np A똳8[}3кs,k9dq2A-U!KN9e^ #i<$r^ȭE~V),(#r}<{@ %eqr" Niqh8iYa4z݇G=EwP c:7 i+98A}s^c^F a4bx\d4Si{Y&pTIɰ@Bw--L ƹZ dqс*5_Wң\JL~VQKo >y2N LmlT&,77]7F5 AlTQ4 ,UpTG}s,:W2mc8PpsD̗@=,<E!žqz9z;M\' 6?Aju4YE  QTbis{_m},-SU8r%+Fkmڜ) ѶfOnt#Q^li׶Zs龾'MS7? g`Սڰ5]yQH'j'O@!?f UHd-!3wYn31qIaϏV$cx1ͨgDݵсd[Bc2N] !mxi0 :bwDZ)!%χFH*wXIHF.JBbJ_a8>dBzbPC ζnZOG1ν@kD*\q:SRr >i #j[];wdWmNB-_CDphM|cvsDmmWccŤ(9 qD*<9 >3<:/צtڤR_ ((Nmk*(MoZkk&0Stli Y6(#YLxqt$HS ԁ, rTOAG̝U?ts:dkW$ VLd8gTf$ M]&p3:6*U)猇4N?%YmHnZ}=_4ʳF5ǂݜͳ,?*BMp@1tVA9ƺ6PlVFșYbXBz+ ӖZVoZuЊ́/ˬO3Y[k&joLy/sXdp)BH1Re%"+UEl҇zhEHxD=zlU ڨI٧Qz81(2\{:/+嶨}pc/l$|'QKD$WaH"Aa,d| \$Ab&뽺x_.W}pfٛ\n ^q[ 2 oNN?f[e`Y1ALk<ְLzl/2&ޛ>\tlqƝhIAm `_ϿSlP8N{Ǻ]w l&]%Iވ|~&wwC|~eWM{L]AP@47z+Yfg#!TKR{T cOK9k(\%Ihۓ4$mB"zz..ݫrW`'CPɾ~e:٫h *y ƮZr0^"R' -F_nџU[6H`˘_zҎ뻯"%DCשA"Q f쏠uvnYQefk@C>Ȕ1N[FhT_3jkd?PO=A-v"Iٌ msU$.l6a6=O Ԟ.LhN!M#FMP#cC Z $۶,0s,/7l-Ud,H_wE5n%V. [V?X Yǐв;8V] A(]`pz`zXʋC##]ઊor3@= JxwZcc#]55Z qsH ѕGG_F1F=dKN.V Qi퉹y]7JE96~ΏkQqLer]Dpz ; LwűOW#XqKb-kI = {?F `.jEЀ)Jhې(ÂF |CzOMo4:WMI[)E6kJ(AcyQХ(њ~y-A?=@0wS<^ lٵ!Ȝ8Ggkغ9!и}۔EA; 6nAS4=\㑅FOjYJjJSI8q^$&6p6ώV4n!e,GB_%ʜWϓm]FIDUW F3MѸƶ]38#FU#DDsRd&~'(?gu(Rly2YWٌ2R#Hp}M0E&ގ iRwul2- zӧLrpݯ*#Gf.5mJi9ܐL%r-bM)uH2"dt6; n8B>Esy v}FېI3j P .vشdue]nD[Uu5-9[sK'_`Q8{'XfN%RA%4 U6X&Ig`!ĂaZ|"U젚<@H99< tisƢ>^tN.jtMȼC S Ğ *zegᔚ-igaM/jZ}'MuzX_!wFFТWb_XYպ@^9ٖLn{k>:_pu c-om<+E5!R ̭m~;o Cl~{ܺJT_{4#{)_3舲ӉK鋯`]+)Bt' >g_⋤@=-!%BL S.z[#41KSLN&[a%b~DjV&o|UzT|Ue#HomD,S<3*XlӰW9J5ǽ-K龭&S[ڡ>ca@4a53nO(H%s8w @Y\#5[t_[JLcp8#/a;@;#gĞ:GrH'&nfg+dȡܬӵG?f_l<owy,'0BA mXhl,9L6IYw`?oϝ%B9Xҗ%cL݊y'yb%KoWԟQzv}KWqat+s .7InNo2?S8( bZQ筭ggOhe;llI9p0s~-I<1黋ӓGӳsP|GeJj wEEV=/2,Xf&*ŤkDŒq#G~xƲg+֖|\p8Jb!'|H=_= 9ꖽ)dC*y Ӹ W&k6%!KT٥H\慊7Z)RyatL6Ɛ)a%U>i~Ru ttu醅1bU|mCꛢ5N![Llw_#eJl!!˃9{ڰ16I/`b o(qI?+~ꊦݡ EcB"GκKT酾vqnW&޺9,+iPj j/uޯ-Msϟ㣓Y z3ٚp4 3q2$wO&i¢jou^_iyZ3^Ft4=<殪-GZQI{RB@4džXE,K$tEx XtxK~=6+ߗz%=WιN5W3ID ^:ߪҜ)a@o =pg#'S+qvئR"44 ?>{~ޒ٢GD2csK1(?:|>O7#KH_4lO|>x:@sTBheEĆ OŵUhMy_պzZwm,5 _Z1dlo*YV~`o*CDL]`s!.}kqGpXa>H<#t%b¦.(}ƀ3v_g~7}S$cx!Lk+$Um;`bDTvr2o@(U %F]yWy>RTx~8 ? 'p&PqnpeGXSKE7OkMw`揸CsPL~K*.RZ.ڡE;6 )]LHމZ2g崺T豥oAC4t8ҟ=Wn10[,Ҩ誤-y'  Tۄ&[o6ވs<ԥ46ak'߰&A~pMi"HH)}1U4e3c()-lf`ޅ"fNEv]oBJJ0TL!:amx.>ߑ>$7A8N"/ޭgAQE5MЀeX9Cnz7.6ݰd[Ww r _ 9%'w-:}sC(H]Ηdģ';h!^o`l֥ҶZi<$FhxX,8W  Ռ36h>ce!`S(a F(Nc RIKoXZ$CzO<\1tL%#Jm!&{2ΆCJ \ ~kשupL-#x(=X;*tƍjP:8*ϲ jC RXa C٬(-8Zݴ^]zWR]R24y .TL4 Θ7!}FT"n/b^sS谍^J*Ӣ4Mě܃ʺ`8 .0UVl@SjII0h,K]5pDsĆشQR&aʖum.bnd"Cz\qNʴȴ8Zb`klpcR㌪c2yĜ2/3uǽǜ<3wn\Qs_W1G} qjr\pIKrR*tB\rd>`Tq S͕[H,pG]bDcB-VFɇJ)Meױ,ytr sؐ/GGO?ӱWҖVK㹫쬍Fl@NxAJ4纭(9|pϔevi)Qe6fV^PV!(-)ύbX[&SέdLlV`2-eWՄVՄ悃ojՄ>~8*j ucl|6zR۵Qjl"a Qm kG"JiLrt% @uJT1P(pQ! lPVmǹ 'k+}i&E6=J<: 74Ύ|W8J/? e[meeJa;o""hƶ/Gn36bBhvKsÆ c}De.1G;KƆ ;=l3؎Y4tœi{7?C>öGh t-b-׌N&p Rc;PRBrDV&:砢R롲-@(hHK&UՓ)$jcB5Fx}33m k C0msA>I*d$s7j38Ev7 0ظ=&|/ t- 6#ǟ lqK¥2dn.but^7Q:0AMU4Kk4&~.;1Ƨ:Ble e:{~LϬI' $Kk/ @*iGP+ܤ觰rƩBIJR:'`{nv n.7l;jHc]u2A/ YKj16sxt O 󒀃m7p^vlɪD@W< Q>r֨a9fjYޔ0Nřڪ˱(-ulZn?r^0X.>gk*@rgַyw]㛜y ?̇[/WFI]"y& x: !`2Fe`c v[ ']Z,| rWjfhv>i#Q#3CV@-,3tple_ٍ _(uWf>UOe+Urљ><̛(&61ԌܬqtV A?0vpn~5ĸdMc4،TgFNYOԦ԰IeHj@KJ@t}.J k)s_+#ú!A"p*4qQj[y(T|1XpDX-Ɗ/ʼn,_YgwiŠ\)Ag2_UueJЁyo%f+FZAE|8a4lrS=LyyJeD1YQ="謣OqX Ы_ cN^mc|ѳQ){oh{RӑcOqPrUuPuxPSB1;}6ĦW~izԜ?~FNuEPEBgS:V "h52Hٳ)Ӗ )8&Ǻ)%Nɻ~ۆ@^*֪e!3OeFsgz{moTm+wRm1µO%_/nv,u̧` ZJO.pVU ݰä%;~Qqa_wz<˸Qcl C, 2B3ary靍[Smڞ)fzІ; 7:ćԔYr^xݦj J1!:)1"+O`u )ï{LJ~>"q,x[A-:}oDui%f":B hg5pzBMaaiF))BƼ`2>[/Bk@7hjrܸBȚr|~yUqӍC RQ$9hR&)ŋՖ>:6nhClu MPƮ^%먀DElddE6C qXltSV_>I&Tx%紁5$`0bG>x pPmj(mZ'ON\P+.^\,(mdI:Yb@ڎ{zEh 5 M;;t]m]2=7j-Qmw5R /4XC#T3 ?EWA?.9ZVDŽ[0#EC?qA9J4Ov VܔJ@ED!cȉD,ĘuZ4P 7QW( (qk c˥I- W| $3~Yx#! ,Yt?}c5%"6&֓aŷ5J1RͶJ*Rۡb:Q4T(4Qհ)@iM:{6gxKձgԋIzߪjT>O c+HF3h) i_~nfBM wS8XN [PW(+\yeg⧬뻖@G{kQʅ{WӐ5W\x]3땍wcyOPXUZXIO{={}{5Rv7Fv<) U{/_{_o$uL,q361ݰ  m-(8̲~kw WMU.5(jmҦEMqAKJ]<2i+ 2x[>Wy0nܽ> NǛ @`=mqh? _Kx!IkGF.ppGb!{*f1P4={!"# Ɔ&@ 00ddo?h6jDHbw?"Ǡ0uyEW)ŭl)r.STuJF3`\W/jfj4 _kC0K+atj2'=(lךRt AEt7K #!6V~\pOh //kR3~1.rF)n5n<6n1m^L#?Ǘ}hZێY>BW*-QڸGdgGJhҍH/Ʉ&!'?!p2\-Qڴn  p8Jy݁0~~Cg z|bD't"ny m UY@7gc:756H' ?qeI8-sRu%E)Q@:VV&9qS( ]ڼSFд.wf$!wJܚ*߆I |i^,-Qڴ늸Q c6|2qICY%Q8SWlҦ# HS|".}GM=*qPK8' 䣯[nmh&}u܀5/(`۞YW¬EXJf\<":%{|ww}mhN!fdL.RVA4bDvx+8 )38Pj W{EUn>C7:"A@+o!8)~?RR29@׼[ZEI=.+Bnݐ!Ķ>.jt4+ny<(9#6'̿FQĈjpV-3Nt!PIyHrQ{]6[ı1q]Vd=duDtT?Z_ 0±?J5^DijQb@(Ҧ}Ӹ>b/xeh Eiv&gZ(@xT3\ZqϘ9uAVF]9%Me#xZ/VpiLW*|Mm,OaoM©A*O<%,ko*/wLp%~B1)/\ţ'ro4:[*(8PZ/7}<3`Aə.C'ч1휏#?*͙BHp}eE@:6M$? JPygkG-TYrɠC6;BFRiػ4 A!p ?;33J3 \acŐC 6_}Ζ$h;n1 HȩESol}4̊;ay-aA jk]mtKs(9%s]2A˅ pBrsyԽM3>IJgZ? х .QR wA|b2dȀF A߯࿮z_X_UZu|S*}KTxyh|Be_ӄ>O'ƫ+WDR2Ohp>3ګ"|8d3HR5ޘ` u4+4 T\iYv,+tEEsKLLDcΎ 4/yPL0)S CW6 \Ȯԛ'+c Hbo6B/ :dQ2>e} <#$^j-MFݗ5hXHV&?Cz @RJާyq)jZwv?nʷ]?g]֟^z;m'1bmVi7f$, #[Ae8 ܊'!1 hr;YJJ˗l;n=;4U+\Ae u/gv}.;: {*xwW=6jO@3rl(gB1Ÿ5_ IBYƄhJ28sXϮ+㯺^ժEHa Ҡn%;ڭ%FC21rs =tO;mSr4?E{TTzXB://b#0iW\&IArW+LvƊnDXR[}jlǑ_-yk0 {f"" !lypB$NRN<ʿL K8>Bs PΒTaQUa1O *i0{Fq4K޺Qt~o<:N 6/Pf/id\( #Y0`[>:fS!V+K[̕Z>f4n`&(4dF][*GjK*f0op|G8m[;;+_#9>c FB#j]KQҍXҎW/ )e"H\ӃٴE9kbbQ,ڜςElky q郊\$ou`ɞ봽V@Ryhܽ{JG H:VL=qvP^Vm'ˍwz~ x]bZ(*ڙ[Óy,ƶs^c|\LJ-#f|h/ˎ0[͵C!2&w.H\oDzyA,x1~m4caEdKY`Pa~NӃMJCԨ `>TTf $qͣe[ 4c̈R؍/O7Px Pgvh.zBy׬Ѹ&Gc h"HC`~ 8pܱ}Xat,Rg^SOPդUrw D]Ґb'HoRȾ'gd;2 l1!}!2cBb\4_MB7Y;sTL?ynU62D5-l e=:\RJy&j-Ld2dǎ`qc@0_):,Oxa 'm:f&C[Z2Ks+iP7q FBSTPIӇ?ᦻ!E^kږnD"-qf1z+e7:K4O`ͧϭ{& ,rCٲmc"X"jQTC8!+K%tYYm4f}}+Q&)! Fm1TKUaVݫ-54a_[Q-nݤ73jRd[r+j(QǸaw>Srh0S%m~a[s11'=Mۆ7s7+>qZfɉʎSMqQnX榒BR\厤t\ZN̓By(Ǖ(YrluEvְllagihV֖!S IQXⰒn,*Y\U n[\~)7@joQ/"^z呟5v^b nL_׏b#2BH <xhMVMĆMĆhT)ףRMk^Hp_Z$?JNz>BTLꘁy,5WN@gF"1aLj\MDf[4(I}@' <:~>Ū́n耒K1m6UR sv>o]vO{a-hk8¤bf4--QjDjCLyUbÎp,6Z:~[⭦~&2G(6YH--Q ^[C. ȁ6Hz, 6!XHԯ6Rh+ك1B V,aqsNud4o5[ʢ͆ ~ޤTا70vbll6m3^ؒ;[E)1r{߻'m _#u雒9rFqx8rF3d(?ީ"9 tRj*Ii?[80]7r~|bzu*?qp#Λ{t~q3`"6@6I  FTt|zOY'uuZ`;:8x}5{gOӏjABrEYMZ 㛰M+ L:˳tP̑-Dff` #5 Y<hH|ylArڍ@a֍4=FZ2>*^r'X40qX2u8H(9Ǭ%Moo/Ş]~kdԱVZ*sN ZٗjI'~S4 8IHu`n Q)n?Z/M3^cuTg`Եn~kT+u#&Gx-(ōzyILrdKa⵵i7326h[ EטdDzK9ݲ]0ʿ4/΅U~X g|xi=6j|? ~a{L"'M!0qhxMڇשJ0 ehg}UeC`)-O$sQ.i]x ɄK($ƶQi_X^S;i0 K=O-d/ל&HvNN 9Aݦʫ9(QvtI3gI!#r^8`sdFNwF=f%p)+S6|oMڪޔSv8d<+-u-l.kZHY\׽[uԑ2ݲ3Fdž;0*uAahc+g*k,_GMY0Vem9.OR2Gq) ]W`Z7GnE i{z $ qm!E}~6r8RP2L:v]dsvKlN&N]i,k f- Vo]F?w._jѝ\,zzHhv-㵑O4vi+iINV΃΃ ˶ 'HKA3`"6F` m_NatP; ,{ݶ `ood ~=y}Zl{y/Axsta뇃woWOSW(.I0ֳ%0qzm?žC%L^B(]YB,Pr%9l^\ø0q8홵8F2 08ugGlvC(_8yqw F"v->exϨIYyYRa‡X?_ UvQ6" llq$Y 6Noxt9VDgc{KF!m+[M1P}ci[$_ /) r`c{  `c<-!nrSS$䱵9 d̫)9)5@n(Td|9'|Et9tmm ]EyqMdsֻ7؇Y m%c,x/Cܧk 9$ex.j) C?MrRۋca@{ᛦh&QCll1({a4_xKcͱ;kV;5R'Cc;]ǰ-޲ϐeK W mG@l7f_yo֬^\bKlUEϊwÚcE66VrJUm t.~:'~gX(0q_9+l2-ź%$ON$I[ӏںd-;w;$@τQ pi9J&żXCΌ{zZ51V]ű )%Nn:Y$1EeZw]nDw&)]!{ qBYRS A]:7b\{xcNdpY1S 6x>XrВFa+ exOkOL:ǀ6.9 Si/[6yo+]ϝɜ șL,K}j@d%fKR\4S ;IDB) [.Q'p͓'T۸ualO7uTL=rk"}]ׄf+%33uhٓ׏~s?9Rߜ;FrFm ED=J'|~nBVKɑy6aU7$RФsr[DFiY9SnȽ"$h`HQ=8QY9 aD+5w\e83@8cu`^KuL%$&FbCe)Rv h!Br?n$#a V*]п l+0 `Z7g}Yˆ9C휐KO1.@/\5N#8UQh$J1vToRi<@4!-SAr QlaHiUIH\o^.|AQ` 9+p0>l΀6! 8t'b >G' BZќ"X4US ~F^u'7c}~їOKKdh4;:W]5K8%CMBZ)//vkpaLQ"n0Q^-g=)%h~qef9EP gau[դT/ܓfS&gr)Q"G2 5s)h }I=3&.u{`ĀaJ,\и=0?3A\a6dl^{l}ZYgiII*ԨdR%ml7bhX:z}kx:k /Yj:;2@al_r 5q) Q&jXxEo;ֆ򧱽PcM yٙlcV:)4?N (ey]Zܸ¦ƶ2l(m6گUa_VzkC/ӌ ?L2gwwf?9- MgB?6K=/!?riuVu#|sw D#06V!la,W[ :u$;?(M)K9oS#Sn[r,IaȰb *v#[4(zԁx NZc MG9xc}E[DZz.o8,&kClu/κm]t{oY;>%n{ۃSz=>4:Qav{/ZQ5` ͟^@+vt{_lx:;ö9Avܿ0=EC ހ@mAZ&;i޶V @;m'l<{؏~o4M`T}5qD:ys j k(/ ;iO/5;[xoN:-Fs X .h/ o~D|E¿!GZDpxv-|,`HG"Xst,Y?{fTK@Hj :_r9ǝGi08 6VjkďNa.ϕ0/uzMSCA{Uk|Pþ.x(0pe;V5,`C޲DZ2QOO׍տrC^T0(> 76ByQf9,@Q8B@6д&!"OFnQM 0-wW2 4mT!/^%&H|nϾ=شIң[nYۤ)Q{( _LkS ]Ԓb|b vC & '?_0-uَ%BΡrh >_a2!4[t A@ULote|ʺ겯DQcHz{jOE t'%OIΧ c䖗PV:)r0\Y>]]0K:5snZ:ddwfG6l Гd^b,EsV^j6j.TX1naj-Gn ֒{gNEETEL1kMi4T,_BXVd8Ap-;EԦWPkX^ȭS\ ~ 3W+Z48KϬIyϟ E>]dR)ݚK qa+L 5gA&=JOBf/M`>,}s0%lfZ KO9Zvث҅#ʄ LchiXmY:(N`k KZΞT0[RSP2@/lT6(G@@WB ;DܙE9_f͝S`B^څJ٢z~;ȍY5/!n}WS\9D:Ώs\.?>‰Wܺ xo{I+WB}/s׭\iruw(V:o(lRw,d ymصÓl> y]4]Tr7tRXDN.>jdf^Jrd*@[Skٍ~7(+0;LlTfB_gzԲ¥S}Sw"umI:2jF5M ;gVAkf-xqp zPInL-sH?nQ^ga<#pV00YMFJUbwxhU[A;w`V-ma8j[9BDh]mЎkKvlOYJC$U 5dNܽ"m/^KL50LW՛v0\L>i]򔀕]$ E 93 | ʷ$`zЗ>{ 72 r'gJ5jdޟp&~ }&>M)rd A*WRE/ruLZ*-+3|` {;G, (,*eBl|j`R)3APPZ&] 8!mvwya^~s(5>" h˧%S$#~:@NPy$@Om[ M1@u]QH+u*yUtChV^.xp4Dr%mI߹6 uc6ز_߭)3?IgJǒA%!-=-t/besMb(5a,|oO_/!P}͏MkncEYdIaq8odA2A֜uw]zoڈ>?YнYLe6Y/(pl mwu?_Uss`Y Lz{@0UVHOMRRj!K #;Q4/-)zm:&D%ZL҄iXalo%Mo./>uÑ CMÓ4o(jF#)ڰr:;SqRA0ƹ*}UqX kکf j깡%ȣ^i9 )5?oZ5C8ۍ,fj"yRf1Xa1 9GH4*MBXNJn%]RꬻH5f~|_}ac*;e)R;Aܮ("5ohJNvhhP?7U$9'z#tk08jllf7* fB3̏e?~O'7oq譺>^Q_GK܍nv : [!>$qCL_QwVM'W'JVbUa֖STkz~>wVY n( 10d^8äҁ @/j,\7eCŃ@ZHU 91b/0^- f5  bܗSRT@]i GtMiXݒ׷Mk&>m.L:Fċp9=)E&WzM I <ZoFb5֖SV 2Kr.FTe.ܞ -|Q b6N)lJ })_t̞w7ܖUJ7Z>K_v"Yd=0E-?rO1,\˟*ۻ<]f"=fH( n'^L٠,CQo҆jcA٘+yL -8SA^e_Mbv䩯M+}r0hsM,cW#>c@Lnw_;ݝY<,,?7a.9YaZ,Jp{x,<.Aɻu|N?~$y'w ytm'Vd(_fյ!B}ՅN(q5| L&+Nn;wp}CIu}f6KBʎNz;%8 ܬN(twh;gv{.)y'!EՓ}s(Cr88w 0.xBq- g UJܻ|NP,N"oP,f1AٴČcA-a/XزLjfX:\Z%tS~J^yOq8+D 3D^](N q@4Ľ*FwM_37buC) *NQޓDB-/!L=臲stّ=,Jyr1hFQ|2q$x@Z5ylKʊvD ' 7i]14 +')tq[`gQ?Fv%Yh2L&Hf0yC_Z}pbB+LV@\Ɯ Gj YJְQLS~`rG >:՝ȦI0ӤsAiҹ 6F&sm2gOd9.k.S3& wݸs`TVX+M,̲XJ?B}c;>K/_~zE|{ 9ܿ,LA$q{tk?$${,)}`U| Q SS9/?iaU,5plZ1ˍVS5;9W:lUxRXN>֋YK<,QZI1oEb zg_ n>٭-lQgc1v| ] PXBaԲVFRgaHf1#:5zh){I 4G=m2|dgJќʆ'QeЋ29H.>mȢlk3{=su1^g;h'C~Ꮳ F40эdQif9f'A p3gKlef~2'1ޱ0=Eipxv$*B;RƑ>VVϹtw"/nsu7dAH9N-%_g9 -c΍_J`Fe$*cʛڃDU^2|bgVʓ$S=/!XN?94}̬Z{ yZyŗYK]&W,e t*BήdjکR)?VXxw[\F#_(P@/Nq#{mp-wsr ^B4Pv7eqbtJ40bKϟ4^Ow~r\˥L %pոA{7v"@ yxG8X 1 ~91>f{n-N%U-.>h'hJRy#_Jĭ&&%qQhn![g44J5zA ɽvmޥLaoG[{٣,WDHWsA^]ܟ%Q6,\O9YPٓXԒɔs  3'èK^T}Y Nn:Y ȍIX?ߤ=|/̃G|czsS'KX >pw cf~AW4,x_wb \%Z* Ɠi y:]Nc\])S-ohp1ؠmN @PFbo>HN1ܸt7zQjMevr&J@.S<ʅA1m Ga&Q{䍽[d8#%sEhi :Ũժ:W$˱]Wxl?ؠDtzh%Ю/+=^r:h}I*5&h`uYG%x'9iqa K`U1h>(Yoc:OzB^j銏SN#}uA _,rɔXLfەfSvJ`޶.Gt2]ƻ6FFGZK>~1wMۼꄊ,8.Eo)k$5H{)<`SF. Y/Ͼ[d\CS&Zb4}~03l-Z\&Zj1BaRw_j _tpʣ2Gg7V:ctH(q:+n=0kx$cOk'7=yGS@DvF1o2;fXAip3] Ǥ N쟃 /=v-Đ4-&>Jr<.x:,alѬMZrz%P%0ix!"M:izl,v~fIk `-u$dޡ+S4ZW=eoNxxɴK ͖M$Cb$y(*PU{wp;Ɠܮ?HQ4ЦVAأy? C@2BIfe]k(>WwRc) b'>=2hJ"Jn2RdsS Jg @0hZ&MFJTkngkә؄67wK4$De^JU*Sh9J¨nY-6$Ϫt.2f@j.[HoN-RK]шA. zh4l E#:O)D4j#RmBdPKQlHK?Fc< '',x{|3<ś>@5Ts8- w58nd]cf H%3HƝ- aqة‡Q6 1[2k}^-;F% 0qjXax"D*f?zV#AR0bJҒF-@Jh7dž"U´5QM})#~e㋋]EኟX>dESSB$U,)I,p&)[DfAis< RsF5> sg=Y;=B#pFdLh73=;) 3l]=>- Ʀq^2pW`ySK/q#LA@ō1 ̡Tf snH><P Tm8 tzuW҄Wq4MYBBʨZ\>(1Yˏ;3}_]Pz&W(O# XԬReTlgAYmmVVvvdmx>ӡݴ\yjixJG`\>p$ᅲ#=r1Kx "k)pn zL~0a=Q6x.|6蟝b%t>D%i4y\dSB2)? CϚ(=ͶuOsG!f2 ڟ}gщW,Ixa[H\li&F{=`/aj5!>_Sq ;IXӡ /-:[7ҝҖvJz9Q\ 0Gv-o5e*&;5\ ݰa1R~}=71%N 9P—oV`#,c >uB_k bfJzORӔߜ@޶,>t.#eSn*ߛ\)-I9zwqX1s{Ec0x1P=B.+Ϯl+n-&Mbp2$r/$/ ЄΣqO9E,lD: -K;Dj) 4"+fN_  .Nx~>:_ F~bPB'(`)& ^l)]piO`}j$f0mO8ylNH,܉*!;"n|e,a, *=lt9xg g` [PP+ 6qsQVa)ԯ@VjlORnW40NL#x=ܻrIopN=f*M.5Z#[&z1`IB4Ws{t3XAqHU*Gֆ$e ;tߡdn] u4Ҷe$'!yΫ-u&hxe^i2AUM諥C!rLLRu8zI`8u=Qv:x4Hw6pT8cDO<}]܎ws1dO%Ydt?gX>'BcW%:DEȈۂ3.չFpq;jgZtiֳo7 иgBU-@zulWpU(0|[aBo8R8LT?1Z"6upp?_.dA%Lei *о[;miuΎΪ&<`\~c]P3iH!mG;k u~\V>?&[!v| ,')FH._5-ZFW$[@JvXp*v3V`R͙ W>-h>~te`H$?%P k ǧ=li>`JyX@SB21YH~$*ROh4o{)WpXjGS.RUz``M:z%ƥGJEpB秡tm0 d 7m.hM#W0%(5f`k^%lb6kA8@&vV]1X,&vOo0˿}pk6koT:>,k79 aWl V]QMvܸs uTκ`foȠ!j<84Xv4p}EIHA p Mh>5"8У´ۿC!v4d!֟[4DoM~2sams/oGnf77A=ƵHJu }c[ɮf $*9k|o Ǚ)f]duGo-7+QX?OoHOĜh--f!P;YHBSMt.\'Ҽ&t1@eyiPD+NrB

ttHwf+|Jt~hDi&|`~$dWDW[~ZiUM'Ɗ e餿PNzhڶXeuCq3 #xι˝rSaJג#t\Tљ@{Yz4Lsm9?Zt-m>ԺrUsn{NlPF*%+Q%J.*PPl*cA~a]m22ٴڏzTpjr>v 0ObnEY&3^\lsەL`zq:[#pDpv8lHiȩxmfKb-n_KquYD3n-L 8(i^Lzhg'a_gZnVc{gmOgr=y>Ǐ./dZ U7i##p377܆GtX21jp"-A\2˖ )9@ HtЗ%ƔWj~:3s!Z_N=z{?Yڬ/)vU.Պ鯨3RI浤 ^̵`#P95hƈO c}Z j uAOSVm_\Y U(Е"WC9V WY6h]^:~rՄ_hwM Yke#gVkO.m[f4j5BzlK]՜Iи#<] !̮%=*3/?N'\Kc| ߩ9I.JP٭Q&e` 1ɜ!;pOڊ$nʥlJEm$#LJ3op7H!s\Nکi瓔Ƈc-)Ef*ט]-Ҵj٘^$$ Z{< Ed »vno@uC!PHBax7 LΉ 3j١e_X=۝̓}o<8!ijIY>h}X k"Gm'͖ONrf[FMgjtڛWG~<*γ&͐q>OY>s24(J>e;%`&c2LTCˉrQqYp&z~e'۞ XO;D*TifA(ó 3N~MjoBǑsM^O䕶~U:j/ X~=&.^UՁJVd~Z~W$pŗi*G8jl}j~^\͗K^\ώG,~!`D\Jn>M[ִuԬs_X7hRT__e|2ꗡ>GT~ʟTWeџ]O<{K ~{/4z*]fqL sSg޺Ӡra{'ۓ' r7TT;{2A!,d :74w+g(st%_|hO{*EzsCxAib2f1^}_ۥY?hAAnh,̹gKM^C% 忔[Yr,;TaЃx":ywu8з)7 #ɤq+֝e3 FƗW|iʖAůN jbd|sFf6I l\q|v8:X#RҲ:vl0Jc0a7u6btq啭Z{pZqPMG/x (y%tZ<5:.fSM)V6]5w)ab*f/{&HІ76n >SJ_)A=ܬG.n^HەKs8AXMQ`oMA8@(Uoys )_iV+rgu%nxrl^=B~r[M2] em #T8d1O yj~}ˈ?|775Z.񠅚yH%7 r*p#LgMdQh5 86aDY4 턎iD] d]e>n&[E^hbAwnULcz*FJ*}Bթ A 63I M@ł˘f2ѥ=8 CZ M@˦΃$F^N nmQ[ˉ iӼo֙頳㡹M4Iš5kl"žWꜘ M@a4Zc,n:=?X#B~X"&>}evGoƜ_߫M /ze_0-1ie1I쿸T{t 'Cv\,=¥.(]f.ftMs\ʎ_?gٕ^pAH7,3dkٻ*xPn0F)5 A]aJ..:bq?)I{"! @XZF)4͑Z.mR (~*/҅*RcCh-ΔA6p:V]--*i@wqõ.6ܛSZ@̈́PV.T3m^i%q8jMz9!`rO$c3QPQFz/|i3_Ry)a1p+A#7^x*.nV f}t@Ri:dgvsu{^sqέ?-jA!Sx i7nhQ$h}LdL͔%PϴZՐ)KR Cp5*::_dtVlMk:(='H=b?`cϒ].^Vq4RPΣ'EX }G5v),  ΦN V9m:Y B0Ur!:Fx/]$颙j#"u.7ZG֦wmH~Um$Iv3S%T,㦦Zm^$Q+RI|{ d)3gl"莧oV׺dXmFӖ3aH3\;A!E{x0ΝeW,R iY^"f A|)m* v,t% q,>SHwTT* a\)s1'?(ȳM8!=o mmi+4?6Z@JAM!;x3t\ /g^#. AI JBXb(ӈ2Tw`Krs#~֞MqG# 4U4BBa_˛хD]4ڊJ M$.k<۝/慠8"fL&+fZSf8ԧ{&m! C,}^X_t; K Z { ]7[/1HrMpћ\ /0ɻ8R8&O"[I6m|Xn5L^.U\ydMŝw^=@ԊxiQ1()#<(4 HMeg.s~U/hxFn]hDkd|(/-E*t`}ɩC34Ac}1rEM[<eVh}MNXcmJ?:R7~rФ+G.a/Q#Wŷ3;Rr|ɭUoz&$Ω&&a` >c1+}qt?s'bC_a+p鰏oˤq&RI|é,t7LG&aВWG6m!! wozaEQK&DX4ވ[O;t۽o'8JoL\=QYqR[R S**D%ıYBKPf9Qf`Bg,+?(.VNj:gí!L*5̚kܖsjy]n괛vw`l.[y@51eTJN5ŧ"j`Mǐ&Cǻvͦ?GO[B%_iїfsR5NvWN礊\[CĜk_ Af'ā s8ueF_foϢ/ ~kXyї>Let)HcAKjPl -Ez -5hhq4u\Q5лd+J^0ZaB0"xN D'Y9Ř* XP|L;OG@V}x,ȫLnL82C.py[(@0)<-Ez E?Pq+騣pԷ-uQpH ,w,ٕ*}WDHKMYmw.Ż*« uX4cpW;$ ru=4RéVx*Z]#xKgRZҝGXy5A/SJApRyK*C[ 8nMLCt2) Uw$b rfIYgl^G(+iĀ9|FO 'l6 Y F `vJ 3Dd7YfQprN*wYf6(A_N!h8i%^l]o2m}2?HS&ԑ\c ",3if M =#Sj^IEL&K*#kް,It>PIH^/`1 5:2}Ev^.ǔ[8#wks9%c7X<ڶTԏ`ʲZU{v;kڇMX0eSAXz!#5/eEy$POORPeՉE.IK n Fe@"x\"PP- Io0f0O  8E9BJҤtconr+!C66mF7TcW?o{# V9LD@4FY]H^>͟8NF nDi1$!J " ! ZT䷆UfyQ: Ԛ(ͅ2SV 9SSQaJRPN\ʶ7sqΰScD ZZ$[5 mN+لo] ^jxfAݨuCSD6Klp7U)ă`uK>@LOq~6G'mDQy:dJc>XZ9/qAX)KLiɢJ/-,!' :KLYd*,*4,sal=K- sF'1{m)tB;ڦڸ$N>ۓRdwK)RX=}8V ^ ᲊZnʀq׍fWA_J58ʪ T]"2-0P-(> M<kFSM404WsaDqȨ#4R Rpf-Y =!$IRH8 "H)Bΰ9X0fT TZίU*Z?!)@&Qe`}̆W?WSheV'Q w9 LZ|Ǥ?̘|堀fbƆ4Q (t <&``I.L6$-jnRVnR2d coi_!Bϙ%#Tp*x.g >x Bw.'="hp8PyAΰKVK'|~P ; z~7 _ ?\N-jW&csd K`ɣL)\5WcM(7pO= Z'Vܙz]ɯZُb0a"&FB$ 4&Kj΂ųo/* .:RI+t"݊qpB%j#BlޭyĨGahu Cpr)Õޅ`]8_Ϧ`%e[1- `e+T)#=0ciFP>s'>5|oK8!1ƖԘ E3+L%Lʩ@i҉xi\imT6=9V%:%x V[]qNΞHA{E8= DTG۬]BO"]4ԅP Vb{lHTr8Kb^I%PO>]Y(ƼUƔNjjմg E%,Ig:}"Sn4UWV?Stpy>PVy ++w⯦˩kb)Or_L5DCJh}r h z/b|5 lM%@:`3QK[^\T*7훊qK Jw6*Doe_VО1긖sQNa(k9爚>"{dP]3hQaFH0QB̄L\GBwy=;EpxmW}{ 88va|h5%efS$ I(bowlqelsys# _ܧZ?>*_OIln-m$\Q4vBSmpz턶kyJ53N43G}Pm0@`!g#:5x(np 7b,_l=P*LPhk.8eHf8P,}d=T J"ADLᦂ05HJ?M |?&A璫 ' b|]> 3S&A$C dϬ$p,.1{(g\4v$ 3O}Yo͓x4i 4GoǏ /26f+$ 273VPc-TH"=?\;=8Ǐ8M  I:`+4`u=8C BRPGÍ=d5 !Ny]I✝āL8g'@V+Ahrw ^U{&eAnݴ= [VMo04۸D@qNLh@X=̢PӻhtɈz-fR {@.i @")8GByDKKI$:mY.h8%gh[rEJ c\c2E!l79˥cuԝͼtpW.lY\`]g`lE7֒S`}:ނALX{X]::&7"d ǣ ksX}7_|WB3㡶+GބL] 5@/>G{bMtF+l-׷3/x)˼P" <`2c+W:ZR Аw3.c?k Vw]y/z¾ڄ*aYh`K@ntV{zDf&ZDf^̭MdZx@V{ܸ;BgkHS(o994'5zW*r2< bxrg@&iYdMJO*߿_|iBOVwr*<={IRz ɷ%ĸ -qϪ쳿nx 粓^L1,C;ԢL}=bNm򾢿88MO᳥uh6$DqQνt=*e-p=ϰ8IiBguo|0w"+WW8wK*+/y,DO(S b$1UDvmtv-qȲcSw9WcLb?ퟕWdeNN_Wg$mTn7+8J._k)\s۶t ڐI 7MSNiF6aUq3v'bΕ;N1, ?4j%o؎h|䀕T/ ښV Lj?,*6^M3wqW4zN%O_M\v/<\y r5G}ؕ*|g~~-w$mO48d:]Gn&<_ޯ/E ŁTNY0 0[}Er5]c43mZbKWZLM-4Y7qD4_#?<JSmҙxc6&ljσ)bBJ M֋w&w:fs<|=kj^52晔HiMj;# t$rhi̴CBRWdR0C]%ѴTsEww)xnO!0[m )SHDΣߌ*>^b 'hT{H-,1V苰 ^`)BIi9xuIQ5jl$rlHeEìwq)C$z}yHײR"ņ;s. vVTm ֵb {o)hES mih5\E;d'w!c+yw3.|f(baMY_ߟ\zC&|Rш OPbum'fx~0= 0A`ǔ2eLqxOVU B"f{6t4I쾹l:̵M&IbˍZrM#)Km+H |bY10!KAsF= t0edTCDfzj!CxIH ,q9'qՆa{x K(N<;>?ze/]N~vPo5_ ۷G'J:o˾;4Ns̾}w}{~ryJO^֜[Tg'׵0\\{M]ܬdJW~[E19(hQs=&\t\74")#,]ރXŤtO7>gc_z Rh A1h}2u_O9*bHDzGS\\@5DDa(T3WN4$c62r-^ M1qԚS˄=~ .VinE1N?#Jlĝ?+`FȯO_GUsqY  ӫlS_}%{".Ы}ݩ Xh*Bs\LWwV-`$#i2uEgZfXVduG"Ώ_^Է:9KhD)[?!{^k9ͤUN9k )N!dI,'ŹdmhRh1X W#[fw@m]֯woFt P٘p2JGr`[sˠ}Kqտ J[5g~gfSUhg9J RNN xf|LB\eOb WU#noH^lS~YUt(-)TN5;0FHCo)_ ?噆eJfO]2^`2rtvt57 \;7;Ieղ+Wcg Wyip^zک{/@R'r(b,^CR,(“+gr >~*J1hJ/Шto۴ֶqfZzT|1!!2E:MmNy6m3MçNK3)M'ד 1*D^CB8qH,ؿ\DH d& *((\(C)>=,,(>g6kSe>Z|&{!<Fa0xu׋ynLX!Үe.0T>n…Isׁm}UMTnLyuvGmцQ6bmv>6mFIFdm h&o:͚D˰u 9K F؉i6q?ocTu:6d%weJ箍'8iG|A/vϳ?Yo[Zy1˾b;* iK!eic&zo<c(5f.cš6no[4AMFA^D jꘊq6uKv8\EFA0fIyN0&lp+k^B`A6)"6<'NB _~U!10\<C8IK2aNE xC 8Hi54pt7 G-Ƚ7y>N`]eASj}kPtbd,e4F-PuV"ΡǬWQ/"!2RT5.8W7'AFx=6i<-||{h#ߝIM57\W%"τA8k|J(j2W>bYBO@cm ͌2r/hҀӶ2K͡&u/n}] ҉,HVO;bzHь$14z! hkbUE<4fNccWEASl>UڜN*x!£Һ 1~w[| 믢aZ&ٸm|QmC`:f?T7Gt)>_}'  ,ߋ2|avcdST6?yy{ejjm@O Bܭ;_|/b9pDϭ:eKouѪA=aS1 HxYw9c^T1MIpSfKy9,=܇V3*~qS+m <=LϔE/Sȸ*Cc# 7:J+ bՒMߖ1sF?mыH^#8+ӿg.W!p׏zOE=e3{`kL0t2tJ$WgkT0rgCۈcD&Zb5ud}̨ 7"Vx[n#`#0W;O{kJ.5}5_bfe7*8[}V+(WM&o1.36akf/C` Ox_BV#ĪsB /.n+Ss~م"Z.<ck.klɻde1QwL|xz~j(||f1:hL ._"&LΝd,l]@vUJOM̀?`=h"ke8xtHb"ŗ Ұxc\{aƁ9#am&`_6+ 7&ư6g|f&`Ɲf!cf'Z}z"kH֝[2gĎ}\cmV-N"u9uj ܈8+0z㏥3Ou/1%J/l9._Jz׼45=;$ԱTO )D}ߒZP#9D\`dFpᘩhKf..ZL_tct7~~Y[kt`b [q+af+m4ly>QѢT*ONM8LEt~l p=QIt~/Ey,֮K&L7pYa>I.Ė nh狏Q>5M'K$8$7{Sg:޶ g1ZG[*a< l4q-|OVhϥl0#fļ;bl`_C\y*ɭ^QbW=ܕX쁕}.6'*LL<`ΪbӋc hYAcJK9sTeWlwLlllE^k ט@Fq^dHGUh˴C?2DKOVsj`#{gv-WBq⏊\~MRSdٱ%כeU8iWU@-}dMm c_`HU1kj:Lv@- ]S:u^mPc*Yiќ-!LK7`;pH`/Y'E[jmxxK`bAۍQ.]_ط^7˽_qu> $m6(AM^XHtl+`moOiO,2N'7@YxעvfQIObn6ӤnguyO$a'xvS&e)!(tDjǿ%RKxYe2(>R EDxA<ĜnMF]7ϚqsںV-:,Bk|J-U>zNAV U~_2%0W,Q:##:x //662Z")IJ]N70+Qr7(EM rmiQYwQ|RTȶ]+m89+wg.}# w, Zm~oMBhX*2/ ]Kwb0M6s;$* ΪKum|5;F8hحW @FCmBN($4O[jC:[i1 }vQº*`qZ%Lxwx3ˮ?C_%Pu|Ծ$~bgNi]b%%%29Bffܘe^dl^5v[bn ThHZmFO+~Ƃ3*Bc=s=M[99@aL)nJYCcX / 롂.p'4+2á^OÖz>Wk֚= lkE|w=Tp 寅|ZqydLاKO+!Qa{*MmVCSR+WUX1F[f@dPbo{_deLcEujZ}%!me8DS!7ah\uIdל(8A B R'SCXi ͫHW SWN1a/PKՏ{kD\ۨ~߳w^Kz_ `o5ب~F*h%m.(tr+tOѿB TύZڵt?UDqi{֦e_1B9``Cj+{ 1=I{u#K୺v=lIhYM65=~M?J[S{韊O4^UqFZѼZs,14)k%(?[ۢE )L-?M"i{iYxNTޒz\WfӶ04+"QqLY' +[ P&Yi(\r;)DìͅdlmR9W66rxCvu366±e3@g3@a(?bpOy^wZ=LUIThUWs?rQt|l!Qf Ѳ?e!>pֶ DR>9<8E wvAv,Y7ThfVeadQ?_8x/1unAnbѺ/ix'?ʠ@sPWUn^u^HN<{9.NL2>Rʜp,xM N<36om3go9hv‚,2IQY. 32x/Jb-&136#Bz~ , L6'C{'x"ڨ^ wA &(dbȲ"d|EzK߆vSe[EpW!%4'@:1Őja* ~>SڗS, ș6!nF5$tE--m+QtJ"([j9)j^ofޘ'V*c*'h EVڀ/,m67+HzYִ亰6CFؼ6$ ;m_nY22X\*FRxv^/`dbf3 6chb |T;ijbb 0og6q4N~dE11^Uh[!܃#-4)shtRB7,z"y|Pټd 4on(}=?u}Zɡ:yF4h;(٨+݉mR3 Юu6S>If{ۧzvFsP#J= hJ4廤{Ju!)^v/Կꠀ/ \'Lrܠ+B-%y0adH7d~M״jx_q[D )/zѽ^l;v9f?=Hkb&Oogi8m6 @ hVodl{{{z` KUFɹuvOT?ρ}s" ´m'l )mFq3ʮo_qDb2Ǯi@@B@ \F+ׇiE 6o@3 m{&yY<LX ]Lbx4&vLtF]d1Ĕ4T(` [cow'{2˨ / 1669.l0KaeВsڶ_i IA aڶ]O&C4^!  6 ;cbSyMBJD:ܐX?%]'DZzη0j0'e }ù{RZuP8B5pG٪YSQgxc+.)_ dpOl|` -]g?͊sfr]˽@rzjKU~%%k_nB2MHCw ?73H  9PS8wp4~n3ƒx ekVYb 1L%YboJyQU `Z&Y_#Cؙ' R8.xNe%l=!LۖyHdh*Q䠵N|#,k|!:F`&H5p Z#5G K٠|4CGicH?[[jf6@Юzҿ1!{>Qb0Q38[缸%jIVс> !L۶(&qƠAMNZVgӶX0 I,wx)b%\/ꢮycpD/2[GWcsmLzDZ376vcv( .|8M262gI{ؑ_og ,|f7 rKj[iu Vl?`x7[rXVX$b!/w&݅&l-1=j-Wk#yp='%tK>g("r6-x`߅sj/c0񆋣㳋Ohv/./NN|p}}𵦭98>>i>k_~>]ִSkwSeYuggmN-9[o}5|f&<DGc(&wy 9O]xu_OMjGIϤǛi=N* 0%F%ryht@}^jioRt{i'6>=KUWZgmD ƿkq"7Yȑ³h2%91h#hi`gq)N)Ro[TYa07z\cKԍwA9ԂKYZΎmWJ = E1LLS{: ٧8aN烶r/mX[KPfލFaČ^܏N?> J)R tN[rg7; 8Gg+LO!ņ܉}ul'W`X;E,]o+l 5 ͖qA5&Q<)jf3}MY-K_=bB5B-}ꋠ7z{XkK 6RBcڥ~C'JAEoKt;2RY#=]0ſ㾂#έ/YBwW&)t>O21;H}?Ɨ8; W!v٦_ȗQmmH {ٰ}h,-yh PyZ`_RnR?|He?f{ކ?V7~_do/o-ЬnZXh 3YX٦>@۴5M;Y/dζB/WF{dK utB˫ cVZzh[ ބfil!<|FoHx_A6ѫG)\(]5J2rXPc҄߈/=E¦roM?sGDŽRDo؞2_8#%0/ C[?b6Q%JYX66lYѼ+4}s*m썧yv$?{eB!hMu5Ni6wqt>ml.}R.ܑ?ߙIo֪K6]Ζ`m |P? mJ[m"7鄒˃jNi45[x'HGvPrBի0VZ=}fȎI41Rd57=?n- Fa^G;2C쁩?.Anˇf.tMeodXB1g {)Sub:|YB}O_}v SV 2u_A͗rpm|DfsݕcBJO_sBqLr @[ګ|47՝J|~Rz 1TM7MyӋBp<qZĈ2\\4ZlbS s3EbEִNNFYn)C#foaz1A޳N @=]i&_U8I^/]bӵIH.jgp5d8JM8;2Jަ*6*vepah 7K"TYFU z$nFkLnSW#esp7XVP \ e`xM'W]QsDJRA2ć/V#Ľ(3&FVX0cuBʅʇ 0d־sp۵+{t5@=m`}s(S1}7GUU=gy8.s5bj#01RRըb :r ޲qgk7bTud#քvzF6az]^AW=X[K!OQ13 v+LGԔCv\拊et,R@|kfEWW'⟓tx$R9(KxxFw,DD9V3&`6)Kx@d3J E m#,;&j-8zooĘUB_0Q!kUYYJ냯 [^8]M"itӎ@+u9˴I>]s8ռj0=e] @0X*\ؠl'ksV@2yGr^N6VkO~>c^L*D'4A{5{ĝ|͐tnVk 5-g&Rp&wġ xnIT;ŷx D ,+KXؠZ]˅ (4-ݜ%[؟sFbymԲqh#_B&g&U[~a\9CzcIm WH,c0EG7Ӽ=K6yLQuD M2kV07=m|\01M9j:BJG? z0f͆aNOOY_.;a[ak~ll!ihHrHg%ig@'%CFn}Vy@=Lo*mI)q6œڮ"V25@4N1eAX].bC$U94f$.Rfj-9 +"Φm&L{m_m5lb؜P A|c(XſH`= ؋dW`-gӯ[ oxbwX?:UmZb``GoҏBT|T<$)̹\i馰{BGzZ[=U+@8! 81zߴ<úBTexڴ)6E!&8 YjGyB@=m><"w@1Aʭ wsrhÇmym2).y0)g4ą6!TufUt ϷǹVCY8ڸY*̄Ͻѳkw 6%Biz E^M/3Q!#`$Edmh6۲´Lm=.cN^|;Xeria2oԝZQP"^#l qVIQ3%%Fpir̈́l|}|43n/>iߙn".1(`8EAzڰkb(Lsk6ۃNж؉p=Πm!hYӠ"&!4˖mnv 1_p27 l:*>[ִ$4|:w+jٔ//-Li@[~⨂藯wL zBkڔ5̀EpZ[_QVaFlWN>}zvqp~2Vi[ބfil! d<׷SFt++Vn6$ Qdl#Z1!zH䜠Mq n$G}v"_K(Բ_Lw0klh M=0ӤU&>1knǽ߯Л4ӹ=dIsmgbŦm]e'~æ]3{]<% $ xv&llqAоl4բ ¦"FWkPƴ G9%u؊ͅDS` +ӳVMڢHIF ϾoM۷NPjA :q =@0݅ % q%ǹ +j`ᑋm`anCUEۙ-~$m]PX7g]Jo UcӬCL"5j3-9N}AlGv# ۛ_.oetGimkxjLsKWBѮ2.>7ġbiV 062)~/:dlUu(?Ԗt09GKhV ߇ͧi>: % W0 Н%MG?k$与A`|UTR^=(*V}&@ŗ[iH& ϸ4 +"М_dLo]z+%H*[x.[ZeK4?L3q⯢ S{l6]Rh ea),Y̔Շx~~N MX/(H}UphpQ R̈L-AJNl Y\|}R";H˸1qKq-2R@C1f|=V<ˏdAFy2Uǵ4r!䮄wx˷鶯$@AW:},{k$$IW. %$I6.8P~)TXѯZ[w"o7AxU@A^&EH֮v.> im {t;ݩ)Ij֦=]8`|,ղCo^.Ea+K.kzٹ*#($B ;Ab'~Y"y=yĔs(̳?sSԼ0)%I˕}g*d M*|}>)i|*16`gr!t,6Kv<ߝ?9l4hu =t M+NF@#f|Ni'$ >먓 I KQIB7; Mqb/knQG] =q'oZ aGo g*8lC,\YyA9S'~Ibt#RrQQvR-M:w"UsKR^V)1+IÔ 3.WT3N\Ўyyj<|k|[{~R~*y'_,y'3Qqzv-^ Q,ɥ?s/(l!Ld_v`83A'dT:߰]!gL<ץa {_}LVPuAϊF[3YL)fR4ga̾ mƣ^ۗ'pxy5\omkm?-ںAa=XaKF;0uMbc"|3i4O1aEPW}]O-UC͆h? 2la~ B4Z256q2O&N$uwVK8d6Ŝӄ&(`Z-hP) ٻ0z2g7FHYz2ѓc47nO +cɮ1aڭmFSB N_H87:Zg=@dZWChƤ&/zQL2`nY)(20l /"/"ݚ zȓ P!*jySp<)}̫6 =@)7+T F-8y<2XMb_fFB1|+cfql(SkG-,X{w" mR26<%gކW~]D,D=x%S26Ȅa[B~`?~ hW):fD gxj'iC\·(Yu&|+IE60R;]vBƧj*Su:ɣ;Hv/Wz~6PGlit79ޤL'oA[Wc Gtۛ Pۂ3xS.Rhǯ34ٲī4;c_}}]j6pvk&(ˋ ER[NҜcJ$k8E6+;YVP*Oc7pl4 s$J?H,7?` ?cE6J\&8VP4hyd2M:=wnмδmSjl7b4Ch4/e5= HЌq N]f(Af-zɕF0NZ@m:@#zSc2ZJŭ8ؖyUemjBŵT2K,%>jm`auPuFU=L-,;҃S”Ϣظ oU5 $&2vӂ7ʎ3ǹȼh#Lr0 {QlCqϦ=CX \XxMR YٗQM=LN*Pn` sQ UuA D%mC˷Zܓs=:HmX 8$E'?1K zqԊ]ƌG'N;+N # m, YTO=`ENKwIX-"L2(!YFC͑80) +YyS<ϕB6sEV<|3PIsAʞt^z`_' W@-6I7ѫ J{жv9ԼK[ԇR.@)>h>̋gLw~}+}-SU2&;HzLGJ 掤xa3I_BkPRx^q2|kغ,Yr <9fE9uFFoϷ`aK';O OTjN0ږ&u6Lx:&B2-->22tT?)2XO؆NC3[|ٛ9% Ra,lx;Mz'KMF/bmCFpMS0c=:%eqõfGpo.p=[xIz^LBߴ'Lv~~+YkT\<F=eY*m˲qhmhW.Y8OOj u1Xob낃~g6?'^ J;V%h }KlG6+iRQ_;Ȳ]}Q%V ֠Uz~[Έ}"m-lkWOl(9G-(_m! 78={\"ԋY|6G2k"wV oFB^  ߠ Pn.㍩~#OVPj uX(n.Gʳi2;s%LgG60̗ǻ/?c2;Sf pf髍}cfcn[5<ą|%4Te knu?eTFh<\okP[0\UϔR([r~u~#y ?5"^跡uSfGJȜ5˘ /o.RMt+vzц(&'3Joe{KoA]irybS)fx)mYm a#5Kpj޻ P)degcq]ѿ>9.bԥmYy5AQjm)˭W%&(inCr|ʛ*3Ʊ~"(JF 'u:l?>\e uL]ΐV ږ_E-㤨EH [a4NqVu'&Uց[rZQ)&ʳ~*.϶2訍*=A)\1=0:*|½i`⟎g7 2~X~VǭN]8OZCCܟMs\!1ACk>8,6Y)U=wI]-[q݊͊J:TB>xeLZf]Y.ET&k$}+B˯]3d?_yV(uyدVC8ޙ, *VޞJDj `]1*:,yW{\|u`^,H 95k󑡙peJ]zDmY0y#JfO=qpє{>/ƂOkȇ5P'1O6E{j 5="Fe/4ɵ;2O5kc[vBK&6Pız_w <D/&Zl+S(Ym=P%mڶSл:7{{xܡ6 &+=؋oE!SU#m8W;5-NM7Xl֪Byj*!3||IU'^5^MY؛F`/"RnoM#LUm69 wWzrÄȩ|1HygP_jFy٨M)7݊zUDbX[1o S:, ۡ/5ھ"ڻ&V#QެV}њE HG|0vzSP= |W()Ϋ>h|]OigͰ [h ooL'Gc$yFDַҎ_{簫-YS EqgjvJf"5C_@(6T"~qm+X\ _w;stG^b]'R)#-f=l+gs6iٍ=F<\9zz½+ S4>/m7IM>_h4\|MRk D씴?mc.yUFQ>mf&K'Uq@cWF_􍭙\7Q2~&[*; .Β(<].1.p'Iլ1\A3סLpȕI &Ⱦn:?OO~jd_x?鿨{aߡVI^W͋Ɖ٥?f/hzWG#^ǰ=Hsg$^l^OG8<3ֲv]AVIP6B0Mg᠙gS6򣮮Df=J $^IƟ!2Cl#6 x>+*_3ovgv,?4w7G3E6|dy%U}dRxp~qmdś bn9SdzNv.RxasYp[*NBy{ q \u'b9(N@C1kmHw<4+#V䚭Awc7G\ &8f G8(ë׶V-}o &R&S~"&p155l'33 #?NnIT_ksU9>_Zެ6xoٯ`TDA:Ϩ5Z J7~~\TIyƓۮ gj8ojl/s!_zY%2ڶPTKcSf-9Fgcd! ;Vm\N\W>S0,[uKql IVkdPEٶsv_uk3t׼r_/'iQ8LrAv,\8kg: G< ϜI` <(nRW~B[MlS;hxM#^ G-@y'!uUNO~'F.BS?Jx~~]wl]U_Z,mK~ ,Ӽ/ 8 vO`K|bjY^4t|f%'ږt6濧tW gquh/Mtt5spiˈMf` - &ǂ{& ?FL@KEo4M1}d4.rz"Y!n2ݤ Ȝ_~4lqM\dWgj閗-c Rkkۂڦն9FAt5%cǔ \zŜ25:љN%Z)Z[dsvPZᙍKg3#gjvCY ]-ӻ4כ2Č?zWNT߀-gpFywW1wՠaŬBةi,XlXBP As9N= HF+=JxGm+^1ނ;XxDĪSpkYV%/bȐ\ܹ=[(+!T|xGՌB)˗żPP2% = 80y;pF0ɯJ)F1G]z hQ uFB1⹳~4ҧϿl =-;޳TU cAVdL#؟0nkSUy;?=d5bB bgH2K8M $&o,ϓ1œ`֕v,&&ZPNZMᙈc0R&y>}od|GV>`$=f_Kdbz/:N 7]NddG 8[\M<@ȸ.Xa3Uq ,̩ lk,{/lY1Y)G^4xb1xb`YF_ߋr=y5Fb^L (4I,kEi2j1kj4Ƌ>Z:d6pZZ!QZYO_2FޛL.xeŻc,l'j:UxjmʸAs_VFkorffF!ë^56wAXS~2zB ,r*qʦI bv Y(R0"Q,U&BA 9?orbTOוnl?wٗ5YhðQ Kf> m/5jO2v cbe``1K2v}yW.?;:sOnp`KY/#g5g_bTiW_Xv[dduTX&2Pd]M>̼a}{ՓQϯ}2{쫎_qozr?u KCbȾw ^'cb=‰^wIk7+tgY]i-/RMPĽNT(!)4ƚ#M8^K DXJVJ:2j)Ưc[8du)ɭ(/ƙ7-n*^R&T/D,ڎdw,Η8rn *?!I2/TߺӐszu% "ö%Č[R^u炕::{7rv sg-﬽_x@W+'G'F&;UUӮG&lz:}aUzx``O/pNyEƃ,+trvW VJՐuW6 k%R,wV?}隩Kefk' 8usٓ~}Ƒn=B^_ GG(ΝO`ek;5w~oQF8:-kF~؋Kt~ CI6n]F%OWqXɡmuMhwbjA/jR}FFzQOa QȨqX b Aiƒnm=F1lP1׍/rߘv12{ f<7Ŝ"*ffJ;.'^,\o aSǛ0kR#%d7]c%U1|5F\uH'MIqeLxo(d1B#.r#y7]c$ekD4t#!7]cJM9&&vh*AMv9p֛ԄnV])Y]ıwS;37wQ;< t61`ŚhӫZtA=BEy;=_oK4[N[uWy̥ uL|?Q/cr6;xw5z՞JERىa r>;aXH1_4Gq;]sS e6,$"#|,YJUm ܬVM?.nHdul\Ix jast4e2˪DrtZ!Hc؏ .`m>2e/j0*bF (xk;M,9lX5AQ.:ύp]iNTpAd59[.l϶ml[4Կiui)kԛaԖZn .kw;Dnd&쿊 n.&iyWB {KzZ,`ˇk66޶Ռq"bE\zt#běUi" XKȰ6C./Ny~{ٜipW(O S'+ff`[vf3kk픬z>?<Sӽ~GM'G~6Y(ݮFMfm(smۄmCM+9{Q@El 5 "NW@@&$XC Ø&0uPAF ~$E@yϜassn/rYrC (UBQJ(7.݉yCTBQ&2PS xx~&(/AQ13+y䨐u Eߨ(p{%0n Q@QѼQӘOQJl]A$}R~'s%wy0ʽ!(ސ<}u(7ACRnDb ]AQ{a$)7>ZyHFΧ!wߋrDeؠ#7AT#y 5hP3ڰM#7AF2h(?xcFzGos9(?÷PohPeA= `FqsIcZuR)(zoC)(è CSb(7XPG9wQ J P9`PA+6,u ):g )mN(:g:A2ʵ(rB*(A? A6Ga솢ȏPܩWPoөAQ4PPoݷL8Wo8cxE꽮xE3AAH{HpE2((rrE5((7>%4 瞻,o0cʨ[6&J(ZaŵDM|J(78TnmPoS\fvrJ69N)~ )^;x#_hX`/x .x]Mp醢x#o\m&h}HRHkǬeSFleUe[CwWIk9ds˥)#%N E뇱O*ifkHUIk)m-'U}#Ue32k󚽊8vWiz'(¤+8Sl/(ke@ztYD!tYA;.w݋tᰬ 1v}BGv8 v+Gd{_}CmG֙& FBqwZn{ڎʳŔyw8l)Ll9yU(ڍW)"©'koLM٣tΒnoJ)֊t,  JaX׷LHӻll; X72u}\<*dpW{(k9۔VƩAٛ $:F1?[@hS atTlЧ%pcb}Щ@;۾GQ넨^3-b (802L Ms>gs3\% S.lnp1v>/hPFJaBnяH [Ail]W6,(#%5f~pr*#%luÆ6TFJ?_p`Ge~dbl㋲;c%I1t'xR+%%7fu};ΒMlp:pYR]10%%v3؅z] > gv<1KD~Βh?j8:)/mwPK{YRn6K܋ Βa4dZQe/w^]!׉R~tiFʠK <-wA? S0c"&>uɵ+#ه%T.fKI3:Q*CӋ?Ѕ"^Y;L. hg= " S7j74O!@[9hzȀ[(hgο GL9o*AƬ6 Ħ¥pA܄;CL1VͿdG|s܄A^/z0&y4|MءYè*Mء4jYQN@G-?Iu"nšQKpMXs*zP}s@R"LT|1 ܄,)7-7 ]9rl#AˠAfAhrb M" ?e&V ]RАiPb-Y+*@F SY Td#@[%Zhb5PqQɠ ydf zW'4!yD|"s94!Se6B@2M*,3+ d_ЄT}&\2h#rJDdNf:v-T^8ŎULYm;2k!c._634!dBD[Bm?/^Q9xš#yWfM G QW4!xXVLY& RЄLE-&D,B`M Є0l?B*~ K5&DLd_ֶu&T/LvՈЄtIG{쏾{MWR:eXZsW_-6BGcFq9@4l}kFт#mN] 5@X3)ƣG| V_?An7rb儂ƈVoAP@MwÌiДMʳAʠ)$2Php&攔+TPN.&(GhB8 ^#TC#4\>'TF9%D&U nbY6ƒ&CcDMp) F@(<mzT췍XPPe>:&`|8 [aBG5C!Rfͻ$]^y{Ue}#vUܫ 5{9jч{mAC@U?`ޭȾu/CҠtA搐J"SX~:У\p>Ln^&K~H HdG *#`X~,? l|B14Lk .+B0W ׀V:VݦK 7%tߐl6Lb;G 骊aD݀ 4Kс4.X:s_t`XY~t\(l|:Q{- +X54z{XBS!9u.}~ PЮ&C*J}t +/Ў_|\~¡}[rB!̼"1v)'RnƸMO+wIu꩕㯠y=pSL@)}a f9z R:YQaiTWzTE[QWr|DFaD~I`>5E浏8_&:yaM/d>Є!rG^rS>~6[1ɁЄ]\yh~?k| :A`!ML 7>&a($ˤDř䜀^UZ=N/x(4ͮOWДgGAGqdE4U}5?|UʦaD aa;{̱ؾ_J*e&vdk~艅.Mf=q)yZp44ܸUץ ʏ!Α{ac]Mu${'s R AXW^z[m L'MR,["f&QyȠ@av{yZl-?$άk2e ?gAKe~N'r(rMi9>: %D?0nAr˿C (Ҥt4oLAX8grV[9x/~tuN_xLF^Ch6}2dlrd^ C&g7LYc}p`-֛#{cX2,R`N"UgD'C8lsB[ Nxҩ D:N9]UѶbĻ1>үjY`J0 kˆb*dr"PBcPBUv4Ď|] ^w^6D|?h.߄κ|cjkEP"_vL1Lg`uvio!ƖƝZыFH16~e3ZA7wsū&#D]W=dh9SF5 ΂( :W5n5yzJ 2`'^8kZU& QT;u' 2 w3̺E^!A*\(g{/3Nmeҕݷ. W,[WLg2z1g4ɞBBWKVk~ӜD<ǧjQRxEIݚG r \='W^.:EK'6]GV.s2K>&ˉ6y||i{mI*Z:L]h ύШ v,6n]xX;9vsNMLp;M9Uxx{|=0A{c@Rx(DoLj8LH ϕΐY-Y-9Ǎ K955)u)x'Y2vXfycvc`>wis *<[Cta6qX:DG`!NNm /t2hxy 6W9 u-pNɝZ~9l.ސ\^jS<n-UuD,'xpC\#P }Da#y(gzc;8:q䍈Cof+섳F®E=BDJ4A0Ҷa`s%̣fCq{FUWk 5H:]?^qhX.9M۶Z80dAQ1s޷?mk WΝخXIt?ٖlmNG$J"U$hӎ4Ōe y0ȾԤL3jG܌,-!\zkWퟚgՙ/Z5ԑ85uy \~dYeV2eF⾰IxZVuU_q-1Dtfgj ^q`Tݓ&|a\]݋NVI:k5ǬTe]ύH \W;hu;p֫u8ìw*؟!%.Ң>e:3k2s+ \k FEqH(3;Bd7ݓNV֙׳}i%֚F`X$3cu@vg9&2`E MM^m5hQO\?w<ѳ )e^ы7E-&pqsS!kN+kcCc͑2<6041!- tw o YכVsysKLk$4~s(&OK>/XS[Vgs/|G*2w3@7RТ <yo<y AoUw#N$(b32łCD0",Y!P˭"b+{2oo] (M jj6JJ6.~ * yX={U$/"$fȫ֓xm]@ccJu4Z IVgmj`'AJu%?{Ww@zo Z՚,^&Ϩ$&ۋ20C`ZV֐b|}al21Ev R]%)CF"b c#նwVmGΚZd2TKިI㴅g2n6ɇe4K;Eⴡ(kk5\mvQLUPU;;tm9kR5wtgF˚ZMfwĚ{[iG]{wOhյǿ}{B>Q6YC\b jOWP_lVώRΘ Kָmq+Z5jגET Ŵ=g +۶X6kݓ:mĶ[={}oiM'gݻxq5YtlaS;4TS|7UUT=$%Mq^OT*+hztG* g Gj7Ȳ=$R:LXM(V&I:H7\\tS$(;R* lgt\'ƝӋ]SDTw_r%ٙCq5v6$U gU$ D5ˌK$zF7ઁvLY㹾lǐT|t5CA7Ax&xؖ~7' .Og8r s.*㏁CvX}GÛD.{=k!-OϏn6Prx읶 ќ4D8|0Y !$e9viXGnwc/T](֍ ԫ,؎#4ԠKQoC_ح#\L'A`N<;lN#>Ebc6AM'_aB%餛+`￷U+WO# ۦֶZskX7vHa@mU:^TCnoYL63=}unjݩ| iEUyK(y&e_r`)3 5NhV<,G+ \cU \3gU^C(tx1s^16'}~6n[Qӷ2AEUlowk^A'nm<.́mm\'|"*NvquOF2" AKi<iw_tùC[8^ '^:5N1Sx_*/l*=_*n =CyUwzzǛ`w0:uЏm\,=}Ŏ#- 40_gsCUW $Kn= m'|yFqS}I04*%s98,@rAIj.v瘇^իCUOQ*r}T*c1 /sӸQB2 ,+]J%Ӆ@qp<k&3k^ZzɏI,f;ay>Wȟ^z4r!Ak[ e Ki׍=jb?[O}}~Vg =ݐq>s,HŒz?zO eD @b_0"QY7CPɨ!G:Ǡ( R7a!|k!# UKSCG,yꇾEքD^=A;c"qC_Z a$;%0 _d@.ޒ*; Eʹv9U& Y#6ԙO{޺M?ǧ?o;jy8ƾ.3C s|mB4(Zgn=0Eޞٷm=uzq8ݠwywD=rC̹ tnz;9IȎmL_9mI=* 'h:߀5_Sr.RuӥA:,5T:"Y,6wٔ5M%.%ÒfET@Ak?@\yy,  ? Dې=aMdZ& Uto+6ukOߎO@E2& FEL*mc}u1paiVH+ եMmAh g91;8 dDlRj^L:#8c޶{Z,Zڋc5:6,| V4 Pm $?&F&+H1Z\ޢ4E5^L6ng >]V}?`~IpoeW^6mBqiZ>ͽ$4"8es؞eri= mFá$R E $9j[82AKQwNeVS|7N9 mr?}FNzްYH?Q!'#jjDZw@9{gCSf #8=07614:($؅a fTfn 4i,%( @.ErmK創) m U}Q_̽ [ȃЄ}}-4^Ȯ9˃uq̈CQS)bml 0/o>"#2ftYD}"+Xt7`N:^؜ د'gHKĹElbije5^~-f;R״VfYl0FӑIPIl߱Y@U7evs w]D;Y0w¼V}~d~ew:=Kk[/d!i 6䞲Z"zpq.94Mʝh3 GVu-[?Cֶ;nj5<ZՀxF'KIX,< h^ZN>N b}}'D{! 7/dp< j% *AC[8' 4N 7)<L)D kO㧐,ɿEP~?,|N<@BP? C󛷐+1Z#Y/gH! "v/BӇj,lAqTkdmݶ AapD]fe7X2ԇ0Η8%"U-`Q5ShܲC{IJsfȐzݧ4)i _V23!{(KW̴o\2@CU0p"B-n5Ъf JX6}Mkx!q(,4_Ff0|] AIlT.4D۞;h1(K4](*L;7j.qlϜ)iKoTjqjBҏ ʵ2-脌z <h|STL#a;o3Bl̦$'K O%PB  A>mO ET =x53R& *!"6+xՌ8L,璊~NiRfpv%wuK~l- @t~6|rާ%IYLjt@&Id"eȥa@?*,OM}tG/sK\ dE:mJSRZ)m:6KC{Ii,sAHCEWw05!z7Q[,Sm MqSS. ad})5nn!"PP%Ks1$*`-.}NQԶ'9JqAGdW:v"}V-/Q==rf1ezz}x&vk'[ϓ{Eg6\q>VXt,_n-,ʼn%h/ڋ/I[RN`JR9-ݙ.8$҂)LIbJpZ3t3hq tLDs23azcmbVӱAT ŗo t,nAN&va:oX ipAkUgGiI5(|^ B X]š^ŷ|Ak:9o/ֶ܀>R(%X:Xchagm¢4XROl9z)k:4.t6gt?'4\jRuѯMpMf|ӠAkd4#G؟H[(V% ']q 8uU@]}|+;#’f%>y) {7IZ%AO۳c|}J]w9=(Y"l21БABB>"0tJukF9g K7hwl\G^VXXyiX qnjaj1q ѐii?x!,OiCCwOUwԭHٶݭz}k"dujQlmm\'|"*NvӉ(>B$Fh\>6|wmKEJkɖҶ`^^n,MXhG; =qWA]MoNi֩Ɯ T%wf63Y N@N6Kvn9_ QQ-)h;p|lw]OĪU/HJաŪx.Ƙ}o:euS?LFņYw`-J%pG>MJ08zsnN~Lb_5ݏ q\qnS25~j fz>xn=⇍ [ ]# ]GVa+tY[#_>:¬hqPBB}:?BCPh"򂁱~ rGl&f=]P)~ u(1l|7rPZ^+4UȌ{co12!_(W [X[lpz-4QA6_ :== %s6'C)㪱yf }R fv;'BrOr`)[3Fu0뙪PQBx$[W͛8f Yt ղQv/"WOL ]bV"bȖ)4S1. Nnf <&-Bs 7zBp½<׀B9)rGE# +H]+ڰr%+[wi ~'3O`ݭ׶[kj2Z^ok,5FJPFFDC=8}"[+ &vV$d@*r-2-VѰ2{0On1EO`&zA o So^ ޟmO4AU_F*[B5Ƞ/\"e Lwnp@W𷵶(.&aM~A] >y } B8«j90F.Ϲ3'=J؛:rʻK@ea[.rܛs*Kee }URW )VabԬɏiPhoB5&Q3rEjXΔԯ|Am"hDs5d$r|Z"3y/ip-x'K IF cuR)Z3@ 3n*mWdu9dҊl?kc gb_c롳mE3׬8cԎE`Xª^]Ђh+ )1*؂!M"S1Թ2ZEWEcZt*UK\ZkR:RB$"es!:Nb} %$#iF%^YfQH؃,i¡Bgf횫+ȳ2$HBnVS;SM,o0IyyT,zhLZOKÂS=%҉{(a=GG C1) f,f(!zVbUV DS,dIU*m]T wYbosct Ko63P ,D>rX9snԩh;ZC@ ->T,8_w*_G(4 -~&7L~FdfV|Z2qg%⢘J! l +DI IckN-w$>5GD0Q#=1\ .z0KjTš*Lj%*;Yh$=X0IfǠM:;fԞɀ~C穅e`EZ= ;1a^daQ>I@ .kOQBh+@K1B&rơq88ssiJUw.s{m{k0{1iiù3Q6 [Wր?l+E!$ `5שL)4oY9[r~]ۡeGԓ<,2-1r"|Hӧ,eARzbbo r90"po1KzWՇioĄG~af50>ɥx;A$+^r tÊ}),<̲F8R"^S{Xr]S.n"> Z Nd5%X0F%Yfv<gI$Nnj!zM#(jrSOZIqSૻ"'iސf[wS~\ gb؈m8 p*r X Щ4kkn{J7'7A8D!*f(T_nC /P;c+2ӷM,sb: բN8Jk\8QRS_*,*5JËI RƏl1Ȁ pOPxX I^<Ңbv@N WHGs3-7ʚ޷7#޿ʧekgdEH#fd=ڲGrR)Jd(!)?fwA$qD$h44rZ4rŢgrS8sǓ8F`gUU X9Wq!hM- 8=2|/u@$+6EDL%H.` 0sv&.Y2](Qti, EjL " Ǭt?9xEsR|muSF yUkMrP78?/&…X7ze% Deq*G0:y h42$S[(QK@%K[:| M=˅ˠXy%f_#k$)-0KIDŽr9dp]#oy^8ߚ6a{κP̙@fBCR,n(,7zܣ֘]CҚGsb@ pQXV_4`U!نk Vd%eP4E1y3e=#m*.Q4S|8v$1S\S7ʇ:;J;Ӭ#꨺**8m,*}?GMwkg>hl(u֨Ah9-JTZ.-Iӡ5wҮw:L [;?9:xC`=S˵]#;ZVi%I%1o;XX'/w I? Ѷ_^j{A۲ڝGeֻ$]lHHo(.Ùz`z﨔H>\ɇ 0g`7H>\ʇ3@ t@u8ߓ]3+e]]#0T)ݞɇDsJRё~H^_J0{%~/j"_J? },~2`{{$h3? Rc~,?_ +/~x?(ůx?}sO'WNG)!n!X4ƻS!&F_h,x#~?{ !~?܋_~,ޏR w*UvR6A+OZW B! *.8_*{,%jXø{6 {/$^|^ZR%`i(WTrPic؝u}?^Vȥ=XȈx>? eǎ8W9k=fgH;{CBitғZpZwDq W+bM;Xm`>Yww~}!ķwSzkb1 fm/G#7Jv y)_](?R+rqtC0+G"\ ԓwh~ѹ /Frz/!N.{g0h@R`KrmL"C!s"it'˖HI=HƸ&vj C룶,0Hܴ֐cV1/,5lܟ%HE%|O_ŵa Z:[I.eWWaDyeŗaIL $a$ _f=$(G  2F*㔣2ON,Xlbկb8V۪Y*LeDOJw (-g(_FN,n6 xtUZ| Ĩ5]`\ f自S*`mm+v>o @~41l~ "`0G^dacE'^R=^a$.I? Eb >@C+WtR`;E*h ωdnnޕK]xRZBMP:!/u"cd եMscBP2hY oU2ZJSUHQi&?{?^Lql&Z%E frgv\0܆(c2IFYhIǧ$h 枵0LR׉ AìpȓnLH5:*Yk'd (U~/Q> 1F^Yx6rq vX 30wܿl58*LIg(,F+uka.^9mͼ ;ZVCaWiC 1tPJH PAADBtPֈvsk@^_(6څ#'SzFh L",\qJ"aDjmc1J,(FKs DF(GNE<#>c!! 0UyNl iaO2,+@Vй @ /2q2}$*u"]AѮ ٮ+8)+s]y{<=ou^v rqrީhps?쵝V#3G}tn؝+Tڵ.֮/M$綼jHcKm Gۿa$Qߡش']%(Viy̐In!PbzLBu$-1]RJݕ3/F^M,]oiWc֍`Ќ,PD̫) X:N)=KW024<@6I0S8,sl=J;>T[6OAp 4v=WU4JT: >|0U@}U—xMYqI.t$""v7nh@pS+gcV`9`zVǛj>.':@oY0s8aYL|gA @7w~M7+qD)b5IճΊɀޤ^hG R[/.Dk r7j崁P A5QDs5>I жWɅ"WwEMS@y2Ժq9~;ڇk=_W7R 2RtzLGӤ] Jd+;= j {1gVfnMѡ:5=w2?\ri /5LM[ȐA-h!MORa`艳dvPǟ@[*V&mVGֳM] "?ʱu}'ꎳjwx ?\YYE\9+M& $ZpUQ Ў*;a_t8et~f49UóL9'!%H1HF/Ç`q#u^'K9V;228?26 ~VÍm :B0 N_صsyA֎!k2*b-Fy&:ɲ fl4pX9x4eMtÀ|!3%biU3M%Y+?K]gKHTj^VjܡjdnjcSu/fdZ ָ<2rO 8 DC@}M~b~JF!]!aeJWu+.!UA0DЯS:ą2VtF!­pXz췾Rj /{ FT+qѯ5WkJ*]İ~0pʯgH؂U,7M# ŭ̜G y:g_>̝^W}UBS{ 4e7_ezo|!*?ȕ&x)O}U] n빦>5H5'gVvSMzqH)e%R@v5r%,^Aqj:2| >PĉV\L]c3,=Дhx].;ߤk6E8ӫc!nB1)Y[(EjJuX/t<TF<#3/3t&A$'ʟĉv.2X I?LMVlt 8~i M=k1v1^*v s4_ynvu`:Rqc`@db2cx螃ܨ+vML`Y&-Mpr *Ms緛`O_ܱI3 R&&Y0 d˓y6$vDY5Q +k %h2BZ"a,d={M"x\M.sggƷ. %؎.tZ> . Jv2s 1W%v2M7clZȏ~^?}dooV]6F3jX--Àc8oEP@gaK[;Z RD"xv/#lX֋{!{qb8"DR@y~z[Ng^]̗?42։% cwfMfo_Eca^31@ԱV/VgSETfzڸ k0Ű WCX.k>ݹar]#{E3c@bwr8-ɵH8Wj1щCr9;TE޹m1qj5D(F _(#VO/{M $T Eͤ`ܞ*BnY{R;s["ٮz#Mv^J s@P!}pl;xP9kp'/E Ȟ.kNYx^*C,ď,8X҈- Z"1>9}<os_KBKsiiߡWϽhuvDkTz)0-O}7Xj.~Qn=7m Ϲ{(Ņ"#K=ݣv16hO 0y Ufcv5qsT3b}1>;ed4z+:{;mԾk̒SOJTʓ-7;䵵[8ZZ]=ih#ן);wuC$*3%ێAn.qHm۞]V,R-g}juen:XtPD2~™pOS ),.,*j1vbM@eڙf \Xi`ruƶ ,C-ai|SNxl_-_zm>UXRU|TӢT~VSGzFpN,YT"4}!B?YYKn*d Qi^!-'0F8 4_ۗ%6dd- ۣBaᐾ\y{6D~fËQ,rQ0D1K:^8ynI()&G˻@vZ$9>隑i&c?X%ϊPz>ho?qQ p$X#'d6.ٍ)wxh)/ pA)($6ucy:ZrF_=qQ&(eK`W D]xw$|0ƠZ1XY(ΎЯ 9@ 0`uOzRPA1BtS&2U٘2烇~N@[9r|Q=_ %~L~XcgP,!|_j־,]D怦MZ 34946ԭEn"DRͅJx3UXn̜(2"s\N-4!D#2?J WJKg.ϷFolX`!e?h.߇Y{*D3a''Ową:lk4bN1$Nyh2QreM#Z_ GI6t؇KsE,gRAn cpqfR"&֭2:eŠr# Ӥ~4 :!Mt2YJ,,d.a>33AȃYAN ~]&~[Qm?Vڍ?kA%hu ܽqq=h]z}+r5Plq'#e1mo,:&79n*K$ڗǼP_CzJz\$:ԫb(@zF4[wzBPBZ%etVŅeA/0&ɇW/L W$Txt.QSnE0meN\)wc5-uiIdϜ^-\y @H/t";âfNzh^&/Ŏ*E#z W|&VS00) Dm3 owai+=p>,򤚣~먺^+ٗU.NTfF {b+QC& np+" 8L1dݝ'Eb;xqP{.ɋhf:&hYHǘ{8š_PFO"7ŤW:U7ۺ!_ơX*-Wfҷ ʔU&4Pj7/z4#eX'z,.˹Jŗ:҉).Sȗ39HGe:zkF  sprGxY bg759G7v5,'lM$qMGZ*nH,*HmmyrF__i;C_AD nQh+ۼ:*Ug%9c񁑅;{]geZ3o*Hh\e_̃HM9$m(DŽƯTYfɄFB^x2 ǥ֠EZ+gyī'ìxmDj.miWSNtP<_lcHx`e|^g~e>5ě,Ϳ%mY*=lT4A9#"ŷyH[T[ n,u'/W/K]:bd}GWW*]JA b|v8L]FV^xœuaF-"Ke\ne9|gnMq7nnP ˄6Ź? G%Vi*~9T ]E*Ӵy՝մ]gx{{rEEy 銸|ox!!.A"vzE#b|RA-g|XO\*Q[~ٚEfJk b^u.Djlqm8>L; J%04[Rb`!Z=wJA0źg>}ryqɞq=Ǧh{ a$.ͨNl%ΦQR s\Gv kTͶO  ܅\%*5_-ALQބa#S.&S#n?D~m=TX D@~b?:<ͯΜ%+A=ů o ф0&-kڑμ&8WOUjEq:mG݃R5)vsB#NY:~^J&v<_mAɂ#7olop ¨k{6xߩ"".m;~ܖ4(7r=R qhSpJJʲQ@%S)#0# ]O=9 !B@.^]F]cFAx勐9S`r+0rB'x~Sd4WǬ cZaDj2r֑0Lb wcAB*BPFDg}Ga^[R$F;Pht]y"cYʹaILD2Hr *xh 9gbV;;mJ}>Dԫ 9tD(Uek%4SaIҜlLH;Vku:-Q\P3*.sw"_Gꎳi+(zxuB2eܒȸ1cij $דbl"V1QDQv\%<*->(4u^>xC.9ҽqYSƢi 'nV.h-+lα}$jZ\l SpDO*j=|~s|% &"4z}nRA< $XpYQC!5UЀ,iXMT.* ϺRAE '[ux klqGx2^,z+>+YC{B`P5 Y;Az+U܉F93U?xu!`aQ-LwIQI0sډBfܥded䅞@W ƫ&Oڰ1qgnu(C8 Ʋ2uĝ 83R Lm}c{<.M@|ȯ2?tj6H 0AC @-~lG Ī,A"5:r(Im~99kZWͯӖ40eƏh̬8ř#y:M1թTi@"kZi -yU1ޗe'Q7j8\E=+&/\XihIz9:Po D6_/.yz0;mP-ƛRSS6I<#NP |a4Jvй875ZZ(^Dl%Q`}ĸuV ixjB-l"]^[[8->m5D *b!mÍe^Pd%tǫ ^_$|YY+}_Vo+mAB b!UB!q> '=~zIfYdE3`̀a4TQ/O6dAIěqDbW%6On ^˜WO{_q1]Vȧ7ʏN8OwMpQ5B/m!rGx+$ bH:n5 B?(\]lCdɄ=ƕ)Xl8 i2CҷSMJE{K8U*8T]i/9O嘊I7zJuڷGlK n:IP" 43Q;`}23B/g*)5i!|鸘,sB+ΓIƂK9h_iG=Cד>R(u Q4]ԵRg1m.Fdᘮiݭ1-&t*J4D'[|0SsF*M;T9V&j5D~M֝q1.BQʁU\eN.+ʔgَ vp F ʐ뫫Y$PMx/ȯ7UY4OΓk]i m}\O!HFlG3E=8„zX"C*= S [YzO|_t`.Ka@b:-X@Ya!T\#) gznLIXe d򸣾ZqO]c ci$TsO/Xdaz1֏Q Q<|qQ.iKMR\>/󸬺v!y Zp :ה̝YJfL2/OxQ}A8lܲ9Lbg Cp=ШO5b\З)Dj5|bEsJ[XAD=EW jD),&IbEjy=6%i(c$?t lÖ,a[,mUe:mMuL֯w׷4ˤkkB,Δ)eD(Qdkl"V a"+9O*\MTM Yٳ/`dtP:k쥙$!yLK8a:OSL@^y- YB CDVhٲ,vhkgI#H zeQ2j$zb 5 0jp,6rD_}f5믛842҈?_H WWE`Fmd. Q` K…`q7 !|eqGM`l&TVp#$u4[P` Mi2ϼ(!s0Id7bF<)wttíq3›4]k(ՄUhM7~v,IJ͞M8?>۝Bz0i *~еCL#eG25[PO~2#jHChx6 .0>Pm.1Nn><ש|q şj y{K Xhz0׏9s#0yJhD6Id}O)cհ!c4T}S:S,Eha@0\ AdQ?xDz(jDJ#YkJ#_V::NYKCe6{;q6't!S\lipa˅]v޸iuuUtuɡ&]dr bikǕ=#&[Pm);/zR6 o1y 5[(vYOS@Zw2+([TysFc#?eh9XtMtD D% J.ȏvG*}V(Z&Զ~(yK{B>%+W %(EW:&ٚKkQDE3OeU^:44a ddk *3)@7FcA/u?/oY)(J549Za}RNx1Or:cyrr~'U7Nj3?,-etx k;UjLBP8 G-$R0~8៤cFIY? j3i m0u [gҶwB.޹'q`G]ʸ[nCòܹls!/"lHrυ5uGf j,\Fϻ|Go9dgaG}kWG '!7tzMÃiyzO; {u||x7>p8l~b'!3U{, OA(&3 WX --.<R0 qO aT߽H(^mI2I*x1omH̪jSAJP$S3oy-][@,Y\v;,0?uYʝ8zɮ{h">]5Qv$zCw_&}o=qC.쳠|"piHD7>O)`[aqMEիWD,R"hk^{3֫tI^X-{l7K;_mtj#3E7Yw #CȘ,xLq̮h4S@,gxV`SmpDb\itۍ3ZmQjfMqEm#kޫ;r}Sux& yJC"T}jqOVo-'w ZUG_,w4,gtuTSNcJ٣I'5OǝwѨu)_Cg>v}!ںc샣9Jv^Y.*Za{@.#GZ3Z7)9,ҳytQ3kщ/@656"EC2;%15R$ԺNEb62US:AB<ߢM2~h( xH#VxH|lt1B>&Sp(.[l35ůTCU3 Dތ}HpU}j^i6ײL¾pg^d!!l6k윶4b4?P|I@p0w"y?oӥufR'WsIh@mbQ9}D-3xV ɛΒ*^ wA&k|yzb}gV9=՗;|= N'?ų=@2a0UED.8AgDxh(db+ǜ*5MSv.V8Sv|&(W״utK3Qe.r+QߒHJI"66kMēhFܝՅN}rӚé)x[aY5p=& bT58[I hͫ%QMH8(M) ʴ g0I@`ïj&}7TnLp7#"yqN Fx9JTy$;{-|~xEYTtD.w0zF u,4M=.uA̋/_ QFxܡ]/F<^ayCuHtYeOFu#@ȫ樯2fQPj_eCDL1@D3gdedyd]$4CBWB\b1%\q -wȖ#oU g֏+WCvڤqűegqrtp!|}eWRN z4N:Y馞\f =558JnUCD9>%y;/yq.v \ Wxc;/r|ZĹf}y}ˏk?ϣHhEr7\@p"GɅtCKZ.$:K߄b?"Y`X !1-pUG"MJď*APW7B.^a )Eϋ@1\E&p;1&l{Fغ0b4f1QZ^N+ Gݺa'[p\łƽT<7 DY`{{ړj6Åiq>v(qqYj@ь H_ŭVwrӝZlQ<B;3U]!1_B `nLfC0U:H["j!Bs<,#K1bl68 Gb cʸ{jvď픗O$Wi8QR,P2=gqb,K ;+?2! qz#Pl;5h/BV?o)AT 1 42V?/`8Sx}/u!8YdZN ^аQJzYOxAbHϧ3<."0'y:M3(a"b9BWj^}^@͇E-ecWwf-h?R -AO|#[#IUӆ#sAS@ va`Y~!2峷~y*~ l:߽>h$Uxaa-XNXg'ZǨgI)LbM3.RP ֮0TcS8Mg1;M:pY(+U!MNwLj &EЕ68gJ/RaZSfR: ϥVlx n NNJ;r3 g4lO b-Q;1%v*94T(ʒgv1΋^YZ[Ϡ8e.Yěo߇Yor2~y.&:edW%d1D]O~`׮:«Sd0e8{~zoΞ8Uq799 xtU~USAUO|!ehrrΞ?7ki%uG+ȍ'|佂qxrou=P&_>y@ S3![ɏ'e\^}@<(m]<GAx!__\)8_Okb)}_Y|C¯y\5K걺ɛ>’ny<'=^Ir'|'Au1#ӣQw_K4q1bUUVUpp :T,YhT|ˋN;.$ ]:Vױm%hvI{4O w`:y4>om~yl,Q;T#-Nۆ,6:3'"Ѹ EuQN /XSHiU2$)|,L/U8m ҸX|^PU1t\LC@-PP@RK F+ jP뚲R)ΎMv^FPj|fQfqՖܗ/96BexblKHD(OD=2hlEqv_4Z%Fܤk1gge)2[wT]SN pu0pO+.q/q^0xY2x Av[pCjeR\pIhZG(+$g Dt'` UjV^:vb.IAW͟^|/i2t8UA#a 28j3]z+K t d}M7UARGvTK5nꮁݫ}7uR #7u~QK5_vXqu:# >+s(+ݞݔJ2G6Q)>k/ bkqTHYI B x /S QpbhE_CeH:w$N*-Z @49`Gr<@!W=ysjW-g٫W9*KC :=+pj=x-(S"C_}~AEB(w:@9l\9r* .p8#tAmόg"Z\$S!yaRҚh@X+j/ \U%¬w`"TIS>UQ%Hbm<~*R=4mLԜ<痮z./s^%EjOD;..lx3/z!u꿲#}aڋWaq`:)z'$rLR3 ׸P?ʹ4?ϞhmӚ%)E "n9))l,ɭ7T/?adi؝lb[ղflRKhnYðdF(ܒ${7%j T-D[Twt]@=-U5Ybӂ^=;_Ḫ:ߒ8/`A)d 3yAtHLôIR;ӌ*bR Fǹ"L)3|o5H#ɘL0q` E$%_p |"9KW>mTAx‡2"LO|#U*sx r/b(/b;uXǚ?<R{ >8cIФ{} r%o.i Z# z*,NS3meEf0 J'W`̒\Td dbA Y"ғx=9bW#jhSM~W\$3/x%V^bm>c541u΄_)\T_йF%B_  L|01ɯ=Ҷ vqVO!ծfS7X뭦D$tyZ Ds.kQ6K$r"7K۱$^,x"j i6 jc b i#=W &FW6<r7L]7pk bcup^S@mQrݲ!>׌Ǫ6ϫ'22Ъ4W09jFb2L^uajwș$o LBrm|;MqF}`?1 |g!j.d!.Ukxh{Ӣ{vF X0wTVBh.:A] ɐLe!MyG~9[54x&2?-Yad> u`ySV{h8yt4-hm%Ϋר4rȚ0q` rF;t WWGTYTEEe^V_iZa}| &܏scR_6g~d8-&Wo9n{xVǮsV2[ $if?f,nUeÓ MZQZqZ]۪V; D{ϼюjTR`g?Y.|ZZyuO3,y5EP-K|OD6.b&R6;M! _:j}i`&x>U7 ,%(Q.}hٔK6eNHM֕h6aul -{+͋Te^l[{S`wClvsd9)0[o ,q)0V}!=氋͛$রEbdś͙Maql';_d%6N O?& t`;`d;:(j>(i';^fkWiOG8Zm'tvN&&X /n{)yZzr~J>3?t֏"ʽH_\^ЗC/ }jX Sψyy5dFh^i*_#l+~FK#_軲h!zWa:Fb[GwBf,:~LQ\>-B#yۘvuI||- NkLRPhgUvuBBHW zAj@5Wr4㊺W{(W_Vb.@yV=sS%_Ey~4rላeuo5༢5,-;7DFĢzɜY4O𜄪ԹOGЬQh$]L9eu݉]K$?뀾*xs+s҃i>A R yN6EMÄXxA*N}X_e#F~1BpV 1ʥ:lm=&;iaiM 9ܨNۥfƱ*#>?0P #Csziޫ";BLIlWE.iO<ז{&S'bEPs_7I 1VjA`]pz/(㝧Ez? P@ sK Ϊqل7B$veȶ+Iqԍn-W {Hv@<`PƐKqksf^6(Ǿ*1y- (Ύg@mΣMZY%TwmnڨYЌ JuRN.,lN"+Sc숲RӲ% x4Fn"63?@q")7O e_pHNٰ3KW, #:J8ULǷ (҇8+yͅ{B'ھ(ZZ!v8t+afJm1u׍/î9]ۯ#:r] 2:@[MHD9|^]9\ a 2mV:'k gÚߟ{h0 hw/]͇/L.Ӡ<}u8!`ۈ6Ko'njz 1"-S;m|K +增?}}/pSoX]bVe%(B''kei$6I&X- s۝s^ֽߴޯ09S=ke a^\ݷc$>H[x3)∮T.mW#w #h0_bչ.\G`w;Tݧw {$ѧ˟8=2$狰pr@Ș_#t'Hf0tsqN"\5KƂ!t%9Tm_MGh+8-~=NfwX޻ 2f{/@t5??<0iwM'Q}"qgw]kF{M#k+cH$wߪ$2x~}Żo^O^o?:~u~8~qx.dT%_vD:ٹUI.@ E$)+r[`'ĭ ̛ ]޷#{ϿShI|}y g =~|iC 6yUIj/$g/wK*JRU$1?*<4S@&kd4&!d^Ӽ ^&&OɢԒ5dK"SK"SK"ӄ]]Q)"=ҩ)"=ҩ)"=ҩ)"=M(d+֜l)z6h[2Jg[ERWX*W{-_%ow:h.UR|[MD[ۋïg-ju-_Po}u5?>/pWw4QJ@k/ù0 u'|mGe@`v )/n#8tC8%j*5/+uWѝ1.jd/4wQzY\ 3Rxoq&ōjts"Gh*mOr9]&]lװ'dĩt=GJK9 p*GC%LP&^<&離:$?|_d6-B*Ѩ諡|zؽKѰK(b{uA7B|a `y^ KAѴNF5)}0Dz;ͭ(sNnU28Ĩ3˯@1v檴KҲ9n+ ;ZX:"c~xԍQ* 'ē\Q m22I%wUcI R_MW"rwA_IԹ/PڱJ`W6нږDqO:U4#Ou' ked2|Y+[Q,HH-s#3xe3I n\`ϣuP'x}߾aPӳ8:8F]w}v !|yH<>U{Go`\-A9 ~x}WoDZQhۓ3z$م-9ɗsP7 I%2*wr(P@kʂw:8;&X?'-'D2d?r{x*S_ ns^G Tk^Wo‘zxpe3ϲ,w3wu8eo={U?ٴ_Z6#iڄ$G_xUJ_z1 ,^hQU)RsC/9E}]ng2U0Ӊ2>a{n}է)C#מUc5' Ss_Vo3#)j>HgL2FT $ ,blIW.v 5Bܬs 50a99WBÎ!2nR!2 m3|s$mpt..h$\,dnLLhrks .6Q4l"nH~gPzyd]נE:K:Ց\+Zݥ]Jv'0ԆY~ʰ*aX}ŝl*?5*2)\*P_s;!oWZ'{~R_|~-w[K=9 Q5Nͫ4»LFFY$B"!&8܅saQh&}2|J]oN)Et6֗m\- KOn n|owQ_I| T[VY/׷oowI%Y {Ufk!g(bC6g5w]έ~E3J ~ qaK;"^d]Aһo{ߟ}$wVw~=bfKbo.۞Z+&H*PrܾŘ^DD=m&Թ6şyT^Vg7yj2N8$iVeRvf;:;l\k0GP!:㫳GrAaǓ&a; |ݎq F+hdG[$Ɔ_ˈJ[Za9_؎o%,$Z>1f!%zR}@,Be nUIkk$A`-}v'| $mKȃl۞n28u^DùԳ'WK:W ytm~?F|B>u&=,6aX>a^f]w*$MQɴL\z*Gˌ# ୒\I%-6L PHNұE^ߎA^\dOBQsؙȑÅ4DA4umEi?`,ȼd. 7bor\<{9m9L>@n~KyAɓٟ\c] 'k͉s9G}> ditRZ9m1^j r0ܴy2 sCݘz3kfA"K{$zAOļ%`A(L4 DZC M-@KX~CYpJ|?˶Ί.oGS4웹y̜פfS$V{=hDs|S>ƃ9'HAX+C^!d8.v|tT߀<#݁#Ŭj>L_1t4\?7Oi}p޲GDI)[mq pSfiW~=/ µI wF ;-;~Qu fK=|e~$O1.Kl㠓U8aX:}.Juܼ##鷦eP\r,1KAmCj30'L9=x{-7s=vސGi-8QӞA1d4lO.y"ɪg3tk/cP4`}4J{z|A-\EC? /#<;Krװ*BMLzSg%6n'EWKT%D\b{wD*GpfJ7KЋBkMb@ V"XyM'%!0ctڱ3tnߍt~ExW82]+utjDm//tХHW$R2O˘hA<.K1$.ڄNnӪ$=-T=ID,jR__rph[\OBC0!B3e Q) B .͏ivqwA @rT^qszAEggQF3fDw c"芚Vx U(]Ϭ:sV7:vu򈝡EBxAݧ0:FCs^y$Nfc7.P<O Cy&ZH p+WѶoZ}\=F@Slr`-n!zT}/Tk5n"$иǣZJ4ifAE" ϙ-^ _e '#X++JOEmxNīN5K d )|5ŠVXe]\*a!iF5qq+KxZZ4U"nxnr{&7Z\  d3҂iɺv?Zh#`^7"KJjp&1`j>4aCKYkf@0,921dY7PrCmz2/dnיq֤i(FC?ʵn3w&1QE ϖ$W*xF8i'V 7Qx0}bDgF}deA2w#U#yn3^tN&]fK@QDxݽח[/vkcYZIҮv S5;]x#i+Dw[}KtWUD,Lߩv \gj'[9zQfd4ͦ6;dt"P C"w,1]{bI4Lgڑr)J4M=İJ6̞Lybdqu#nr*q UʟN,8 縙9#9=yxEY\T)QҼjk}i]v] ]*5]E JQ<8|<9<~6tFev;8͒H3Y>¡6Ã&HE Q5zCT{ :KǠ]Y4":۾ԊS(WP[Kg>POU?e9+b@V{Uou+lo9ޚwJw/YzIޭlb OSLt8d^CYAԋJ*tYi(KPq/WCt !Ir j%PH[=CA ֵ]$s>TA$iF';Cgzk25p+=df/E'WJgɢ8UtK + 0/Bwތ,KQYz^JRğafx`ESiGqL|PUtn"a9jD Z,~.9b@yw9FzXŊ;Mq SG>vwIE2M1wTZE""\"a̠G3e]b+Uxz3F=߰:b' lzWRs-1ҒZ1Π=t 0Ax#f*{ܒDRƭ?;&4_|UMX(/eϥ|.s9 \>p1,-#ى.<+\_]j pP5`4PI T 2 \hVգDIza_Gr_j>gTQ8Vؾ[qu:_GБYA nI4у$){r!f]=e@C^ 9ǥ!LjII뇷gj֥S}M6vW~NG_Ln>My^4avO]gyNP糽gpnva>glvϰ]Ͻŵ2ch<7'C/tL/f{^Ѷ.;[|t{:hG-c,h4FY(!|EޛFF BWT˱fUf/kB+g~Htqz( PXc,hlxb$n9vV(lL9ƒ SH p$[> bAɷ98&r _#6YA%e;N%PXaӜw #{aC>ςQ u;XΠXQ6yM/P/d%@ d/}2 dɈ-t'>:h:6>emFa$҅Qmhq_3>4^s܂W(MY#СrFaX)f'h Du;:65OGG]cFKyV6($̎ϋdCW^ehii%!*K,C>Ԟ A`PhfpـlUq`a)?er,#$U QQ`+n>d;Yc f]? SεĮJv]V=Kˆ΀1XH)s-I R NtG\?"b M L4߽0L(Ne_,#v3@oOLOl5:ދ#Ƌ@Ёs7OATB)Pp\aw\fYozx#f**]W])X@I.d ʖN,u9e]bvyF,ւN;`dȐz[=y?1@amgs^^ ~w[tdпǙTہVqI- pQ tB}*vzE:|N:AJ^`ƒ 9 D@|O}GYbz^.76 L!'+|C?>n!C X8t-nDj'{dgVE;ɬlP Ln34B#&:R 4)yq6&Y1ƭ~(|h&xpݝ+߇pnCSqvPd ]sd:дq'w3A4N X}-G2AgbԗЩft| 9v]X}N.R~^hkbZEDC8v&1Fm;^KhK ]t>Ѵ,-? }]K'Yf仐((%'qʺ-,i^$\Y, Q6Y'OF2KjNkt^{BE#>(s ;3G`mdK/ uz+>&VX G_odqڟfA#l1s4LyյeGEL a︿H{IѴ9u,(4_;3 >Qcj904jwuY1a2ܶ"cy2 P÷mJ%juE0&G#yЏB DVw"fOwYrR] V 5Ul?_LO,7MCbWZ`YX,l-`L73)ZGŀKnFaAZ5 Ag6YK%rX.stTd;=_)6#DQRp:^Vbp0r壩cM]FC4KoK-jŘgc/JENb9_0Ό}h:=kg-YC!\Һ]>.Dh\̄uHf0^<^hNpoDU(QCh_kҤPJzBke&b)0<ݦbsb5!*er*,}/4M~Vm$ Ht%H.-IW2!Xv2)zre{Ƀ.1sk>[} ͉֭3v8݈w yn )W9vdwbgf ṻkcvs/:AiL7cTg_;HD{zfY2  %d"+8%5? ȵ{SSIm5eHwi"57^Hxj=#H)mDdr*;w 6yZcϜS=I@yaj5ię8'p'|7ߧ. װDDhrkc޼;8:=>l]>;#ӝqݓP\ qA@q`:wr4#;l#vr~؞ >A6|l.FEܿOՌоۃGqq)g *m]L*u<`V '&cOQ9 Q!7͢6A4H(@mMv |h0G'P9R|7+D9K/R'v=}i`wsu\V0̑c=Wɨ[V{o{'Y+A FopEw͆_Vgm2'A&^NM# 0"#QliMq=0TWf{,T}.9-boBCVme:QPqx$,~2Ch1r]CeCTSa i{!te#ȶ(Khhs dž5 mFCCOOth̓N,hH=m|CԓE];pKoàr# a\pm1^9S@嘛F\2Z% K!Uqʛáy"4BVnQ;oA\ح[:I:W&՘r[e,[^n(fv;ekVX FnvAwM0ΐPLnF\I2< KI؍85dʤ"hfdf(Cs@]b@|a7It,ۀ19yTFf~cory8) gMр1#h\mRa\bwczҞD}Sn0IÑğޥ#w[F0J6O\P V&#S/!MX~vU(f(mԒ FqDݹIy27db" Lᬬnժ)z8c}I\#76F E9jVS7956ri "戢 gp+"A5F#::pWb d`>VGb ax)OJFN_.B1T!hU:Q!LӽLfΉ< Dq3I4 ;w'_6@Yy˖B\*X+n9E$v(Ldm,^V$cN0 3h(,<2Zp}lp"Y"Ő bBbW-v05)L6زJz G@Ԝ'| qZ^E`jyBČc@kh$~*f8Bڕ6"bxwwQcg yOit"hK\OLO3zzAz:|7"Y=SX8(gw"? TA])sbm{n!=5Rt>'H~Yno~& k2(-et(e#ޛ~s8(,*!z ^ #u@HAclW%;3 3n8dTә;0nV}F.+еzUʹ 'nԂFV{_N5j}M-dTCё1ӑZ0x㮇i_7u9v1Y%F*qў'"+a1x7hR7׼,wcmUHR!yvcT<Q_J&ԄYD&I'd9RrS WBK@xWMKMQIbu{Yq yYCq5/ݯۺhPo9ז:F7l4mL/C#RU؜^ô,.@Xw uNX8-sWPA;|+RSRW)S̒.i%E۝$,fiTĜXlo=SjWK!!)!\|{}n MdbُۮfJWjTseBŠLdy6">[2_̓=ء,|l:(H~rwkgH^LJWg'a{~Z.Oాa 빣Lq ޅHC첳!91wg޵b0|IU\$4 {iA|6u 5] E@Agj=ܡ2nEί֚}Bj&qþP cW_ 衤7H~U!º!$eI?Q&YNBg]٪DoG}6[l ~Xd/n]џdN;M&l;.]e ,ld/lz,̊tٱK];l2pޚ6%^`kk8ZXk쌌0xq?6T<ֱ d\ +tj(xՔ!^|vd5do2i/CD:(/tlle9p.QL\:ٕ i8jz{Y)bđbđ4UtCXY/j06 L @fW4X Ȏ1*ѥ=cj߉'Üx%g\bx"@|~?栔Z]%OU{myEXɱ#-pG΁qfsh:I|m"5FO :#oBYw+bήD9bˀcrM= 8caL[z5Tsu!.%UOFj<=>δ>FYcКDuvrhPJ g7!jO ?+<3e)JUXi&HpUz0BH- TgάR,Xjp*4y(.(`hY;GwflcO@ D k W(vC=l#+f))**.H᪫FhEa! QD5/c>לtmu;4I.׾,(} &8%+oRH$l J|2_+IQGST6PRmn0FCl_Va<2Z`b_; FI&ykȚŠfgOsgcꬄM|zI6&$@Ж`Ӱc &޿gqWCyCC|k~ j?5_aſD_jWjmk뫫y/' 6x@sd3LrE5jo#&of M%5pO[R(ؿ2c+ d(h)A`'!)(/m": JQ^ JC긇I%2!bNը\IZQqeg9@|ޗ>3*, Dp RTKI,8]\s!Y@YlAg gY6q2r˜j7ji6>]&MC"т8@:d CNC6q3gbNY=P_調)HyiYHAp*'4lun(-GR8C;` ^Lpo oSF4$S*3._ 9psMS n\wpoVy_IFMc"ceց ʞ4idFP7};ޮVM_n$*՚灊OF l{Z}{U奔2a\6`M!DTj6_2lRWH5׷S|͖:x5P/(W=j*U2^{k}-K)ox RqJF:O ~Zc{o[3`"WRwX}G\/5ʶ_C'4cRm˔; <>Ç|K'?S?4rr8?D3KR="~K┕f4F>#]'\P;[yz 33y ;Njb82M&Օ-?|\2~LR4q; VJ3_zݴj2GBoeëեDy?"VRMӆkd>e~=b_Rlշگ7+T5>',m,Qj4H FG HQ?!;z;ka0 d-MYj^? Y sg/qvZBi~Jm(֘%'y>:eHeMSk 3D!Y/IJ6d^0yHxVzujB#:toLSfбBiK% # y)/mW?YLvG1`R]oN!a@_e_]]5/`%Rs @ ֚@ m1նW=+хݧxʹj dh%>؁v.ed3,|jgm=isȕU/^Hq[R:dRg")j1EjxXGow􁃔drY$]Oa\ڿ [a7c nN#AaapWTp*d] Jׅ-&fJvSVkjzU&Q"^uX ŏHa~ZWP7xmQb|^ɥz jz$%(5$yyTdTZR-od;"jp̥ܵc"n qFD2B AM{TVȈxObFP䉕ZAM,r؝OFˁԏ0nPQ]e,Ơ I(i^<(bbcu'dzrY9*GV%rdޓzd.?NOQ`t=:FYÖF };h{4PlUz2孖'R=E>JP^^MJ|EJ,_t|5K,_GJ4fEkh^ŏ /ܺ'8S9jPw3x R9 j1 t( 1Lbal Y_bU}o7=* P~W&<|12j K˽F}XҲ,R_=>~`.~+8~I?/gW$'i Dc ^gjJQ`Mǟ='jz5X&u6sL,U go~DA{Z=X]t£S%fґs.%-W:J{:vw¶s 796E;r-Sp_dh[!88cja`aWp":IjH *~wUԆϮZwJ-EA&^DE%J`ӵQ&iF)5vbd/-$fE"E]` lAAAݦt6^Bǧѓs 0ZdP6{`O< cJKo[_\xO3Ap{ 'o{LG0@4$ Qab.#1kt)!B|tʬMrk[8IL;$mYq*qǐ+TkIQQ${m0pӒV(V`{9SҬZ Vi(dR+T-嗁pB)joAb"IJ4G 㨔_%CRZcJXsB)և~OKbeJUmpsz뙻Bֿzz^W5Xm}a8O|wےZzeF!נ9-O0E㗣cA5f𐩍>X-kz:T43!d4M}VYS+5?V7|Uʧ_\=՚Zk-GVB IH@9TpM4W&~ד0݁.P (Jxό‰r_Vy!iʮGB2$Sk5,n 7M}гLvWKcC^&er*Ków cf~E@+DTiXAд-!}zjG?_3S1y*y!c[- )ZA aMi5UlEԳEmy)U0 Q!|o{1o;`!r4Xw޶ŶAa]WNZNMQenJC͒m/b$JЌg -S-i.C$5Ti"-JBCru*3Klq]IT63$Z\;P˰65QLJmF$MdH^FKԍV4݇) \VfjPe[օRR[ʮ+km=aŲPI{ @rYV^̦ (8io)/ Ӡ/<{vjwMiG`bnT:}joP>Jox7f*',ݡEF)wj!4 fs)*C((*؈7+shTOdpLVq|~B5_|Y`3>]3lTe͞j][KW fii<!FH@o#?L2cMslpɴm]G8ׇ*WV4ϱ*aToڤSb'~vT-$er^UJ8Za$"axGou'$i4vmOzoa~׎clcM-&z" cp豫) O-d`γ!/LoFX4"SZWLkuǶYa೺!3tx-UN٠-?oD~h%BK^^ZIe&=#s{kM5Qh=+0{3[;e2T&DGn1+[8?Jb蒓6rczD.znV1C#; 2Fy嚁9$gAkDkB?E)O8UC8޹8'Ҩ}`^d28Mx%ڂ'6W)_4h#NX@֮a.=X $YI.%z!ÏUsTZ)VM .Ogz2 ]sj9{=A .n܃J*QMO x_,6k~X`D k>Ji^ S"XZ0s䣗9aYߋ/JqGU!m%w jY ^Yggre,l3JH@G8ajʹI`v?(VlL Wk3CFaV9)Ʌ}LWpN7 cԯQe*7ҎHa~{'/X+O,/Dq"?@gI?ߨ=M¿Ƣز[+ P0%c."}X잕w`n0 ؇I2t%d`RJ[?HI^oM=N\K g{lpY0 (6X\~L2 :-tZ &y ,H\J1O1T : E.R?RB1 7dy8J"P0@򌜮H$y$dY U4#rMb1 }{{an0}k;A3Oq$^vM@&˜^AI0XQ}`i$9CgW" 1Ѕ8 s_?ZKA҄& eDHίha*4iHaED_|IIN]҂'ăO .#[a QdUjv5, 81ˊ9 Z_P-9M%fNצܤ.z*ό 5_̽ڵĘ"ed^4Cj >(RIM xGcSJ(YFMgm_Q.SmN+>m,Zd[8BybmTuK} $F6hpXp(oi&, Řg\Ho$٣;u`)5[@h;xuKcg smӅFH nu[ȯF%A!F1w{\4+¿~ʦ{iEX}2VA{QS[Z?p`ra  +8-V`wr_;krc;fpd0l{_;B)9V?:*Xsef ORqmm|bv*.O·J~"YpV=ʤT nMP &J^#ezF,82SGd22n|lh [^(c;q0Ao0إv($;ˈ=}ak}/"S#-Lp=ˊ;Idyq@%i«// #'mm[I'L OS&ia&0⫐|?ˋ"I|MC%:_y XEy-%n +|AKJ,ϡ[y$,n R+3<gI?g yQ"$%n0$0:I"C! x@rq9 /ꂼ0=Y}H,G+E} ..م8 EfQaF/.%syW " D `- <#ge|3Hc&sd˵#U^fIVIzs;rW&۸+nON0ݢX$ӆ/dOq2XްҔ BFo+/ MUTD5d=fw244,%SYˈjtR9E# 6N٧IjixiHbHIpv\"l@a2q&`j[ЦLOd &'*5XkD=l512a!44YU|NOgfd B:'OҌY$1}{NN MR̖HIPɠI_c~gyS5A֌@0_:DyLS$JŖ@ň2@.j󤒉dG,6$iiL 0jD4CZ"mLOrjip*uZTɓo;̏ XJ8SZLBI quL逳Up$Ue fDH֣g"eR46x\DctZИmZV7P&941 VKAjMQӒ#t&}#[@%o2E;8k'3O;[zW2TvدPJ pAȌd~J R8hji~"T2֩4DǡAYY$)Z LZNR6EPjVBF"mLYd&oCЈ G"yJPSsF\"ɰW3jRk6YR<~oSR( rY8~YW+5"IJK+5u"ILO9mLDt)(pu G;H !IFshS@e4<EZHVR"uԞf%۴9h34%2R4]x/fc>'0s;w70`ML=YQ$kɽaL{9_FG?QBeI`}(SN:\DJhiliJse*ijb9䰖Ni]DrݞoВpH!֫8V54l CɶiVՎ,lX:Wt #B=%RG;Hc8$,(ghwӑgKHD1ꊺF&P_JZlaHcGZ V Pdi?UKG*u^oZFHcKڋ&Um$)cUq J{ {'1Lr6:)g+YdmaR.7^o,複ßHPTN/j}Q(E\;^U^ ;=W]wKqw+|偯<"q_e`uoEVL]`Gث;$b j/FeקիN^]MF bzrU+^mɭW֫-\L ЍKzEǥ׫%D$,#tS/| &1ĀIlxn!BϬgQhm jIz%N|N7NY h 1TUf*+E1 2XlzJSe|Zgq HZ u@.%UeBG>Aϯ։g#T-&4dܛ)"fHMV։ƶ CģMT2Ns!!#$1y!z$Te$đHBx/JAg_SiFU:3E18_@1sέ*qL$$3pTR[UNH{Qc&&pZ/T, EibP aI$l$cF$Ϟ+p:.+˴]0:%o?U!L0?%&(ZG acon μp*btұoBmhuv| Ӻh+MBiB(ʆ7MVPM*h $4ZȤfP˸ӛv&'^.Of"rbM!cMڀd/\c@H"pHEBJlj`$$b@*"םf P:ҌkBL15CRP?YR mN Ѣ-aw*$&Ar4n!1Q-@VJ;ir92P+}f_YZ.T6M_*`&!~xԞsM+zGH=ɭ8IA-`㈼N@ V1qx["c1̌;rd<-V^#暸QڗlV1d8%%iZցP% w8De-88!09 jW:Y&<k `סt1 (:4)/ E+nCWM,<ͧe$1$˶\fØ (&@1HT.EFԃgJ$U1"(Ui_=T6:Os>̐Z 2$iq ʓTBi%G6/!9 /A'RL$] wH7I\TEa|mMB8m&mt\IzLKq<˄ ZrA̋@ZΎ5tJBCÚgW6U[7Y6rjI)n<ݩUivI;6`#: B )ܽaTa4q;SSCǯE U^*ku y(vFrvpX_Qh% m| :9x6TFJEc5Eiy򑕶,WQ1쑥$-%~Ao1 yF D ijړ˜ud'% ]MZ[Ԗ7$ I}E?._yIӒԯ>-_yIӒԯs$ѕ=}4>>I?Ȩ%7e?W-_EOJ8;PdNFGsz'^kӁ0SNXJƲ;meWz]9\O>IPz'A1GYmZ=pǯwu~Ŭv ߨ#v$ΑXoO9w5Q%b){ p?ݏ܏i}jb3: Xհ70'ś7# |7n}?ӅzĽoO:G~7B@Xsݵ}ew\ l!v^]K:Ŋq?ӍMD%κ k6#P؁$mFdFKh"SW~>Y%IO"e ,y7Μ(.sQKU;LZ>fV t$v d:ETNj]y8LBMX n96 !+&v`+?\C&25'A$3:PqflZeU`0Mu+G)6'@eTM@Wĩ;JOLL[gPyX6E`1csg_JcG܏7M~<?x3<ML7ݏ_|'~)"qiy Ի_x1&s/|im[4m3n7y[x3k ⰺओG|wǵҸf/ y}WqNJ?V"HF쾻αnB}BvK/؏`d TB43p)2i$N]euMFcR(9*]:mX2UV2}doZl$R4DVmͺg"&#XM/mHSw:e&2"⩠'ih[i^3ƙHPU"&lg`ŜnLg#ҘR8Hme" 5{L)b%Iޣh:THQ)Z?3<_RXg':-U1 ֡VA!@ʶNh-8 |{Hǹ"0A3H7U /2'&o}p?g9tå=7\C;/^ ]O~]'q|x*~%>݁X$bSWe~THK_כyJ^Ho=a,9l[f@ؼ[>9lgs-sAz;aZ?ĺA|Zf`G5,hunmm=jK<;AڧjQcu=B{.׭ nՖ j k1Z=hw;+\!d>LQ \hΖO+XfZ$j9OGf&MPCV0I-vjhdpUun3aO=w YV:4Bkcisz&rRYB;k UQeVhTOЮ.! \͖m-ٛul2/Ðs_&ږmWj+go8ۦ㲀3v˲Q9dIi">L`i2qZM2ʹRIQVaj&^0MVRk$ %$rIvz^ȗ8^ĭ5 % s㭀MתB֢.#lOҘVYząC:&<[KbA@Bj6Z5B¹ATuk+1aub}$*:V *(haaw9Ԣ,t]\h>–DN$:7 &u*OP)$&42l3nh*YE6t peԶk@`!,AxW"x6*nfDqmr&†JGxrU) I,Scg*`KlwDmYݶrn+e>1pN+뚇+Ճ2 ?}nڶ_e5{#:߾'^j2"1b+<:'o$ MTGW:!v˙UJde(vjOBInDUwHWCLra p&:1*'TDeZh:hIpP11E/*"IJ p1U8>™x#t~!?;ˇȅΫG8cU4x_Ҧhc NàJ.t$aBVDJ T Ј)k$ڱ5tylĞhR S2pE78=&mwo,+njbRF$4by!Q-I֥CdMʔEx&P1H'kI^ ֿrY^xF^oʛ7U6cÃX"Tit*Z*npOm*vW5_νq/5X/_>eէcP~ƯV9X/vU?4OZ_̗~|%?Kٴ,GYC "1˷ȿ PBw l ?}0 m.]3]n7숉fw?0{<>Enq +b#x20uCg \9g.^E ;;Z7nYXz}2;Kkv70l͹ ]^-/ΏcִO^\QE h%Xn=6ȯ89+}B;zahսc5!lCGO)w-G #D^'s`=Voy<^"Ɨ_'!=bPm4g8Fs9a'O|Cw 7Y<v;1m=fwz\7nG'oƣ -/v؜M|N,޳%$&3]&uYlҷx]E/B+Y\~%_s /L^aGv?n[﹙sϧ\ fL[~?x}.9gǧ'2LA.ӌ8|\o|oX#}^oɫ;__DDM+{FtWWlh<)jy>㉷*>xR._h=F7vG>~XT?b~ G#:g#ES!y^2 $.&jh{s=vvyP1~FhWj+z7-% Ώ>^ G5+q<Ԙt-oz$V-E]ӟrh87F}`q.(z j8"=s,63m]ݐ`w\; 0W`}B|׾q(Mo罢]itaP0d̥ӳ>۩:{_.7'ki6yDٓ7qO;?E`Y'uXthB%_D콽p;ַT֕ vIWe(yVs;Wf_J̮lOf6b6j~wE^ DFWq;njh8<[s$]4%BwH~b{kO+$r7r%gTv$ =ДL#Y@g'4wt-^ќ~GȫVw5;qQܳCGcڙ<XA\c258v+H8T3~#"-JsNYr$°UyUArVKm$Ax_DU7k/?tΐ^ B3Bh{:!xבO$&r;UbÄ0+>?|p'q oG^pB.Dc7|sه@YèDC C{ نܞZz}L1/^\ܬC`_`qtp_S~Äs7~XO8W-d@z"^4u ;ܸ CpX0ϕזv~t磽Bv8.X\~\bOJ$q[܍-vwC]o)̺'OUe}xX쐈eMOʯ/^,8,+Ђy_9jjĔ8i$NA? n W4f;J{E)Gr =yH&#`) Ŀ/{~s;= o8\kX^K}yBR >]qJbdUh I]P^d,.+M AT8KSEe&4= 1#F{K/le<3fjx&b\&>NhcgA.򊇦kq{d=|ɷNq7ǯ7 ۃpDW4o/x"1/[xɚ0l/V #߷ˮ;s`o 0c86?{u|cM=u*=l!7!ԖGܛ q7y"_=C|kE>tH2dQ!&g#[:m#Sxkh(O 94Hh%m3Lg 3FU?>L26c*LOωkJS*Kcs,}] gFp 9 Q\Q<Ks|m $ټof}k7~#tNζ:Y!E5"q8McЧڥLYら?~ ]RM2 vR^iE6uS[~>jM;$s>N("!~$Nٗ[y% }wR8CvzğULJF1Yeß_!_Ql$ÐejQƵ#epH,n}/K^V%Mnp[6ǡFlD6MU%nhgYEJZs"7fYVYGm\.54Ji=9,i-]Jz|D,9KflDF_ yv-4EH<ۆȥi-ҹzB9]ٞ)B4ܘu(砖5;~`X>ՙ&R&_4bVeLauhǔrުidkǏx]HlƎ!I?l~.̅m B`7~aq'л!%#aPq<֩dd5{K:UB.x~jey&kﶾN D(B!aIZvZ'a(A4 ΚZ9U ]gTۍIKR2n}x"L*URҖ_gacRDU ao +y#N 鈘.RHfDNfc}TNKZ'\R+o*kWH].? L0 ⒦sH?r3cTl\֑?0"0@4ܾ&RX Bma1Pkm1U"ƺ%!aTҩI5QpbQKYk_EbNֵm4v:|&G\ƒST2|Ro^󄺸RCư&^O3U.*AF7N)‘cD8Ʈ0]-:S8@2ĔS \Xk_$CvJ%acbH@-Mdgҕu?aWTa 4ˆ]_WF4+:?\36CO3,pB=&FmdAt!hl%UU.kNgQf`AE ydOv oVxyebes dyoDʈԥ7,^.iv/El =%fbKRq˸vfnʐAg4bZT61û v䶔ۥ;[?aU?-ask?k @H^Y6 !@w~"u!EF;o>{3Y-?^.N˦u^=wRk|wr<91hfl%(p_=;g2V7O:AۈÅuE]F->^@8G7PK6u;}t. GXqCM[1Xu#ל6PZn44x&#Ԓ`M5F.cm"A oHn?/oVՉsә j6^aLY~xˍm_ɶWs~q{ro x0f9 DekfD=@MJ %(= )1׵&"hwF˓PNٯ{_PA6HѶGoNNo_?օ .mȂ-w Ɂy],wg=-4]٥]zv{3.<$P0]'ԩrg.t.ܥ|KuYly_emS84)tUE n1͙#sz. |ەhwRqb {∺o&hԹ{'AW_0J>:r]zVbg'j~*9k;0ɥde/2ycУAXã6Hx45hu ]=Bӓx?rD;`;|gP Cw1_7Wx8(5fp$$ٻD.G>pABQCHSgqD}L|Vv xHGwCW\T 7o=0=ܻ3s^ccc)|lK(;';pǖ&7rDҥ^C^V8u.qW;l:hoRU`5󍟛/Zrq+a֊Ybi\I9TSvOyS=F^f2SW_ #t=?p\Jy|'D#R m뷶oho/82=6p19z醸!+;2U<#U7kfkfk]}(O\JN6˃+t#>C}xᒯDl1`T|??-htBItIە4O4]ItIݕT;KٚnC'%h޽ղ)rX?8ړ3ijas +X?ƴmOo;q% hi1YI^.qϣÖ˼o17 e/쿍17e?Ho7glQ[g}{&_G 8V7~xGDNO9ީ@7d,1-1>Ac2j`谳} <%e>w玎U:ZM&?Z|΄q,õWςժ7>V'lz{<;47=d͛,KU/oK޼NB8!> #ooi>=B8]eaٽͭqo{Kミ4a^7o%lyܛvoƽO&{ E`5ӆ 8huЁ޻uS7-- c 7t@1bRUɩtvb ‡.H>Iȉ_#v>`I{1ވ8ȑ jEq/֊9ث3$rz$adGѻ8ڝE}>xN|Ե6uO/.7Bt`Ոhp\"v4C}[s\an|p~{Yy7K6V&>= h28.1aiןP9`O"4˓@ aD}F$(L5u ,{2na@E/Yje"K*ЁE4=H(#@`b dqY]0f@dO52@F/=Y.IZƙo1a@dXئ%<< tW2]#52t^ngk9[ٛwǃD_CP Έ=oXm0B8ˆ;>ȩJ`nTZ)z(h43ks1>8{!"FwPC.ī;DcP"LW7 d"7~jYss u]!088qTb҇H_+bSq،id3h >?.Ex ܈P@s.Q\ nj9eu's?pWv\TOz:: F]{71 _Mh LEx/w+V0.m_n;|4z9o0Sb(/M"`ͻZ\MV~pӡ>e9\YKē՝TDZ-rP7e+>E񘪵}`ŋNw q :M8;ϫXw:;| 4ѓzߏ?? ߶P:W|u,a m3aJ~Tg8rOY4k 5zBQ|ΗP3k@ʊ!O{kA%^21D4n9 WlD<4FWh&VH2V*>YAߝ̑yP^#D:q4`x:__tBZpߵ}YxEhdOWA[@LiC8`G xxөLVO*8UhPɁJcK;qiWS'f] ?AD2Nl'ULD+'UV,{[k2oSwUEҪn:&Ae>^&𵉇hc$S8J=3 9G"\[m]٬TT6R:R!i Bϑ8==gP얭]vS vc$ȷ:T<1X\SxKz0}%hrܢA{b7 sCin#C`Y_g4ҎsيRt?t'.L>~="]^Z' $7eϖ)~~@d&(/;yk5QQ6PX¸+fF]@W1EC o[G,Vdb5Ns^=ص\#Z;s|_hbNe9&:f7 Ԡ+$MN.GP9F 8a!CIT;9?-oS'?ṡ|ȉM9-O]@]ذo" !D}Hc߄kZĈn xݣ.D87G4w"{jd(eԊSXS-veZqo"X3AКؒf5(U Y4V*.\omBT &T@[Qh8v[n8 _QMwoC`%EpJVAPAS7*P? -8,gk# =QŹL !$NqJvhʘAy<|D8s)@+J +PfŇ龽9KO2Z$!Rqe"x.RvHtF||]~N|] cuaNFlq9~}+s:TbS[V{kո8fBFG!:Ǫ%~ƨ8ˆ4E'I yHYI@GGUPۺm!cuCUU՝;DM#LR1(PAҠHkIڪj ]Ðq\>O¸=<32w~閥7ۺfCٻنz?6 гMt4t;ۄRoMhhO2ʜml }OpL@f0kAs{[M&@.SF?F:_}5:;r:6 C˨îW]*iQK<tnBT24p0ʛ` IWRv%RR*+F F ,6p%]ՌJf*'AoЭa'zzn~xfpZipaՃ2m9Ȫ;V>~zHB|WsŤc|WQ-H.kEҦ7o3smcUC UV!l6.d1}-T~!3gojtuh?w֛9Ϧp·uPhTl*" Wӏ8q7jn+>㊻@ @ QۄjgЧ'"m\_ +(A¶c$~ Zĺ hi@퐑'Lm19Qډ B3:|Ϙo#yF5i764n!w`t?_ndځ>z|UƹBU{gG;BO&PGh_wn {sa} AI Q(L;>n>~qyA'[ڹ:V-7]~w=CRCl\b?':]ːG\Ct1~QO[0k> ϏQ,ZݜBwO WܞwzhPjz>v<83!5Jli¸'3N^}2WuMu|d点E }g=4o'_7+wkN+B w~ӯf!PW]Ϻ5x5aN5dWp\ q{- ar`]*2<_Zcjny;]?ҴU^ڜO4ܢ| P_ZS$ʻLtSÔPLZl!:-Ӕ)d lc1uݻ}G٣8ݔaI@4:G;iÖώBawn4 {ds8o׮_wU{}0ׯrfڗ Ë|<t8%.qr z5쬠ew:4X >x 4|8f{,OQwx1zG&]nxG_䖊f9*9˯{]ԲmJF~=d6#g`ևΩp=H Ҿcu=?[[GfSsiCP%[W_ 6hf{y^v|pt=<\G~bvo ȋe~tfqyq&bklOxP`t'%޲:I~q3_:F#gaˤRl2{y]w`xSة+#*XmHnHvc~>t[  } 18b,xrGʈI`2 JEz@:~cDpF],۸61ޝ$kZ\%6ZT.X͢g'l+G&=vS[syQ.{IicY 2qs6*T46|W:72Su7/e!UymRmcpQΜp"T\oi$#iAņn G5U9]ȦIݘjY*ػn^ 6+s8ˆURn|EbqV.ֹbdCpʤ.jL !$],rDžOBRrVu4_!)P\EÿMQ*)o~*ϐcŚRTm3h8NH4Gi*:WvI̴pu[jӒg$r*EZ bdzuӴ ʒyR<϶ _Fʫ:0umbN{u$/s~FϮ-WOU6ke_(ss{}3sOq>>z/kbKuYzrhCtqM+i." ]gr:?80cЪ=rS`ܖA'o~= idžoGO%$Y3E|Jt-aC22e" 2Y_ʈtˌ!:fS3z+ޗ7q$=G4ڲCg&!;@!6@H_27:2 u:lF%VqGsxtPE#|U CߏG9lv(pM1" vZa+Y8w6 0d-{"!6|db.޵iBNt;UDm6m#ru(QfiZ<Ăef@S]B6+?EG#o94zF1R2zMk?er1KJ:=C!@I'aapLrZ&OX =8a'&yl&fٙ[EBV2Ho.2E3P=kS.ͫJk\K YUgҼ>UBw`i@ǡD"vu|e ݨ|*GqZo ,iǟGe׋$W\nu-<("*Ur >4hRrpĩ4 F^l1! 3„%?wqTVw[#7"c8h:o]"3P<7aH j-b_lp`\@" :F} nn;GuQǷ=&#sX1v_`%HpYfYrIȒ 9rfz WhsZY R#3[7oZ`=-dKRi-lk ŦgFKop;2CP~Kw._KCug.bNGIg {(0Z ?s8qr*9ZYP==y9E!(m CZrF 1!Ap|ɗ:2L=mpf{M 1d;g3$L1]*;gdSKrbZljI ͬ _ og׽|܋z&.'+ wXB Dm✜hPK);)zE$jRϷIO+450PeY!'!kGNlMt8U~6|ӼըǜtQ'; Pڔu'Xo&.꽉**7P8*;!RFެ7K꛵0?ˏQelW?_eG}#ok%/)~`K<ݝ E)Z L sRb˞PHJ_E7}>/Diu-suum`,/xs@Ut?oޙw"E}>{#c;rCQv8_C&UJK嫅x+NuV?&Bi5{*xE_yS=)R^[= = e{Fury<;_"T_'gKʩ|5a$S.QTY:i@Tzx+Е T+ms 0D*~h25t-1:x+YnwV~|KI5+y2Kb *Jg΄q/rAy[Tß&'&Lɗ̿Yj@ ‰+UftڟrZ5$F-#lPɒ|(<Z54JXvy8K1 t90!X+ )gC< tuEj3&n8V83\UV1d΋r PW P`ӰbR)4oe Y/A1 Ì;ܸgY ve(a38XW''Sⳮtr#FIF=&1U9q,IP1]Mo[@#.e㥝9a| xDEnREDTPKx̍PL:\֪SJD(:e08*2?H= !4-I/+#?1**CؗjПL$*0%FD#93_W9yŝ#Yq `Ûv|F&Nj!vsJ)S/]u`U}7kʛ{):'nA{pU>y;2xQ/s`|SЩ,d{= =Ǔ0noɜ`|fn J]4PĔV*h 7Ģ[AKl.5GO,n \m>/^\/|zC4 yg jpW r07yt"G}3&6 Bf0X_L-#~QXO3MvLL$E|JZ zhkC+k&bЀ5VKzű%, oքatJ*%C,1,4aX!X\c/0/O״?IEC !Qf gW$,̨Ff?vĜM3n,3I39<.|`k0vW Ltƙ2Ќz!!fy f6B;k'ǃy<0.7S7Z*RVXfh3J=dY3dBa%l3 ϯsSa-pr7%9 m+hJ_~h"к;:ea˟تoL QjvskZj꥝nurtg@yۜT^E%^QWW|d7Y4|Pur~e*Jϔ3CbVp컃)wҟ@űt5-d^}jj{K Vv"SP]\jrҮS~{pp`lڡh%gw f26NlAUrw* 3O24*[#r3=r`ͨ4ƐE M$IIfhq:Yk$~t#cHTj5\_nم9ٓ2/Ke'*,.w<Ę&}f Mz_v߾;ޱl^,($v? Y8IƈIt=qO.9􉟔'FN8%jvy0| 1\?y q.182fo Bg@kJ; 7;Ǘ;fyȖv!'1/+} Ņbpl߆*-;&Ķ`kUIZP-)jePflƅV?)9-p㟔ǧԲ4t5;%L'4*KO\4P\'F`F䑎/v?Ή- cՅD;ä 4Hh tgwOXC8U@L YY+!wov`|rM0 f9fhyPc^%uzI͂'|`3wTHC=Ԯ߿$6#}'Yzfg/8sExJAPRncsYNl; ,>J}]8Xӓd3f.]p U%^<._Y d4d6E)PEPƫdlL2Ke]w6敦_uS#Y. tZjpS>-t;D إsB+t H9u'UVQxe*@?BIJ3Wg婽m9@`kTp_g+FC!F)^9j6JZ5@`-n*ۿ yPgaCyEɶeW)?K*A޻9S}ӡ!Zrf A猊F j rf ƜL0\8{8B娇0_aS`Q@xXreKI\:pQ[31O/\=n͌ ZsMDvF3TLLr4%Xg܌a⽲kܽ7αBtlR]F !rEjN95PkpPgaF,=a&6GVdAm+#OY^%λ+x99F;uO u\D-UCu Ϣ`g$sxW^/#uCL_ujYa6#`=1l˦*:h6*b<vG6şz [@']6TVkeG!TCL/MܲBosbv}J^o&b)x<h4J$Ife2}aM=)9gh# 9ji'bh=JRJ,r 6+\VBFY4⺥O۴wkǿ؛t}_| IW}%ؠ .`Z =oxW X{NV_MWMr+뽮kz մc$!#w˻]Eᙽ }$8>Ɍ`ZwLr bYv}Go^R OIO ջx&0$+%(1?D/b ֋> ϓlf';yVbH<b%%/Jn(7xTNGnZ+kd|ue'%I/1xHLEN/ur2.͆Yd)ѾΟX @ k^> @@ޞzf_ݓu^y' ,Q6 ֿl mwESPjos/vrWkV䢮u9j_cQ{d?>=7ugWS2 $p8/=@DT|iNu;Aɒhr3$cğ;?*cQt~{&[u)!٠K/A#R@|y %;1ۑ9~*,z_;҈T/u5g/#-}U30rao.i 1fMmp,ڍNw0S-0-&Z7GՄtեG_=ūDU9SELwn+q-]#f'ڜ@wI0$!Ph7L057B'ݱv3q٥=[{AW67ݛ?;m[ w`{Ahq; QD]Պ"?Iڿ{ CVwpg&|( B:NTk8m3tAw[M@t.5Њ$_tw8LAubfAjR)&׭T{ԻF ֏DP9elзܱ%QPAj5l%٠𹄴=jZ^Pÿ!M7Z|>NG (Q?jܒAJjiv Q:xJ|;ypti‡z!!y#4iR 68ޕgk7C)DG@fggEthEjצn~l/CBZY³$Yxb9~-jp:>ep◧i]Ԩ'3KNu]DPfNusFOLzbge\tfְ͔HB"_`lX? ]4 '*:3NEcg\-ZTĵرH%30 "<eFS`b7"#+5  xdGw Lg]T֑jͼ1̒fD9]qzXierd:` 49Sqпe_O%3gKH[@Z*v~.^#>e崑4<.Z \D7am˙ΒS ``gc1z{][ÖȒ Z|_S xy'9ԂuT=6f}o0sqT@P/9Y "DuKVoxtiN /$ {VC_T^D76f7W%tsa@n q^\8\<#|G2H_rM9KD᧿@e8k`eI +[/+iMV;}EX0yFToG XuKo'w+ K;Xy p](Z\BG@k^C}ay u(B\aV@hG-7WUֳW)bTE yWࢽVußɩ*^X?9Sэ\tCE;R$i:a"i S_TM5Gv%5%ebR.ÌH>\ZyM֥8-5Xsz8 #4XE lOS60 d|AXM[ 0o 7oP5 XT-{>-Oz ,;.*+Srha6@lٵIgsrlX[]w#ĺ2zl7;rR]Su+f,U % ܼ9;SEqވe ilJnk^ =Nï_Ak40<7(|Ě@I3LNp #Ŕ(Xb!FRoސ\VQTL-`AVׯyMD~ډ2A+eh;+r,F^饆/b H|]&1kl)6;u r)u.-Ix`C8ip_HHLo~V\(RNifؿ<*,<>N:VLJ V8~8u{ ^s:u urgàU2U!sSثx}.2=6H^zцF)`aq)f2˺f{et^]%P$ q ƍLʀ0:+H^*u0eBok:/Z+O9,m*v>40cHF- ̽+"Y*5v]Z:{T ]1:d<4Ylv./csԊ } 0Mlܐc ^93tdd5J^=MV|Mxƈdd4*ƒ(S;w2ȇM5k_5×}'=gK:>>T1[Fӻ!|zIq{@)2X`&"O@ `RI,^c&uWh昀ڗ gz Z41C-'XP *~|-H~:\Zha6ǀS|-+]=(R|W+J s.#Jl:P~JgY\zjXnle^2H^]L>ьͯE/ajG3)m˼#{.sW&'t@}k~ ^Gb<l|QKGgDnDZO(.r.K씡uqvX 8؃tyG}qG}q>!5O8 ?)/A'^طxAݍfFÍ_\ % Z> kWSb|a//WY׫%_/b8C9oo6rGr t*wrwV9.g4"sm\X#:/4N6Q~=Vzz A; v9k|]wÃ6{na5V5n~l 9Z|vv~K`N8 8? d F;~E rU<tpLMIW Ė_ j9.נpÞ͋{8GhpĎGhpGOײO햊Gaj=cejRBGI\~{8jw>_g_?.O d7Byq ? DDP/5h~,PYYce ex,:rh{B$ZF&NE&8AP`Zmog=`$n#,1 G@`Z \nDL7썝gV # 1!ǞߐelEzP|ܐ}$cEr9?X''5q^n*5`Lػ}<<7֭T؞udnԺx@?s.a,a#̓T7R'XdvCZDQ݄/qe#k6lhr܃"&wxE~FhB(h{>l{QNBONՂ+-*> V$(W;R{ 56W-I vY. vwI9ɟMaiZ}-45[N3.IAXQm~@*!&uI|aB< Gn(B3M6i:\qj> ;qLӦUvLւ={p=3Q;2c~:"̈h;WwÝ6vs#~q\tA@v3g9yA!eÐxqFXKyX7/>i'n5 1@W, ?-r<3af؁aE@NP!M}gB}93s #ԼIU~\\ͅ.Y,~dzL20 \OD*e 5PąPç_Aba4V֤F?љ'W4$Dw[D/3{K4|~0f\Wb.Hzji#G8?*CuG=شlVj,1'ALMW^J|[~ww@}ZFX̼3 @^{wA5+(~^PF\]OϨc?##HẍSO-\울M- x;GD5wmrvuG~E+qតF>eSꩇGd6<szV *_?XPD wϸ Mǣ{́mPB%xz'4;$UNn.mY9f۴/=ر\ڀppz8U ē^08"o</1/H|ӫ{IrֿMl HvUf.{H~3dr>Eշzeo}0i-CGuTj,0/cDo 1odh Sӱ% {EjnΚ;N% LG`_ifdT!Q̸BnwF. ֮&n6I84I>MmNnEj4Pf9%67~VRͻ5]iO\p~VrJ:CQm8;R6  YJP) PĹjmLގD]>M`җxB#z6 ]6e^ -<Ib6p8a rBǂ|0'$t]4tN#! `̣m]?VVJ~!V }h=wƒFЯVv\*|apП5XӜ}i~8~շf&ZaT&}߮$~4k=*pbCTrKtJI7ܘ˷X0= dCo[ɵ(clK 95+4ry܍M@mi(5kcbl&LW}fNVze$Ypb[nd!Ҍ ``咯A#kgLs>UJxc IӪh-𛩐^ ׳bP2[5pEr]9\UpVݘL}gggxB榄a˪g*iW, 7W 2I@9g|Ъ&y3ib@9J+m}lS['s6'+p}vyVO:BT$, F-3OM$>"bJ'̫`Y.+(HG"0ejQfrIRiqiw5w!?g3sDk93S#nPS/S:~53<6~3mVL25Ъh5[ZZGeT`&j=!M]\@uhd{Fn{R$Ug3| `ޖ\>:6EScYҒԚ~rO"&kR3@h4_=s괦fRF0c -Y/EX QɈ %4ɶ^ez  *֠=5ƒ_Mڗ|p#?˗|'Ue\0Vrcq8\A2ʩY6@K {V#c0|Qգ;Lv敕VH=c*U|}c{Uri9xg"vIl$R`A8F g"IE"Ms:vëe[>eNoЁ%K;g6Ws)N_.Od?+ tK0-%3N9m<|Jj^ m2>~'=3VW&Isls#x8Z9\"2o$-ֆ@WZ ]L/3/旈Rw%5ybA `|€0Z'EU%"޳߾@f;D.5:Y|\=0ݺO${kȡ́Nگ[1$6 Nl/?n|8*,ft|B8/4#./ś6ۣG_Ki~<`77t>2ţ`yȄkroCɒ<؃ɤ tрtY7lX7a]&3:ş6tDE- \Smx97/@"څa)-2cʁnN_NM*4EG~g2a& ye\ej(vIr4EAdKRV-4ƻuk4?Ysr6s]1Qh4+ohc'cS)x:QA"-)TE~ɎB;4({[DdF d ~~يw7 u'B[~7~D cOD`mrJ`)y0рB1 dDƠQJ T"89 Ը/ƴaev$3Pd 0.Bdїbe00 GicHPDp8\R|$2JQ&2pa j Ĉ B~Ajl5q-2 ({ 7dQ԰'[Qe%84#}k)[Kպ=t@"ZטAgI"9C<,sO0j뜚|M= 廎1 R7g'[7+HEal ۤ>Tt8O*TgjpJ k< $n_sqP[{)^OcS =>eNQ] xEZ:@%Ѭ$D]_{<(? HshI !>汄ܦnT8"..@UF=dߞb[ĹP?'0S<|u?;0l8`P%[//90 FwJ[m+Pˆ3(%Ю1ͮU{u5†m5ƒ80@dHsF #Ć >ۛEw! ^tE}o.p-,+LXT1u.) &5ۧ翙'a|QtQ?U5Ƿ#7vܨn b k4k<ڜS<L-(sP!N;eqBwe217r02X\b3K4m g3ր{_Ysnzc'胁(`po1]^YaZGoEYPq4DnE5ABAǺ٪ v1 74.8Op|@4c+i^ GVdǾTe"/_l^atWؘ>8lƜC&Ƅa3 rxz={uuz:JMѠ(3}1CH{Ir-U~nܢ]Z/<7o~=b!4|CS!*<=4֡Og+uTD9m11N#t%`.׿ΈfFwz^|rO X:97?W+:&x6iKVՎt͓*JVmv>i?oGV&|㿤J W",IsR|S<_ g1 SEM"azW$"5GbqZ xX_Hy|5 Q|dĴwMtU|Dt 2<f.QZVauc*(rԲ Rt ^yqRsT,:A\$zB+*Xq“`=pۘ}%/9F"|_>3)qs sJ)S.;P%:VM t$0ew^[Y e4'@Q#C":=p< h-2psEZ\M.hʶbO\6Ô FޤNu_KHF׫Z)#eA7xJrܡC b6xBʣC1Zd,y6^؍YdG4U²,E:zucNJDzRcD-"-:NRW9UmmJV{,n㼀ܮ*Qj)J E[?K6`tWIm9@Ȫfze2c^s+{OoiL$Gm:/F%O#MDy$C4顮l,q_FeӲ}3*2/!CRzSqPR6DY]'˛wW+T92TQ`~ulP@h,@" a`]y\CPR<]yޠ61PwBPZф ί 7Q\yp,0T;n2̶LSeTM<Ѭ)NGR0gױo᫂N-1Ӌ#Wwd**XmAGcgDXkY N(&"]3y:H9+: '@(up69?%7lѣM [}$ QS ʗhWE*U#$~G6NO9dٚ8ntb/ P, x<l'7BdJU@,н6+EoWW"YH GMV!%1h~.L2}wa2r/eM$)@u/B8*.W|ȇ*!~Lu553dY )aS '~ t<)` ΓDK CH[,MX KxT10T M"F>)LiC(Ջi>%1$ӣ sݘ0bZ5QqL5=`$"I rA S h/e q (0 Pd $%HZYHD3rXQ˙PT,0L(K` ,`'NHCQ%0@'eʫAsj@S:r8,x C,/KЉ`(@QSHs͑Ç֒eqAzHa)>=rKX'2 a1( ߃NL@G|X`" OYVHCF!#AȾ*cVA<"A.3@2fHdŐ 4 9,qe i}*pҪL  ,G`< R?}x>xCϦ R6MHQ3FM>Jj fe60` ORr ĸ'F 4@ċK; $UrQB7HEL C^֧x+L@k%)Ƞ *0J&k'i( S@އ&=e=5D 2 h]R(0@kaVђG)%fB PS 39/#bUѣ%v4JHQȍ0UH+zڴ%9#(IE+c&PUJ7g4""S#xMQB#_+y"'=&$oc`"U0o h1'%: X7b9PdU-ekq0냄Ն8)Făt4, &Ay+TT=(рA$+ y"} H 7Ql &ozzj ˓])a] Aͻq(0w քn= ./~`ħpb/N0v/n" τz[{w=Zp-MiA2vˮ%Y2%Y:dLfId+/DꖜUܮ |u>:8u>`]WξKξt/O'XWU+ @w-h 9E ƭ_t{q[^v2d0 <='9[٩/ch,Z)(4׵vyD7v6Ku+ . k//(9XRߤtF [%忝j7]<އn߀3C~Mz[u}vxɠ!Ʊ2ܲ#LJrE⯁w5/$۫'0ko8v15kK^);)[(O  ퟽PhLgY2>n`I];4xȨ[Kv݂Ц^nglqd{}N~) ^oo?o< ]@MDEh@_`qv~7^ކpo)4Gu+8CQ ,g`w[ 𶁁њw 2H_1P6L~&&<+ U0׵y١cm#YX2ױZdt1xe/[zUF:xyQ'ib>9xk[LԾWԓ/Sck,!֢p3dA}dt҈l1CTPllAYYg4@u@MxZQQ駗 iP!lQJг#ɶ9BU<{\WgK{Qƫ,S(:.lX )] d"@Ca s0C8 t5-6d|R71`4q((0v7&0cŖ=fjhƋJF~.v`N;8Qs@$'kqg-q ֋&&V(;>)o?$\#RMyL}IvOgP]T7׻ KH٘Vf~i4kFBQ2EΈCw†ħ͆Zxx4}p}ŏ|TPH:nmb6yF<֣HNdXREvbn%꼡~5Q5oQ\Gl w`ʼnv{ #9n@f~0i0-ۮ9Ⱦ-*n*m5J,1D{rQ޳hbL)|9 {C]u÷G{4 5PP{b7.:kxZjgmE;#*lwtT%% 2fLt6HV 4C/UI 5^&q9;%4/iN󋟁SHhxQEAKrRp4aTtFkWqDoC1,b4ITe/([tecv[!_&Bwˬ2iOȞd9>ۊ9KEE'E^&Z2d^o f04Zb*kb0"Adn6 %eI%T2&+Vc"d#Qb5Ih~Dmi[痭ik՚麵@<^xZ/Ob P  6RARMt-HrN*}0@ :k9\^uˋhCЛY *# ? ,0tVG`x<=W\Ԛ xDJ|QMNKVIQAb9im|T刵fX pi:%ԽB" `]:»gb䢆:>y݀h"  wB/ OBj:3ZL.$ȣyXq[n"cb`#f%Qq3/ YQ'ӬiTy#ڠsAU3AzKG98[lfs\wwh~Z^ALogTZ=nr& ځc(ӷlra[V-}NKkj'!vouYC]+.7X>z2t5Zj=os?i.\}?kZzjʷcD P=҃.}_hWRnqb>(?]kx\F]Ȫ6pg /.l~w xtioE`;[q7:ѲB#:tq1痗/$?ClSAQm?'ePS/ eǮq:X: (:HG@X$Уωڼ/( w~@*=o)n|QdO3ţÜ)”|.hs;[\R ]/ X7;dťaE~FE+4st0P& tq>W Tg5/ɕKpvu6rk琷ue ""ZO{t&Joez+R3k?Xf E} okQ2CIuo||}[xK-?=lU? lmv琐5=SW? tϨ|9?_q]wU", ]7,ԛ `D0?]` (uoMEgƜaktĻm0YJL) ;lqqa; %!$ҸE|h04u,`]%YejtпN` CВnᩉ̤#HCWKFP:cb[6qlGS<0cyd Ń$}C0<4~Gx(N eU['cxv%1س+_1%~g;o$ jT ` 5/ yU5:@C12FAQ$TĘ@j8տN?Ꮦ47N:,`M#~3-b0sWWHkfC*CuC/_Lalt`Ў Xzj ogfx(7j/zݸ\^W3P(22ڝ̬pghh>Flo[aߺ V*sCaK9Ϟ?1v5 navj2$^cNxNusʟG2?N5_ QO./@e?]ƀaC-qC}uN]:Ȓ4 tB$.TIAzY1)B8Q@e])Xk|&ވl\Ƭȝqx{Zm}ey>s-s0kIFVPU* PQ]X'lWG&n]v7HIehSWx պnTGU~l} a^Ѧ:M:jfig_:U&3hXر}y9|z;%qb8M\V\ٵ]wu[v.K~diN4i /YԅWd/Ghc0:1ra*q7e"\U-T\'npN5zıή`}u&ʤ.~ϼ\5gwvU9V6OjY=>bیmѭ>5Nьu"~ΝWitUzݱQPQhќcqsla1>cXg `+ᯔ2z3mW$ΎT[\}We/uQXT.>|Lxc~÷ߘ_gb dF#eDI`OMT {S;py}mpҾ͌Pc=})I]:kc4ޕI7]mY0X嫐 ] z/kmD]6#r~'/{G"i\wk/ܱi+hDDq4nS%vƇ*QƔ1CfܨPUSb߭ܯbwU`To@Gr?m67C5͸<3pT>}i?P5WS~ %cφf(kYf yF/sC^H(,.RM6ǚ PۿVk}UڪUbj[i{mբV[jֶjkm?3gΜ9曙];pA{-;'HP2[۫x|!03؇x' ) w''!c_ G1܈l\c/􎘃fpy[^wvmAt:7id<b)jZ=z];h 7! hP0FXi 'bÍj!-}Q(kW ԐƭC DQ";n6Kh G$Q1&1P˔B$bk[LKBV`D4hIcI.4nHmv5[xfqveyTϭ[Y;oB*>okUs Y E ԆPPYv- vsИ%Ԁ?*ZSUU#wŊq݉UZnFe>|dDZ KxqHma`PU]BOc>Vo34͘^C2){oQČJHgKp]( VOwcڎ}/ Uc˪!%u,mjs\۶ICt&m"(Gѩ⪕1lc._CDƏ:<ף++8{ Y\o:/g_?ߓy'<A_ڄg^` 'KF<{dJuq[ܗ.o6_2b6 0TTUKD*q+yԴO(wߣӨƒD޼9ID*Ůe00)&= }E/"u%%%舾qD6ЌvV )ױ+΂I|O'Ph[r ph: RgMw$񳪲\o,6!jV8P7zA~ ct.<բ_J8 RteĿ}Z Dm#*Je@"iY:Zf\UFeaSKL'>h}Zټ8Л&HX\'ryziry}|jM93q895CZIoʷ;#yc3ÞA⿡#wZ];o d7G6v%9hHw4;n(lHG !]q K&HFw5UU",t[` 3C?F_n#ͮ;_ߝÌ ߃` Bd$&`: ‚4a]`tB O~޷ ӷ{?42fYUsCc4.Ib] C<.L{²j Ū+p?hfO"[Y 鐈 LBOgz !TYC2ʌ*2 B=\Qm@H̔761xRߕ% ^q+Քw1' ʷiT 693z NmȸL2yBc EQXgkP oA2&9pɑQ[,/ #,,*z-ȂA9RJ}@sSa8dWېP*E(<66P_Gol ^==fO{he/`(XT`(PXSqdȄdwtgvӃ-uk{ܹ<`UeuڪJ 0 `b^b?(q}gU c tSyp|Dž2mi 7i'3eOĵg/Z{΢p(6}_;ʀh>AAy Ѻ44nsL#R IB($`1"JzE2J{<#Q1Ak?E#~D,_.++qɧ.[txZm`C#lW|:,.Ms+WU\ׄ%=q9'z,%  H-% ʌ\TQt >ˈb.Er>_J,xpCYbf*2 q5_{-J] &b iPDPu{vt;en֕LJcw|_ގ1(7^Y4 ] 43gH֠% Ǒl8[0ʒW"?]wA/#OP5ՙeޕ?g |`8t$H7^89qN QOϱX^)E{Md\!i=2)EN84CCdM91ѤR`/j5)ї+@X FnV}} Ws=}<دSP+H)UUlU W]q4 # `T!FKjv1f<,+ۀhՆRPMһO I."X$YvƉiCZ"< iotP2ԥR!ڰdkHZpU\!Җ g뭶*.[w6Hɲ 5J.Ǵ05E9GʒC`6cS)]fߙmK+C1;B=GMT!Kڔ 7*2^ͱWWߋ^/ X{-qV25nqW2sj]a#\ol&P^Qd;r˓665P؁ zB֌_ e%Cg8YT:{RV 1+vVk:dGkgy{uԡ,=om__O~>7Omm{C{Kb}+=fWfuە)^7呼ጻpuwyE6~ O [hE"4Ӻtp (NJ=$>Υ(9ѩDW_6Id"\ϒ2W,{^R:|*݄MVJK*ΉʭKS׶ u #3.͡@P52-=`X5iV v5(dr'!$g,P38&LQO~v:wwyny0M-yKЂZ3=Õ]NǥE?hM$\"K)avX#t=Z?Hߵt&TCt0^׃W㺘(-;aKl卍]==F7>整zSLSLs*3bWac]tq4c]&cDUT?IeYƷe+\]}ecUXAM09@zsaL~}/n0(. Hٮ8LJIy62^''ǘde㓥&]цa`n:Fuf$nr&PǍzkNop3\5*yH f2$ [W'_gw DЮ尓ԕkcr2pS|ꍭ1<tbqtojNm\{ռ?.6|ڊ/[h+*gWϫTm9_YySlxB@D.SJD&$$?t  "F9G@ <*"20O_a`YVM25u5}?υJۓ&8ƒx<і!:ħ6H)& U\)"yHٳ.[ U{ML`?Č \4ܐ61GRq7-"S6q`u(P3/jb2gd{J\8f3"xHQYE5!hFDzB2x -öMiFdB*Kq=>C9' 3CC5 $w"bR1ll)"b[(5Y̙v**ƑBYKL$kI]O[4aXYV<9QH? <`&oDN6yyh7}aOAߠVcH h{WPJX`R;FzqHC{$DL":)ea=9oH@E=*LSJ6SIT ++M 1ϳQ6x2"[(@H IՂƆ n&A)xv|Sٍ)ٰ@l>Nx:j?M%&끕=c^èŎ$Yl*L<6 $؅oоvY*l1M OhɈnɈl4Ja$1WBuĄ",|9b p<1y' CW%b)Z [9Q䱏@(**nD#^(By~B\0ޚژ1}.$.uRfu˿QQlgC|d=QӶ1al]%rm˥˳\raQ LW;tlJy<=!>ȕZAhVJjjέOdѠZɑd~RVIOQf/+r`3kS JhO ()Sn^vO=gzƮ7eŧ~n`7w 9*a Ɲkǟkέzo6[D-Ùp y~ D&lą 4[%܈JPw>f3? yr@PuwZ Vt; B3ɓ@"e IAǏs$sf HcSR2'Ca'/*n֝&hc` Є€'/D O] gH$^Y.ې#B3&mzb6(vR%%UvQٶ.-)HO hDڝr(ns-7h7Hٛt{nlՠrBC3a4n:$"Hj_IпB6'IvBPhS xs=OC-0 ȓ-ÙNz< ]R:Wr EgCD_Wjϑy0f)4Jae,)q ,q )b BJ!1Jf+2}>Hy ?LEE8/tuW$ownSm)hBߺQּ͙: WOǖe4.x0+\@YEAS7ȿ.瑀LJv pBF,vo `oeK & IM(޷Ȑ5yd}7۬si۵4lp)ۈ'sMivwW#K(41E'uA.E=9Qqe}[&S`yv)Vwei;]$Yg,xNN4NnYwJPJJd;x#i\&Km)l3ܜs-QNXX3?t$)[ i?fVw4s[3wfeofvkvifK3fv+v4[kfK3]٭5nʶnc~RAq>^>YO߃| !qgY)_QBЌCDuU W;@ PY=Y=@~|0K3!VkVKVÚqfHP!^nbWK~g `4$cc!@OrOrMT ] \JT)dޔxRIi'P m|\^knڄQΟKzN˥OOϑP &ǔC' nhfQ*0ا#$C)U=x yY{٨F~ , ZPL@2x֟II,Yq _5+jV%Vyź|uubuz#K`wV4+LYY:Y#8*Vr SzGx@.C sìY2**,t\DsMl٣lr`~o/ISMN6CbJc0Oq"Rq1 ;8$j>נ!\5DM6-IM PbvJ LV)TL"JYž :q3>PP¬w"%OW6oԨQR I+о7w Ii,Nn$PXʼm)Qk4N,!>O ^0`t`)+2Y=R(8.X}*4یa^*l /9yGRŠ1z8`RM/)h1iEbL)c&VaGJ,p;. H=T dqslq{B,b/u/f5,?`a.-2_8NtWG/`#yh-Y2Oh:PWlpK+Q;t3tLV.XLUuZgJkY^g9O9˨sŘbMgyU9ːXμ=bK:X˹q0,'FH)3 ArTײ=&Y Hf!NI$!*jSV /umj βWĤA Q qTQry",j|oQ`͌8n>E| gvD2";(&7Ыth,u BAЉcZ 1jkjkK~ɩ^lKǹH-=j!^43\Yvnt.D $$XdBi$5z% c#*{,M:IM4)6XMjf5k`nNIJbxi&4p)MtR&)*SeΓ645[HDVJȆFd. z WԃDkȘ,eit\$sYsۘ17Q;¬ ʍڌ4+i`37AhM0blav>h}lqh-Kи+S*Mr(W&/hYoz}{%Xg|bT|.y$@}ŀ) P/4*Wzݎ,BQ;@ܮܮ~*CUԜlMlvr!| U]U\ao.6z&@s殑F)~))96C;F]t{i(gl8hߵTi@ֳ]+ .eq)yU翎2''@tIǎ0!">ɶ O! ʀ !|}F)H.&%_%*6gW>Cu1``.@MlR̵ހh)(.TͥW.UFt{C#!`J6ce5OpIY2:R)Pg 6! 7ʐn\kטgX+j0j[\m>GnF'B b;%r{YTZE :/X0L;ġa՗q+eVuq@^zuP 1 .+nqFSF 7Ҙ;(`АgSJ@Yޕجoypm/M)pLMs;SFŝTlq&Pdq#T +nm`r"C[kpmȒ!]/yT^u/7{|r.i+==`ĕ V[g6'10┲P-B3NYh%ygycy}T guS+xr#dN)aY>r#c>+ FGSWTKĜ1)!mAA^ݐ9TIjg^׃\#5kw"QY4>ʌboO@QlI ʼPY|T[|eQm}\w.J9٧+fڞ/.{K.^VyY[exe*]l`.V~mTL+hˢyg~CB!ɗ ,g0e:m5,JPc_LĿtS/#yipUᕻr) J!YIBwAԘD;)%|0LW,=NA- A'@nˬH4L8Z>Kd6T7Yqt+H2W+t+G,lneYŀk+DΠ%+k˵n+;VJ Iu)TLY$LqUݨ@Ѓ =`jM&NhD%]M,~' ~DB$/iy3Gl9 >`6ˉZ4[a|Y&wێsB&9pa3IVUx% q\i8,_0JzC3YRK2x泔e]L,륙4/jF)8)>0]&=.RPΎjlM;9|s)ҥW%deJI.{8eK>QA\ wVF9 ȄسKA:7nc*+*,舝:'Rp)s81EHFhDF0jnB+ |F+A6xy}*WyJͩ|.'8mбiaJAO<=k%V Kp[sj 0e=$8WIy>U{ 6g ܮ 6ǴdQ\;:f)Elʠn.?#hV0o#`&+%R\~NbCʤBPGe5" xdPy%)TyNlC)?;ׯ* Py\Z&ˑ( UmdZ2w2 Z&ӒD%G49N;:N1d9CM'è2DbGk*pFň%dNy85yFuGuJEX\`d 'S7ߏѤ&~o e?v~|f??479}_{BƷk|ph*%s's陛*ou)ܵ+|m/'hE_&7?zI|l?-?UEMW>|Ү…eƷǽOj-ĝ:/g{/?ߺ;[kgL2זl9d|p?\LmG71N /}Ww!Aɟt?ɹ){h /i>2%""E|YKDB[L2>B0؜ȡ7ZT/d+.6W4W)g&6e#BkJJ_#zIf-uL?PZ\!O"p Kçש:|zȾd\C?AEN[>,u2p3S/[gvkn v(Y6[˄8b氜$f2ب)$|>s4Q]Yr4ᬵ̂3M@zfmԴJfŸ~Ws:Nȕ5c :\Ĕs~>FT& >čjDw#&jMt)9la'欭fMR^ҖaL$S9*%[wŽR  y[e, eִYQ \μ'DLYc%(wDžDuR]$ERºN i*c>Ϗ<$ND*nI>cYE>c9 md "&p'x&DXeNiH'4Z"+!#/NEӮ L3H]36ٟJj0u\* ,%TT E8,T 7CrPaSaGZ `u+k%WVǔrU;UDբ8S-:Vܨ@\81Rʹ@#Scq.waCR]nLsE7ϡI ~MX B[ :uCTso,rHl@a`-EF 0.я|h_ TN.bF 4*ZvQBm1NYbWfH9E 6C+ ȏ#36y gY4iVc{VC&!7!UJl2rAM&tԎ$mu:f3ÊFVVdxˆ1 HϼE %M\ۇE)%GbwL9T,%>=u\)#.qtˈWjz\ )5mOB_NQ&N9>W&<hL8}O *L}xJR x%c|r-ױ|~jgɡ})3d,3ԁfr@ + VL*o~)[TlXqFf=6JxT.b8n?p:Pr&6i)T)Oޤ!OIgSTV{*o!y+Gŭn繕I>f x!쟳H $xH:܅Qiґ9[0Ow >uvIwPy<)t4>!/w0_`08|>2}ԛse* _"$Q&%F^D)"YW}LHf!P!ȴ8~9~}}mLˤKt5K%ϡ^ۆ1Y|Ǚ?&p#Tw0nH[Lyfa%H- Nє IxErcؘsc- /ޭ rh;@xbq$5<81Mˣ`T: -! 9Hz7KD  eRR2?ҭ)^cʐCNJ#׎BKoqs딩\ {dk%Q }>7(KcJ9dKf旌~ӝՎ5K ?3b zĤ@$֣:;Am"|ս>cXٖI;/v~nϵv( ʑQ :]nZµ>yH>!])rT-=f~xx{n'{X~(3TUv#n<=n#nHYZL 貎_,Wv_rxE f"\{^rV(^w%KrBGDq,. &eSD8׆o; }!:HwB6E Lcچ.Ã3O!bRL~p dvUfx6o̚0zҧ~OY(> r?<bPf?6SOi?嶨,H,DxƑ7$zy[KhڸnÌ,;#xAZFG6rEw%/ַTQ⋬=(AE  X˕UW^yʬּsu;[/.?a# —$ Ȕ"h3ͧ ن?
dztּ٪}^*m!V#t/ҌlW  xrap3.~#:knR[rF)vg\A:xJ1.l|Jd*ڣb" L Ѿ#!ywSifIp::d8~ST:ZkWmF"gMKIO :q  w "BZ ]蜥L>^BǯPY~K k֎5+hYa{ kV^([nr}A!ja^`XxϜ:螥ǧ̳1`'h }BӍ'f:R'B$&yR{8:=_J^g@~78S2|D!is BM" $*^j&YHI%i!7k$-dL< $$T G5N @@8)%sΓo7?䳓;0L}ϧ;tTΞ<[wNK),>$Nsd)3`F^AIcMOg" sKaSۀ?mS~fI~fI~z--D"aAr%Y:K:ԓg1ZTNKl45\fwK ]B~A("`?J#HoռМpStJ]{W&tn:@/4hAsDnP؝aAoohP1d'0?md#fWzuW|i̠lZDD"l-| Er2㠼D}4բcIIw5Al-[Pג)Tkl)JmT͊W :&%$d+F2c3Get~\c~:rt7_jxO$-B)72I(n8jM)%)njb@Ћ}):&Tܚwj唻fO}H؊でuTu 1?+AAMB͂Ita뭮fedJ;ҫ9|b80}wxbbxvZ;}B_svgϝ/˩@C;9,AeK<XzKWH>_s NH*=)/ܛB)iW1kpM sN!+bA!Y---_ T\XJAlT1jZ!$2"J5ARC~"s^2V䷬RAbsO Lc='?╮##YW6n p4Ly9FEb%YNsM 0%ꉔYH|bZՓ瓩 $,%p"tRLZ(J= ڢJ V}D C8c}h) q/|:Pe; <|L Xƪ|,shY2`y frO^(2]{g$r.SYMI^ QWH ٔӳϦLy6e{G^20SڹCYURL(_s)?Z0Aϧlxޯ%@-^L;HCML{Ucz583Ɨ۾CCHx:+6m&NۗqcNu`Ro!DIƉa1fwm|*Cث(Sk"%=@ۮzRo6wgud}s4m#ɴ| :q{чkQ!Z$ Vڔy;8Xv' h8d".ވT:1q_Z}cgN$Ep^OĥDPԂڐRm b bӞkVO+̭49.]ڜ“l wGg)08jj+, \_T[H>"-lԬQ70 HuH&7J$֦J Ҝ\3)hN-8&ϠJ.eM{ݑ#Q,:eaH%7MeQ9r꘴8)aKAy~ ԑcl @K++M?L]TY;WNW*a b81 rd A#E_I;ctqt-2 MM #HNX*S4[T7Z1W YU0d7y7{k 5MM,nՎSM4ZsȤ mȜ†Ld2ꏃ|2=v W9KLq-1wƜYY2Vr>qwtdl<^4J볲:R28>DΤh͖ M CT;ȲRqUV5sK57^JZfpF9$m,o:NG9\_{֑|ϒ&VH${'3/A Fg Ndr4lk:d8HVÐYsDzB Ƒ. EhSZRЙ&pJ%WS+s"Vuu.,*όKӦHҲU/J.sElzV9v\[(_~/L? He~D?Ov.N1yDto?dgJv9&bKU#ɑ60v6j1@jQ+ZWeV4.dLo2ʰg\a)k+|K|Q5"8Ot-.dR ӦϮNc_֥űtUN] dJfdxll,GC"p(pC1Wvq%U*U8]"]P0z^ @N)z^V2-`tC Y3tdl<|´DG/1W7BprOaFkr$'nsRlhK K+Rʽ Oii؀FY$v8]֟egP(PPKJΩ{̒p)QӉ>*/,COt;ݰ{?D&PD)? áYi&( A~ F 6~N~&EnTB9!\>rmG(9F'F9{8"TP=euUH  ʫgrٸ8CT)^V?x6\+bV,9\{s\EI!28 D<(g{^|d6[Xw*QcBا>;;(`=@M?'{/dUO\viqgTNd ";YT褳4y>,tJe`KI;<((Z_] TW@{5ֱ|\DKsj'K`r=_NAs]hg> Mnb4ϪՔoCV#_jV|R"rfRXsgzJͭtvmgY Shiv- &p\M HɎ֦BXhq9>]u.|S@z7)gxTƪyU<|ҽmmyNеk|TV!gRL3o+~;&w o(z7sJ%GKGeiVcP?4Y>`,LlͲonq7ѿ?"bD?b2 M0Y1׃,A2& rX] ^4x2nj{0! G.FڔS}P7o26J@oOÜjXB7ހKu>FxS[5Rɿܫڻa6-rN97EA~y/l7]G1UTMXr7sRt#1`(J1Ew6D-2BD(*b`b  #RWIF)vPsO!܆l.mDi'oI֘36hnGYnCۣ}1uӵ͜qefUB JNɊo+F_]P])UJ1ER%5RK8>g}Is3Y8֥ @Qet;ce2))>_'` ͙.{_t7ƗQV^\"=؜M~,ߍD^DX=VD&߃0(hZ_A!,FK4p$P>V#^O(z\qcF,{;bެ^ >. dr|/prJOYrmYW*ϠJ.Da2K,7NfZcO5r&-4R-h&](bǀ+ĄrTW*TГ*4XjRzSKhZD  `5^ JVٯl#[PXjBo8Йu Z\BqWV.q۠L4fCY]JX9.|w,WgV4 qSJ^\n1+͂u{m"Oj4n܆1EݜiLJⷢlޥ{fƯ5tܮG\lKCX@Iُ55X4@Tc( k#n I:L\-],qfPl=Jht(}-a-a-~gG uӧMm'_*Yx|2BxgȞ J=؆W0Ιvl ZSg@5|ʷ'luϗJ2{ (WUeBdI-Qw Y ع9xGC_Twrctt4cL VVΤl}+ WHㅱ[/dC"bxz:~ $Rܥ,;_z'0$X1//_Kϩ_P5 z /\ũ4W\ɭED3.*.(fQEEE(0NDQׄ5uM5^Q\E[wC\X;A TR܁]PׅE^g\o!ƚ=Sv u~B,L{ƼGW }(n:pC }B7\d]Le6 о˩ +0f1i"f5oMeP\bG)FowKP[lnɂJQ5âٳ_H]:sdBy.u Qce_1dȬ̸RKHY+QfLfUS NYhBq3?v#^zϸP8p!,tB/O\bJS1RaVQ(HGD-Mɏ*N1:G Bhz?cN@GIQVXXǬ)Fh~1b:OZV>5Ek>Ɇ] ey08RKnpznc_F+cNH9`ƜYJq]3ay [Z+Reˬe嗅 -c*A[nF!Q{r6k5SRsWrTZ0-"^t`L_sLь`FSL@|2lAHh330vSTE#y=gwdw< =ߔ#lCQ+fm>ݳ Jt<o?GUysVll,~Ϋ? Efc A<kc Dظ(!;$HJ_"U&*w QɲND!+`2R4-]ʗ3S~X!6VbXAW.NT(U+e涿AJ3Η| 0e MP?2J5˸ehnOٙ^ < Au(::tG]#!g4@T.LeR:s UF+qMLS]\d/"e/0(m1{/ԣ:zS?ڛ+ TP.(%NWu"wʐNa'= ޝigq%S ke4YbX ] 3ttZ2[!L .%*;>72sƜ# M4R'fC__QٜXw{X[٩vƿɯjکک~ jG?pܙus?4h?։48l}}ucsCd"RWWEQKݼӛ4 )/0=R#Yu2vމ-Z$3$u*p/Wk.e u=%MWP4os aI-G/hFhǯ2933.`fb\̔e` W}MNfn_3fL)7n50{D >AEHn1k!3]*uU)t(U@:/*[!N5)БQI1&x4*$Se)3 AӬ+ص6ˏY~f9f֦ re[`0ZS3a |3_he>ӵf>2̇Lfo02g#?xIpvl 嵫{2ӕfAgSvu}^:˄s 93yu!WfIp+biy}Ag~gTQ0*TW1 + ;h˟A D=Q!:UT("%+r!"EL>mDrWA]l)\b|13bmL).̗0`ĕ/̗:R|)3f&*2̿̔r~KKf> fUNSW{B[^b^7󮴞NMǽHp ]pW_Ds[pG)r sBܢȄE sWզښj60GċkF2_WׂZ|m;Zk:0_|D3_gs-K'-u|si-A_ogq-8hhŜ}o.}MJ &usd#FP>"Qf>TePKBT'DE>T:PH)hJ8nPϠ R~g5|>9ჿ؟ jߥU$Ȱ:a?RqSDQ&oƘ &S&e:~q&zqQfC{tn2.V,5vnKav0U{?/c鹍p+e.[t'm9'nvBPPsR'frReԓZ-1-#4zTAZ|L0Vmf4_=/ Svz^rBX2)_* uv=n-_ZK *b^GX,"< a "`D)ܖ붷z yk-U<Q&n ]9m,ɫ[f݂e'߁zP M!#4b;Q_0gBŤQ P=w+4]@KBC- $r}eI:! U ݗX"ڑv_*{/IIH]9V>&`B 2 Z?& }~_4Tod9|@d,L02x{ZSY4fNi|2j _HdT796~*`ԃRzJ=hz*ԃcXy еI x3 M3T7:Jz]PѴ A;B 8-j8u~՟Q26(omՙ ,#TW,)x6 s/)}" ROFCI&=Bn'=~2 R`AK!> ScpT}*pBx* <g$94i<-g :=VA-6C-M>ptd%/a0`呋G//j 垷1rq4!H,Í9Lz̥9eL;H =(zad2j\HmjE䅥lb_lXUWxuXq#J,^k+"AWpְְְְV[)[A `PV[/WXjjzM+O_HJew`(C/GAzILEqq /Hx/:+Q^9˯FpW}V492j|%A(b3Ө|l{kB]ף /XZ: VyN:*<'Xee'B]0X~S fh7`o!`.աք[äoPolM`5ք*VhBCnV! ehG.-u(xͯZAZ^ŀ}=ֆPf]d<oEaWuޜZ<0։i7s*Zgi&#мcz'TPw<ޱJczS,v `HCc5w-9Btr aF`쁚E-~'HWͫ>ͫy9?G:˩"ځgoz(OQG(x|ĤC!)π}|乌6GQ`q9FDA4OYnPgAO?4Oۂ @tλ) B& js,P w|:2`C A^h0AÜ[x[Hd]qBEŧ!T:CCMiz"=>AחUyTM%0H=1!P6]psFN$$q\ R}{@98dgϑiFipIi!pw_nF2@ox''sUaX7AR#ғ$}y΄1jCflt8k(TnV)Hq%GC ŠFN$V2hh@T*cJg+Q}MJkn1NU<QPcnc-CugӾMMPX@E!U YLeVLb@ /f1{`7m~Dr#tH߁J)wY2s35q_ ̂.ն;e_߂[`'X+Ny L*QM"ĤO)3Os4ķG3kg6yҝ|tnO&|PIpf8 Z'Doʠr9~mI\𩺘\ SeRt3r܆yO̙-|d [Z&9 hlƜg8ZTT?j2ΐsvnBs9-si9pn{h sҬ +P3Hˬh\ڧ2N+4{}B3H7 ?M8ۖ SjJ}`.fh>V嵏6;\k0JsMz(c1v2vΤ|/GF 0Wte8n(VzOsPݫCuA* 烏R;VqCݝOx;.%n̬P, (<@N@7@}G Pu>JF@7˧ QءD쵍,paq Ƴn =6w) ΐNaSsqC읐AS"QWn6?>-Ɠ>:Y! ̺8 EԢ,)"1MǫS6c{C(F̭Nab(-\)Qي_K)EӋbqs.T/uj78<:d/y3g(pC_*LTOν8wչvs}!f~ߴ+Sh[.q̱0G^2Csx g\8dl¿|d𛉵g+ө{ |hx pT{o1&epQeRĺ\ieKoʦMSWW7b0th>yFɺ2'G(Eo!b9}JXw.ży[#= `8da7_ök^~({oΦ@߼ fM2ʋ+s՜,+le^l|Ju랰ɝNȾؐr}S5Uc'0$;rjA;Z3jOH@y7-S`6arvjg\)˫ԆHp3,=xZ";Ť:tCK@t4t61TRVJbJ:$*Y]ǻD ,=5ˇ`5Y())6$I2{?_& -ay3|cy:+kqv9'";Ť:tӎM> UԹ"tS) َMo4x ʼnP/'NAο}G;p}Dhc!oh&B"H6O/M&BD~.Gf&aԖmFQ8bt$.ϧccqУ31H+zC 'P駂M<7'1<`7bKg`o7^ I_Pdl6u8_/|;N:{7β+lɊt%H|I46i՛ sFFPg(+\LOE>/}cbj) /%jd6I[ի}vqf[_sHȅ=t_3br,̎,. GO4VvLFdbx/,SRUNUaE^7o !z#kwL_"XWS4=~߈?^um35t:>I!|rU#T\9 $ߗ䷼&v!'Ϊs+@:/:Q3o#Wd,Y ~5kN0jP'+Z܊O`+ծ7#vڵ:2+ZjWծ5YV2Xz+2+ZjW Vގ̊]̊ڕj"vbkmdVծ2v,X=;[CJ,ԭGg9=:i1o䧥ٔt2hV Fc>0ȏVCYC)rr~l̳fsmhAɈ#4,N|찲~Q!&wۛ.YU/Z`C֑CO,jdžaL{|̨~ R`3r!t2d42|.|^g%ynvI0Ν -,%1X 99ʧڔSr#yn/khyI=Še˩2"ă.qS^,88 @fNi [*^%S!83!X]C0!XE!ADżڹCv\fЗ?;MorRfrLoЋ&;98d^ }׽4|ii߹7%~ZaxQ0=͎vูQq_m0Q|M_$Fz:*bl IZ6:RW%J{ig%|C ߡIb^vT(%.,O^!zb(檶,oi Yy]N;8FrJ_KvYH$/ىaw[\C&{˒E͘]?Kv3/i4+!S ~QoY#C^LZ0ofڑW,{P'r~,Trmbn#0Йa1]F0{*p8L7}pTr3ޛj{1Sn'IP}(KXEj$5&9G"U wdOlSb|4/"3i+O",9_rsM-aaU oaH 2#&*jx‚?]i&LPITI3[Ty ȷ 6 "os:c1&8P"53@E>xX }@D0NR*x&mH^C! S&Ŷ˜F;$-(;UxVx4J@|NɭfCq@w-SlE-/2$iG$g21 _cf/C"H6߿F`4/gx/g ^S)Ky]!¸nq:K?ɪ,n/Kh/i,*Y9v[9?sZyc-/[k>1yk;I ;99‚kˮ>x݅ȫ"5#a} Gcc_MoF.X-3 cdbO-tŅ#a d>Eo 2͔|':zI칳9cv%Ҽ|,Y髑+B5N5N5N5N5O~rŮپ5~9̴tRW-8e;D)Ax8z(x4g1LuӂSG yԎA _w] ;[܇El~W/OռN5w kg:dQ^Z/(.*lJx1*AYbzw2fAt~c(qh܀V UE&_TӥDN1XIɐ}wH̢v ԝ\hm{R2ELۼ0z' )hjep-8eE#YP ΂.IdgoU2u]Vlj%׆4ڒ];i*#alIɗ/x5>!A p܇+p bJ/$mu #HZI#=`>.6Lj`Uԟ1dpaL me`2RlV ϧrH. e +#xm iȒ%,^oh^_/އIa+?bUE8Z3&65gKGԱ\E*Y͢NmɟRo~H'OړdZ׈iS'N>I,HڔZňL="?Rm lZ2,ix4*\X)ꎣɭmlUx`~jL8_L*Pe+4]qIp<[>]uU3!@"+`kcwj]H`qX>$iv(,Ǣu uyב\\b\z.Kb _5: jYEјSƈS$%>Aѝv'0I5KsI7'trN&0`4@Vd!. j.uT$QէtdR>_pRu7Ru]uu]꺺*Bˤ 8|(W?3~f~8 !?3quSr/)H|5pg'ܝۉI*ŧ[O> YuWh>8+$E)MlLɰM&٤&]dMl2PAX|quvZ~=?iUNIzN7AȓJ?JPN?^ 6W^_S_Dv(Es1"a~(wԄQ@KPDDJp#9o㫠J ,l0 BgTa4^m#F5KՒeC ?? ]< .:]1ڎ12 p 8eT)g}zs <)@<)w̮Koe6v?7I;j#HgW-xn@R|Ѝ$xߔ=_w H[O>)XRXI Ykp+#[J"L=夃 /"LB1w&0 N]@1 x 3óyCy&1 n]JB璡-C)S< [,46]~`ѝiMsUK D`¿SNb2LRj.TIh5 Hܑidn5@`n`1@ڭ։D$F6lܭl$dni#q'z=UR%5@{0JIt,o8!;2/ TKW69R~g8\B 1A}xH{_5Qgy㘸muH6EJ ]c_ŖSx |wؔ "'SU¶ʶêaqeq_h("`O]*(o FlיTo#t< _lx0,x 7 `(6~h\ `.T/%1Bp=7x^Pn㹂 >JS6 O J9|J܄s"vToVZXқ ~\@*]DkןnF/”^E\_ Uo ّ㚯4-74)яT99ܜ "~ +0˥xc*$KQ\.,N]h[edi=1];Ɛ嘢ߦU-t9IϩchNJѰYZ ,S'w6 >N5.FP-+/UsXJ}eZR^ 5˜O0} e biVh gH#vߗS9_TEVb?rYŧX T㹍RX_^AXЏH yUp._#"ؘN;"\j8~aWY!J/Ő 8m W+&;O}-'蹝=f5$uNڃ)t=%!xQ7ENאMΤxۜ6hPԈ8صn'pWAs9\ k!\Cd_Sv`B%>t|t\ja7婺7Af)K6bMAk"q]q] **17$|._Arנ~;cfQ2inzS!#DJOFFb ,A0+P%pϮm-8Fc,+N)6ɱ%9`jfaRA(h/Nda&`+G@QκbPh,R FOb/KϭG Y1DI#!;Nqe.vDQAF 8=5za{TacgF"Ifp%¹-/S0( ѰM)k97@&aL21ΎX0]}LjݏFZL;3Ͷ4lQ5}jzm:WV_Iez Ŗt/oh\R [۴*$=raQR^ (N*4y F}i _m70B'M ,/1S|֠wa;pz{jјݐR/&7.hvCBw/l{ CCw/MJ%nz~m@CD_B+VwkWk=[;-O6/i@h7~[+ԗ8m/~/ݫ^:`2ܽ 6XxLn>bC-/b6^U NaM`8$qy0baO $SR URV̧Y#G #+(T#y/HBH:_sY#TQ!IA;թ:nDnUA}Fge<3pc ^N3d J2Gzm|*YC+8)s321[tB9iUPFa嵍,7țFENy~_۠\Y`Q?hP,t0:P^E}phZBg#嵎zm@ g88&mfuy&꽵lR7ClG|X-P_hggk^{_2 F;(p⾙_8N`6YLyQ𢡊􋘯KkGh8B,m_P^ GØ1 '!`tly<COJz:GIz2M)Eu6)܈. .F !KJfBnûQ, 9.BeQ©1o~Pw|ٚL҄)$OyUt?%J%OQ]ˏBR5k8PLa7ZPg29 VmV å5%əmxNRHԇf}M`.Jñۣ^GdUnKr.K"] wFXT));e@7CaZYNyHR?RԏDMoRx)B:GKUK(-=JIRC5L94\ىE(= ɔթ'bs@W'rǨ[.Ѧ_JׯÉP\Pa J\cpJ.¾˴l+ǚV}@FڠFLJ1bNzsZ֛WoNzsrїk?l՘l\C洭7'fُxݣc6GF`xm(bD!Ų`x9TP=9$(TǺ7S5 cCNfN'F.Bg&S?Ɂ/l,hЙE,HLgôՂ%tܻnzNZv 8kwz',mԵ&?}҅im1Ͻ8͟ 5&_ &ѷ+{텓cC{޽w9g-]Sܠ7~pǍn_wEXuhMn!󚑝k B]} +WE?߷Vj,"(| U$]{Q;6m_lF$6 Gg] Kgw( .8-\tgm:w]]ϼgVW-V;n[n:e߯C?3ʠ?|tă\rM:K&OwJ-iۥ)S-K6 Ǫc)6 ;zox菸DsԸ3\)Z-g52uַ݂tQu O>{[v/u l7\/O佋]32r ocE;mŋ%%R_m?7:p½1Z$G_<XF$>+pwq&Ƌ`AЭ+0߲@L2aPl/\a^a|uhDZ) pXPDHíRA*FVQΨ"԰԰4LVca5*F LPjS˲Ί!! š&}(+UVa;X8@ҧ̿ #0sf t1IJ&01Ab>Kxji`hi`бFUSXJļN%!CE28gZ~GZYar_I>C%N\3@_u+ \m5m}WMVQSFWwYorF/o|GU+2^-}UD&b 6mݶeؐ} kw'nvIKvbIm78xkR'Cw PZ6 ~fl~T$[J]\E?&]_"iDhwioݟS'/\wӻW>?L٣m}hGI66 >mh?{6 f6on_[qJr%Z|m?%~Z$?~!QamL} <[6 ~ѻ_8^6 .qOtܫZu-/=WQ$+ [xCBI$c}IM翧Zj?ZTmrZ;& mMv$ dMlMzQy=p?~D#V83bwRM5Rm,-(fiv:Xٍƚfghv& VYCu%M*hvӡʦ*&\2>GǏ\\',W=~o,Wrf,W嚁ۢEݨ\v#Nq@\饈 .K.37D2|X ڇ3`7)B0*;/24A0aI &eT#= k%|5)` v2F\I„ҦEH6nlܻ=ac@.ciBrQwH.jkH =˷^M1`v$QaGrJȋJXĺq`+,/G j`4-vW[i*-fkۢ/ RC"o =-t$PJb: STsZb+Xmjnu1 Ɉ,S0O՞5#LaPs ሔB;WJ^6[1a`כ89G<ycl(4adB%ڈ2s ՛76U&t!l6d͵`s{T(O|BsRD,s!u˫g_Bt2y"8)Nvmx!P2Rnӓ!^=cd[O) B ) NRٚw{A['CJaZSs.iR]Pi!P6/p82qf #;D ]/dr(IS22 ^6*i>$ 8YLrϐL9ew\Lՠ (^l[tZt`X0禜2;Un/Ѻ_GI-ms"pm4>Um#_£H]5rIaXҢ* Q~pUiWj@t ,)m{Hj׈)ydϟ 鮚':`jJw\c ll?}ǃ{M?Í&*WhcмQ~Iwfl*>m;͛ͅPwal,=DuF u k[?Kĉ:u {k'3zXCym}O:Ū&@~5ӻ+$[;I{ȘrbG7\yƬ^ƧM=rsBRu$0ڙTE1ɄwH"s IZ+ hM@EAbH1  H *ThVVR]YHJ*50545 [ {/ D'DRU3JQ%HS :BԶ#Pfm]9g%0y Y"5ģO~I/_FKR&5Hw*I*Q;mI ADI~%-ŕ8)?tqe/O]Lxγ:-{W \3*^2?7.ًJE{!_lsIG@Pm6 ~?xٝ0l6 _z WY-16E$={jmeO$M:U\%NrGڴ($_Ϳ_Okvm?)S\wh`U7g޻P[ o|k?YYb0 >6 ~OW-}\Z޸pn&\$ozyԊ}[$w{rBmM>Z{`[~W6 |kw[PW`;m~Xh&8+'M?fk9[MYO-IȾh˯8v. [mr?zx}MM BgeI k]6 ~b?8Ts _QWmOEk lν(1mh^`"M_sd?>l>9ZO7 (}{nK[X`rf1ɳU(Яa;OЕ Ŀ ; 3Nd'jvJ+ kvRVUZIfT!& q;@"$[*F4IOKi$lh綷ɶpM];Md@îLxfEmg2T*)``zR4mZIzNi*DδJ i.0M1`ILS cF]&?#|&4i6ФWNy[N69' DYx_qif~~\sLY0CrB|IabpM7o_`AnF$P)rڨlYdtn'!BB!F !~èb'r+R8@$Iɗ1I{ `xu*QTUkb& bA<9[jXL kl(S[rX$XZM)a&7F ڒ/m_j! K"!S|1lk>K8H-ʔx<$7c1&LsTS,:Jd\lI,3htMDb'&/-Hk GLūm`_WT1KޖnaKW ʀMJ=Ietu2yIOk<8DfaS>尫ep$5[وC?-f-FkIw4VMwUK1j) vZy3TYإ\؜9~jLBTiXaV/Ap1-JHi&C/EX&Ɩ) ikwzWXlЯ\ MTAiPVP ]JH).Q~4C*~]#$6d0++ce,01iT=G´R@XZ;\,Lv]AՍxax!Cp>m@AeBv*p7.iA #jRY=&&&@Gq>ǟ\Xh6_Y{ C^ďKE- )s<[ -l6#ʡPaH\Hd^p:Sk(b[N-ǀka˴yoXA@#C64[nEV;jݯA? .]JK&: nS9Myps?]TCm`d1O6ar9ɱ{,k;XsS1nvz c 2<ۏ[9:h z>='ʘ S uƈ4PH"!ԋcqxI ^=W˓N,"'5H|+jCR DwI<{&l*"$@X$ ˪K aqGźRk[wiZjuߵZXV+h59sfK|W9̜93Ϭg|j9H=hAI̬KS fK*))MtAq.d=ι tes1s gZt g0H0 Sv6כ$294ڨT]Lጾ|qj[_{N2Ha96-@3F\ ҹ#W-NX :]l"JMElkDfltű1 T݇qfGZr_FC&`EІ9h0j"з諆] ѰM4 >?}F.63_āFTV0 95愐n]?f϶Րva'(w|Zh| A]LF$Gc|c6"0p[p (*g][RXiV 5KANj5k?\WɃSJ<Lv?2R<蓠F_|y+~_'o?W|W)-BFg4q㽏.cZ엣LqK|[Fz ;rΟE.d{N9w)HֽQ\8|aDoHIQΗg\~>D*h$uVf~qAM/Gac%#t47/Q+jH]@*JG5:j+N&HMMTRt'6-$G!HѯI 4E c_4dÔ`&b^ nXMT-]A*MG]vS(V&n HG .X=ZJ@ꙎN\GWUKwzoewUK)Hߺ[ۈeOUKJF)V& MG_Eij>?m*E~J+.h$:%KoÏn4UF6 5h$t_~/Ukˑu&1p?BǜH+IQpOQ#Wnt6 ?C*:X-HGG_u%rSj ] އ$ i6^3vY \r"6IΘ= p,HǬ=~~ϛ!Ixj[Ͽ=~n*XCOIuy,*\CWͻc(6G J[܆#*&%:(*fk Zk> jvVW6pNLg0HdM¸n>Tp щ)h^0hePz,Xr+T8j(([4Da{*ocĈ #]ot.Sfԙqh)KAR1)gYBlʙ9w/qV+ɨA @M%"jI Z@ DT#W3Hye um4GJȋܴIuajp c)#~]-sq“)"0CWhCns>6=qWy΁ |Ns#U/

긙uf/>8 9\3HA=~!H hdψA 9Cv_*­VOFyNqVg[y)vn|NԾd3 7}հNG8\6y yԼº E"YX[tǤ [:$YA |ưf:6cPM2y6xY '&ayGV?=HMlA#FMN(8R@/,B:Klf!b^w2uw>1s d/K; jUIWc"}Մg0$bS{ڻحҐ@oؕ=~|'/~FuepF2 I%6Kc2s+č8lQs iZ6-pΨAdψ@{f^H$OHO9RODGd #I_Ƒ鲸7//Y_g}Qe62~Q?gR N8VN+"dn~aBkN_x_$W9|T@6 i1ŧh4pƯ8V3 a1aN5 :eXpD.x\3P]K ]4hRbLg>Ne8P)CXNGkNb!CM<3Jj5rBhA HSJ|x k$KdPjNx-^hs|< 6+W.vTqv:6 ];eTuP4J3S2jNmkjI-G!TGҦEirSY:GY| gұ5c'~7 )|+ o( 퓝ASZUꀏW{zzfLoV`(}V }:ejf)>*5>2[UudhR8Eᅳ EX~UaB1ﹶ2ph0S}W v0huf)`9>} tWq U8Ԉ"lo7FQ EnI^,Xu/JH_/8&;3i۵^r{Kz ]-)%! Ht騆Laq> !ҏIo<6'|F|Я܊HT}حsf껆z`>  C~ kFkN ׌ 2 EA&k*4C1>y8n#]Ua:+9H]aC!'9) R">b+%xVF-ɧ ]r^6( \i> tw[& / 7h Y~5\ſG{N vuÚ,|Xv5{YtoZ EEXtFc_ݧdk4&;6b6Vi@ݷqki 8^c[lY1||p>8+}puHie*o2P3ok242 ]es7Js2TSL#,vd[VaM+-6\md-6k!bcM,6H*#YbLs XlrVO_Q,SrF 2Aqfyy>S`k]UW{li^.* NM vӈ!It,B/vکeiRۛѕ $wg@=雥j Ξ aqb@}` B(m@=S ;4pɲQsscAFƀD^B>06ԫ'RфjU+"SN ɮCcF3{.$:y0_+x.$:y0; "/.=œttڋ>Y l=({'N]Hua2]W>¶SG&Lo+ %A¼"|/]E]M;]Ž?vnȫ^a7R+Bvķ|(6B= |8+3s>ʴ=ޔ">s[ئ<1 Nu0[GkelX &+mhG2$t;.<$mo8" yv鉛WG EOjϑ/w2(CNIFȎKL%3`ޡ)(睿Ss\eIhVPJ|XUuF5WbZ|Qdqokd@=*hJz_(w$6 v^}I8=q.$vD@D3ʦok /o %Oѡ\ <&$:Rh Dߓmp+ypPwK[Spb&iɠ^`8gR BFqӥ xg60vNځd۽hJ0aWƗ7a˩P2t n2,ι骯7#A~ niP_Si%X vG@qWB3 ]e|)c8"+s/||xHHSfi{-NCfG>4U@gQyh_g[f`F>\`C2 & /X*+̚iNnjݚjL;5k/k6Y3!^3Iͻ|z\:Uȫ.'k%kfɔvYiϼw:5v4]'R /?)GS oQlHZ;oe2\˒w_jK@,Kz,ia,jI!,a5[|vs8;y̜E*;jcwSbX޵ ~I_Mq#x?{+m#KLoi0m5~夣WM1L_y~~YݟKh{ e\n:jXʣ[vw./Qv ZqN1vsKZ}?/DJM{st4~vvԱvk.?}/?i"L' ?雴i^?7i雴?OntsѰ7rQEx:ItI/>Vwny$.~-분w2[Z;iqT$P8螎&,Kq)ғW]Q>g{̣*+zblM>!%sZ89nbyh⾢W:,E[rB]Yr"Š@9S*/N#kNYr&3ftSj*ُ=ג]L$lJJBLJK`'@d(\jR'[faHOx EAҠC(m~ȉPumd_a6& }0kP8x)$ !deL¤`W7,DwCTRCLRCNE-E-7E-G 2"x)$kZW=ht#8Q葦ѐLZ\{FX@̈́B:AU2WuQ!(=Si3,cDbR$rA.)PXLF *GahFɶJҞΡ At4d@- <W٤^n;WP87g@sl$:v@QAɠZAYK'N*(گ.u?^ޥoA@@4e!GfjkyZh>nGvힸfryCAD16G1ݱSwalRd_77 !wVV? <_oPAfd: qZ͎y?Dݠx?{ITB|RL1Uog7 Gg!;kgl2[,%lf;Cb+}1ϰe([e˭pV;>1(,Xv>$n 1JbHIy[iz5$l/կ7F~Fu9Mu[@݇- F6kLc* yy+#:kj]VGy ;X&!%^Q~?ri@!^xjp r} #s3u$5>rbG@LR8w#Ms(1τcp]=KjuvΌsgYԞC6znJSJZFmt%P#"qcJRvK-38W1wĥpˈݢ8`2T{\?~xqa5#_`e؈j5GqUCZiz؃ 7ioObMmp'1B-SZ|D.l׌s3_HtB[#nL]b$.v7ɼ ⯄lht=uTAC3ҋ#lt#"j*_ˎMLT b?Sl⢄xk\KW2 U @u)qI "I\G iäƃ g*s7.@IWhZRZک8zoB Р2xI"K~R:mf#z{Fxu'68b nCo])' 2Jz \) RUa;fB+|Z^'zq|-nVxÐ`.` hofcZ42_l$j%72fO[ĿOcg `LJws,Gg& vQ7$; ܲT6ОnTzwVBlhVGYV(7 sr +FBqHyS;v㳿THxq~aph= }mZpo_f; nVw7[an fwsiJ~U]g~WBvBϐنobz|9[t 2I hg̮Uw_HJDtu']…fښF3}bD{HCv¤I^+Mr .F{\62h^ɠocswKIy]13h;^D׀_3|_p2KY.c1LJjW..ċ/<.ur!WqZ0'$断|{4}kqKڸ"`x̍ =q t&=ܡ 4^_+M3S\ _HnL hiNB6H{+fBp/F"C評ލ:JcݻSGk{7zuFOXnԱkF3{`,>X]}ʇhLl xE>s}?. a?K*Pށkl"x"4^_"l,>yT7*;;۶6|w{,Uc׳C:{2c;ڋq61#|L{lZ՜W_1_y a:q_u@w"r9W !7| y {9;>@m 9ory,0 X6YG 9%{dedK kl ~Cǀ< ҿsS9]r6WA6y{YA'Z l<ȂrE#?r=yK-uc $6 /iw:ˁvA-s& Aȷ[ S@di8@~>!A 3wI-. ai "v|s|ȏo:A> dw/9+K@|WaOV;r;?bns{@^TA~W,9dS +N >AȧnX id"}y҅2,ZbI×vQ.Zb?Z͟@kc(rd^LW;W/7-$M&@2F߳@Ees W+| ULioe SV@vQ²>wh蚽l3<`H|lNX%l/:帢D!Zr<#]%F$dANCXQo;5vJHо, -Ѯ2%C ].r@VǑһnQ一NJ)@m9n_|n-"Ő'..tnb|5ȟd+Sh ]gPa߯~'(_3T_~0B5 S辞B5 (=P W}j3pICtF6G)$= gK!$F0dh2ΝjDη)|͸~zFbW"031A`J*+L Cc7)2|Á\KH|{"š ?t# ٽ|Z3KR]f`[\P24fpS qK⹀;DϺ6& Ι.<@O|B!߱0CA$7CD֛h$dITCKAG]@@=#_w=C >FL-q#DHiMA1 t\K%q(=Pm'hu"n((7w mC`hȿtD$oZ`xA$Y YcsJJD Z:k:';$j4Ce4~5ۅK F  30 .d7`X@Ќ.淊' &|0=}0#L`&WhA</;a >tۙ˨E]:]zwHgO.}[K7.?̡BCRֿ/\)v`+L,ZmQ>*FY܄U18ћq`C|;׹Ö\QH;X!#sHMԤ? d*xَ^PD6o-/{R<Չ\{JC^5f'd(@hS3 10u̳ G)!Yǖ=Jds"ֻh@njoErw [B涶m\hiH"}B[/f0x uғOP>gPFRԦa0¤NW aGO ij I kPura)Ck\F~6-a5]f*V*_,_Bѳ k9[ؙ 0o2Ӌ<4ze!M-D.ƚ|1H3|[mnp-6[66~~%:? ϋTjke W/1V"91T+oIxfo.2R6ﰲRP$uuf۾o[Y߶yf;;:wD!︙g I7JsُXٷhfx &pXbYx"@io3F}3໛ fi20 :d``&tXc&1_8G# 2qD+%P,}lLf4Ūt*F3Z0c[ c(G45wa'#=b5LPN-+N  #c 0RQx{>1B=v~ρ'c\]^;>;Hǭh&`33P':E,`Kel /@x!~g_J" oi<fj6Gyg!/4o, @"84α=Bt@K^2iBzK55|R sbT7؝v Tݥ >wdGu~狹kBm 9w5P&N@^zBR8FeR x4q3`{ $3?Fr(xoWie>59f^os[xz%dz6`lZlZ!x%;P}$2KN"8`L\ aB8X }1k!Һ#Y2YML,̉$Cchi d7ww;] l&@H5$Hf8Y' ^D^|= gԨgS ~6׍i#@LiB_]RZUps Zg Ғ2n)8t4iqGlH|K3mfК c䁿1 tjK?p+AZWU,r~99N^ٙݬr*}[t|ȩΞ9c[,rfCY$ر;]L"f3]O"7bڬ{͌/y(rDfoƴMƒgzn ݉Id-͹oyig^J'1mnPIbڊ/n_"cXZgQ@Qd70k>JAGiۖٶ M6=xoQ6=8s旼c?rk3غ<ͨA @x%"r Ѽy[y}hՒaC /9"G]  @]Ay󘄒-%[Jl! 0]j3%ѣZc*M|藅ADVd?/t1.)6 AR;aj8KCI3G+buXy}rr1dɋ(mr2V%3|5~5q_2 K /Hy.U}q rYAvmӯ~Us_ ;jC"OI@mawEڽgF>9>a˻O?[jwHgOCEvG{-ʮNl؝3"{\2+Sxp+!UE|2I`פ@KJNdc̔{"`]P.?-)f0$I;#_QK\@ؓF`YwvH oDIF6kXn Z PXMpH!^ }UK#MW]j̧+"uN\9NtTD%e>ϫlbj` $aʐD8C Hg@'jb߂4=((U%U.&\ )7 3hE#x_<ԑI Vڥyѳ_8z4U(x/)cD3I 3EB曆F 8 ~|WV>si>ijx^?CNv|B%#ߐh::si| IӁx*w_w ʂuR8d[A.o@Qqi:] |w_hopsjcP #978Yu."KQ $3#=,+F E47Fp8/? ؇z5]e>AT]]g3 Q,JT&[]E&q(p qC!$q/D4C"E 8Z(K}h!U!ٙ#$E:<<_iaBP1v6Xh@ LzQu aU\ \. @Zp. pQ.T.z _(̐% ǵ3N 57/Y Y\}Pn'>eOku1_.w댪@>{ 8/2)gAHX⧌Aao̳:;j/+2CtJNPR]*!}hI>*7] JeIWieq~C`rH/˰ݤa͆̆ųzhf ٵhI2Whe5q Ok:~'5x_μ<p:&Ůu8ע}+ueΓ:_<ٮec\i:"ZM6ybm(&OMX<6bmha2`pL0Ϳ_%E~з@@TDv(_5>Tr5Wc)M3{c=N)j׻5 fޏujYy]ӈ DA^@7R~kȝ0~G{ 'ߋ`hc8fH M^MNn4YN|aw d*)$84-Erh:˻elvY3 B"_@tQQ4kz,Afe9Xm)Y!B:^qmah}1Tàˣ&E:mn󵀸[0owdiJL{ &S/ѪC/G A/K4q&fQxpO&6H|w{Mw m&5($v"{|Mvhi; J-4B8W =#bh[\ ş}Z-A-3}r/}Z7b~Z@+@_WO dtw@ .f {dy9noInj-[֐ߝQͰo1!=ՌdqAC,Q BiŘF(I$K]R5 J_i)lPYf̖65~gaQQlj2 Jv&/7>sS8b%f+1mcri2(EƴAiǐi,2(}- JOcxjϠT`+A)գ1(3̂} A)Aƒ,5(%~i96،Jp;DDV1¼lPNh> 1{ Jm{}ޅ^AkƷ}atGC0X$n)RWjJᲃS)2_|JPOג^c(/*NQGPcX}G;dP@`˦Pu B|6PC+IeI'pVwޒ|0 3 /N80z7++ ݍYf!=0.X!^"bHY"}∨H^Afcl'&4qN r6ɬ+>;PcДfhSM] mf'ڲ!瓲knz xG˾pj)d>Ƴ?c2UGZmK)KCB%=0yw1jc+x\kD^H41/}b|.6R7Ds=R$% )POQBL2C\f-JVƇOPep۟>c@d΢^l59!d@@>I k3XkޮQ 8?yBejk KeƜ T4rOr>Aq('4Irv %طˌ8Ϡzaq5H'`+cLRZ"27"Bu &P5PZGj=R#YQ<̊~#9s N7{B#b{T|25iq@Bu+XسN3eعHb3VCՍRyTnQp7O5rE/(xI]qs9لt}! F]xmG¢bxA>5 L 5842xvPXvL"pM-ǠJvq4538?1].}E/F ϵ7&ĻH촽DD^H5[Hw_'xВva!~(jHr\D+h2(/!FuÕ4bLH@<`>~nFus*d3T~5\ſ xui9>row}VV};>-7+6Ya4J0Ɛ}H~C0q\h_4^`Obzyq༉;ƝmFqHū:͎4f xOf'Yeפsbi" -s<Is0f.:"OKy=au]P %LL5n|k],?5wk n];!x?/fqq/9yI-Y L(%Afjp<ҿdI2!::KPe'``/"taw_E/ytl4 )5JE:} ujCeG`+cBW\CNSH=snq!"H:aՉ['ԞR\*"T v6\@OBhǀz XB Ny5YUp&mG(c>h# -PƏv}5j!Ube:F0IԘRֿ/f4@Bѳԛcvocb7js_.UΝW)U>ż'8.?tEG>D)mg{{r)f^~W<v$ o;7tДN]wǗ٩S{;N]9Kl執٩~F `wWoZ[S}۝Àaofn:E |뀛7fpdܛy$dv!F&Evmݔ&ђ 7-\fD<'ґfhp3]4[(Dٽ fSaG*$?V7ͥջihk=cfjxlR.>GT7̏Gjo"YdD2i: |wbnCI $+ 6BGOs/?*<..`a6 :Cs/ fn2~zR^*L(ݦ~2"TP[ 5&Q@zJQU:ex /r0=Ԥw2I.f1LpțdUm1qlу 9$EvWd6`{qvܦ.2lӨR&B:ȽFoHVPad4&6r? ?7n?W \1A$I[=P<4ɑATFkfjH-ȡ8HT'XV엂L)oZGj=RΩrh.{'>q!\Vy-[]u͗`3P}& yM} m)PuMFؼo]X8yՈ[_roYQ?m!Gk-Q5\ſ4wff=zvhpw#ɕsߩ1{۵@yޗGy]hf#XB hd!-y e4#%qS7n׾nv.nMf;ioq/x9us}3# Ǐs=w;{wNjH^٬O!w_n3Mk;@+/,wo&-ItG)LwB@z|;)oU`} ,mQoWokYh<2;wK~8x"{%5;|e@O5M% Zۨi`~ *KDʏ * pc/>.#Z8b0q)GB`J!#~-QCRߪU ^s(?-N3 u?GC3 qYaTcaKDI !I\Nbݫp9p=ȋ-Nxxۺ`Mv;;皎zˍ<jkůARp yި6&Io`;oCzN{8dl~GЄO;>}w_~ o1V8"WL!כc;?g2q=4j8E(K6'K1wi=,D=G|2rx$G8ڼ CAG䙈?|^6oG]GbMG&*QSho!qRu(=O6|6Ρ<]_4gk >ЙlgJCҙtgT"*L@=L倞/1$vU’CDuKAp-̌΄ǩF?~u(?S[pT4Kub^}DMZf_\QΉE +3rM/^e3}}qM%߯dlNU7xC3S- {}o0.P|uo9~)P;e/mOMfͿn jfN5S+LiMjhN,{eb˯vJ?9FnιR3Y_vNB+ dqћ-yIC9` =W`ĨAba%-@/ &8UKtG0d1tg 5kNJ>M,u)^odg5i#b wʝg] ?\k7qo9㦜qo9rY$ suu<_M|uڕa- /LHk ys0||[1Oywռ8֌ɡ$ ů )p&"qJ1䈰F?I\᱕ u3ccOTcG29Rg䚂`x,Y4#$W1`s]|O};#?|!ZFFW߳C##T:Ɲ?UlW ؼ3oU߹f%GF`XwN[q IRXAx{njD'Y s~TD'Y؂ -LtՀ-TqC|Dg `%?:+LtƝ+K?O':+:ǝx_'[2t$~_|KGƝ}~8g9q Ge#Lg#`ΊW-|Gβgw\OSw/ۻSNIfVĝQbInεhQ-LrZ[w_%xlU۰UqQr;V' ;Wm=+JrVwozIr&sG{{w&XqA.8\˛w&"ƝoH|O -bJW9`R܆6ŝ躏4mRnK^_dm[6|qgA wlC۰ qg/~c* Vw>sſEK V$r`qGx/8T$hvVw.~QƯ2EmXeyH|3*Em XUܹ>'{S}1ERLS;^ˏ,7Ec0[F6~2?=w2J=Ώ*Y!Shr*:8_ɹ}ԥ42`Cf _|iY[|1o#oglt,s!Na=?n8NJ4fPVYIƌ1++$OcƘI4f '+F8Ә1Y1"I^tݩm5z#MOeCkOs+Qo$ELy)7ˊ17I=zRo1/+F~1b +cϊ.6߼pOH ØZV"~J]y$aOϴsXc $+R:ҬB0Ɋ%ox̧2,':dH QADL+RK\x1Lq0JoI*ŽbNq0E)(O':'!篁0YL$,ԳSܜ/Ū B=`'?sA sWAGAo'!`ޛc?],_J i<$EQP(QZmBHw:XNUlR_aU3;s \; ic8gAfF?~u\zuBVG#M!fu8l'&D9jOl8ߜ ~+Xv:MgE6~oΊbر_xwXGzX㩽M野Sw8\?mIA-B0;4|zX˼SsVq*mIQ NpW1F-_Ʌ8wQ2˅$I3Y1*pb8w1F%/1PO!EZ*ش|(I~%=SN\#Xĉ1;lKhqqoa#-6O0_LABH!Xq_b~Nq_B]C\.~:(seݴ XF#.F!vt$^ﶳaC~Jgݶ=ގ;8&R2|$I3EpLdHV\#7+cNV(͊c"ca3K{f0|)-<)E>pL$x pLdqLdY1%=: qLdY1ANd xͅt\L_+2~ۚb:q|a|l>z*GQ )>+>mM_&헽%|]Qޚ6V [ΧKD>-in/5/VI\`jd.a^x Dp2P0` <5O@t)΃lp$陖<˲b,y1g8A87+ cEV΃l\VoNۨt*#MZ iيp*dU 9 P陊q*dkq*dY1Jp*dp*duY1Jq*dҬq*dUNHUgCvnFF dW~Y3_d; A}333t'\J 2 g,ǐ"0V(E]8R2K0#rN⦦g982FNVΡȊ91Y1B82FI pd?L49 W-CɊ 1Y1"82F$+F.NcN1'C qrO>TS~ȣ(b)YnkWXJV؈$f*2i [iW%-aCkuҹڋXEIKv+`$m+xr,Vq6&%AUz3-V S\ŪF+h7c+\-OʵX)#k}ʶ<ڐMr,VIN\ŚβAm2_YHrMޤ.IwNBȜ|9ti9Btۑ9wgѽHf+g */hGf&'$ eCuM\L˕Vʹ>8Az7Q[ \XO(2SAR= Kz|nMRؾ$k Ucd69lJLtMgŝ6\fxM`XsyPk={/Zk EA.)|wP.QR ǝ_%w\F%*K[;HJ4TsNΗ?w'.sv(Ή;e_y/Y;jQGgzc >6rH>q$Mٗ!!cL["^d'8;">'>IE ߛ d¿pYqDhB#muHA1̻$=% #;Gb}%Mz\UBNyTt6\jv⃗|s=(ӛng-AYmoH;5R!M -dED$X̮kE{uVRS Ƒr8ܡ1~ J:gXwiv =,RHX"|3 k@"B“BI!p:\$hWͅ9>'fP+*tcrwL=rw 9U 9 E٫ PT/K*iqs1U/\̓9L-5tjw~8,AA{sssΝ|qVvպ]C]m1_sZwQ&I= RN'W\(y>t}G9H[Җ kKKQ!'(v}]2]nm]BF-mA[A]cп pJ΀^MO!0~tqF޹ zb$tGY^"TK?kMyTvY(ž@X3)9AP NFBO!Yަئ3D (z?n^ѺD| )aUT @ȻOB;q߈V? Z4t$=-Iz򠻐1$~u]%uѰ7Fs9h7Fh ybM>Rb~uwJ5W-NtP \S\=\a36gV˕`#|n+Q6KC(ې!qo^^jG{,jUo,k. oNdN2 طcpI={Ń& }-#d-is m-/;L "!C!C,}{cMہg[lҭOn}"[n}BwҭOb׃Ŷhד]O"ܓҮ55^ \ Z؁`M?Ukp0&ưE@{ b-搵w$W)#fa|V,[{ ,5۳ge𞳃9='vwҳv7+wZfV֬-;+ ˬCVf}O~]Gg$1$? hE&I`:Ry@k0EVd35X>þ~ն h, ͏"uW̪+j;ĶжrM#ʶi͕Aυʦж%$?UW񃬺-Ѡ`9AeghK\<>sy>-wP-[TNiGrM:>}h;6nK/ab߼ $tcK㧜ZG9HB<HhdRݒwKːO@+y]Y.K}YEÿvT{g[W7"~<%Y(m[ۆ E-5|z8$SncB79K4]AK[i9-;8 Ձ0$}J^qJG>J\ԶLMK}As<(?}|\.2 r&8E/~CP ty1孴孴~Tp`m0A\H B=cA!mELF;(r&^.J]Y9tn!QhE5+k{9 u浺 zCL:OjXNDSH+EB~,:@߭\zmxpt$rJM}$TU<2W3'XM_<8n!i,Z0M@MftC(AQR+۟Q]VbMM,BMܢw"Qqm&8lmm;iij\b? JGQѳaqR3cDL"܅htkqD6hCr&yx3yj{CLF%}=~)]_>:\g *;Iy*XQto6Y?ys>(s($@ÿ$ C*Q?&p&TnU]3 E+N'(O72 WULpϝx4*Fa~< O{gőn_5ȫf;H!z;$y+9NΪ#BxG6J@+^>ܟAj1O""~A] xqJVM%{@&"Wyqc啮dn+ٓUGE x0nQܣV!sR_tÍ L5+)oN%ݡҫKW8GdəPxEgg ~z;\bʬ6A SjvAbgk3u=dFvjz=(sA`~qERǭ!~D?"9K0*62Җa}smH ϟnžENx]g5USR߁(΢;\*i6}yJ"{ųDmǮazX:AuÏM7p(, +~7U)!`kf8zXI`٭IGThp Sꄔ\ou8BW (v+On1c@Ac K:[۵thyJ{; STocr+#w, ߻2*Y4?ifD"Eq Wr=%'2LY3dgN{̨GE:c@^ ~(Sku˟^? ]HzBN yF~u醀mڗ`Di?B,Δ(~`&~`QA!>M&̀~v` u`h a$AW&/BǬ!CPMgӮG /З^fe$!}1y`پíɜ`MdE(d,8=JæU_Q͌r/jh4t]hd4$CEZzЄ~M ']Lw-Ѕ?acWdv߳֊a9b6+P>@P_>a|Ivw~SȘh8k-eU+z.z$<5h1uNE8ߗpG?/sCkQf~6imv5~T&_/l15 \3g<>c5FuP=w8Fta}=ݧn}G4!Q?@nW|b zVe,EN:ylocӷ1yzi;ǫizPbӜNw7ޅ dni˗:"U8ٻ#ڙ _啕ő?!4y =׻ -"hrtF_۩}Y9ncv(zg㎞VS+pʌrNqյip\6M_LT⸣=͢?08.K:6~|!f8.n4H :j\gãuԈ |y_xX^ kc@QhK倗ߗ'Kqv1wG*AapvSV1)1Y//, Ɔ_}qᗜZffsއ8k?h3ONo_-ji3t4wV豲Q &}8 _#Ѭ(G-G9Y磷k0|^p Y֤S^%gmgu6,:TO32[w8R.>jZ+)N c=tcrN|'|4,H]` 2<o|DlLA1K (sf}/ կ*qIU]|/haWUokӋ6n) jĻJ FIY͐򚷉x};G1bk/T:,8| k ^l)UC>@?z*dש~@od ɖXUeCm]]UU]m]TMw05ڙUV~<m*9+lk$3Y7v0{xHu@Y@Pcy dX`b(9CzGcC1[ ۶mtu$5ЙRyUgt=Jچ+I|z?0o@,1|cU%:3^a%ZT#˝Cm\:pGnN uL3psps_ćh+zהa(L$v_VL˯/S!}&twRUZS:؛ol\"lTLa'Dy_Lъ򾈾H*9oMyDoiٽ P(vIhc{&Yf\]`]-چJڱ,Ò]m(D—n|[X(kg}eɅ6lʒ6h-GtrkF+mFGwn vlhU8o oPpEiLW7Ū?\SC*7VZ _r>0|ɻ1y IM2Bv9!3fKG)㼖ʤtlPMl_ ܺ[u”N%VM.HXՓ{M5_vYXUUՙfռ3|WFbf/aN?+k΁ޡ 1څ.oj:U V*ϣlר)Ცkbc]*օ'ޑZ(XTgA>Dx}UKEh l} S9ѬNal4fN cמͼMU(MvKF9zy396: <$u}"iXlp[w6+jNۀѹ]:ٓ=0<:O/նNubĺ[DŹ݉lȑpeHxaSnLP0<&kzp )ڶPOOڠU%!RXQJE*F4RwJw_VgKӕ`j֥F* K.WM+k}U1%]L?Y~"^1AvvR=w j v] ';<ׯV7P)* sb}R']&{j 'M,ޅeh'u]=thRo*C oWuU`oL-jA[$A vxЊhڦf^֕ci-zۢ-e[/"ěvEJx)nVElՄMunt A1Pͣ@3rmFJW z*o{*ߪ T;43lGRc㽸INNTiTc6-b@eׯG]vtKEth7[V=9ހუtyͳ|Um8 |_}eg ?`!TB*i21a 6nߣ:CUo'ŧ+KvȺ.,v(,ֽsOY{f3yT'no'N}~-M^ Wc_ΏMC?__O"[?`IR1ٯ3 owIHPћ>[@,ҳk81̵edy$t ?U Wn-˷2|ӹOԀ|K_쩯Q TԱIڪ?d?@Sn*QiW?sV'A ]]MY/OE$@VIdg΋9$ˏ؉Evdu$Y6$,Gvq8%$?B4@j^]4.`HHI(HJBmui]fG-;6-ٳggڋwח`R]$1Aqʘ阠?tLPK!&hzn.uNx܄l&3y9%%l6a|LPtLYuqLP1A))^7N'߅dtOQU|~AAVP$ TFiϋeI\YO*+?733??SĄfz^dÃ7Gp2yC:x<OA~%eԣҾmGbCO?wK%4qFGKjߙݝ!7PCrBԙ&XVa>gF "x[ALUMIEAiɨ3q_2`M[#ݴZ#SL;^ٵ+u:sEb![^YJAm|T9X_,-PשU7nkLtgTZ*$NV֙{)t?w_S''gRށRdW_IdMQxSVY'VLZbgC-D#brF$b|Jq!ʁ]La鬤MVITY{4$Xa<6i\ۚVwb7b2*;7zeNrL3GR|hsW&gŧ#F_ *}F}x l*dDj+ F009l9g<֙3"MDpfQ9\,tKQBIDQr*+Z+M4X阹fmKWX%"f4|*;wvrZKz~U^O/S?o-ߩ9 '?oEK_ oi7$zZL@g: Sv&B I 5OmB}@Pꏮ%9~Sacy3(LǟԿfp"!^NJF#4qk1E~. zx6"P`Ov >=8!+E 6 g[z&~uܰMM}z O^)/$o? j;/δMBq byJwf8:cC{Hx:n*'?)(a)"oU 9OGT=88&\qƱXå}=8*SOθwKD/PCcʗ/u"Y_ t%OH6N ( N801xLnY1'WBgr`BpOqN?+w?"_'Jpi<7MN bgf27;;?`S=?g&wRzK:3~;]gh,dǞ~(_N|+9¹(l0wmN$ 9dg}~vÓ~n:kIf[/s;O靖ۜGJO_;f{ /1_O{&w:ͯ&\ܗSt&t bGzq^w`Xitlms9?d*K˿z}@FŨp썟Lil^Z#7К%,),KɌd dRsDt2OIl.OZ:)PUJG>~>O% &4m\R'|!Me9n$_B6] j@ L.Rx<$x&ؤB.3IM3T2dt*rDֲd>ɦs|:R%1Hg҅D>GX6J'SJgT!߹QlL(dIB6OIT.|"䩩xEY;d6ˤx"CS(Kxq]PHIx!!8YyD:xB&3qb@#l!ŵxT[T<*siS)i.OI/T%Y,AE<%$PTd&A'9j.^H'4HPG3x6uOe(?AE) ϐJ sdtN O%;'M28)(f3޺!,Z1Fġ@2Bۡ y]̊}D#r!ZjҸlhqeYn)+,? U=Ď׆A Drko⌽#R#jkuk4JTtl`h`x_#K,RI?ˇIg+5JC@߈ Nt_=򡞡Fy.קuC"ufI4WF6@ܞnޓq{ =Wn/h{s*.޿1z3b&GDåPX$Anr3}yfK{xRIP])yc3NZT hdE-ZG'EJBMPXю 35r+Z(m\JA].2Hw=dh43_ֶ7\I>̐JGx0nҚ02otc4[F3 Q <dW#ZvtۘlSLMU"=4ʛb`iQ;U_]^+8V/xjrs6C2zВ#RRlHm͒I9eGi(n $ϿWgs)_*~]+6ю~Ϟ;v_y+CY"{*n%y0`MvMѮl 8:ke g_NW(s t9- ՙ`j|"t_  ]{*=->B72FIHiwTr=0ta#=$j73J#$sJGJ}}Tu-NgKR#:l}AX|)D| vݪLS'GgͰ(l"mkOpC9yg-op^ l^|V_ۜnh-Lgl&AB{dr*AGv,ȧ z,h}[{6uYY{Ԓyy oxDoBIo{Bx#RRDiENhѽBխΓT #uS85ipG@$ж]RH U%vqi$\]insi¹XeN@D AbмKztvjQ@c8"(Hʭge7"478d-u<ũe])DnȢEшS#O+P=o j|he0T[CI4R9x8Ĺju ЋdHqȝTR 4b&= z{6| <k sxsYr_im{mj*Nnh'wKH7WVxZUΔLuID~bN@* LumҚS)=9MSv.vVB9.lQ-3'h'F #f9<H6H;\Zu6 0ۂQuNi]`V$nAHv^;;\c\=U@b;4C)\wvvR[qv"ES:h^t O'La@&! hnQnKọw6 m[노vmm=毕\~Τ^V QF)Cݹs#F04ctG&z{SHl^7f 2~5]#Ȗcx̑ufY*.Zd&#v᨝a,.7vnȮ;Ν&NZCB /7>}>=fNq(su{NCwb_ iZaa|ħE3*\얽̌A>3hA\G=J%μG(ë$ oB֧^2h.678\,%Վ*]^YV.U{WdJFfuiB̰YY>RZ\4#]poOvM>a%YCfk,*rH/SIŎh6BUr$m#a/YբIn>-ȋ|iL vFzkL֋gg#l@{Ї&Rx7DBhh,fHt͖t"#d1iKў%ըgR)iVPm6G$%{ȉ| |#"7!o2 π(o(T12`2z4ɵ,ݵ,]F`]`70JX"K.._'j.X! -8 `X(6 glj- ~挕I'WQnݜđeU>ӨnpxUc](ǽpSC͑ v&%I#ȫH]cTvxrnM;j,ITKRQ81 mD;[(uD~?&JP BjkU>:w@7v[ a?qQ)J B! .cHEtSn3f*5@V^"ތף FZ!O !ܠ 5.VvIQrD"42#mw*^z-MvcYX^[^TDN?hRW?< i@(s:VVZQ)yLۂ_H GVc>(1AQl89sz܎v N/+ΈQረn3*ӳ'pWz#F&1 "-) c.he0MI&π8EhElzt/U n/Qv׬z-]8>o­5ԛ5BQ UyYDРL㒹^0>{*M݁*߹p r2W;|I[*&^2ET|ײD ӵ;=$vdy=_- y&6 - q 'ĿCLx|P(0H`a(8R ;&W/8i\ڮ)}|uV1_-T|a_7*Smn.-Ѥ3J)tӣ&RߡhiN[}Dk$;Mwك.S]veTUT=*RkKAq_IOwp8RQ@ntwރ;T {|CyĨ+uB^A(O8pq-o|p2@0wF %G Ń,QcKR{ qrt^Yn_H$nӊHQՏCJVKN%ڴ*JOĬܩ[ٌh?oy &hp>jQZ13BZXc(tc>aB'$t]>7|$2Aj.W\*'\exRp 8,'\2ƽ"X=&Prf@hy׵\GE6B-J^sNY(zp6o|]r)r?.htiv305iьw[ѻ/ Ʌe>B6yЕ*GۅrH{ Mr߾)ezzta|, whl:kWu;ߓjc8qx|yTJ*g7]oN v%lnG G-6Zl6Ѣ…c~66[l<.l.lyҰybIasIQ) -WY lxJcMUvQegb^+՟ 8lo\C oL@ϸDlxFzϋ]mb|_騐w^^vV3d[^D4"knP*BC[tBƧ!!g}10Z˦i>5ia)pv l![, 8 xFnj,v vZ\;,p. p.x^eK^o{-p > \ /Xz{-0p^p.8`W<`+Z`! 6,[* \ x l8jkYZ-pCxX` L[``<f,p=n `EWY` @VCh*I:WV_PW_ 0mA Z 0g3-pX``FY`~ Jz.+^ k@Ӏ|x-p^.8jY-p)#x9-PҠJf=+ y4h9YisܳҠgAcqJƞ㞕==+ {{V44hv/qJf4hv/qJf4hv/qJft>&9o2}ΟL &%sd\4>/L{-p > \ /Xz>lq4d4d4d4d4d4d4d4d4d4/X er9LNogEy):.)@mp} y( 1'EN@S0v V;z |abbbb0ߠ5 ÜcTZ9ۨ+o6DG$W8+- ΋˓TxaDsf[RT!µH:bA-\kj!ZpFC,NRplKFb w}µPr=#d ?Z~~4Q*#Hur6N@֍%\r^~O\NkNVpl4ٴCm6l B8X ,R{GC^Jh.H"H WEXW*PJᒣN'Rf$\j`*ʑ5c&CU)A^@ ř^ެ R^-HV[A ŝPX*nс,73vPt):,*m|?y#OH(GD4U-*}*'hzt^nʬӡ*NGN<ʒ`p"t0KH9,7BQTY%+#~SFnU0xq;KTi U*òyB5{ 0~ _9\`Z:P G4p$I ^U4x{]JH\L#}88LEȐ,dP#:6wsY9]MB<Cb;(Σ&z h`~BOAKͨ BuqN^8ea!XlUbZ%11:ǬݹYWyl5#`5VT:"54ix=V _*6!2A? Dr^L[}#Z݁y/, L@- SxyRMd }1&2_R>Q쫯 %7YlÖ6߅(ⷸ9%߀X (ִ B;Qݰ}{REzMfjIYkX*Z$ѿ\ˁt'u F"/ 4_DG"NSf'N"(Ty=mNLÜB]q{]kyab:"J^#d02c;O7UTF)'XRCĄ%+MA\f pF\=w$U)mF2Mt*DD͆-똠0HAT},yωKb>d3zeמڅL5Ʀ*]pL]̘ݮ1ՏTr9A,^l"*/~S7UT_؊{蔘!=HRq2`7B$3[ELReun ;!;҅ )Orac!S>;ۡ* CyfÖjk˽{]k#6lnzy6iϟvas%IOߝe { IxMD s m!'J hly􀮥 )Ż2!C$~_~_=obER>QLH`L|jT({B 418a1$b{h=^>/߫XrH:p1't)Q&nw!EȰa ?>tsB6UhlAm!8!;]-}d{ A?<OOY<$.~%n wTа?ioF~jU̢ϴ +p )rM5#^˞**Y4I^%egJKdHI__ZJߴ1үT 6_9V/NnqWk_t5I7~Q" ՟8*f⯁["x/pʼaaGm-?G^#5`c^k jkƍH h7H"P/0"?'K=BkaN!+3|V%;¾h18*uRIBEH8RAzH \F*u 0Vp#X5bPW.bґx;JYvEa 3|x=)onS_T {i"okЧ]2/eE+X{j3d۠]/A)CTHM- wf%s2 {gjEzaOTܰp;3\_uW7~w􅳿Y+Vư`hP{fNWdX.eQDOsiW;]qX@x9 W\cjx݀ZN'^ -y*|q}>^S_UN0x-!!iҥϘ=#.}{W{tYݽg= .y;i{\R戱[G^ 8ćfNC39iz*ur¹7*_Ha~AYg)XQ O֨vRoO gK :: 1~N3EҰS'%!xzb6^ee*8өy|+cHI`4>VRQ:&~g u3QTĕjԃt V1R/? 'c߳vcaʁUgjv8jPExoqj_AE/_M҂|՝v<jGאD=HI݂M%MJjteIGL! SoEd~u5HW NW|]o :"U_ @c1Qk nr"ωDNdDf6WAR, 僑c1-+V^c)-o.W׾߽ec ƖeaB"ٲUd[˺Ȓ48YΚvL֬z^6)IBHH! 1$!< %R;1g~{,ȸ3`e߳>go({b%tTL뷈nm5IF>' g&F$7RZX4P^@@x3d,{Bqr13 O Ro;@ 2Jwp+I *HIؘSYQxژǻ|wYwߕ~W] 7Rɖ5ǐB~cq_  t| T/ sL|ӖE7y[є#h0FRHfғQMQRS)Wa֚/=꘢0;1"\/ R՘w m$*dG>:S˜YSL8FnS6+9- .H|*2h9%IyPܵLʄ;(;-9G6B1CaզSHJ^;~1͔!$L% EQ洐GhtheȢQxZtnn"XJ#YjFݪ2Y}uWz j`\>PoP(y#b=UzOG, od^E$AT֚jjv)Q`](Be~q: mV])nn0M4TTo$ȺJ9i9]i{ Iܬ'Loqˋ,EARN5r|U*L񫞢TJLc]*23JX*WNo趔( +) dFa.fN2ÊL؎!Fi JѢ5UQϑ3*OS{G=!Zs>2y|pU j T 7N89Pis\Nz}=AG<=!B|nlx4]GmU\xak1Q(b >%8w"e,7^;|*Ot.]q,5<8~N p'D"GkwS70hUxμZ ,}%k.TOT"0CCrUDѫe\Kd*_EN߼̇%ܼHJb?M*O6u*#zRYe@s A;xZ,LގrkfVh,2f!oSeygd"+Cmo2o{nt#[iW$?ف#^lGcnkґ%i'KG?t3WpVD) ˣYrp.ݣ$Ui-W{X\Ϥ;-0OD-.2ӓʈ*e*V;E[?YBE]ѓICuGTp|%8]qT#D3m;WP*P>2-bQJ+z|\aZ ڗt Ktue :.bU{`S('MTT} '=Rv:R|PAmπ+b:Cn>qft*il)-@Zs{A򚹶rlVpDqY^z^kqYk][L8X3;+;.'8;m,,x\dJśF6Z}5*J9>w"YYٯ$U iO}a[ȩٖÈOW)= F7PbE~eK>xP _[kezSLd :HL ?+Ⱦt)4$\4 [: Hgyβ5x3Q^pisg BnQGZX:y#N' R?Q>,}<~?FP)#Q4y_5?;2=hBW yB^t.p\\bVF}"'$eDX-ͳf|w"uow5.]PWG)R@CJ)Oټm%HWf ^~+}#HxJE#Գc A[8y3 [O`B*:9:˻B=xKښnx:,Wz=m H*݆?`X+{1.[XjHǿM&cͯv_؟=e}akjKh-f.&[.LDҖPҒR*nr1[K'@RE=עG=V%@ՔU@ ԱE,ۢYmjuKA^pZ+eky_T>mVG͔͍-lT:+h<&3+Lu4fP,h"AY+#(#d{+3:Y *@89sl!61.p-3"ڗSıE؋E j菇-Zo(rʾYrޖ[89f-\M?+-?mhș[>idpwЫIWStvMWu`z=+6c~_0Ux !ØdU2QZ>V cOL*^(Z;;ڣY{`}kǔ%Mh UCCg A"8FkY/O'<F"F\Q(2H{BL(eVFs~kiU2%mMlڣ Fʟ(7~/$z!Y{!Y Ep#{cË5cË 6bϋ~^.-)޽r!e1j('4$p${c?.bZ&1"QQLI#>= G+(Mctzu0U꿊ܙ_&ȡ!C|a#I!2þ$]DKz1P2At_OƁL}UBf9 zhz2a\WpѨKɰNu8PN0p2J봡{cW1VT,dG`spI|įxQ El"G҉I&r$ȑt"GL4 [#~h@%b:˚6 iE[RYg7 x3~jxӯ  ޑ-Qidex/Ûvn[hxKG3͵XF=m+[J'VCn#Yo{zBS8܁&}Wl%-)bA"U 6o":(36ZvZ(;PlⱈTi6gQUKQՒEϢgQJfQJgQJfQJgQJgQJfNCYSt" JХǍ WaCF!'0bgL1§`,Ƶ, õp*)+lsS١  7GCjQPլ֎-jTE˓ؽ_%S2>422BJFqkNc;ݛJ+D>Myt-Vd5OV p 6J{v&Z&@Y^5N_kz$,3ItvusωP͐P VvyVA$G9,*% 5! Aܫ5>x+z8@ 5;v9*jC.I~"5+ \f*2l.wEs/g42fP- mEաpeYUo?awr |2$R _*u+jd\r\UٔkDZM u7NiGRc@g"Kݏh@ګ[\g<|gEǐa {x!0DPQ##tQ ߳)z"hDQWUh'bz1D3D_Ehf3=J{S5E;C+m_i"jK8`k睂F=.UB1S{&EzZ&C>s3P_Sd~Bwcww4vǻCJj)7/7]{QoGz+P3HcԙqM)v~^8RC!bNPM.B &9㑣g<%1+0 x.W|yد Y>C`C |k򰭉5yXd(k,Q (s~nt聋&xQGs\j4HJssf) GOOv~o;$a3VGA7+#_LafM qXWj>N䰾D1=Wx N-úUEϥ39=m9)ard蚻J-kK_!]fqm:mc3:|zKP_MZ䫡yeM~;ضcDP%ˏ8Y5y!n9o4=ޱ{X>)\@q-֜{3 d5\4kM)jGmp'9-x rԓ\[zJԀN%+SFv68tr{{:~nh>d_I4(odSeƆGw U8XCp.Sk1<ϩRl[\/@"GE^+]M'f^ЀCcΩ-!31oA0\/>=Jnmf0ďuIIeZd-]C~ ṵF?~W+UU˞7$TJ"䷏ՊUəZs| 4"o=2t ik mgZfj+PƜ]9}\WrF;5fiU o`wapuhЁ/CuF }pv i'su2n@ĮńSQ^Y1fa;Ah(Wm41{y ) i!O:|#{&3ɐIL2gtHZL >˳b<:fzdz>^4H ڌ$G3;.J 9Pؤ|ΟqQdLu >'n>hla YYNmZҞei(+=i _M < Ƕ_=MfbjGyd 0nQ@,M*=͇H/c`?1[J4I~QNg{$_ǢrN Gn*oۖNѤv,-ha7iF۳2"pfxx^!6cXK_c[Bjf@ƣM U\|F7Z2j aJxdoGHN1@F&>vﰤsO%R|M.kjЌ/ nŏ39jSr: y]JyH[iM^AD$ӒXNd 3=H.ki=.:ABd_Q!Avkfs5 W?h7%GwV%L;xgrY;EԿ{>x=u|>Ak"%&DR G~%)XEUDZ! >fƍ<~8ḵ)8!@ڽhެf1cZR͑/ˡh( ]C_-b{D`hDdZUv!=&Epn ^󺹴6LX'}uM5DV=.:-"% ;鎿^^p7M i:$CQ֘7!g^_ϗ-;-ps]=ZWu}v?- 3I11ΐyދ ʏnxY Kr7/@Uw5b:$橢G=U洟?T_I Em!NGsk tFϧ3z>Q?Qc9O8H12'(qȃ 8&6>M"l f[t5-dq_/HpCay K&N=_Jt^9Jst)ra4xB#ђ`p`R\ ?,L)~J =EJ@T"j~CA=ߟ^x=ݎדx}v~-;ʼn",ϢehTZa s^#P"`Vg?S/_ē$,/2I*a$@rKF4ߜ`276zp#jǷq/ wnyB ܴeMF×ShԦ M OHФ h&6 i٢o)m&k7[8S)h>o)WS7u]_ Yc(J|%ަ#HL/Loڛq{:^ʽX/V^( f,{aí>hdɀCS߄7 W>KƁa@Cuٛ#CͿba8Ř&d׾[B E`/SߒpO<%'0JxAxDhiZҭ~YnMuk2[n Ӻ׽-mINLJ0*N(~(_HFGCr2/wiޙ.I;4(KtL[ZDFឈ`(D*;!pEH׉jfT+tpxyW4n}rhzM[=xTMߌz?Ȧ#E$d{'}I`r[,eG^Ki]ߧ7}jgerT+0id_e_4!w<Y;Mb\P_PLsn$_:Pga;"PCCEۇV@*>վwdwɀ/pf"R-DjXK X$)ݏq&Ge!H GBlUxVIm̲NjH*Ǔ9g/ 2~<ajdhWR)DLƈا"_{"]CCvJ=5F5P:'}cO&=4dؓ1^5NeN <ύxʶ^@[TO-eaeq0ɰM~2PS )yD}ڏd$O@ tG7蕣zs[ <ΆM$s|&0HƁDR5[p81vX}KH׷OQc +V.e R-%٪orcU gv"pʽ&snE l+eWR1r'|Yw0+r/"RcE'(9&_Is~;رkQV+&-XھiEJ;K١쿺"MnJ fx7NOⶭT\EQ?RRRT)v]S,F,vE&VmF]-k궭ZH=3^}ڐT2BNPo`Gg_Jg;KKϼjV~=91>lZ"hn@WY,q§-8h WȳmOLJq(r##cp4[Gq:0Ry-%OJ:.P*w,AeZ|cԅ=}Hgs 3 ҥ,r( ֐.4u?!c=Pq1njMߕv0@ӕV?8*"5lbXι>F6. %X{]W֑!88vg @\QE; n#:42('b_ Y̛zC$m='/C8Zf-YU۹iDlE؛.KP/sR|:+AS"1 9͚t5]fȳݽX:T !%5%!B旂]`qp6 qUlŇ1 {5%*j8Sj>)XIb ~*O\O!]I4$mz}Bo?$~= gYXt4m<0e"^+25X&".:.uD͚]a.-c$nxg2(p|WQh~+"- _.?ko"Z~ti9'Y'[Nd2=1\N.kiW+@:j?~Y0c« 7B3 YmYol?|TH!oW&`/*5ʕ4xJ&σ\EO 9֤6mdWkcM4nR2 5hܪhh!hزIA㦪d(y^mZE8tGj=ZOԀT 7!o 52J?%"ޔ6}SM>ݝ.H{{{;lʪlD)R ,.+@^!Ԅ0RxoXr)U0ncp nhUݜ~"7DLxMK2%tې T6j^ί&JVX{]Ň;&&jcis!nMfuP,쀔K v{| famB̡96I^P# X4M`m=Rt$']5r%8QG@mqvSqClK ':*$H'%}]NUѝI;YĜ@#? t_"SՉ lpgku꺀R{Fa0p piw4[̦eKiV. qy:`~}!+E&C)2ʅ~ue+ "JJI> Jpto_ٟGiXp2]c9 '}хq_)!&Q]_mq't6IU4 ,G[J XeF@X %}gOLxEZrӆ8_mfL8d{ {Jk"il<ȉgoX(Ys@syQO7XNґ֩I:vð,-MdYthbҽq03H\b SSo7S M Pʢ:)Zx㩱B[(1@T Fl/'4 Bml+U *=z~-P-mE `ezD;uwZ{XsW-1_k ^C&Szޫe>D5a$*uK O\zqy i,W;_8#f<5NB %SL/puPbO1^3Q}D}#~U3x*?2(W_]<ʭBɋXӝQϳa49 cS0f3JR]`'ᥟXL2oP"%3𱺇tɫӺU}7?(p`}38+}֌\=@)ܷ}m7v>1u< ޞ ۬”ޡTN ( ޽ *?~x,"pf }ZK@IF,3~e泛Y}ŏ%Ѭ&,7:! `yIIwQ¡JtmxȻ[BBK3Zd"J`"A_`6CH2qW5'*U&Tİ"USj/ic")(0ݧ۰ߡ$T1`̢*F*D:` H1@1c#8RgDZF`Xpa} ",8;V vH T,PJ`Ă>C 6l>jN !1\w.vyHaHBXP&y[wMAK.\ρAqg~=ksN95[tbE"Hrx4lMٶcv\vo7AN-Sd8kC!G qviq9D}<$Ή:/xҭ+p,ŐK=r~jdmZ 1ؕ:I7?'*P-@; >}鋚鋛{ɒE /YtKlͯ7{t`$[PWx?V-3Y~K>rY}hc}}xW.YSЭNi T*g_*<]9RJ;ݣys(zp5elQWis$ԇ>Yso^zYs9wW]&)'TAWY^3X#];otæ%Wu˩Է^_wh ÐH9=aZeQn_T`լs֮[%dJeN|IjSszJ#\.kW*[v\m-0 L4͎U*bg?6P@QQcz?i" S CXkh~{XqXٺsp`G=2T~u{._#'O,xWt2tRG;:,_tB/^>,%uaVWH(~"$$ JQͺ|wTv;)Fv V-OEmU pe&VDixTAh._pe|dptldWM{cdmf`>qb[6EWWL|O pLIUn=JU= !  xPd6~5h)6ِX`==3===1|uwX]ZvZaTW+$βWf Հ3 (5n%hQ>=@5N2G<~G=9y߃>@++~|6~~ -(T|zk~"h{'磎be"h Y!Z@x՟޼O#? ճB~6FI_5}k8g;4z A fv?_Ͼ io_L+'YSJ*zߡKiA͸hލ^DG-k!T ]޹o9jo5QE-H]-E~UOjLg c#΢>EI5U6SBmIA7Ĝ;JU!88:2DN5utDyE]k8cˡwI~k%{{MܓGXyю1 o .=fP:}7!SHO]O!4(7.;)b)U$Ԑ 6@&PSbPPR{Cb7qtRe7J1ͦ:<$A#a:Q6i^gjZRv*n"b<㶿os,m^D=﷥GqCH\Dq 4 3xD`6T3(Qgğ_q3;>nsT]Gz?ϓP8@-֐4VlO"bZ)gP )I$3mBKj33ldq6#<_ Qgbڙ5Yz9۪sHF 9jACʑ` iHY 6JٛA+Ff|V#U6谖Oky=:edRڱN봑M!-v8/AnPGy/rp41zG6M{;^TɏÛAH!9vܧBẲMykM1R {()VӁOtlsBp|n۠q gBY%ێÔgGvmqU2Ndń#H4akbsf!.n8j?jAry1>dQfA.^A5sczO҂K & TkӰ_s?79%Qv1%Ck3&O~bf,ϊupW®%fv>NhmKCAMwyZ5Lw^7lUYoМ3hhW1I $RAӭ+}P SJh3&k!Ofw)d 59v!bk|(ZCba'qyj 0v޾0sb "ODʌdzMॹ*f"Edg,f3-r{Uh)d!ZL`X\ Gڪ`TxʱP,W?+ 1why^:ϫfɠcoZБ1olɃ!f4d\bM^_BW(5 X' 1c"`){(UW JBBޥ`׾FA;@Dq~=@>gEU7r\M`٬K~^6UB+<4w؜bmqoUh{ƄʳT{{mMhD_$[ [[_`[7߽jSf|5ˀֵ@;ϧɣcowpf_gDY6 U pwN 6`tԃTIKQo-бڽ`RmGC E;ǘn[cZg%3r1cM?m}C6Yߣ6ݹ[[Ȇyxծ7o?8͛WGϟhoG?$_߳iɫRYأ&7;3͒ȟ$*+=$#CO}@?j\ͰNU.]oOX5?~en?E\?,to;(=^4ݗx^@y` QC )i 7P[sX3B!bX=і 5 t:Td)f_A19X %3Іz[7(.[RQ5aH@0[@x#4VƩqa:N -'}gaé8h|z]4,f&õtjT:fE̮R)v՘4&.[뿊G {wn~-#O:RZ ^Ϧ\H)8:Bu,|.RqX,ƽ!OeRƩ5O#p[Uy] bi hC h ԝ$42Yk"|HbtB㙛 OمԊc !*~c5޳vJ`Z4> YK(u'}p5n񶋋}P88pX[k[M Ksu#$2qJrxWGL^z,tguqQ`AsAZ6O' V[/f7訌K"g'.')wPS]wx%V䃌pEёcv[:֣R@.MƁKBW=FAo=?۝1L>+@nSW(bDhPr5rC9#GՖFG&X (`Vk `e* yHG6ݲgp]jP?#[`PaY`""rjiѪGMhjD` <'%.tp.I(B8/ЄdXOH2IpЧzAQL _mX8~f_:BuϮ m}u0A# L3_1HQAX*#\0 FY_cV` 2 .y_V@P Mfk "8Z#Sˮ8}@^Lf4a/iI0-8:Q }j[9an9&vZeC` 6.C.cl CuLόmYU!fV6oÎXةR S4q5s!"C0Q,Ɩɰ&"iHJDV5>VDN4 Chtx,͞&7xiMrj"EiMedZUWv O" 5%m2̑䀼vnbRąs"mdh4#hr'Υ9r)+eto.!|;Ӄ*JOQxrCu 5s:xΎ ZhXF yØåa(|YK)V48UF(M9JHmȴ bP>}4?Ȑg8UD>lC:tP6Ƽ M-O"gaxXFK|hIPyƿāQr \Ět;վZucg,K ̮±AP$ !^@DY,` {@Eh-O!s?vq^¹5gL[ Yl*j!VkJ."ܐVꦵ(J1+qc9HAuH4Xa!GVsa N }4W!h= [>4IÀjRg] BScto^2j]T?}+^RjMgRUT(P,^uخ KBQ"[-hH{'EtՇWP= fn $BYʮ eqƭܲ8p.LdHCz˼a"oh%h$S W042+ʽ1IRS͡e˞Ow^Vnmf<'γ</࠿=({o!hBݢ\&_^^c0UzKK_^ۑ8a 77дlqE*z8hQ!;Ky^{謘`Th3jGR<@WpVdx!2d3bfXŧQGE*:UF4j1WO&v75lR9])PP\zҰE$ WLFe} 3%tYn>D|~g ~9` As3m*JE|h<ayM1^4A %m-@cƝ_-x*dMkؤ5@  Pq^ vf^ܶ_K^ϹPQ? 2[&Bu\8Aɠ7fn ͂/pZ@i[΍)/W ڈWn_W%6N|'oNTj0`4M-g"}&N8۫fSiym '$ᜈhi !u+J!(mAM,зR^S^vJ};kjuox+ftIW111JIPA낛v &8^IC]T!eQ.+sN9YsnZN3=r_;ϧs#Z:(CQ\a}lA*[f|)UCTS) ̢C ;.]V{"a:oGs&b܀"r2-p }5'+tYZk}uxfOu%8 P`{Oӯ~R0}0yɜ CW<A2?xIIEC҆3p!荮,:yS:A@]9Ȟ~#ThVIT%Б@!)-M@+喰LevO3i'0d@Ge g8b04@}"ʨZ' ab!.Hbe9KQHQjk^E袁8¬#}- %*(Hh(dFn|Cqxw)ż}[znލwdNDy 1(ےSBu}Xjsow?ayZD>{#v~i®G~S=Ues~G!Gnej'! G#(AbB (+Aval/l51}JcKבڣ\T6~/$^w,z}m @Plg|VsVW?›oPd_F.ۦ vq΍Š&HQX9L(OXߵ~?6Q~Y2ZR}jH@׽~OצHBed9>1K23܆7.E c Q]j[x5L$0)  uy7$٪FVNMRs{\bk^>S:'O9wiZu#DuYQrXmL#s|ӽ*g Eg#^b>G[/6ðcp ?c4~-d&ߡ㗠?hX8 N*?Z;l{{ky}|\Ԧ϶ Pi'Mc!hZnCf#!+|hׅa%dB;V*.p| Sj1GiHoVd5lvVo`'[wHnˆ8QGoqL\e]cO!f;(׿s3m?jQe+?whQU!5jw}2h]^ J^V{".xF "D|(L=6kEV;BVo$W[XJ i.Xs[ c1`$F4E{TeBmQ T"~B-~EW] >$T`jWTgfX6zM\(I6eE~,D,D*"DIˠ1YqHQaEB@LFrVJ;sEgJZ;\p4Q{''݊hE< G1,u貯|;4uv%x~XfR :z<^ (toU'*QqDȘ= {Y^$`=PGD ZSl@m$r1 Ԯ<4{M/QdX'Cy)H22@2+xn݈^>ثY&gbI;<c;Cd4WhM Oox]TTAfϽw+?UW-őF3Rn> Svu+z)@{uУ |]Hp4p__%h=EuV-KIES1Ux65 {Yjب,Fh%NJlt'?y=Ǚ _MNt .k:^7o+*Z *OWߞ{=$ʲIX`Fpn&"?_-߲#rZ=(oI?o6x֪t{K-~ r\kX? OB~[%Uw7 RO,hY Z 5Σy__< z}׿8o̠hz5:ܑ7b ?XlyBԖ{>M:L:Eg٪F {7Rs_X R rWY*;)z),hKK K3֥knQpa _,YwEc>=44Nw|OXl!y}QNFZFzEsh7r=_6{X?ww}3k/~oIH2 #U,$ ^\2OCmζ^e/k* [n

ϧʺLFv_aϯ ]C. ÞXL]\lu"7v:נrfU ~d4 _KO몏aTEǎYvܟ^%k_{IſFaP#< [qfB`DJ5BHqߐpsVk" 7R-P?G37KɨɹE;I9nZ|=lu9_§mrwߧO") F]Y^Lp.nW]ۜUQ=9čՂ?+S׋W04`B7(7xFoIs[ 8P݄oi/nqKch?5IC!]ʏ&uj'Gώ@+DDT=n6< IalVQ,Z I_/b9շC-Y[5Mj#*\2 !W6, ^PP/>xcO_<0 "ƒpt{>=zq_(h<~/ﮮ}ɡMӃ"f Y`N`4<㉆e='MKgkCN,xY-WbpY\rD`J5s굼Al# fH.Tષq;CLWD>#M a (-9$sDflfxXI*QuW1|"kRT~Jx_ǀptNsSy>V3XBn(_?܋^Csyk]~>|LP*JOG5r BP6?"ɯrs{oB* VEyf<x9]FPXJ䤇˅'F/8R)}F|gʱš)M" !-x 1nLK"Od\ k&a}#fROCjO_ě++ P}E#5JĀ>?}Js"+j.K.PWo~8ZT 2hXɐ~IN I;^ L 7\tv2e<_ *6p <'UV)UB41J$ 72歜8wy_qX2cck~rv}7M7"bm+GU1]x9S!bX|[ı@b82{u2KCR"Pie'$gɛZMt,f3PNJTeepX|0h"5303A6KPkN@~,b])8Yܯ̱o)8yݯqRaɋ-"RD:d#/cJhcˆɐ; : E 4 EDU a>u,!UPm+Jӹi,j: hv $7aJ( $\T*K z!*UߏnIJސ7 {2l\;ԨЍ 6e S6˸4l^0ljEu{f~CFv-`K- mfO~q! GYW[;fXXd X5鱆l(CyL$fv<ͿQW9^NaR*JcܸXB4-G93 ي x@9֕=D8.14颪jG~C%v`M0K}z)1^Ÿ -ʷuqYE@+tr0=gk6ܾG;sVe.=uV:pNr{6ϡY׵}4fFhs>5yǢwZ]e͹Fڴcs{FmXBM;Mvkvh7N[wV3;}[vgoۮյ:ri.wݷ;ݞ1Nmκӄ*p:ڔarL={-ÀvK6v N1Y0e f^s<˲x5VuL ӣ=L(cVVp.u@l j@ u87-1MX- 1:Ǣ@ P BdL}fCۢ>PH_Ք/(讕_4rMmܗHT[?6sW6VǨMŪ5\zJVw+\CdK4:3WIJEߧFnSu=hHU8dSO΂~ȦWߺi)g[`8+9ܖXݓDcWqΟOբ>ND;&L [h CĴ^|}u4G?d?ǀtӯɘ1n6=;bFmYßr+/p"YAf{&j`PL)Z8H:&ƕc[쉻,P (~q8 u @˾|d3O!-s>}^IoGb8?7 5A ">7p@24vPxubȃ89/㍓w9d|JZ.͏>2gq>cW{im{u;ӯw52J{}KI4+mIJ $Gʊk(nmDcZ_qQ:=ձq"=ꐐlǡ&x(fٖT'p P%WBe,*نMyځCI\ϖrvs˷07@3OeP/ Q< "T`Pu-5:B~"4}, ݇^y큛%BX5nYԆC0fYݝ\NooĴe6Q1.g3]Kp6d*'K2/'0^Ix"MℐhDD]qtR}.Su:oɻrdɫ'OWӷ>z:7 d8['Ky!gaGd5Te</H`4 <ɇW@(^';wr|OڷcmoTYhtr.]c8?$ؼA3M fp='O %XZ,$~]r!P)q,.V I22^t9ugx71&0^Ţ(t鏄 1e~5~1]._:ZN&̏_\Hׇ"Wfkc# mb{U#{ϮE]ݲo6"M/gx5YC/wM"@E7q;|Sf &*1DcD= _>D,nXMh1Mk9%J#/V&8&0_E:%&cli_h@˓GG1`^`8mX)؉AhL(KhCt 'ˈU>eDSJTnY>qTJjgX@6A|s+uv"X8n|ۚADZњ  nV2u:EвFkG^dKE*CŖ$Zqs^JD˃(WFlbF m+U!hQJj'Rb>e/%Vbx<0 *#V. R@^<2LXռb; c-~g~Ъ֏Xrh8;.O= UT@u:ܰEHTnrg5;7~] >p +TP ;3 x(r/ںtBI`8{,9MՍ![_a@oW&16J#}ѭ͢z[VjC?XPQ7]=tת׎QN#P;;a{3c|&g|\]⮇.nC8K_q7>h*XQ:a c٩BPaFQ12eԽV oI8*|X)Ó0ϕ%M>Mj&;bշjLmLmVDj!#î>\MxsS?lXxM.-HjA AOJvƞ. =edگn3յɠ a&a\;*fU|I&AD?O! ҢwFMka,?yn ݸH9%qƮ J<^v`qv}ðI]I]IaIa]>qHbSvS0Z~ /dk/d*/t.t}j檧qMkzHŚ/F8[WStKۙNŴ*^7.:*&yfZa?[7F. OZT]w/__ '_:l{w?]tc|x>ju EGEq|X2O?XF kW:I!%aJy}CB^ !/u념W: 2kZf:Žʖᅰl^ʖl^ʖᵯaeh=Y+:2 +`BP! ū_ C:xC(:xѫC(W:xChZʖᵮl^ʖe)2! B)WLɆծ dCZWP6tueC:W0pEahC(:xyxaZ6muW!Z!ZʖUl^ʖl^Nn5jϴ-E [9ȖeuxQC([:gufuZʖ╬l)^ ! h ChZ:^X/UP ]u#9Z.Cnz)?moY~s4"-G׺ A*"#(=|Y?]]ݚMYϟI燨Hxx]I6H)AZ46P=Fq}m05 ŷ%G[?4SꛟM9zS+Jӫ7KʝZ^#_kMrj^Kͯ'vrwm`wJNݫ➌qֵ oݵiB,ݶ)7oJoDz@H$* V}7ol"w].g&)-AZU3iO>esY' o>Q/@,umZMJ5ڋNypo/v֎lPyJטr>)5*~59{FU/!XEd:E[om#PCkOEpu-x$1 ,а 10  Luc1. I? uj^7ҌTyPYvb5gۮyʯykX/^~֫gX~{+[RX!<ӐFOCB94/2rpm8Oq0T3-:#*xq /uܕq}_?Z#]pټ+I$|{/iy_S׻<'3Ι5ӻjܬOH6 R&|)uwU+PB_|T^W4~wzIΚ?˗;v[xA_ Ʃ7+ g_0`HʉT0~A*'M3 ޛa2wPqW6#7yVuR9N>=:TW͹=p4w'ʲ~t>fyéD!CᇼP"od7pM}'(n7x ^ o…_ښ FnRyy*r-k*SP7xV* `7֯Zb^UD#XpWӳVnrA; 4 Ip<=Bp+.x@tB(<â$xԕ1QMω$x\3#xB4"tO OE_vh* &g]"/ۇP_h4Y0be>Ř[ gҳ+ڹfƍD Vs9mXEӢ3EGlr|f\)I[`<>ykM׉ x'32ww-Iph{E/IB H&c.\E:.:Ó$xBTI:D|A/ |e~Z?Uї$sϋBMyDO#ԗ͇%PćSHٰ+g9[(0n|z>bh+]| R]elya3+!wmHrNSwKmE"'"OpALK|8 2"I<'IpTvQM;D辈p].np6"WԈ>WFEWcE <,NQi set\4A&"tOr|A&E_"6OB_'xV4]D' _B5h#.8 NJ;J]\$L9=V`2OrZ0cd7"Fг`)Õ܂"ED@5͡_AN(0J WF>-2:0naȈ`2q'D O fQ("l606RtnS$ ܯa u3D[ʜ9*Ip|7 Gph {D dd)2:`ʩ͏!<(IȈadGDuetLTsyӂ'D mD:/i[_|MēY>|dd|S9^`*|X&q Fơ9N!󸭬p0Y.\+0nra1.QM 2(>mȹCaIpQVSē`7Cۼe'Ip]+:$BGpn)sGE9 nw;p2]Fw#r'W%Dg _ԈCƒœ!QxE5 <(/ IOnC_Q"xZ<5QxgEF_9QxE 2  &GKzRFzEEy+m3\Uf "r'Xed)Epl󄁖2m-eF`()͢Hی҂+O v(Y>E 3VTs :AaN0' OpTv:;Dk;.r(<=9Ap.H&C"#EQQ$D'8z =)QN/r|Qԝ"Eȝk<낯H 5" Vyk*kBO{Tӊz͛\<>TC劗l>HxZIsl;6aiКP`8КPa܊9܊^xd W UePcSGhE1'< !e a'L$ rr΃Il1)EA59#U=<EbrlB)G,?Ų(REgO(*J-+Uh6m=^%a) `/V] α%cAoYD\8J!JQgG,)%E qf.3Ƭ8YY8hO8#sjNbER79]fp'..G\u9M1bYfW&Y&SL*\&g %\,Rج$hOh\).wEl]*p2QDi)t"JÁ.0p1fy"A|B妛H .~2u[^OyEq,TV[4(#\R0Jq *T[p_! G5s|:[R:ǔΡc֛Kk@\Z!e.י|Kuu&_ͥ5_W5^zQsRE_o'G-'l@~z˿  ( (eMٳ"JYl8p30p1fy"A|Bs35ڬul9]~K{,7{qۀ6h8hlVG2-`R29)ff%A|B۶bvo(-Wnz۰Ұ҈)҈H8f.3Ƭ8YY8hOhzۈamzm" [^cx(,}, ;0\{a G'Q05[SCS`FISI$fItܿ?N#q.߿ )c9 e7cOQc֛1G@c s@ʌ9v|1ngz3`U5DԜTQZa~:C[`dh+s..]>w_B a ƓnRp)22? ̿ قا Oa6U6dm>J`(Q$ Q$iQ$Q$H_G؆#a&6!OגOG〔XpiM\Nr9mrpi\Nr3gȳn.|҆{<|As?+m 9q6<ʘ҆G9wnXig%o"/QFx$`'+m؍.{ }ײq(#< mMYie$|>6JA2¡&=.!]&#(]B]vZn.(nc s) CO ԟƘbF`@KJrP8Bm!XE XRָ ]4.`ƥl lCH#+H8,$JvȂ=a+ZVVJ4m*Jr͡U owCUhS/d-/ZO0b'U *i7is.WuEa .|E_rcc,=[16ԏ x%W9br| XV ?yVoߏ0Ո)T͊vQ ]2{͚]Ug6^44ۙϬp7 Y&0#lAYP UePcG_iE1W< !e aWL$ r_ +R2]R_0b/Q%BR.}(v< Q/-(5zY" `D\o&bT @DTQ>,؎105 £`^}Л bSjRE1c֛=<. R)uEyJ]fbz:BLռBԼBԼ´UyȊ1MzX0]|ttQt=WcbeECX2rD9A_fk,ΛÒ(xjPvF4z]˳eOo}P-^SC] wo9"XDb,A0pp*9#+".` L'#Z)'` 8lAGX0.4* 8\g 'L7 x5g!\Zk|¤G68aF \"5p)6 x-^]"\!`G!"]?mCJ8a5\N"KEFX0_ZL"0^7 Xp ؀pf\pD' ؈A~Tw 'E،p-?)`+O  p=ތo@g@BO#|BNSފi~a5n_6,*\ <,D5&`/p>G7}Np-o x?nwވp ؏GxB  “fP_#p܌ K-_p+nEnCxZ!a W$0 8*}&_pE_?C w |S#!@ f?w6 y3{93Ce ]E)hf=уkū:èG߾AL-MԨ*GU*p+ezf*bQH9Ţ$MK*Tp n6m1y'05Q5 oh?(mc0W&@o^;hlM,5rR``):(FJ|NIO+ b2̢h.{oO^7 ͶftF-Ɓ vЂJAqju2LVtV= )biCi`A(uM䴫a6}RC2Jiܑ_).`Sdžf=Pp+֐͵TK%JO) 6SL*`3)h-Z=(2[J\(BR1*応SCCtMG ׈הGYQ{KCϨD},WڳS*9O$TϦGpSEaC޲K?o}2_-s R^ܲb}?_,nyu4>%n悒zoKG}zSچdm&O^%8BWON 5E#j(tZ(z jM[Q_S*٭*#o7gEg6ywΟU<346U[Ϫ? 9U{F{"Mf 樼ǀs`7IyU3Q&Cѹ[^lc~rԛ8?s| cY)gқ%,C"_? ?Ѩ! $7ehr e-yOU|R퓲A F҈sy)))?{)jw/HH =`>->Ӿ_ }Z;5?hz˃Oў>eϘatgDaƄ`%zh:y!wss_t^tW|+֜|7򴮶_|ga̿)]1 NBW^%vB/7VۼdnEˊLɴX_9:_a#1 q" _kGn}zךr*?{ƹ^_PjHza>5֢p=Y L\m'Se?}gtT6C\̊zx 2B7@Gy|`gyU婘7Z 0󰎘 M_SMoJ̚@(R\Z JmU}T m$GS``"e'-QK&IyZ<-bu*Ǵ7G?m:cuP\Muƌw7n錋ߌ ;alΈ}mn v›`ofDd NDeKL'\";6N놉>;q7V;a鄸_?Q) NJﳘPWu/aPpyG :++w015gTͨAe`~".S 9Qj'r=@(ͦ(o4ioꭩSlzjc9b˱Uƽ,^aq ڼp&"|L(!P-.ζԟFi\f>5_WE_4(WJV`-a_W"Q*o߂0'Mڬ;*(LNZI+s 1\@5*MM*kœS}W}^5h>Ht`kN˰2Ao*#4Yw0DGA[d:섅R }@GX04EiS1nFOkies.;x&" ( &n sN7Ȩ` pB|`?xGtKD. MaUFQuBQOPK|ZWPB1ԎGy'-X[o!RtYF&w)rwE=q`g#X8L܊k =%Ö냺ݏGZnh3/ьIn?Hyias4M ssX:Ga>o?ut$ a]=h^ ,#]ɱ]y-ਣj#:eOq]|kqUSW V<':ŕz;s\0{%q)>3s}mM|EJ cLb_WcX.25v VM.a=`}k`ƘN$y`mB`0K]|K:;W_YGzU>u֊Α0F!8uւxSg0K:K՞5BYe'8wqٸA;3'sg0Ԏ@؁3D79w$00wfܙiK;.L'j!B!B!B!}!B!B! ^o}9:f{f3^k͞e|0? >$M$idUmbcӸkA?6=m+m+nאcnD]Szfb߅y!ҭdAj!҇ ~_$e\^dU"^PCgs?3q1C?]#}/_V@?)ќTOif%#,ksrYo ;&-] W)~Am ?0˥Y&尭9s_/,e'jc< 4tJqޱ \wci3\4CGRljCNpE-kd9OKE|S~pB6ğ[} ]s9#]s^R?n`f9?hrhԦ8b\.[sx3yrǂ]O@=̴sFǫoh]'z!]NQ Y5 {௜U5o]۾D(CWIә3؃Vwa'~ǪoW5o]cH|ӓU?vտ r֝Rj*0*=`[Us韚g~6V/nOE7d7"I ;l Z9CNO9c $mIr4&iM?-3_7e}݋7;NdodNK_6ULֿSá]Ȏ]>w5CxWst%GZEZ cqH+8|iK4f79of?v^fkS]6E[sa&^_A_s ʩת)}>KEzy)_Z?{xAy]3v]ukrjJL/7ֺ/7wfnrJZ)~kWN3ZMѐn3'0oF(H;sHO oF3O196lGlaZ_ߌΔ;>ẓHMH直^~&1D=9k\>}6l!/r}֖YXk9g_ʹK}Ǟ]쯫_W/Ɏ39 _ ~],_W,-Cge>?Vgt׸yUer]we).<#P $]~}ٛ*GL:\&.SWiQVu >;)BPMR=k 唨SFoTsy D2.Ϋo-]~-~*{"_|H~լ_Zhn}c5_wIƚmLS0gP=b.YX҃S{0>T\SR%EpJ*J.%W^&$J2O唤 puKIW,[?k20#6̨W+]כ U*| ДU~ׯN.Cmrn~ٹ+_֗Tw, 3 ۔qe?/Y=U?U?mߔ]ţ]r. r{i~cNAڟ?/}Z^eKsJ/?kߗ[*)Z\*B~ُ܏܏?/XYʿoJ*$ cu~~~{?~ꚭVVs?Vo(/USR__nͫ5h'[0_e_K%ȻuȐZ9j?,ACpoӦ}֡=h ᧠ x|Ԩ[ྱc.-a+tvʕ[1|A+pzZt\|AA[ٮ]&al{RApYA :OC,;AU>] /t edö;zV͛ z/mv7x24%VVF`emt ˕k$h3&E|۷ooXX?vݻ Z5$h u밠x:Zj.hx侠-8nv9sJh~cyA'͛:tAwss{AbvAW0~߾)n~'92IlwbAOΉNMa/|бc" F ^ޠ?8*1w;wv KA6m ;w^+l``(}z`*06v`xСɂĻw TZ \0,S,Ǐׯ@P p֡3 @##SACa_ա;h >8 yꆂ`Cؤt::VZo)h Κ1#[ l߼THxAyGmZeWNLC@{02sfAGZ׮SRtU ΨYEL PHCAwbv`o z7bbF zv&&:zS<.>0 V,_P)A?pҽ{u8_C0Ҵ` X`AzA 3 ,,C47gl ܸq\0|F06xpGQ`IJeM+ ƀnƂLQ)76>L}W^`"xq.$}.]BS;:p4 F{y% zLgf~| V}ǀޡC/ fKN_^04544XPݪÛG4|}3 Uv4שCo034o[<=A ?u84_$h Z*Vl5xSU6`my.\XT@{0;Ulݢ#w8A'pa :dG A0o<]\?t)bÉ;eР3 G z_{#&92B@opټy}@ӧ˗o*ٰ'Gw%^ BBj  C_0<6bu`Ν!%K ۃp Z`8XB;p%#A/.p*vre`4gϝ1`,8í:6m#/XP@0,]pYݓ' &=- Ӻ03QTlV5kjk+,Vh3KQQ3l,ֱcJYg(wZ̫;*CQ;z&KS~~Ys ɓ߮4MZ}@cÇMQn4ǎ}O 굠t`'y^޽mUzUN =ǧOZb?x3s +V4#V椾A`F^}Av _|- &$Va"0 t n)>}zF0|J!(pܸ+]czK֋S`x`* &gϮW045LWjI0̛`Qpںa) _`XE#t߿:Uf^]& Ve`ߗ_f2Pŝ:,Px9Ap A++WA#lY^5-h_7Ouo? Z͚M,h ޺uxxtՇ Z5jt&h>yr-Xqv9%T]y%h퓠xOA'͛V:\:.`v}S~o5tBtiq;AOĉw&Mƫ(-;v ~ :9$ Q~իsU{f &&%8|\MpήO}r`ئͼs`ko  ) Ν[L0mۅW__ FsJB(9,C0u7nzT0)[-[O &KU0\n$pJɠ` {nS!C&L;Q5XRk`&ӲYǏߋfׯTuM;uxL'AD,QZCA#볪Wl3h x① zu͂C@Xtl-{~gȞ%h6o>U5)h-XLZv TVtw?&ΜY&Du5A'0%e:+; tkt! 5%R=Aw]۷kz11nz&&!zl"X,TTyA?޽ݪok&8_ߣ`شO@`Al :,' gTP0p b԰]`xFm FǩH0 \I`4rep0-FcXpʔ* ?Y_0_F0lxLp軪u.^+P0 ys`2إKupǎ* ^^тi`^̏_/_^UgQ`8tŽԩK={ڿ U'>Pŝ:ztVp`R` XXeM# -.Y`(@uj +T,Ο_r`$ FW  ` hi+ >|UuOy Ɓ6,(/.\V%'DɡwgnL[` 陨N`V kԈLk;Y5Xh5$FEM$ Dd fǎ% *eTŝ\_g -geiw/k!8ɂFϋU74?,Au(ASp}cs\ThZ;[ Zr%h cXtU`% RM ;݂`ҁI7 z{۾T_Ao0PA0ǗpA_p|ڪ~uTx#{V՜F+ ym$ Ѫ`S/`쮪t m]x`8W0A܂?f:e8 Fvv1ƪG7 ƂCmnq?ƃyj*.o{`RzdV0@u<S!cCOLxW5Xռ| fƂϧe f( ^?9Ze O@wL˂!XZFuUmh i{Z6` ڂe*#hNxRq>ASa2!3utS‚t0 XeFMAW0ٮ A70lv zox+ ƌ#Xک@% >>偠8 A_P{'k*8ѫ`ԧKS@Ibu 'Z8zYn1i `8x`dwmj<[0 \$b`4^J0F4XpʇE*}~߬\0_&^0l=&'=)>]`2z?S@5$ S0 \S#j`:Xڂ!P 0jڥ(L%"E0 <61lUR*2_ʗOwV]Qqg>Vq oL,h~^ PqRwF$AOp͛/0 V9*. ?^\;3 }.6߳b` 4;AWFZ ?E05Aŝ`fc#vܺU0f`$;Q F&$' ƀ{ԫ' lYRŝS``U&Uqg 045LoZJ0,X4o^*4S"L-/.[/|;Kj^ f]FT.}y~lƉ*,S( h0{!ce%h)Ҡ1بvr&`1cM} Sq)h]ԹY3AK[W h vV xœ'qu ځ%VQqgYGAkNi7*,:.ق}Co tN).nw钠'8Ή^NMTYt($99 Q鮮~܎WUYJL`ΝR";צ`0v΂!ఞ ł窸 ^mV0|a`h/wnH̿UY 2A_;;эcNO"TY<nح`ǖ-){{Pͮ*`"rI`AoG[['wZiӇ {'޽+l=;`&ϟY"? f'G_Wqg5Pŝ:thjbd$hVkXxkwV4n^Z Hpp44)NK\;.NavAK0{֌VUY#=<m*SF|r;k0wwAL̙k] :[NQqg-tV 2fMAWٮ A7wZ`v=5޾G݈-LTYOy@}<`/X|B~ITY5KMz__0Ҵ` hR;A{:F ,,C47wZagܸ!y) mz`$b2h^ʕ1iiESTY<ެ`M|`<8OƂ ãULs.^,yS0 ޥ` !u;mT09K0 ֫`:1fkj՗*lf* f.:U0 lblPŝ@wpͣG __ACتU@uT4m-Mm4'4WwGŝ9xJz}AK0=G lQ;: ڀR [H,:w;`j׺E AGp\N`a*l:AɎ.`y_r},/N;XNm1l`{0 :5l- v@';O4 t{hxM=7`4`O0[} H /i/xB&@ ^Aw0Qw _pP 48 =~H0GC@/YA; 7jp,z`7 hphD`p _5 |_W4߁9`& ~h#X f'5 |`k ~=y`J_5`Qp> Fi;1 K Gs3@iFsV3 TW@cҨ]MmW4w~4WyznAs7ksA I-eN0Š5}iWAmA[>%=ءrG :!E^t:`u 3f [V[,G.# ]^R|5uIA/nw ֞}"IQU1"A, LNY)jF0? u}tB0,; C0i~A0nzE @ӎ}*7Z0lwžS'{uL04 C0 eHOނq`m ƃ &ADʍ ǹ;L{/D0 S y+vnkpac5a ~oi- z`xtd܂٠۬RjZPa-  S 47=˙w 7O'h VlsM \c {Աz~,h 08g5&{=h 6y= 󝻽-ov`713~h~]X`}A~e ƫ!5A}AMsE[ *Q[ p<ZCHbC.2`"^s Fni. VoR[ Fw+ms[' 6H  /h$}{` ̎˶5PV. O_#|1P0lT(I Q:Wg~& Z>U0]P0nuQ4oj%^,K8R0nsϔXY0LI|iRG0]x <`"q`<ͱ U Dٚx$ptScdp̐tpڱfjo vY0 43F0uxk`ڮ֝#`8tgg?w fWc+ fK{0j4{~ThlGAC0ƗF-(u1ܻ? XJ˚uS6198lAK0*1(U ,]r;}J,|oA;e-ŷ:Ot;Gk#tޙ >4X5'mtttc*Zt6T |?/7 % NM ӪK4 -?傾`^/og@0psF KL J{΂A; / :,yjH0^> -'|)Nbb* l|^Yq_^C0@dl󇂱{jL?)pǽqGA+ [p5<?[`hTq`2` jeau?O< D0 |pP0 MN| ntf\& zS0 qr[Q7%ǜet_ݜs41C /]8zS v5$h]_)-rI'Ւ߬{ Z',h NJX&h:ƫ5xilARsmA-p({A,wpAG˶!N?5XlnA0ifqAWpu[7F/;8pi`+=Ot_*e7@opڂ>`%5 KTC$ 8Rp8eI`u(@pܑ* ]8$ (-F_& 62]5joa`LJCLzet[. cʼoQd}Qƀa3 Ƃ 2<z:z Ɓ.-#z=/fM뮾a &;, .` 0U LG0vnZנa%q[Z_0 'QlpV7SfW4l_.h~1C|ކ5zv&6;wq ځcT\XWA0U-t?ꉏ@gp˲.`qy]|c&CXz/Z- _ n3\O@ouzqApт`2mST.  mj/8,`XaNy   Ԫ(z) Rg`A۹E{ F74  6H\=;E zF<+ ƀ.]4P)pxA}q+ ƃF_L+ZkA7ɪytK%ޱFt .M x^EAo00;"NlVV+Y jPYH?إskwN /  %O`8Ӷ[-C%V Onz?aVir_‚`#v3\T0 ,h0&9(]0ҤXpYjIx `"q`=[ FWLLFOPþQ/=^ F;'mD0૆{/<m,l@-gTZLϖ/5^0 8H0`gH0T) `&FP^3ι4m`&xMo,G0:ǜeuMns41[1T,]lX*W4w54J\_}[AS[.WA3I*0Ak-I?Msj@kiۂ6`s/ ڂ ;ځ.UbqC_AhmC:??R%@g]@3]vtoG%&;4+C='_M.%AoDRق>J`j# KTۨ8rpIuͨտ`i0|tPW`0 n°HPh&6CL; eΪ'v[@01~+FR' F#a& ~ V \Y)]Z`< x`8aՊ*&vU!v8`2XI壟)`a5U_ ڟR0 Z .Z Aw@-R5G=b+F7(fm) Nl%6N5`m&^ Y0L izl Ӷ3[-V[" nM0Uzp׹rpu ').|`4#63`,xv'5O7GoQ[0za&&ۧ &cMS'Ti`1׹ ΎP- p峡c3;g<c+^K{斠9uu؎W _&4jR=h ۻ_lY^ASp?f憧0V9ŧq8+{EAK0(5*Q ޠh Z;ڀ[}+h ^t]5 hvM(AGpgKgA'pUC>: O #Vc* Czۂ/=\ zMUʩv78@>ݯ /o.:ۃ瀛O5 ,1 KZ"IG0qmu`pC@Go ک`x=CpCϖ#@)W#N#~`4}`1`&ccAyjB'̏qq񠅭`@_&K?+>5* Y. J ML LC_J>`#R%'\pFp;e`fT W@q6 OH0(;@00,\0T]aӎW7& nJ(p_dh؜=cfa3cT<zz: ƁK|o+z v?2`"ʍ Iǹ; &Oz/(KmTp~Wi`A7gIUqe, o~q\\^ >y-F__V0,ajAN &6&}Gt,*cTq+SOk vmR+ /` H3/k8$ P8PŜ:={ApSc[1ec\&[񂦠ùf~63Tg\4FA R?U-Co!U]o_L'h6;D,a_y8Ǽ Y'Y͏ :{*I@g|]]¯t''>QMɠ;X˫Apǚ#ނ`o^`#}-3}^VTWK9l/ ! .`OVSCՖ [T}0*m}Spйr_p亄v*gJ,cc:4g}ګZS~+;jL(3D0ٚH$xtSd0}̐P޴co0\`8&Ӵ`::ᵂkՠ 0|6tJLpg?JWcwULPŜ:p9?¿4Ojh s~;wh`a5Xyvj`1M4XyhQh`IK?5XA5)h2 hkA30N`E0@sEi k KMU3V`u0YAKkN `-07V`k ixVucZ`}p9ڀl`#BlmIl`Sp9 ځ5\5 s~} h`+0Kl<"ti-v`ۃ9üt4 `GMom `9e:^zk;`#i"@{o4 <`\v Kj/N 5\z s t48L`0q{`748y*#W"\+*>@o*G0 ^"]uݯ{ z a{7"t(b ܄p"X{a ^nA[| őnCx6p܉gB8Ep7A~ɳKp/X@_W^!D$`Bg#|BB O ,GA~ Q|!

ۥp`:먠k'DE%,&9$|,5rR=zb!6rx 00V⽀>^"J>!",H@ɣZD5犎 |T[\!+>Wyl}UQXz7W5BCHug(bO$oܥcP,g=ٔL(Yɷ*PzfWF U g6Zʮ*F?RG$ @'TDJAXٕXфR46lx:8X M+-ᨦjmm#XըJm#n0G VM͇j4w ʌB]3zDuUe1Jl^%+ZG>Pj}'}O \Pj}jO Q/XSVzpV'nV*Y+:jSo&zN$-5>uȧPӽ }gZV}=]n]=R+OXٕXL>Üo A4> nD4>_XٕX5((ΪoêWmg}Hpm~oU7%ZDomF`)xpy.w ׌B]3zDu6W=h56ۼ-:*[\SqDk*|l^Sݬ[Ujիgի֙%=p,wիZ)\Of4)qi̜F.bMfj3Lf3s4 Chmʮk8܆?qqƨr}Jt ZO+i>uJmOki>'%k'|G}@mmwft! {~y| 7g栜i9csVW/VwMz~>7T+EWNj j%>Ωki׹7zbb5U?RfvHT&<9EpfiswRT6|Ypp|:P@jW!PK ڵBHBl'9LX]粓[^ס. MWc@-;\NvG;k <@h+wh0tɝ?:1.}ȥѵz=w.V1t:2hQ܎ %!λCU03 UB"!$]8iQ=\wڴVXe:XCc6ܦBXp=mZ/I47Hm^O+݊2lwMA2D2̼eyˠ?.CDaFa."̠k_jzZ͖O<ޥ#<%xǻSÅ]}yMD{[~N;D[`[g"Z(g"x+5pijn IWLX鬰%Y{Pou, ~ BwK6$#~:Yq8.:7s^͐f3L3d3"nЮK5]ܕג0B}?Fsj {88)4͔Se~:% i xu , {66K:K%e %,!0t]K8Ua,8qj 竊aP9T [ZmDg@g%\®gp2"YMYPE&YO5"#d1e͡YsDsLYshRɅZ96O搶9q.\mm.:Wh+kj+\!0U\66N5ž'3͓@Ѥ'uKy6j#mKm-B|SX0_h/oj?ގ A䇋n8UQ|8grrvP@DT!03oPT URgBB!p)p!Ph[(]hj[(B!0[(.4B}.WHa mBhX(-4Q(yB`)BXh노["rRpX$..2K].dD*YZDϼb!k)k1ŸXZ,b\lZLbO.ƙXh[ljZbҶg {жԶ]"-.1-a]Ei[bjZҶgR {жԶTT\*]j \Jb.QdDږڠֶ,e& mLm`2mt x;^&.eB2S TiH2[yE2"TY$-*DE"EB`P?wg^PYd T[.^..7.@ mEMmY.y˅@.'m}歠Wm+Lm+d+"rzُϼB S TW^+mu*W*U7BJJS DK5]NF$k) $ [EVVQU"UU4)V YA]byU6"mlq=Da?$=dj{}Hh{H!9h2"mڠ*Wk{=d3o5Zh[mj[-]-6IZh g(2"mMmP&mKm-5BSXưFh[#]cj?ގA䇋nU-p \c3o}PTVFV\+]k\Kc]V\kr-\k3o {]'3sd~|יj^/7׋@כ^ g?> MP5[ \Oz!nֱA`T,6DLE.atK8 ,_@ϼF!k)k#ŸQ(bhHbO.ƙQhhjBm#ih3.ڊMmhV,-6P,sWdDڊMmPDk+&mŶ86Q؛MM2MB&&S&.~v"#ҶUEZ&O6b,m6%o "ͦ6xO~6 MPR L7+%mPY"-1U(+>JS%T=U*Z]|ϝ;bH [--szs/[ؠ~~o U-4V {жԶUU*j *V!0*n5BUnEQswNTZ$EA,Āvf2YR2 QdKE%(@UNvJ3 {MPuL K8 H<,r-6" ,%o+E 5,nE%H~S;Tvx xx= 0>~@h '< 0BI- <` }Ph;hj;H@ʙqP g?>, MPuJ |ErZbdja6m_-y-127]*GivF&FL92F.F:cĈdĘ4 P bt۞=\ќThFzH_=y=12UVv(HAIݩkYUt&PT-:0[tq5?gďoʼnAsջVU]UU˽?y҃0>w2*B]Ux+u LPE7ڑv^q7<EVT^棽^ޔڞ^ k/T7UBݔkO*{AfAADA&PG~;LPE7:^}uv::,t:;:ʜtڂ؏ϼB`GS TM$W/^u*;*;S*: EME.atK4Φ,rI<{\hJ HEDJG.QdDMmPE7I[Wy](]...BVcSV.B[P?wNF \+μ$JmЖdjK$ mI"$S[#I #KڒLmPE7HdS TMdg^(SeG"BN1PvRʠ.>ϼ2T UtS.Tx*3*Se*RTm)0U&&U #?\B`)\* L3巛MfMM椛~|unu#ݼz!=PTكRC!a (r ]Ɉd0eAݔAϼ^zzz@{zR:z mA]|EF \O+μ^^B[/S[/J@/!)LG/- '#UtSig^oJmo7%[֛[ #-6AݔM Zm}Lm}(}>">6h>B`P?Gc *)ׇ3(ʾʾ2}Ծ"侦ԾBePwg^_\_R׫ϼ~2~~2~"~~21ʠ~>5Og *)׏3?巿_f__椿~|n'z!=nP9T9R1@ ` (r ]Ɉd 0eAݔ@ϼ4҄4SVL@Ж&M3Q:҄.>v"#Җfj*)FҼH( 4  t ڂp2"mMmPE7^qSjӅtS[:% ]hK1)BVPg^Жnj*)N ZWleB[-!e@3Lm8AB`P?!fne 8 "l,1XH,BlJL,TuqW| **n &Q !2C!!2C!"!!2;CԠ~>Å8Db*"7T왔L-Ԗ))e3Mm2'B[P?)feLg Umɻq Y)üb#&0̂*N4L$`2LDK5]|b0}n0O|:7<E88\bP9\2W5Bݍ%D& M;D!pt)}k~|XN'M$Ⱌd6xrr$!uy)uegP]a9Id*7TN2O;O3U| y"Yl eQ~[Qe,֕7%߽2:oqs;4Z'j7j ]MB;U>҂C`BN)7ahz3521V{eY˟@E)NUk?ڦC;|pϘicsX:[=?3?pK!~Oioը-럵Ɇorq,'@[~c/V%OQ wE+?9T3jVͪ]Z]CGOge[qw+ <8Ѿ*H[a &{&= GE -+Or7j|)dyjZ!SS8T ʹZ/<_mc'B/Ò@ %.RN99<') j]k͜vP 2Z@3!)܂=s{ b|cnp""n<j.ZQDVbZ.Z.ZC8(I)3,D1I;՝%P~pg~m| vޝugk63=9ݢ;8q(~,O*r|:@~Whe-#'0To9#fBawqcYȷ:A-xj\^VGf8zŢUC ;b&7 #?C,4 wMKD7N+]dW]]%ɮtWInWI$U*EvbtB]ʮRuWnWTUwUUUOUOUOfW7A/Wx_@m@&,OOݾfǖ R ]܏"=XNw˶yϣ7xYG˹gԙu:huF`VTOSnFw^ȋȶ4 3| >މ1UwiW`v,lT nc*+TTSҍT5&']&'33in3/6>S /J!*$l#?%sHF*3XGj;=:\BPrg=k_ݙC5[63n=U4Mkk'dAKm&{6OQzS%"/CUT0<`M-O `<SU1\M|C[D7@>B"B2XxLm>tN}h:5] tt6F9d;GΡff݀u 3ZHs16=(z_Uw8g4:9Zg*y5{2EZq3 P4垩3uC('xgG=>>{ dz@ Ӄ´L˴ikyc?`&05{D4[NڴLG6=JOScgUd8+P?+௪<L(Z!p?gHt&U9pT{M4=*ӓh/Ή|d{CK؎{Dt=_/^FS<~0u{s*DZoqzƺ?P%j>@xF%ܑYD%XmnQoIܞX_tvw X2PmR P5?-"96`XczMCi)Prn10ufGy:o>EA*h4TD)? S'9o.ԓy^Ǭ \Y>XKp-/9wm q-f,>Iab"I4)anSF05(F?[X/sCI%6NAPs2wc0^ HUxamg[on0_m .ͻ lMMz0lpz |m\Ƴ #̋"lH "0m ; u@κr7a,+ge#tκ{=1[Uư O 6Gxj ;F0lp2߆ncpn;0 Tg+23e},p`ioܖg59Cv|U1ćCf!y/0YM" <:|8as3W0,@) ˢc8a_8OL.Bm %r EFd v]W">=w3\pޙ &\MaKN`6qI_<#܏pߢ- D#Y2vlsGx3':)w$xiՋ7:p$³}g÷xq09Qn~3܄5as66|ԁcBM "ܐŏ ; .0%oqX(8aw-3cakCXi".0gg00r G \ە0 9la8}!:2Et+M[uOn҃ o/p6gG-SK&ߛ6!| # O1lEk; #9|v "`zÇUk ܿ㞽 k#;",a[!lޢ6F{ 6A>v?yp5VWiWa[My109:~&#ܰ>+s6g;=8a?vAZ[f ExC G <1۬EpQ10@!\/~` cق•ʛ3pu" [O[6Bp6FX^>&k=as]_Ss16̰-Ng}i .>Sفt.` 1쇰hN_vi;]ua_n|Cp7θmpXw߯0a>dϩ܉0[- x263VNc8ᇟuRdBx?G^ٺ%ߙ^:ajD͐C>pKp=α5#no^FX6w|.zQIwzc'ŗ 2,!,-iKG_ 3<N>u.)o:",YM>pVYG)C aWfa5-?`9nc=UTawjMF8ׇCXf+Cu:aµdp(Bom21UkX1Eo3CXsaGg1pψ= g#,Gx?}ec"|3.AԄK!L{z O!\0aXn2Ç=y[" T~xat,׿澹{̠lfj1f+elLmhR k-JEʮJQQlRIJ%u\}|_sos,l g?Q"{g2]EdH eONjuR J*Ci*i5Z'pgM7'n1z7M}yw*]?8[': 7/*`ƍ <xGd5-xc{ <w < g>Z@2݉]pkoA`4ު4A6`<_^`"_ `R \x6 w(>`6] 6 \5G.7iwx逹Pp`6y?Cv;.xu-en\_7>=+H`oQ`_^~:t޺-$𩎗-8kMk[`=<,rs38ͣe̹)'tN?os%yp*`V_8 p@ ce Xt4ͥ8pPܓ \s׏.l1c7}7\?p]W^Uj=EQp ZFi :ۯYW!ݧPpG~.pI=Cn;[,la2G<d GS~{EfX>Ӏ,} +8֌ɾ `? l~u0^[OI w hk 9w(1` A xf㵶Ѐq;`cϭlء}˻\(00{Rp`6`oN+O_769| x$-=ހۊ'/p?!0g>~Y} 7&rW لac+~.q 8)I zLNaʼ 8p٬.N^:N~EWw)jE@F [<}6E U{?mՀ \wk ثFM76 Ugt8UrM]os ܣ=e p/-'¿ <8c].^w|_=8'_{nYom @?`' -}C5k&Ykֺx?6 | X3F/>`ߤ7 lAvLz{Ws@``Vշ; L3!x%sv\x׍;V/DÁoswT`D`oG^}L`_ A]O`9 8p_ Xsd[Q%V`9MU8FL#Ga{,I8Y7ap*`8 pV]9O ~Lmtt8\xZY> tAWxD+:zLG 1,p`Fn\\Rz-Μ3#ܦ͞*G#No=Xp= 0sF.D_ß']W uU` vZw1ZX> [u8 6iDoƀ\zP\{;tUE`:`\qlV7TC`;o>ߘWI`gA`.`a x_% kM }]ا NZ%,p(`ɑ^bj2ML]B{McϮ?@O)u8rT$w p2*p*`|$p䴟~90nISs A G,sT"9 \SC.|3oh+t=z+gСՀzӰ4ZGEg8&p3`ڏn\z,xf{BUOwP,^xpW.]wxUQtx0"EIG{~2Yi_V4pߒU!0qрO?WN}|^vkC{+Pk6Д֋+VH<XY0l [*6rZl4c L,i( Wـ~Vj'#'3`2 뗐++S`o T+/UґJ4|I9F  XRiUKN8V{pxϞ ~}'}ɀͫ}k!~x |uT3uas݇zax \87&3e.;1\ؿ5\꩛\qۗ \ xz4{ pLA泧7nK]T 6~?ܝ|{ӫv9XnT-z <[״xwh . MTq* zLIOxZdg  ~xvAmrk6H OYW`" tX0 ɯ  42-pwoph]1చ_yWLAze+JZRW30|bZvwL[-#w.xG`g:W`.' xϗS: X;<}߹yWX<:}Y0xS>ٵ~=A^jk\kQݶ'>_γ'.v/ zNf $Gy[ͭ]8.wpn=i%&2?^I ~E,OװZ]e;0N@߄en\z04[ǿɤIڀo=3;;g|iwv=]~- xOx@xHgG&`((IxpcK,[V;D0WpĒ |2 YFрO=N+l~H`"6z''ߨ] ^ u{/>m5?6QH˟WQ`:4Z0075]`G#_5C`gk*_O-X=\Y58,p<{ 8SN:u5TuSiܝ\Uovvu2^/p`Q/; \8`Up`|W} +ulPՀLk\.pk { Z 6ܦmwfO]S.|oG+h^wB\/~uX< ׾/8%fS4zkXXۯ!0XsFFBFMĖ L̫z۷kVvR`-N MSgg xG l8$r5l X߿l怵9]`gVVqn f>&T`; ڗv5 Kͤm~F5G Luoh ?Ow6MZ,z\`g [ O{\]"+G*7J2cQw'XӪ95ဉޡx7Flzrp_ Xi۾>y1*K:q [8ЗTEUFxegWvΝT 8pmfBw Ϯ&p5.+]2;' wcO_ [1U_C 녲|`.G〷}ͻy5< G霥9z rmR,;s/'Kb/;_RfRYPqKs8$׃D9zX? fboXTv_U *55謹4Tʊ8mQ`mVőv]W7aݼP1b}#G !ϒqy8*d.d9oҙ}?# GE˫D](+g0,"4MuGnv E@+F`IgTwȱa|~(+_vwt tWy^U8/tv`۬0*"|&NZU1BψSy yOsTm!UuMxMhB>u_hr#N/׷^o\z*0[/׷^ߠϗtʀT!r!Ma~J}I<7ΓRg'm7iY4AC:Q<x$G7-i'`j[7-Hť2bc*wޭ{ 3qfac q!TMˈkatDBTZXU*9 Y1Xnyy<&"۰C:^a+10TOsoyF<ǼG6Cv ܖUY.mK ݨSwos: u)P۲ʡHP_]6}6C~c^vL7pГpDř%2mNIMB0_,ʹJUR›3k*\E@'f葃mNqc99ǵ!;^J88M]~<!V@iC_ۆT=Kx-AճͶHB+3I%t.܈FjgNpV81(׫\>|X\B8 }{LAl9G v)Lɼ_G'!tTCk?A2䳨b!TPM4ōWCۊqA~ CWb5u?FOw1?DGqu-bcKj~0sk>[o_)bcomxPk4g{7@.Ei}Nq8a7$xMHtF:QHAoӝxeh]&x72eH1`c4A [|<|80i0A, ZJDo1ϮP#J'hcDatS&z2!Ϣ4uXkC0= ML9j/1Z&V/$x*ǓO x$7ɓ DJP_*='ۂao1%tQtg G;IP=Tg6J~-q9nB29nL!n,Q|@twhqwV.7~i?f3 mf ?Q?F5#t!,MD5<3arMG^Xbx34n4fx70 :*}9P6:U(Ӄ%' Ïӆ*= V!e,)uFy N?CyraB5Po Ԫ›$݌8 UY<O:3at|f+)^!a\l3Y';<0zR T# ' ɓlwfSAz'9v nZDrj)3Mٕ8`IXY5,:zFިKYfSn?yNS #Lsb!()J+"J%!عV`z-J0`2e>Njh7\EC G9 yd!"5#q, W 9g3QAYr6&")wTWx !+B(Xr6|q~4h@{^{Mނ$y^w7*䖪CQE%%e:YY7鍳E l8h2Xۙ<23Y췊b)⤒"*5Rh<-6f1ʅr.Cݡh?xhES/cTaTRZ~U/,?#7Q߀4A^9g߭]!V-҇5u͠GSWьhXfGSWD3e##C\5Éi1SCG\uH/Ki8-Tڼ\NU6ܴYe*+mViJUvڬf6Ye*;m(*iy7-z:iVIJ' ~;vg?vl/^|ԝԝmT3c*}|z+#Ǖ[-g}&4aÇRUn;*f:/[y݈/Ms"0,cw#R*wHL<Sxɗq0ƩoLne}n^w&*[S!upc?89Xt ǝ=pkӭy]3ocS{߅U{q>1;Y! &Ы'oe*d3@=ǔꛭ/w!ꏄS$:1ʻJԿ$9RhEZjE,# uc hp7w:Ʌx"r6qޱ7Knns)WdEtߔMVowm7!DTc&j(ܸE͞>e%.O©HntI%fZ% MJ8+:vM5mg\ xVQs-YNB$ZlU:ǒwi5p`5}tԿuD[+֊nbhR!9d{{ު 7U\D"uU(I0YU14 ©]9Yr Eɕ%*ґc <;?1ΏvTrG zgFyi*YFfmdI'DG9xԛ'4M̓șq~C. *Rq0T9}_x t!8RCDI~vV*ڰ 9)m6hG~셠4H)XʄUP0I4cZO癱%J klf9wK)

^ǽ\ _Q/7$2t"J*L|~@+X00H/-`Y00`$+kVeV8_eYװΗS r! ֳ\ [p[ 5̷¹V p8E pnx V87F i8‚;R(+qNûp8E V>x Ymx d[5bcVkӬp3oapOXYSV8wuUFyV8?\hIg- p>gs7+75\j3eV4|ɂ<+{W:B* iՇa&mO[$T C/"H<"p1#J~ɓѠ K 5ݫ)<=x!vXQ Jt9vƌ<@bV|mD Fpw0m6J=; 6Hk`e#ESBc|ugf0S@c&M 4#cny;PIIԓ6 oe3=t08UH^-s.D ѧsL $C8U]B.N*dYkƳʡ[FqU|$Pc_9X oj4oڵeF0u ޟzV{c~=D:-]c$s9O_Čм&4rxH0Z-- ^dۑSf H 6HmVYJ +ZЦ(F7<*>IMJ:U+$MUUL1n"1y<ҥݪb&'ؚ1"ZLX6Sx&#M&&<񬅻(rh6RIpCf3ÜC{A} hfEjċ9YBԡu/L4є$#]=p#.`;_FƐUyИr+80ƩԹҔ.w1w1z)UlͻIOtۋW3!b-f^+L:.xgױ/CZr3\7l>әUN`j1,5UKLYdw!_'@7,aᒦ! 8w2`F[f;ziYl!ZYi Hoc^6͊\4+ӬMHTwCqZRb'ǁDYJXJ``fK g!cUM]&hVвݠe{7EI8iGǪU]TmnDNE?@$:iJn:J4;Z hut OG;;yS:srM:4@}fnSq$>E$Z>.q8΋ai[UBrK9˭5^8dtU]ұ\>Pps8M~B2"Z#Ǣ{rqvyN,%fU׃%CM oF`n8M}$r_~@j*:tD^#,]c]ܧma/ʜgG =leɻǺB_!٠K]JЎω>>6@äg!IB#OHIi]P=ӮEEMq|;:*mڪ`Ĝ5X^ bOy d*W KzU$'P'p8K\ ;Jg$6pqF_wUYmҰ:Vjrl&Y|`YH2 !p9ή]@&-p3 G)mI%ryU^X ʼnc1U9}r8U5R- %}8=,lki4εtk޺r7זMqj~'tQ $͓)*aO? /`a")W3!tt6#1:Uȥ (1_4ª呞2m]7U2U|SUH<&+N?@_:2wf q=Z_OV}Sһ2c=)I*- Tj7N|H?CH?o-w[阒=^@H/$Hcu辏pMHִ0-=u_.>15ևl<, [!>l 7zLB I2ClqGFz㷻Od; Z>afO 6r)H*>Y;e0w/^eM_-!r+L.R'm{ SM4qygo' a0sw DzW_^uwtx۰ߵTn͠ m߻һ}/oŅӁM=|}3Aq#!*/ۆy! Tm!w^&~m`)"(Q$܁_@yRa'(?Cڮ^;z4ʜ'(N#[Y%3`-Vk{ʍ8g\K933YY9]8bՕ4.f!wQ/tu"E /;acgt+\Q4T2яq4o1qoʥ.K^={̡ImotoU9/OF ka.c`V{V,VNa[b}7;At 8qc ĸ&"F#̆2y|y|%Jwޖh`Cd(1bR%JTPLIP?=N[AN1T5AOwzswr/pϏ\{F\)2,NchaAʼn Yxy;;}o}3}?aL>/7˿@WI{ۍ^y5{ϊji_&b3g:l,}tvzxMD~ SBmx4E4tJ3 Lt=]?k.3\:z:}e6?l}o /.Za"l^)z7#ŹC>z$>sD=(XkTGx{D sy8Ŋa1 I^ϸniQ[*zE߆NNuytӛ CeT{J4U??2,D%9n$ QeKFHVr.6[|0> ی^0ř_VX(%O_A 2eGTb,.C-3_ T1JA;4zYd J0ݓLt9lZv=6Zrl!J&LqDm+'if-)߀hU&/3|m,gfsg-&U9=2c#YNʹQkm4壛وh߉YrAҍPʑi,hKD۸fS1*;W[,w9cbXR=$27CnDžZŰJS("KRG:yvwӌNm?c#-&>2a`>qKl#ٰʆ/$K +;ЎGCx+LG:~eeWv|eg,>>OJ{*Hޙdջ4 BMzwӗ*WKﺓ/)Q}ɵ AO!V%"㐕Q߉wVF}ɇ!%e%X6i-/⌥~ӇVXVR8öW?AOO}mqz{w&LUmT;Y\ޛ^BIfD;ӕK1%ӓ3ۑ]sQG< E}Is 2d1rk]~sKc,ZT.z94sI^h wú˚jDmLq>ĉ8 6Oe`Cӱ =l8=x6zH}ϥn.J[ K}=*7MRsllΒ/ fSj Z8:t;BC=e: sܰ k? AT!AOF9';Yq;M=hwTDx~"t>@+D&2[#5*),!<6qr`rXR@!چ"z]cnty1jL5t416xRup5٤г/ [B* 6pMҸ NX7iRlT!dg'ˍ0Ϸ ab_N3b.ͻ27ʼ7&8FiY.^[rw-%L>Vĩuv,N -A/8'iN @5|~//L7|)\ږԓ0>#iu/R*դBV)ۗm*waJ۫rqHyP= `\ʼn:D$h|INlφm8DN獒Wsp׹ks ܾ~ΑK.BHfMؙ c}ȍ\iNK9 X`UT^dy퀾Ll6VV rk|+_ DYWV43 %9}Hᘈ{(m>q򺹎o2dO|vH[R[ч[C-BɯV47?t~ M-qőECJ+ڰ8ʀEq6@3YF$ݤOw;#Hi !m0UJh*LݙȪ*pfU3դ0NgJ#KGS$+l#b4>?ew 8ZP?w wԦ[P?6Âu,B[`A?-7[ x~leXPOSdo[P:тMom~6+ o ^; nт, Xق{c,x0΂,x2GkZ8`= lfӀ,H_t[[a Mjx,x;`-8Ă) 8ʂ`,! 6b4G-8 6`6 |ւ_`g, {aހo[/Ղ ݂`[ [p,/xƂCp`'*,8 g6 Ƃ s,& .jey\0p%` ,Z" nf̀-~ n|Ђ;'Zp | -xp>k#-xpI8_X.Ea1IXn) mruo p< VkڠOax^X^6 R -lR [>m=a;@>v]AnB&=a/# hT8 kA2wEnF;.a0/ cqya<0.L&7)T0 /L3_p9*"c.8AsτKa=fYlp0\$W6 ߅Pl[6p\ K#S nvۅ^a/ `P/υ#Q0l~-  #Hga=F\0* xp0\ L dp0\#Lׂ;4p0%w 3=,p0<" s<0|W`xVX~(,k+a)xSX~#,Vυ?]`8QX Nրӄ:p)l6KM as'넭&aU) ;]Aa7'hI _Og: x]8 G?0|ʉ'a$H>Fυ1oXpPp0\ &kNa 0<$LLCax^ ~9ea.xU~)o ]aQEX>2wa98!&+iJp \& kZp\/7n6{M~asP<"l v#HQ ]n'S) pA8 #OQ0l2  FKRa N xp0<,L Ya 0(L?&~.[l[axO > qxa!8 Ӆa 8WX .2aZX nV- 7B+ցGIaxJ(l?6- [K 0p^A`N ^ >τ a?Hq[@Вp' ZK#r(R'cF&7 #[`] ƀ{axT& s$ca2%X7a0A>fυYP s\p> Ep\%, ’%aiВ,AXm|GX V#a-xEX~!o Fxl61 p#l ep\-b"w 7pp<(G#I(x <M0H~,/ c/Ma0;`@*L&E($a8MNfB.f9za.Qn~a!xJX%` xAX ^ׄWŠ a%xKX~- kZ x † ١N6SLa B l7 v{Aa C฿ app"g æa88p0\"W p0|Cƃ Aa"x<&'Ia 0<'L a&x]fr0I >υูXNE|a1@X.K`LXVa]XT' k:|ca#xI~.l7maxWv$>v {$  0 J8k p(w t 0<" Ca,x<Ɓ +0)L&S40 Wa&\f p0&gp\ka IX DŽia<+ `%X~*?ցׅAK[acВ | l  [56p"_vnp\)W l?App|S8 %) æqa8xF~(σg(0,oc8kaFb8^ Nƀs\aZ'`S&o )Aa*x\gLx?f s/ axW~/, _EA6bXu(ӄe,a98OX.VUVa5KXd#u>a=x@d#lO wYa xN ^ׄM?;o}aWP|$ {¾ KRCp\%W G Ѡ%aث$ F[(ma4xcXaxQ~$L?&ׅI7dga H >ρiot0a8] 怋2aB3&, l!a xLX   /[a-xOX>փ /F ] NX4u` 8K +Za^ nv p<^s~p w`p"o G[Q;a؟p # (p0!g cy8p0\*L E0 \-L ST-axXf'{,0<փ9Ea.0\~!,7E7b;a |~ӿrp$ jp\# zp#_ facP)L G1ax\"?v a7# X8*$a8NsaF.F+Va] ƀ{~0<,D]a0(L?Wit_L0 ^ (Oy a>RX[DS!,KRp \!, +uJp )_Oa-OXփG AFax^(l?7K`[+ ;.]d * Y 2]8 {a1c0<( #(0@Ƃ Kx0B&_ o&0#L3a04ylp0\,ya>!,w =bp< , r8_a%xQX$ kA6:;a=H>6/`Jr(6S-4a+8C˅:a'Unvo`' wAp<'? Gk0l #H0 ] N\1ta,8K.ƃKLW 5$p0-Li!a:0<"_Yia6xF~ ?RXw/,Oa%8UXVK52a-  p"l ׅ-^a+O#lZ[$?vW5a# _s 1A6pp\- 1\'  #MHp0 |] [0<-/ O D0 +LO3:>SB1$lp0\#_ mBp-,axFX~ ?V__UMauPVXd#փ a#P.l_Y1m` 8K aX v p ~A!p|G8+ G °T' ?{0, /70I>ƃO a"8 0 &L_|aP.ffaC 9a.O'GBa8]X`YV/UA +C*g k9:p\`B6[va K o cvA6ca/xI$ AkxG8 ~v#AQ0,v  #WRC1, p0\exp0$Ldp0+L t?Ya&0 "怷ax_(, `8nU(KRp,(DXVRa\X ; 0a-<  FmaSВ|W$lρ߀mv3aGP&v=^BO8E8N\@8 ."0a8FnFo߂Qna4xHƂ'qa6/&pfZ(6s-p,,p|KXgaeP#X~*/ k:^6fp1[Vp \(l;5Np+] n {C<" EP0pL8^aqc0|`D * WI(ƀㄱDa8M&R!&)Za*NL0 <&0<'?惟 [BVX ~', K2'a9Z(VSUta58WX.ւu2a} a#Qn6 [~axDv')g @ ~$ _ ~kx_8> p_Qp0lNӄ a$8K.F1kXp+ nƃ; ^a"O&g)T0 *LO0I >fυN |p\., E:aq|CX ), pJSaxEX ~5Z.XSX,lN6%l [Vp l 6ۄNagp\.<&O {S>p) {p4Ma_ NF4 F1a,Rƃ va"[&!0p&ZCA!ap@8 _sa8xY^FwQ=a4P" gxWwa"ʿ $p0*L S4p0\  3t0 (ws=\0<*O 9axAX ^ca)xMX~',VO aRX#k)Zp8 vփ Ba#J6-V <)lςv ;υ]ma7xW>O} P'3!pp8X8W, [ p0|MnFX0,Ɓ!axD&07maxG ~/ 7a.8~g(恓4/p!,Up4hIXn[a% V{>a xXX // O %a#xU~%loq` 5hI$l ;N B, 39`8G "PЧp\! G°mpM/0<(Ow1ya,0L~!L `R N)Ta*8_.˄Ja&0+H  a.[o ",, K< VXV*:8/kZp\.6F&p98Ca xX <'l/ ;;v_.awpqGa/U8NӄCL0LGQp0lnۄa$0 <,O cw0|O&W-ax[ ~#LS4wa:8_ÿ3Lp0 # s\p0 7 -Bp,w |_X~(, +%axWX ~&5=a-x_X"_B7B ,l["-Av.p' {C>< 8^_ aHp|$ K'pWaJ~(F`8Q *c8p0\!L $p0 &)a*xP{L0 (?_ s[0- BMX N%Tai \,,vW + *p" k]:p<"lb6g`SP l?mUa;xS>TqLqL1#i#Fq+x≓N:q҉N+=ēxOzO\8P00x]8~'1E>FKa8nk(F` 8Q NƁo yp0\)L&)TCp nL0 <%/s\0F^,wEb|*,'i(s p\.-jp)w z<,l  [ b8I Nv3la8W .}2a?N8CAMpN8p4h$ 7G 0ZFcX0_-a"8\&Ba 0\/L7 a&Eft0# C|<&, bKa xNX ^We a9xSXVOU a58P' kY:p>Xo`uFp \*lW [&a[%a;[~"+.sa7xZ}7~p%o ;a)Y(SaIc8U%#(p0)w c;`W~*L$0*L ߅c߂3a&\NdaNPS Na\ Mba #, <.VL<'/ +`6%l6? [) [)m#a;D>v/]ढPS}a?wZ8fS8V6 0< a xM Ɓ=a@>&/cS a@f녙,p0, s}0/. VX  K;2a9`DX >V<p|CXփ ba#\ 6 -p%l?qaxJ ^൅B}-a?pI8* f#f#_GWv{`ؿÉpp0#uhp0$?Ɓ{~? Aa"xD&_ STa0+ 3u`X N)Ma.8W.K2a!PX sSaiNXgA8a%x^X^V5Zp=Xփυ N6baKV]aQ#v]gn<&'AwxQ87C0pI8<0lOsa$_b8I sp0\ =a"Yn&ۄ)a*|L?'Ea&xI^fw9]a.Hx?Bp(H,, KRp \%, +Fp#XnV{5a-xVX^փ ua#x[ lwa+P>τPg 9 'ba/&p%?#k G%Qa8x `xR F_ 1OXgaxO>&>DpLg 9p0\*LW u }a&Enf;|0<,S|+axNX ~?˃+J |)e(րda8EX 6M\as00aK00a+^n; ;=+<.O{>| g!pPp& [8sBa0\,W 1Fa, Ɓg0<)L&)a*xC~/L 3,0|!'b.0|S݅;`EX n;^aYXXV*5a-TX'W 免4a@ .o(lm a;\+ np'ba/xP'?Ap*7ak 0Wc  1a,8O.ƃ˄ ra"R'L7E` E ~(L  ca&GfDž9\  ^X%#a)TXNX9XNVojp\$ Up1Xl7 -axPv5a=ma/@Rkpp0p&gGQp) {{ p0@F1!a,xTƃ_&gUa0)Lwi/t7aD wY Nosi6b38MNsmBBaR ]a7.w O~xH8_ ـxE8,DcxCF? #(Pƀo c`8C-L$p0$LS4p0< -fYma60/||P,_? ),g rp\!V݅:7 k:<.l/&9N mCa;D>v/]6݅BaL8CF0p%?-߅)axA ^Q7h0)o 0|"L'|`N tp0|_ fGA#a0<+|a#,O% a)RXVT p- p\+ j mp O!a @`!pp|K8-G1 7 #Hca_ ƀDžaxV^L ${a20+Ltp߅b8E NY,a6Fn[ya>SX$;X_ Ks2*o+ª#ւ|)l Fp )l [Vp \%lׂv녝®``np' f#?'Y88^#e(0l F3a8*`-NƂ3q,a<8_-L edp0\-Lׂ_iGtp0/?fGqa0<'/ o B]X Rua8[X.VK XVk5&a-EX "lu`KN ~+lwa'H>vτ=A^p xgyJN8 ~( G°?=pp`x@ F +a,xV^ƃ_ kD:x Lo )T7aX;kLp0 |C Np0\" a!xTXg%a)x< 7Aa' š \u(ւ ׅR_p\%lW p*l?AMa'x<vAMaO^a_\~pPr!pp 6#\(Pt  Up0|_nF;1^a,)%ƃDž a"xV&)ea*xUfτYlp0/ |p@X/Ia xFX ~),7wJ{axOX >|!' zp"lg 9fp|[6xl wa'A/ {OaxD+8|p0bxM8 ? 0|*ׄb$*x_FS1[Xp0\, 5DCaM p0< L 0Z^f s\g<* gBy(S%tai0a8_Xo`DX,DXVkZp/ F8xl s–`6V )lo ;=aH,l{I>Ma?8K8C{app$wec0LF_Kh0!o x10|)Ldp0-L tp0\#׃,p0&w s<0<*,O "<%BUax]XVV? gjp\m(րL2X 6 6wFa "l ]<% +ka/Q$W!p|! E(Sa<\a8_ .F `+nƂDŽq aikTa8Sf9aX kZFa!MX%!a)xTXUa%55X>Vτ5sa-8D(5 1 &l [_a\NP_v3`WNraR+?.  }`8~*?aa8xTF_ sh0"߂qwxGaT;Idp0!Lta&0 !?总axLAw&Xt% a) #,Vo*|v5Ka-8>i`6p-l w-:a+VaS vDžYaxY ^ׅMw`K¡`6ap|( Va88t(Fo #9m0 \( cXp0 7 .a_ ~v)1a*0 <%L3/7,0)?߁y|UX.,  Rp %,Vj: GU*a5^Xւ z<%lς&9X$l_uaG0a'x_>vcM(3<p\$+#(1,  #aaxD ƀ cqEaN ;.|(  {<~ @py`-p\.WG5Qp0lۄa$O~"` xD ƁO0| L qB1 L'4p0" 3Y,p0\'  se00a8;`L N8Q2a40@ ƁfaO~dGa xY ^ׅ-ax_ & `?E(Ӆ_aT Nv_, {E¾൅{_A8 I8Ýpp0L FG0Vƃ &w}aH /ila:0\,_7raF &aDX,DX ~ %qa)xBX~',+J + kk3p.)p#l f#lcmva;9_<)v=Ua/xMY>[Bq > Ypp\ Åpp0|S F[.p?Ƃq a<0<'L/0twaL >lp0# |p)_p\%,7 O%~a)xPXAXV_ +o`xZXFX^ւWuma=x_>6c6u(6Scmvp|[ ~ W p ~pp+  GQ0l /F=aD ƀ·b,0\  ;x0 |_ 넩FaUnf 3/Y1a6怗/<0|$,τEP,KyRupX.o +wzaHX~" z`xN~/l MS.b8S ']Aba7'' >N -!ppF#h]w0RFgQya4xE^ƂI`P>&M(&I a28W i:a:K`0%w 0<(  g9a ),o _}a% |&'_H|]X )Wp&lw-gVp?8l l v] .o ~ pC408]8 Vba80\"S(p0, c=8p0\~)Ld<ׄ axS>fOB1 /' s\p8  ׅAwa!|OX ;na<  /a "o | N6 p+l ].v ;.a7{AbaGax\8 ~#G31E^FKa8P' ciXp0)L IJa2Yn;i^a:0T gY1a60<- |gaxYX^ׄl| , ˂-b9\$_VKja FX nguzpL~.l 1[V &υIrp%gU"a5|SX ցaS +lOq` x^ ^?_ua'xW>v/=Ka/8c }4a?8G8. app@8t1&  #C(0<"Ƃq/x0%Lo$0/L S40p)3iLp0 %_p0\"o aQ%a1[X`Y00a9<&VgEa xYX ցw 6MDa38I݅mv}aZ ]Va7S{}Aa?xX8tDžCAw0xLG%aA* #C1 ' cXUU0|C.&$p0,LwSτiQa:x[`xF ~/fW9ua.xCKa!8s E,a18GX eraBXtV~0kυuzka1)l P4u%[" |Ev ;]2a7\%ua}!pB8pzW(._sCa-p\ ípCaO ~* ka,xJ^ƃ?^&IKa28j(3"aX-30 \/ sm\p0H݅g"8 K2Ga9x]XVUAwa58?b 8MX|_փoFp)(l7 [6pp<  {3>Y8$D8 >/kp0\(F hp+ ƀ83a6b38L[Va8O&vK]{``ž``^p36n Asp<+?֌p?ca$T>F(cXp0|M#LW ;`Q ~,L? ct0V ^f? p`:wy#a>8F(4a8CX  2] |WXVk6aUXX ~"ւz;o ac]^6W--ak¶ \O(|a'* p7) Xn;!p8H f#AM(xQ3W a@ >Fυ웡Ƃqxa0\)LW 5p0Pfa0<.Os<0&, '`|),'q(eda98UXVsU7UjX ց "a1 \#lׁy` K  cV$v5=%a/xׄMp0)_ iBq'rUa8&p0\!W 5p0$ ]#a"&'a*xI^wsa&Rlp23,a8O. 1b=a \ nrp<$O oYa " ?F k(6s-|a+D. ;[.p;' V ~*k xB8"'#4(8C~ g 9p0|U) cp+nƃ ]Dp0 D axJ fYOl0. |MXN?"p),_e[rp|OX LXVB" zp\$6W a x[ mAwa;D>vB ( {Y^p|MSp\" f#+#*(Up0- #`xR ~+/c[80U>&I Np0!Lg E ua&T/W s \p 'B<", K2| 3X Va-BX\^Xn6;p'~*l [V-8Q8N 7#2(mÍpp0P F c0Nƃ?^&wI#a2BN Tp0 +L_f+*#0 \/ sF\caxZ~/,/ E%a1 X7max_X>V +*pP kWbp7X.փo jaV 6a[g<" AbaxS  ' p I#T(8Kǿ Ja$InF;R0X Ɓ_ Sa"xI^&w)]a*b:@.f p0! #_ "<#,? [ |  ^ )kWBa]PSX!l6˅M 5.l?!ag.; ca#L6~ p%l j p3H ~v[NaOX  UxC8 >+pp(+ Gc8ENFs|aP +Ƃ`I&{$0<*L'itL0 # sOC1,g Ua!x, U’&,?aePSX~'ρ` xIX " 냚|.l'Pl' [`[N.v;u.p"w {_ !p- >N8 >mIb88U.F(a4RƂq&aa2X Sc40DXFB,, K``2 a9? p2 ,?ր;G:ca}00axP< 6_ S<'l/ !o Ձ`X >Ӟ8G8 %pp|<Ja8AnFۅQa40<&Ɓ'&WaB N/NӅi\a:8_.f_Y*a6N /QaAHX,o K;2|$>Jp - k x p#l ;a+xN(lo' H&Ǎb\"!W Q8 n$w 6na8xD~!F`-$x0"$p0\(L_c`Znfۅ,ca60'h$ |$9a!xIX*, K߄ea98IXV `XX -ւ+ua=An6[M.as0l [¶൅ ;;3.!{1_}Sa?8e(.  ^[8A8' w#(Sa4x@ƂDŽq7x0Yd06.S4p0*g3,p0\փ9\p0|O녅Fa),w K BX~-O+S*;a5xVXւ?] &pڸPl [`!6p=\*np'?q@]8tE/ GG°-cT>F/?(p0'_ƂK`T%L $p0#L?iia:x`xGf/. y]a!x ,W Mp+,?Gqa% F&b$8  p0|K#&[6aS a*0 <$L 3yaxE ;0|" qDa|MX),  w*_ja%QXnVcրaxPX~.l  V ^? [K¶`6v<1;.p|l{e^p/H,?녃&Y8 n G=Y0lGWH0 <% ceaxU&I3a2\NTp0 )L 3Lnf;9a.x@tDŽ7BVX [a) ",o +;J |*O p ~ց -a#F6-&a+E v{]aa7xT}ua߅yp(HBq* ^[8 . HCaC [ca,0<$OsD{axC >/cxL p0\'7p0# ,, #"Ka1xRXeEayNX**p|d(V5+eu[e Jac]n6[6%.l τAax\ ~-  7W5.P8N48[8 aض1\$ -.FMhp0/ / a0 L/ 0|)L'PLg 39LaP .=a.B惛a!+, KRX ,j +J |.O Ś"g ׅaSqfp\#l vp)w?]na7Z 5pFT(% `8- HV6aO ~"?F1wXx ƃ? KD0 +L STpPLg Wf ,p0" sxN8" "  Gg°P #Hu0 |S .ƀaVn&ۄ>a_ 0<-L a&xKf9ca.8.z yDa>8YX",o %Fa)CXV+Uya5IX ^aP>MA,a8_\$ ^[#p\-MC`0xX8 'wu0p0/ 'h0|)Pg W?$p0\+L S 4#a:Gf`0xCaS~&L?&)Qa*0 <%L/fWMaH &_ s b8Y. 7`QPSX k&aYXXV{Awa_X 6H,a#xU'l "l`!vpf\(vsk %np ?'_ xD8~)O GQ0쟍 a8xG>FO`8un(Fs1|a,P.ƃ5Dp0 .LwC` K Dž a0Nf?s+\:o [|(,F( ba|O`\X VšXXփ !a#x lO 3*l l ;gNpPY0" %~m@]8tfH0(| ýp0(/ kh0-x!0I$a28]it}aR lp0%w τaBX߁#` xVX ^C  jp+ ,l&<.lmv_൅UaxC Sa_Pob?8E8 T8 -Êp0"w#=(p01a,xH~#O D0 ] [)Da*8|Ӆ a8W f 792a.Nn惛 ۅna8H,, KeIa9xNXV`xIX ^րwlu a=8!!Fp)\EaK0a+Bۄ ;/]Wn(/>a?x]8p- {pj(p5p0|G.F1Fa,Sƃ{ 'D[p<&? SkT0 -L 3_sa8ob68 sE\p0\)W pBp(',? K,', +AMaxEX րw}aLXl_ i C 'l)l 5vp&?']>awX$}a?xU8^'ٱ㸬;FP!bĀG\1#1bĈW\q"Fq#LĈ+F\qŊ+vbŊ+VX2YbŊ+VXy繟>f__; 9{~߽|*>nSq‘;8F( 5 7}!P`xI0! h` R0|#p8Dp`2P0\,& p`) n悇9`!xY z-`)``9Lt3Vhp,85+XNg 6lW 6*l6+bA<, ;ӂ.`7x]Rж;Aw' zDg0 p`08I0" 0p`8L0\'n7 ƀc݂qxp`x&GS4`xS0$`6X0|*krI0bw|p`8Vd`8['X,-&pp(X 21 ֘ ւC`#N d7 l "p`'\ \) 1 l 7 A/7xU!  OAs`#g  aLpp`$" ƀa`,_0` _ o#A0gF#c@Xp`8 9 D0E0\# f 3-Y>l`x3`!8h3CAp`)8V ~+*Srp`-Z\+XnlcFp`_<,l/ M v;Mv/ cg 6bAWp;8S\".W k80- O C;=0`8\0|%Nwp`,8R0&DT0B0 3$,bl0]0( w , G`0X ,/ /K3Vՠ` 8ւLփYr&SzwVp`!nv{-³Aw'xzg[3@@p`8A0(N !`P0\" n FcA8`fp`bV`x9^0-  vh h ڶZVt`AOp8' z}~<p` Q0$ ~.n O`xN0- >F/cW;8pH3ƃ#B0 lb$ L f+``V0\/n惻 q"`1xKR/Xf.X>_JSU&$X Ng փł:&0M l g%N`xC)cB .ma AW z# ,A?p`\0L W !zPp`]0)  Fc 0&L &oAΘ L f`<  悋%&C n"p`1` x\ OLq o+@Xg V2րFS\MFfp` G<(fH<.y.`7@|$hfSAW;FF ` d p`0@0\( . r0L F[c]~8`A_x\ KA5``R0|- -qHp`8 Fƀcqxp`.nL 0<&e) / WLۂcB-`X ,3Ղ: p`%xX <)X 1[U:`=\tYꌍ`&p`38T. l&;5n.p`yYxF,kA/pП978XG yAB`p`D0\fajpp`$x@0 <& ~!^ ƃ:0|" >L /3WYeΘ #sтy830,X,d,6q,7;#&+L2`%xZ ~@6F%XN, V+MVs5RZ`x Xl6 6W/[L[mSv`5 4\]hnp`8^ЖO]Awp'H \% s@_pE0\0#  GCaqp F7ۂ1X`T0|+z$:c"8X0L'  f ł9\p`Z0,0n E&mÂ% R`x]|)X%9c@p`-8J-Xlg 6sf8pl Mi v vz vg{Lm vXD |+ !0A_p8E0* m`F0, OFg5KX` &F+1LGi p`8K0\&&``^0*X,pKL8K{eKw`9FT`%/@7jp`)CZSu&Dplg6S:6wvp`xP<"n`xE{ O炞kA/7⌾88 0B0) )Hp`= Ƃg%`"X0|! L`8^0 *  悫t|p``!x@< Q`)xJ (X^ VLɬrjp` 8ւcp``8fp` R] %nK+ 2' o vZxG|!~- Jp7 #t@0B0%   B0 \& F;!`,xA0,^Lo{DKd`*x_0 | >2$ vxS E#b` ZF J_ TSqB:0I\-l6{C-a lO;낝&]ׂ;p`3BAWpOAwp'8S \$ Su@p`]0C݂aEp`$`xO0|(> Ɓ/20|'Z猉Pdp` `8K0/.6"``.o2D\)X, K ec `%3g V#kɂ4:0B-2&S*p`+Q "nv's`9m)cJ[жh OLg z#}Q~N +5!ZPp`^0, n ƀcӂqux+`"H0|. L߁_K3f9H\p`8N0(XN, `%Rp`_<"X V5I-X> 6/7M[fpzgl p`'P \. B ==) <* ~%  gA+`k߯1 VaXpp`$8Q0 & Ng Ƃufb4L ,`6xC0d`.xG0|K0]|-Xlp"p`18D/X N,3!,VIH 'X 151 փۂ}&X6O[Lf;c+_H.v= m ]$Awp'G <* /W낁M_AW`(\0 |)mtHp`8N0 ρ<8p`l 7&g' v{Lmp+J" ~.n5/W<  / !3P_3>0" NFKcL8cq``x]%X>, `13K!e`98F(X N#5,&XkLL ~&`3xB<# l/lo vw;ׂ]owph+ G Si\A/p7\L ]߀A)`(xE0 . FoA|g=;`,8P0!L &邩L4p`F0lm9&><`>xL<.Xh2D;1)L &S dL f%R0E0+ G`!x\<)X ,, &m+Ag`58L-X 3q7-.l4l6[C"l v;C]&C=UA[7]G3A/7}AA?_0$F%#0\&  LHp`S0<$O Ɓ60DS0%>L /7`t,p`68J0>sɂy&Ă<p`!R\+X ,7 ݂AJ *`5xN(X ^6'`#T |+ vp`+8F (N v`; .1$h;`a+FL3}AA_x| ˂A```(ؿ@pp`$8F0 70 ƚ Ɓ+U &Dsdp`*W0 >3ÂYQl``.xK0-, XCK@Rp`8A\-Xa*N\'Xw ֘Lq փ7Lq 6;jv^  w'NvK=6A_AW;xH<SA_xA0-> u`C0, N;0p`88[0(nw ƀccqf =%>L O7Y;lpD3怣sytp`!Y*XlC-X ,+LJM*` ` H|*X]9c_*fp` T\#fK&~. vG{ kv/]SAO8! AT`p`!   #$(p`4^0cqx `"xN0 L fn0|%58p`!8Y\*X ,W_&erp`]<(Xe)X ^/ ւ[߂& bgl 6M lg M;L`'" J,# tO zm Ogk `g  pWzurJa n6Td?ǩ̵2S>v2跶v.3}z޽{:ߍK}8q-Hws hl.p6ކs#u2ebsq nD5~چ 鴯IV@]t[7dp, Y"s4ͱ_g3;ugឞz}_l):iB,.9֑ ] 0qXb5mn13.3㭦 } 7G]ܗScޟrQ~KIiiNOJ̲G<"|M Ȱ.:0Әܘh̢2CFpkp Y[`͡\]>vۛqpqjCbhղM" G|MBqgEҘNcjg#GǒZjK^|w %G8f km<]FEiXث<^3*S+n? QȤ)MQ@@%G? Bvg}gdNl-i?;$3e,f_ijsDf3Nk3j[sq5k?ur؏8Xʴ)f-VoWT?1ef5Xd9"ڼq޿ kqC͜s2Ěwǻ1Ko2_us׷Zq:7TӻtK!5=Ymybw-^-~nkVf2ޏ޽[V?K4ym}M֕E~DzcpbYܭw#^Ȱ}߭Uc3DxYḌӤA/;O.' p{0-IVkl־3ps<dFɅFɅF]hul:0~%q&۬zKŞx$\mc=D:vC$铴+omH:!u6j|Aڰֆٿa;g>|<3Y{D[MrLsm 3g:mK_Rs^Rܘchs9GqYoLTb%o ǛIYyZ"Ǒ*3z<Q:*G7jǣFAߨ7j(.GNh{>o!7lgoY?zB}f=itn|h~X G5rB?Gw룃gA.ȴڎ#}aӄ_Kl6FجeQeI[ ­21uZ!'?=1:a?nѩrL9ZoASv<ǧfk?M_2̱k!̭q ~<O&|4 ~ͳefߛ3=#-Y%YK/aqַifY_̏82Dj;6,$kЌ& Z>]6k,ȱfθd/meXx߰9c7>.f#􊷙3>Y^u}!>S>Cf,ͰR<Թй{G:4;ևADNDma 8&~AI/B/Tu/ yR};d^0Or0/ |6M: @1sLnEZEdP]0\GF!7R4(0.u1*`[@3P2ԲnU(}n;BJS0D2Ų;!LjN`V@n~LU mqoele`Z0!&QFHCpYL˸7 +lt38tk.,;`ةYvj8_슃qf٥Yv߭YvsCtE{ T_rreFN>&ōbÈT?tBFFSuF`9U "%`/R"}hTz(8r6f~Z1pZh^BJC(Ќdfa4;Х2U"heyFgjFZk6˻L`QL(V$  L]YAg#Iie !öB4:Hs0 Hq~$PNC8/X3O S͋Эp48KD@ bis+).Ut ;.-p&$S ,EsuKQT[Kd։F45O5'+̓̀Q6ݷE\mm>,ay1]ۺ0hBY$B:E!3V#uvMZeŵ^~ȸF)X"&5wɠKyqȨml6ֹ.{X{t, QDzh0.$+lKغX$%Z$״E}9pήL*jkk_1T}.Fa袞'OICقm$b'wE(CR5l `%6b2u?C4O*]KaHE% 'U2 =p\)\,_0 ֏(-AT{,QY̦D),*(!JC!h@Aڢ|o$z\B; wn޳=61g];EMWZciV=a՚Y u$_Q1C 'ȱ5;lEi& n.F1W1c# &l$YnГd;J:L :rhC|;X@&;l#X09|3BjLrܩTJ!|Ch h/&&Qz谪|XaD q4!B*(tj[&@`6"$2AmDvK%*l]TժTd'E[jHy8]BcRҴB,& _J)Q'2V"ꘖb```Ȫ6l n3I ]9I66_Ұ¥ZҠ¥rYCja/ڃQjDz=e x/ , ,SL%rza g*,hɌe&Y x~ؒ x~Xm޳ŴquLNf0)>g^N%du.'MUG@|]>g/ (D~*!CCzɔxn,W_P">9U"yצE޽9bZu( ^lzO Ƨ:mR%R}KC!cdwi>Lq3ig 'VDGXL޾]}/ 69' ٯBZ3]#j, ]屮劓dLOwc_q?A\L60 U"xx3u K{V fkN`F:9!v㾧'ue Ȑ'46)j M=H2S }#k|\հav)t_j(zO23~]ȟ`h( ` T+IF 8pH% `s[nJh<Ot~ ؏#LQZO)d'LM+TyJ24`a\g>%,u6۪ 5$x(Dh1/"/}Y#e!f8n.f8n&/< L4-Yп[(a@S u+bVp6,,Ĥ2XpfYYcY)+YH,%XV_eYI], g[˚$IS$9Wеf$; wh҆qIcp~'.6j=nI |E/QZ.ZWWkׄ5|8&Mb#Cd)gt;^v^RMe#" vQ׳:1z>a2-e20GMfqf'jkqj+ǟ1$ük+ {K-gGhSb\|83S*>koF߄n3;3ln+׍;2'Eu{Q;>\>ƨ1jX09cF/jY`l[B{+~镅q$,jTZ`v0-혎i0iv5$Q>l)%8z A.*iX of:6ߓO\3{}dhjGQs}#<>2!H#evN֨#=D|Y !5c l7~P~|Vˮl e 0899H.:ݴ.Ts>\* }N :rk@h !jƝ=#k4iivdu@uYN2iFb5)ചDZڧf.(}Ee-AEIqլHNHRIEㆦ3dN jH r"%#A.o.Ī3X"MaYm/EA{1LD|-ÒPE)CTC@ͱ,gh¢Wb&-vАGߓS Y5}3~=~:9Q> ?b$Xa1"eY U?}Iiqye16F;=WE0[ l4)w: (n% { ;UO݆yy3ç'::4sf,=$D;5s d!!ܥ}fU$d>g>U &9~]XunDk:h~(oyv=3%0RC_50F bP 4^R xu(:ġ2E< kTj';9*u$NuT̜K+goy^g<2yZ "I'}ۃN~Y6><6bT2bl thvmjs~A+\&_h h%v %vڕX,׊u кm$φ14Z0^ԉ|(KĆw|&1TZ95#4Su̩^l3rfiO.h[keoK۬'X}, cYS#AtǶ >wtI>ӨDSY߼AR&\l9-b>&m5/6"-3+Er 2\۷s/d-͂*USYU OM\_9hcIwGK%kmF꿑gLO_RcBwGaZILQ>(Y0&UUu].D-uy$$mzN[ 'M_1M <= %p2ՎĿ;4$fKy2ºxD&Qz9U|z!Bm°5%l}k-@\AYCc<9T:N*MjGm$h>H.R0{J.چ%2*5N uSY@m~BsgO\u4+,ꋉptG9M4mM,8<>'Em <|(򖑤3 o:3)FCg% 3I~-6(TGGu~`(HbLȟF_ $ެ IF+B2hXfHƺ(I2$cyH2 *DZ;&)I4&p /M͆6[f};}B m5nj # I~XwbKXl ՟P֌ \ ɻhQ_' OUT%X;P8OʨJ(#CWVSKCKJC$ou>K9CSYo_O.đ"b&(2S3fdwEotn( ^I' =(=;Db$=)w}`tuƌo:9ǰa]nlI&LQ4a*`fqL?x8&{7jF,|>F5QMX0TlY)3KzcS I I ,9A1DߓŻHJ^1yDXF4blDFSA-%fta&$sEݭ8† aI _!\5Z $5%E1|To,Q了H_-nj9bR{XqtkCVz߸Bs2 (a[ N (H"ČT[kV4{8|q0^L"] kf:lN ȎBsnWn,?RЀZk&1 L4]F&0WZa-5[)#Is9E]W4].8-eEH{RIP/ A5/A1c/2uC0՛|юm+zCtEϮ6AxM:E` '=SVvw;<;6bL#$I$>@NobΆ ]͆{1sQ37n{Rcb-)I y\BI؍w?%-u| pBPx^Mh֧O5;]u(,B@ۤ:G#e"5TU rq",9% kmӬm>kjG"dK5R[r_T]{vE.?uH],?Z̍4ERWzW @&i2Q@*osAX/c^["3!Ǻd!ݑ+eũ$a'Kܮ@wmj7YCĎڸ$#֊%0fW$oa~D8^ni5@| x/pN$ylLɗi^F~`)# (c\zLbd4bG6Mf#ȸh }L9i#RyRv_GޓLH:;R~ϝ)JC;vOٷm w  ϟ1ŏ%KYcemh?)~'-e2!hakN׉sYgE߄lvv6#A=),Dt=;K'Y2lDg$:[^CyAw`ݫ/9:Ц^>D6iJlxlb8ishfޤ7̛5yio#eŽ7emP>ZZ(e6f=FߦμO;!K[͓[{Rƚ랮{8 [OTUKfaH0"٨H PHǰ3dּB [Q(rnEiU|wyZKcf5uYg x.} ^FwnBI>bɨtG0\GGgDeuyyu9ى_X к<Z+ƭغ !.ծPaUxO,.ٰOשRz1f&^,.Xyl¦>c+VN8'<{JEpYm]B[V.V|zhծ3FU3D臔u`"#Ҡ9]uf?nD0꟩BVQM`U ̼y :WRYIhjpXI7N^я8Oq vm: p&e/?tc$d%b!DWXC5UaWg_j˒ORUUnd_*:~f l& "o et}<\t!duG$q`ug seİתgs5p 0B]=.~$4jYe, :r|xTc ==K5P9[HxR)\X|%!b(e HC_ͦ!A6[?1OXmOyZu*TkMaym (f<6mWvBfO&ـ{+ɂGT9e37"c Z>Dys]5m89eU8G@B&=A4'7;Ykki~Yc/wvlRzVG)?\J#`Pz[@s@ml4QF+墕@}]w/BM#Y/El)"^@n FnVJٸ~W~\@cʹ5>mF\uTWAۿ>L!rli|멤+󁆹nAe087yB\ykҵ\O%}el\^~T.al9͕wqB^q~bK qa$+x^~@!PPlI\o|H#x?xA!ݠxA%qrNo>x0>x! ҍ[W/=O;V*7*oRH7)oRlI\s;Qڀx)M͊[W/^{(Df- --+G"!(oUH*oUlI\W~[ o ~6t6ŖAS#!|+)޿xbK y=xpT_U߮nW߮ؒ~9wv#w}uoWߡPߡؒ~9كx0(x#+f(qr/7wXu73P|C.qrлza 1C~N̝+ *oj;ɌG G; 1%q~.]+%?F%w8Kq~n+qqs.p~wh;Qߣ~9"!̳(vޫ8W#qr_?/s~o{i;Sߧ~9?FCw_ߧx[oi$_˗x0 -k$_͕;;px?ok;xG I}a>޿ۊ(H\cw@j;T?~9f**v>xH#qr6nv;px(CCCC+~셷#!̧h;zQSW~r@Alch`ںG:͈cp8PNpB?v`)ߏ߽1T#=}L{BLG1Y60AO M|>|\{B\8\O|`nI#|QGGc?g!>HoG|Q|>=~B?|`^t~O|BII9ҿ a>K> )S )S-@|BO|Jii )˧\>|F{B~Fq Jo~m pY Y3> K3-plgioS).#+G?C\B؟h|NqyyK|/h_P/(>_ YO{/(>__T|H06>¼;|E|,U}3$0=a휓,-~O1K'/.< %f1,|8״o8F5|8` ׂqxMumA k^qxjw!K(_z08m}# :oP %&8:oj[ jxSÛTúw8` Û:oi[ jxK[Trѧ8Xb[8oo8M5L:-uK\`qxGNP;ڷwtޡM9X*N08m}7]ۻ:R og,rwqxW=m{A iqxjh^qd =5}{_}{8XB>о}_q\q߅_G^^ߜ~]B?|[lnDV7b0U)/صsϢE 85C(I]BUKҾyu V }G%f>dЂ\>iA xˤU-.;\!S4uA>_6_ <2!z GȧU ;!Vl z CU+ e29jLDD;1,`jW`xSN(tV6f9ە{c/N?{ѾfX,WF|m "$6jR礪gfW]ā`T-WyUޫ0ŭȇnp Ɂk/nM80j挮5`Wjt5^c ,VMg"띲ܓ\JIZa= ZkmۯwpۍuNv*9r?IH aG ؾ.i-ζ:bys#a*-Rô:@%}em/v Zi5vԔaÙr h;~K$ &u5b*}UtU6:R75p41Q=vkmF&`$`:n#YeV$b ]!5ǚ۴Hm"\ {.AAc =L!^MP!;`j~S)͑ZhcZ$N|I7;޹uB@݂hɬ9L&Es()CQ3wcZKͥ˻^|w/&%gL(f9kXK-oP^W22j-%֮xk߫/jYFt3_.?w^^6^kn12ݸ+_+2:qS25u DW_Ot4}EF(R;X e\&9k?]K-ʿ\_bF?^M{uNċF^cg_Yõԟ)wd+R2e \j-Sk)q5(~Ǐ"{FeR5Mϩ?ZKybR5J:)/y-RkZKͥ˻rϨiyNZ/RKޚw% ~E/{~iNFQE,K`ϷK`7//u؅5w6_u9xܸw7Ypͽh8o$A=ѕ{;ot_Kν,kk|-λBw|2o{˒+doyy.RݕK]?s7s'J[ _^G[sG~ %ͷ=y}:*4w777\͍on6Vd6f8_6aʷ~?_Ia|r'7wN}uRْ_r_d+/dY))JΨ~&~KBˋ%|WE5Y7(=9|KUˬ_QEUE%Wu}3>;Ɇfh>c6>+~>= W;'޴'EWٴI^޸G0dm[ Pfi.7|Оdݱ?<h2;<;9~6#kEj}jWN][R[̳`Ҍ/PDxw"ys/jd|[Ά#',ٝP[GR{=XOAooٓnuf7i;2LÓ߉~6^t0{KTcEi͞rM/n-2:,>.d 1Hwd;ޝGۙ{{Kvvw>^yΎmlh{gg޻ݿ'դGw޹{p=ǻك{ەbojX3{Nߑ䝷ݿw>w;{w޻G{pg۵{w훙!g~|kÒ>|o͍ܿw##=]7(I#yo=fnh< i5#-lRN{2Ǐu?|ǵ{wo?|,޻s;pg׽kE%و{=~{>}D3;RYc%=|}׮Sl9mz:+Sǎ(nRI M={~pwۻCl_qeHϏgclM|uY5Nvs ;G;~k߹ͯO vϣ2o}p,uq8˜dnY!O]f_ӣa5t׷gf[܈m1OJS'V'nY23?vy /㧇{FRtjk,'i}U990.hY<|Ztmn86?DdOBO.ˆb)>$'={8m]?&lM[^[,tBooύ=9n|p# ˺&U[23L;7%ofm/Y od{ND$#/RnrDӺXOZfgC7پ4uVfO!d?Nvb/67LTw?gC5ړoݵx u~O_,m"}nW7]ko١{*}܏k%^{TXh߾v8&Nۙd6kOل<}xJ: 5|';J&7Mܼ/nf7XӋ#-q m9Kypi׈?;z56"3g WpBwzH=-fe&s"ytt./ܚs/c'3?^_=9p/alឞөB˞cӘ?u?>s)X*R/g3<ʤs"3Hm3A3nvqQhMĎ,ג+%]#; [-L-eMʘܰ0~[w{o]>G#tmHgWLn^n$[憨foFŸĬWix.>gΕdywﳻO`w''OOi;qAw'+׬修} Cq,˨\vFu^ѩs>?_/ ң_$ ,=DiG/h&i@n/Do#=)$$lWgpͅ]L"uyup`of: p)NSյe_3Mkr:Y+7b @RuII%%UT](@R}II%%՗T_(@RsII%%5Ԝ']LȳB\`dsq1kz#K^/0 l\H ln: ޣO*j@/K^/0 fҼ+4(2]s`9^R?t*S||ézh9am-%o7|iq'l5USDr(bWF+97wS诬t:gNVۗc=֕9z6[5 ]FٴW IcS:E^mڞzzz|~WndA=3cQ it':/Ji}QNm8DQ]1QOӵn_jQѹ[Ӛߠ+]UjWe7Lf*0TNTؘA^50EIʮQҖNjRykUSw؈IT(JZT.cyg]zKE-C g`J3jXUmV;q2Gzj؟kBi%}<}#´88Ym9h!(wOv]]eǧt止U561-&+=FFJu:_zkrCe+*;;EBAzBκ2 h$QR=Jb֭nk?kD0S)qU{8jG5 5'eG;!Ƒ :AaFF;HuLx8C_0XD7ěiśb(yٔA"ƑzWe(e4AUL,#TI{o'82!˫36ΟPUVU~2*#dFE;%P0>ۤ wMXiG5ؙL^l&/L.õjv :/AN%M' 7u-J5Z$rj LUE9JiR IDrQҨaK#jd_ʮzP6$Όx8aJWhiĈvU@YCtAb)2'p:[L(׈: kY1Qe;ƽAĬT/#&d*Z~}@*"BWy OƱ:[ HLɚPɭ_ VSq>kuⓌk jteH"_6g;ɤK?eb$S%FcxhA.iZ1zd;Qv~4Gj8/8EmkC#3nZ%4-jG]ʊA%pՠeί&tɊr*<8Vr!jWl#ۺ'JIzm%Q'Gce^vϻ2}+Yʁ Y?\Q1 ]3Je{]~z}T],Q,E|07FVtJﬢ%5j)ie#糱ʪ {(}ۈ'V2qIXd=׹塭RR7Didn.=6mPVyߩ[q|B62u&Z0T% TG;bbme&nxmgNvrʾDVkٞU d zc<#3ֺWOe'+Xcee-TϺI2>#)ӂFӃxbNbW^v{ H"Fō +2#" "2D\ѱD"FnADƬADBW (r bト@DFЃqB@DA91 "-v bpL "Ek+} b2!"O ""I"F;t "P "C "9 "r 0H# l@Dk@Dd@D@gHQ "2D$ǂq"i@DT@DD@Dc-4zDU " "242z\ "DڂD "2 "ZDB=ԛ* "B+-L@ " "r* bC zy@DDk@D;1,*qN-HN"˂-@Dh@Du bE"RA"Ƹ-ADAD\g"zH9>D@h.( @D6 bg@Dɂ_".DDDDDv@DP "~Vx6D "Ro0+@D"y^snAD@DiA8 " "* "JAĨDJ5h= bDr'1u"kADۃm@h-HDD/Dd|D(#$ރN"B "҈ ".ⵄ " b"RԂ@DT Hn"DD=ǧADd@DۂDX ".DDDDDDg"j˖ b"2 "E "bDv(AD5 "BO "v b\ 9H "JR bg@DZ@Dc# +D "}?q~DDD#:1׀I(}j1~QR "2Dr*z *j?kA 4Dqr"F?AD쐃K "zhD~D$'<߂bIt b D^""g"2D@DF@D^(i@Drsj "r "@D$@> ! "Aĸq n"@DQB{_WcDd5 "rV b`TւA_"0-8'CDLDDDDN "@Hn"":c "Ҍ "c@DYL " " bWYs:D" K"qD\͗Dw{!".CDTQ8] "ӁDD " "] "7 "#(A8 "&@Dq:"x:$ H#D"D$ e1e_ "DD "ADLfAD4ѯ ADhAD1 b+)9' b? "Dd9H њ1f""t"8 " "FADA8 "Z "DDL6 "^K d44DĘ8'C DD%  b_ "ι!"ADAĥ=t%--e}"G "@D "n@HD%H‚1.*?+@D4VQ ^F @/=H#H "D,H#%*1׀hC"cAh"_ "bDDRhMb\ "F}* H# Dr "vhADThAD)@G=HD^ "-ւqDD Dz@DLׂa_O "T "ADހ Dd-#HADWX">M`)#$HI0"OE'L'L\mzԋ3N ʪaDÈ? #bFl==17ˆFD-kaĥOz 󄩿f p<FD4 #"t#FϨaDaD賂*q S9 ST O&inaD iDqT0"zi`D:W0"\ˆK= ߟ0"C20"9F+H# Fxow:1#!SÈ8O#2X #ƙP #bF0"]FI:1  #rq'Lk`D60b10"70"rN0"#(`؟Baa؟iM xE#Rˆs.Oō'L 񄩟yt0"#a؟o賄cFFD^e#F;`DB`c=#k`D79q>0"]0"70"#(a8 0"&`Dq:#x𧍴:$ H#F#F$ e1e_ #FF0"aDLfaD4ˆѯ aDhaD10b+)9' 0b? #Fd9H њ1f#"t#80"0"FaDa80"Z0"FFr0"^K d44FĘ8'xtHv FD% 0b_ #ιvP,`Vқ Fn/(X qfm7Hn(4I]F-Ɵ̟,Ooh?MCpO7>=|FN+=b8GD). n^y1ugz=R.ܘI)p41dli=q*U~'^X?Sn~6Cm䢰4Mu&3VeZANƟ_m Y$< yCܚgd?XpA՘h=*OS>eڮwsYEe*K ?Qe56ka…т9~6Ǯ/^3?RP "3 "c6 ".SQq=08'd/<#"  Uԫ@D*- b Dd58'D$1KQk "_"zCQR"Ɖ}3U ".@ĥ^Ձ޽ADۃ8qB@DWԫ@D\7 " "r9K1%Wt>h4 "E[Fj9k1Ӏ^8y "DvADԀց8A "F "hD""&*.4Hp ")1YAD[(iQR"& H98'DL&.z*)1biĂK"F,AD(ADlQ"F} "A91 "A"DDDD=DZZƀ"cAĨDD-_ b' \"2$"2DzQ "@DiM[1e_ ""t"@DY€AXoD( Pt1ADlcM "E.J} baQ"D$a@d"2DDDIJ9ADFр4@DAhD1"2D~6xE "H"" :.'1֫ADT@D "v@XoIT "Tq+@Dal"O "4(qNDDDgA9@DDkAD<ЀqAD "Y{1Q ""M"2X"b"F "Zz +q7 " "v/@D&*D"b"F "@DTϘDЁq D"ι"bDd|̀HӃـhz .FDDN "}V"ROӀHb@8DDI bqD$g-H"y " Du "ADTYq| D? "D DqDD#) ✐qψH"c)U "D? ">H=t8WwDDD "ݖ "E1np:FT "- bHjqu)Zm@ADh "Ys1\w{ "9-@DoSGZ10QR ""g"z-cD "@d"D$14ҁD "@DD DAD "Dd="D$Sk@D:Aĥ=t5Ȑz1ڡi\K=w{qu焻=tgAD "X1D "A8 "O "R/(Q[#(aD0ˆ #"# w}K1*焻>l¿k#F0"faD:aDZ0b\;!M0"Y3X:ˆ8Z#0b#s ^JFLvb0"Z @ #aDaDTX$sׇM>޸CLj(z1":sz50ˆs>t`D #laDTÈsFE#f%{Y1kaD`D`D F`DQыch#HBÈE#R4 #b#F}V0v9ʆg#&;M& 0"~È1n-Ȑ4e{1͌H= #\ #2 F\CpHaD9 ^ H k'1ʙÈg`D2ˆ]ÈQF GIz1. H HFDF FD/HN#F9{W0"&kaDF0q0"00"0"`XoqD Hn#91+1m#FEF0bqF(H F u#FDH F9ˆOÈtQԫahw#2FDFDFK #bFEJ)1siˆWÈq=aDq Fd=[#E#E#F,aD0"ZˆqS0"70"z)`D$Q0b' zD #>iB S :\È xt󄩟x4+Oz .ܹÈ0"t0kk1Q\#"Z#"FD/Hq(#FCM0"z0"0"0bˆ襀3}(58}00]rHFD9FLFE:Hq")`DTÈt`DqQX#ƅaD`D,aĨFDk%*Ja/ H FdHF F`DFˆԫaD4ˆHFDF!.zEx3^ _>B>߅3~O{JfOɺb|~_uԐYƯѣJi&7*~ER“ԏǷ2 ԔAfxK.t _`rGA#_8%g~ ?3+t}, L?%5~19Q_ O}pQ:?tɼa1t8>e ?'CaKFAdInĽ~~w\x?/xqil?<{kԿߜM;$X޾`j5uH7:y_$~V0Uxz6gJ7{?>9=`~v`?{=9< S,}iT2rh|{[]˶~|F\~ &'l;Nk$Me?xwhiۻ:F׷_O][Jx.5nd'kُXnX]& koI_'LRskwͽ? {Lײc5Sc7_&F6˗6yLt<%O7mn޺~}3mvbY {G?g{3{0~{Otޔ+zI/x2ާ md- q!e~~#m ?yփL]~qMR}Ե"Ϳ:ƶ{}' oonVɑ84:+|iƅrv\@[,+|}Q0P؛-/n.Nm[opgm+>Ç-h[sY|A ٫od@_l.*<67^yAgV_hY,& O4_lfUlBf_2ې(O۱9mF}6FtɔⷣTkP]dEs@`9+qQ N)kz]bɺc\T\87's]%^fh*5~Z$V]+NPpBi* --EKHzЩ]J?%8k/I9Z%E”b"nҎ>мL_\v1]_r127Om4dm7Pn|?tv{np@v嫹MĬ WIh\Wqm.R_nIt߄L=gnǷ|q1#], Pyu:VW6I*X$5>p';8U>SDY3L{&zh;ٕu~nq>[k~zdYSee)c2^0u`K.!H0}`K/!H0s`Kf.!9O8+iψ m%La[&ǣ 7OogwOd9QGs#[Iz%镤W涃G<l=gSقd{V )%)~p݇>ԩ>Ї }}.Co7D'D&Z]d&Z66sMD L:m6L:mE&Z]`)`i.2Nh/&2_E=󌢰IQE<EWEzQ QT~QEZ=(G6*H?tHW?t}:$ E&Qd(j(2G1?LȔ*T?LDQDQ.#ٛn.Hy0zVɉs"MxV1ڊ& M9]Q$?+ʴ~EBHc4 ML^3ӛ 2f澞_hT^і-cT4´Le:}=p-kj bͳji+åkʦn fssN\z<9,k#w ?ȜO3Ȭ/#Y>G泞~̊ė|z:GfsF92sd$Dfmg܊kY{Ƕ$ɹqL\b9ٱ~z\#e✕/|8g?G=92_&. #eb",_|ͪk Eޢ;vݶMT7΄K/r&X}3<苜 0Rc#,)NԜ&HG >ҐccN\sfg{eKCO9["9MG XLbYN&r 2'( 8(l a+ +',⟰''dTX➰{V<➰R^w" [q\؊wJQa.l!lak!-.l!lak!-c.l!lmmrvͦjX.I^+gۙOE-; 7?qZďBԏE5s)fN<A3'RjSjQ͜xJ-鵨fNZ$kQ͜xJ-Dējz-HchOE5s)HעOE<̉'"#h_9$9$Z9$9$2'DV2'DV2'DV2'D̉Q̉Q̉'Qˍ̉'Q9$*9$j9$9$꺚9컦M_<S&X,vcνs G::#ZvFK4nrsS8R)l_')L0It??/?}ߝ_>2Q-:X4rnEFKטZ,bvGExX욊RMݺ֘e]A 6әn& p>{҅8VoqGjzrnxA1Qe+9?wv6ܳe˿:++.X獀Xލp`U/8F iF yl>fkyDyo 2ory1Hn?JaaZXΎuva\vU؇j'gyA˻I>顧|z'ɼ,$ ZMI<;Id$]nOz)IrgiTS僖!xL̟O_'֞ݗv~>n6>nk^~k7s8g巶8gk#s~`/o]FƿOiުl{Veۏ*3)AzNiMĔm_<4A>xB&ArJж|m;yu,=tfs JV"${ r-r0_\ԥ7ꞥZgo*>o._ >_<_Qpri<} oΞo09x"uzisPuT sjc^\ǵ-ҰonT,lhIGQz翇5=j}Zٌȗ*/#C0@ՎxJM|ɝ¢+7nr# &C?/v12C|&>~7ԄիMn;wzoAղt}%i}^Wk%0F71tuB*l'Z+tY%eTCyDA*>L2[٥ҕɬ`hG^Px"WEHS!oe)T@懻?}/>?dTHEP)ᑙ=fH@T:EFGQX{_5o_؆p0'),\QP<2?DLaf^"@d:P]geC|ZzewuOApxaxR__c\ ?dy}~2d)J>䯩@6PzVeWS|]׋c^! FΧ=/4:6W=to/"US~_RrGPrDK y ?x{s%ҵd [?<,De"^Ƌ`["hI;zPr4p$AזK['b~X'ܥN^Z!~rPb -ʢ6jS[A"5hfQ,cu** *7"3cX/]*AʹjT  7cױB!@+O:Dr[ 9.T8 -=j:-;˼ ="BbJ*QQc٦땗U)e3VBFRz80OvZG_!BMFR) O%YQB?8絈T{h5U?HkQ{X%njVe~Q*!J`H6(,Bb3?8"Ɇbe CY;AC׺}wق8&>뉮R^EFG'ɈtǺR1V镾p(X9n^x(F#lLF`R(!\ Q+%)y7xXmQ=RwCYhc4Ii# a:,ia#la'qz5qM6z E^o֐fjm8L d1/|rAE! uwZFZdUQCi?25_CQ`Oba]V`Q+ _E""FxCBT9M2:W q#01C̿:2(ߑtW &3(<\7X^tOVjtAG%/l ܏#'8Hga,e@"BT0ûyuZↅ5>CL{RD,WQ lECrVĀxƌ rB :6Vp(#p+(l ,6!=g\U BUC8Kf YHCj"& CλcV ͢(/IBqmd3iFK+@B@nVOsz^ٍu`DQ}F"Y$PX+]p PѓSuVxG .| iC z^ "$k9@SDE[^5Y6#9 ƞ(zCH& Enb7K{/ C੩ 'DEz-]*Ь3OױH6J iױ<Պ`3dEU:@2pdGDGa(B;hi)}x7V8cb=:6L8yI2*b8EZ|mtl¢JAŒTJi:JZIhGLH=`k"`t!f AgD-Y3,PQvԖ@' x8Вb,":pvc.T,_ fC)dGsF= 0|̣Z BzαCm) bXr.3=Z"%, E0q`p<& +;H;C" Un@Ve|b} 3f7"ЌEi󆁔 R*("DQ7"> v`C>þHP="npn`_F7"4#J% a/EC  HaO 0m&`a@՛G߹%""h8șx1,Ҿ\I(oDm߆ xN< =J Z#OB\L[`LQ?Hq#dźIojxpkY>  ?ŀ% Ko{Hcq皷8i +2Dc$(F6|K HFyxAh=bFـ JaLҐfxw(jk` ytu-`}bP7 K1viC@' *p»WZv`H[T:dF˼5*EPg:8"E>ut*ι!VoVP[8HPKr8&UbRD9QSjPK3I X҃  a $iYQP7Cx\|ei6"Q `S*YlCB=Zxa3FE(EH9v4D$;12" "mѓ2v%22hFA#ph P%#, C!8zT4[0e]bvF#pRcE{`_ad-D*iwZ"h*HUl Lb:(pB(=puY(6Eygn]+~FgR#00{eڵ;GA} uL9`sS-@bJZ@r( h8P%O=@ qi}0# 10j8 ,hA@0h`+L='Ɂ5kX&=#$Ⱦʼ:v g8!D)q"bosc)igusEr \+Y[lv`{ ;֘EΧ-f'_Irfpp ,+T@FcɩF$i/|y`#!R @3 g$G7Ա3qt$pnƎ0ik8$:X `iFP#Ȣ.HvR,bzؘbt:_Kyoʷ;.N Op/v2"i^CzQ".`@X C;,ICD!+ݨ.z* n'ZA{܈HC@#h-ºwcRc5СDQpmbl kұ8f`5x)7tC(>0k҆CN3CA˞)`X&OҮp'ec=#!cQ`LEsPЛ\ 0.u#y1$P #2* b.*7ٲ  ,Da5XK3;t*m kgx4 Sٍ UrghWX74V2 ]QW:B|'EG]rp]`SXGP`{zces@e"Dssd#-ivvЋЬR 3 >d%dMG]F97y %(%HDN"6ܫNIusz^8,bN_톆g%Jto+**4S/KgRR@" %D~c)c-v6tSZF'YEpِ`@!j8ǚNwʕ (CГv[IѨO[yn,vݍd8SjB%xsptNѱ1 >Ef@ #vfb3Cr0stxm>CcXw4%M` 94NC$0(ey nӖ"lf0BΣc s+!P bIiO^x|Ð.XqF U|!%ЌE ay(NNg:ߋ΋:V?섮i!wT`ǶsҚʝ! ~Mlm+jG:6s+x!ecо#s_Te`qBSJl?cE_I(yѨ<Ȓ8+DĆvea-'0@cb J@'A ̪ SXL]e 6i㲃e><!A&@/,7¯ 0I pѵ g镥+G4|.֌J vAΤF9pHPRNPIWz#zހ@ұa6>blhUp@ 'OHD4Y3.N0خlWwj, HDC_ wtP&mnd8e]c>Ӽ^s )hGJXrS/{z0# &>wP\Fc`3 |hzr{;o'>DHll(5>DkS(7ԗ6kmm }PiF8=yI8Ŗ#9Oot"9:ɂ%Rll(UzLU2Bc_K<" 0<,~Ŕ,kH`H_ eWRJl0jV ,H+ax$M(\IVcՍlٖ !fH/)/Eup-k`hÆ9K9R>0H()ŬڡakG)|Yr QkQVՅ1ryMFL)ڜPЇ@^/0` Ku^LH: fϐ0-DҐ\.WJ:1rt$&[1‚z k=z1|Z4[26<9gCu1'!`n>eYi!E] O0yjX+0[AqJFJw|m:ۗ0qAJvF 'z19R(ǒq5(Ft=(`Ŗ 2' <tb;98qZDL#G":C? DzR~6C;ˆf7Ӭ>vϟ#c8204yWt?T~lOO^t]|i3.MxlT7]t~qYwVzQB[P۾Z宬wjͫJ̿, A gB {Tan?1kig;r\9qƥoYާu',>}|){w <)/ʤwq .^G/Gg;#~(wZ$牖4,}x]_5: uB3JobonJEȨpNh D^CѬC7҅l# SHG!ZK5Mcm{>^] ,c~aK+s|:M<}0,C5yèw$Q/wƋo⟈VQbvNaʎ2zė6=#^oi+{Hm{_,,0RQm< 2D%0inwߜ%.]Q8KǚAeXG[? ~dJ?1mvFbQo le ;'qXڱG6td1wv֨ }qRh;Li+6a7ty6v<_6 lΈ?HѤ6 +`S8xM? 7x*OQ>kF4j3˦=LPӏVfNqV T=d):Qo쨷luJSՁyKC<Ԭt>2<[df &:ۚނEXpxlYƮO)Q\̙J9?TjRf gTR:TP;6Cm 6NMcZgr[>/A_[uY9[gw[mfaSy*~̵?T`tLLWbҎO 1c.ءGƦ/?6zfCOM{;Iv<'SM?N7dJKٔ OƘ7#~ƫ񍭎1M'=޼ʔ&=nB/PE#U*ؼYB.{KO0=eeo'X#f#-۵N>ڭ<ݔ夏f:nVtvzF:˴zFR@afmfxL|[S6߸zwuv].4k6y~[zGt)YNtU-^sg׮ʋrorxuQ7W~ֆ?b{b:Ҽňer|eyۛ;dzP9?BA<櫒RQﯾz]f^1nNQWv Ki[#r8zC.Vw妽7"U~Fӑs e4t^w_7UJґr2DXP['IP1%)gwkc6cyIyyFzyNJ__q"ȯ]~!tT݋]*ˎKzU2/R7fH:XIu~,m2,{ŠBJaTRTR;+40/޳9T^y5(^hүēI8"HA Ja!(aI`[LdmbZGZ@ρg ziq2_.[}ڄmj2glT?kj=cѠ>f36lNE-::lh?֯|/"{Ƚ]?*Ο?}_PT$sw=O6fQD ~s\R>><$6c73nzWrBS۽Yuy7ÛvHLm?\GӞLwaOih*WΜK忴~5ɓ9U&]U>Zj;D{Rbk[봴N[Ԏj8k֎D~[Kr%I"hL.xk\u$>A:L^?GFTHՎTHՎTHՎThA/ڶ%Z0ZC\fZbk3[;rĕILwB:gs.ƥ8]gFRӆ& U?:ֱˉY*M:ֱ]ra06ecQTkkZbk ZG:Dz0{J+%M"jXUlbyk%^;zwMRrHk%S?˭[KZ1IInzd^?:DfE k{Q?\LH@u i&av(Y W&m?N[B%LJ4 Q2W\݋ãV{%Xiq@[#eV f3V尳_ϋW)ҧZ٭VT+.ɓV3q`[fa'MXWOVﰨրMpns gׁqps%žnətb?heBsEGo畸vRotZeWHGqwNҶke_0[ߗqdU} jZ &[t[j{w_%ݩ\vwz`=XZV~ImyaXyO!BCItPCj:`a-CÔoAPJ5oVfBsS]IVܘasb@?s@lOsPY^ͪn'bw u:ŀ1Ru);w K1L)UowCF(;/_]߱>-Dn!r [BP **CR v|@C1TC1TC1:::: 7[&0- 2U]Tu.SeLUGT6-lnas K-LU3U}T>SzVr [.pCjT !S5dLՐ*y y y 4FcG;+z^XпMeo׷˾Z_z/Ũrc/KIլ8䲂?W$_߂b^UOb^,+telr,m@TYʃQ[m2pmNC[%ټK9}3-ó kqbhauAv9>L;ݗ$^- =l>&TZ(u=eKo\(T0J4et.X2OAmL_7?+}n+ٔRdUrm3gvai2M:E+D؝w e7;ږO3?":Y- mL,!+<7(eL8iPr DY*&^4Eb oO @C*:1c c.m,[&&].o:6=9S 8ӱ)jZO\3©wĸp+ 2hGZ߭Re8Cd={?R{ᱻC~`~' ^R{?_-߭R;{lo<ӕZJwKĤxtr?o:}.vz*uO?LlQT0:H(tQ(8:(w4,vb 8@xd ž Ξf%*9jt!%¨ M}P]>:~-uӹV:t=+].'_ ϵ?u'^=?8J8?o5`> @#E "s,:WuF6ga}nP˼Q>ÒJi>f79?iGӸi,o@D\RMjQ& 4pSCqT Ri7O~ީ+tZZa jRS!wEAU}4~ ȗTz]gzS?7';m\vr0V4.gll@K@ DaZ&c628)QBTX bxW6u$E|C9ni%DGkg-:Ma mD|[}4[Ђ= mfREK1 מ'.qrEMZ @+2LAȄ;mږ1s}Wj]d*u-.'+eܖ0-?&0NsG0bXA#$D  Q})^>e C/ѝC;1Z +zH##T^q)8OKOpyA7yes*"iĻ)9 ԕ~8G[MlZ9_ziFyfZ-w[dhiIz]lMOJ,3@ EG4ylCE퀞Kґ.V'o^xN~h#o&Q%Q֒"K[\1P~}\m3zoC&Shi!GtGJ*\LK|c&s ~U)Y%ue %[А8yT^EA21H{CH3AxȤ$TfыT+51 ½=$'1= lR Y$k,ν/4;} z8j̏* E:c4|.$d jV5\AGbB%,{Gq<Á Ԛ!fZ ~ 6Y~q0t|FXV%-`̌&+S}$ # 5^fiPH%铮x@X/ Ի " @*QCfh05$9= ,[-T{|xeLm|!wW»W>nwu#tWu6L*NS){aWVyFsl[h襎. &Vp'V"iVJ*1ԫv|O׊7f0MTZmz)~Z^ QҚJ/5+J{_+VT 0fa|g>6DC,Ac}Z#S+ʥf;c{{,AuR+5.kKr3w3%CI!J4k˛7!#f0Dr>Kfubɡ@m{ZՒ}^Hѧ$I0d6@ŖjDH6@G>-Wuxh9QV+a\CCUc -^-GHmVRp'm] 8mB2_i6,`.-f)!#[M"d5%B *ka!baUEs ,3=#GS"PW%zz7Wt#b+өCRWKj* WՔFC r#Sw,1Wl26+ssؐA=ϟo%Lj^j9?W(J)V-,jfaϬd1˟~YfQ9eʴ}im5 3|\wG>^oGu^}VߕO_QTXZ~{< ПV(js+SF9צG;'򓮝qU \[? 8 J ҷ ܡ0٦5Wv1+e҉է@Mr+DW<3/=|Ӱ1 jm!Kue8Z|TǢQ9RrgXQoJN 7E)WfL(֪:ˊ PjImzK0_{> G߇$%Gc~hֳW=Lf8u4s@'?BO%o{8es=^۫ v1Iph/HФU^npA蒕YEe GRhs;+ZQ>5Bk|l^qox\:?+?? \[ao#2/hZ0WӔB8YU CA̧(sOK_zUX U|bO%/%6~_u_kk/˜ޕɯa0J[4|*O;_zCwtrI|+^NXKQc>b9po-g8bao$ĝ[w^WyK*H ]%;sw>v2dUep 蝹GW5sO˵5!􂨺 k|hjUE1! Nx!?n&]@YΤDqy@Ixԩ4wx,TJeF 9'x*'`K*6'ҭŪeP=wu㔉Pƍ]X ƫZqa[ "\3grf2Jۄ.pu).7՗ouc /VsIi-E`m ^⚜T=ƴq8Iǖs[ʚ%]Y^HHrW EBr5u+y0GJCPT W昞!ಧW7K[%h8߆?G?*,hSgǠ>*<<c1lR8TpptArЁ#%K?ؓ\M8VKzMSO6^QZ7vxm|pFwW]尽Urm%Hr~?r]\wq4f|'ljw+mQL 8+P r=Y%I0EZ*4#]NxL  ~E=ZnIGLҩ=A#MGSAwr3[/~*U4j0~#}KpΝs uSul F6^lěA1o"X<(St =iBTq B!.%S-Rڤ4eueGۃgd7"*?0t"^m?@Dĸ ngW8X{`1ы| ȒHjs{.}$9zwWJCum)p `5*GWӕY8O >ͶJcOɀNm Bx7,gwHMd64_r74jkS} ))a(|8=b<5É4Dr8)j" }C(>fghcKcRḙ6VX(bHԝgYxVE2W&",d|[%bDX 16рs˓܈R 2FTMg[Eۉ@"`H5 T0mLiSal'yV 7oiYwxSѶi~2#)ѭ=> 0*g,'zͬњ5xO*[M> E._{LYkzora&+9;c3R a9l (F#ȥ !ÅJ_@'ɰ=~jF|.eƷtApBbƕP!^P2$pMb/ 12,oh=TۼKZLvr|(NJ1L3jvKtapsO7>wJ䐶  &KJ_+tm-@=Z3[أg3?~_F^tn {nغa?!]Du>׊](d hS? k*3,ܘ*Tyl!o|wlKf93y5EHo][Qx`v&}_"ˣ +=ѧm`_l>ɳZǿV$ G_"nfϘ  de`՟:f]oYhw1۱Z1kZo >t2)znQM SrCF1s/!WA|/MY󷯎1;t`,4ns}uNޤS}' d+;1+k˨(Ԃ%1B#p1/r-2i_o7&l UG<ahˮRp+HqD;ΔY?A9 gY HAB'1&n}ݒt~XJN11U$PU,2!w q o%v+p6j'~"U}JRo 'E9A$kBPzQ$_dkxH~yJe=/{WsfX0H.wxt6}U,,䪫6uQ^;ohqG~QRQ[gW[_!0&JB3rh* G/ fP01NC ,Vݼ|-Z+T852ÊhVD"Z%"ZѬ$~rDǓ;&Q<nG1׾=h* Cʐnp-Ú~XE`)o;|u2\zd!`*AN%Eaҟ8t-ZྲྀJLlq :% wc:FmGexJ"BђAMI? QXr&a`DڇZ>~pCp<3fymfbxlwdGrؚVJ%UP%l@ 쀳m:̬ JN!U!C "5IG((68%fk 33R Ѵ<850AyXZ-ёGyj_+ p7s+nZ?5 RUfaf#̂o1я=s;0\Z֊_"3zn;(q9fY#up`A]#£V[*8'C${RGWd$* ) 1hQ"֯q +a’}U jmKx)$ݺ^] 3?Yu@ߡRMW(a!%}`Sݯv[+w^ Ck0+txɸ \&d*ShL;!JB6v\ll7N~ΓD\(<1&8Fi ^Jv-Y4! pz7V H mQHfnaG9 XC&Q1#N"ClJb3wVP }YS/!ɸ|V 9031ؗXyINW~{]i]vNa< W.%m=BBTU|T4],dx0wP/ֺ!bW!vdv (\c(K)?T͕ѹ~yhtVqܡ?x,@6LLǣ> *5Uv=*-ԤB`ER.U"b^JĎ,UH P%2XWKwϲnQ `tFȵ)W|>́D0w++4.7!t.JN#sr&KUP V'oҜ0HoR\ LӢJ)2 4:(d?_ڗ"t4!.$[\KCIb1D\}#LaOWYS[KѷgR{n^aD&T!{VSa *0)y2 aF_,}Z(_^ڂV$cU\tpv>j4ή't{7w3ڌ "/Ӽa6+KDdH QLEfGb`eYK Bɲq _q<l&<3 2:Rh:6 e5㞇N\{sFIǜL1f kKg].Na9Jo%8paZAVJewW@$Jp9% *~AEp2ƕ3*%Ⱥĝ7FGLx>5YE}cu ULSXT~=OhP:X_^b=}W:y&oq:BcjmȤ m*ф Q$Q/D}I6])_[07zP:³]D-zʰvxjOQ#y4ɡ!Ze&u2o4rAͺ)rS:&81lH!k)v7e_^t+$aU'(9Y{YpF:TJqΡ㟖!56g-tB50;yp77,տ/}yjP3G+sPwtRQ܁t`:ބ7LLUւ w=K|/?@uXF]O~q۾WI~la;*RBf ; U_wK*eqU}^?2g!J}8[ =rSŶccV{nF" ^Gev>T\ t>?~Y$Uxm?Q_'q$1'MTTq:@Iȉh67Z>zIx~SWvpi9 R~{ w5&隣jgEI';p& `n'$P5^TűAX v<3f;lC P;>Dk"**\"o085`L8nhTOݩS^P 9iXR;`,R+4P5 PQ'bDo^k}&=1Бm ~IM5uS?TL_#$ӹl eah)$)MrQ!7* eoJ51Yf&Vϭ됺݉mmz$N$f=\Փ(u:)S=oJJs<6V14JިGzR5HD$PzԔ*o^zߨGzCjTtzUO_EtDP@mnD-/ 0\W/CqrEm-/CY+.Қ/ҚCb|DW*p||5ѹHKTw_J"c--VRh=?%*E*T&`Ybb%q [XXXMS+4]`sgo< /uz1UWtJp%o;5h 䁤ToW-[4)0d../of֗nwՙzӊ 1-3T* Mt{0atՖAq;jHaMa0f`QR dN 2+L7Ozje4+I$$J 2@`a >S,.k|s,Fx1^f$<#<OO=F%7_vӯ齢j\N|E뵈R/Ƿa~?JwMzH*-DD+ԏ}'ELR,cQء_Ï=  ".GezڐЇ eioذ<\y߉ j7eP~[؝|E1k 4g̝3W:Y3?E/`dq,)+M§ʚV曗)]܍}}Y1FYIMN@s4 'i<kzulrJ['7I8mw(lj=+?Ȍ0j L29\=j * Ubﺝzr@dv{-I_%0 ꟡"7Fƣg \Pr6?ykͰc ok~F׋~#}+Jڬ/T. .h6GxduJ7"%ٺ5^햚K үNWPt<.Y;jo_6FyKnUͦu v\N;]U7fGY3a{_<{6܄U.?ѫD$fKCјxf*klq'ٖ܆|[E ?t}N>A;l;h4|t])$Z-roȨOlJYs 2qDu*!Mud/;xThKlGXqKS!.U**(bea+ˋ_LZUG.q2ׇ_8N1j)UJ(qm|RIdtcw{=']uC''N f>٧vNvd酎[{Fd: 7pPx Iy`s aa8ީwDB'cwOtwN1}u|tza؁:℻:]vCJhs,(w;':ީuOv9t} rNG M٧Nu:i^Wy:Qܳ=4NW~,8;NN/ۢ HIB`EH}t|_N;!"X'MOر{v鞞@GuO>ˆ9eGa89\6[pxlhuQ*C=Sq@=8D3DE {`èaz6IN0<-t 6'TˁЁM*C09U`x۰-v-se^|Byzah@ tt`i, iaÈ `Be̯:e=z!yϳnq_Y7'y>jGgTRΊz-A:cXC!O޳mH? rokO<5􇝾o{A翥O~ZdpYSsgox ɻ^(O3C7/Ǘ8m:+MԇT} =L?^x_ Oh ,Q>wK,﵌$J$t{;ãTxoa<ڃkwk;E0t\Ù&L-$K=/i'o{mDFd3tp2(Xn{:+I WweHS4ViLg;* !3wh/`w<.C_y!]Gʀen3kwwk7kf/IPD/g{{/#koz,5CUVa=&^AvM""ˆIU%8|jr˴2ԗh?UϺ}}:g̦6I{?. (뵟&԰?x k Cd~5g;ZȲ:GCCo޳d{GY3']$G~[V7}yoV "q?KqB;pР4%t(8 S f)U/Y/= }^4BNJdj2eюb!Zpo!Qn]#ҁch>0YL6`'QB41_@FW3/>,}sPO|۳TAdh,ɋɪ4[t7G xi(I)t _W"Cuv,+?0yITlexvn A3cNz9IJ5UP/^7S::ki/u 4[TSŤt2Kc 3UKu]E}U  [;у9h:D7],+:/śR Np=WG*m𷭬Հm݊9i>\7Z #)o.ˢcnD@sF$ EDIB Z(!C"FMr6o|/£[ ۞?Q䫪KZ&P 2*!y,NɣZ Y q?$Gs3}НVoioYvmp=F W%-<MʃSp/leZ7(jr @ɓ=;*aM5eHB*h3YHz$3vtbBN=ӛr(bb!Ѹ7be,0PDӸfjsM1Z6 ˦d~ns"v%>7Pf 需j@҅EK\Hw#/f @yV߮Y[n`y HoPK%ysfd7yNFR |&TA/e.=d%V/8?*~#4ȪX}ر&4>hku2k0@g_Kf?1 ǫ BV3 0UoRx9(ޡRT9_;vH{YٖU;ef"!:foH?Պ8Vpx'/u @V&u5ZS 0Hrv0I:xԧiw*U+}\Q(}#rxD $F@I⾸ꔶ.B"IyhN:DUU|\^&dQצU\b%X))tuleQ"]ǽCUGW͕Zp[,VhRq/WnЛpbY jTuTJti2sыUsLIue7&S' fgJ Uĺ=/r 1.g#/`xIIa!Dž̏iR^]d~PG֮T=竴P ESJzx,UFD(RlLy#؎8rYGabvZ81 r:eT- xmՎZv42-qQe`EOD9e$ %cq}>bTYt6f9J4U9Q]5Uqs6R^|@#hRGZ, f`!t_nP.<ڣK[ܿglO̯r~ݾV!7Y@cN)Q#<әn|v:@#=r)6X>)%^3^&]5I)(fH܈uxޥoޥzMB76)RLCro=b]8g[X5_apR63VS =8P>3B[ɝbFtpR: T`ƞQ0 !ho~r.}{äh77P̓S`9&X WkVJMf۸`<`$ F[1 D  EX>*0l0j fLAozY=R$͓KZyK0Gxa9QycAIʄzC1ʄԇ}+~?Nbb%}`#}<h`#}7*0 &S\@|vðk `'x̀ >GY} g:ߙ ~ 9ߙ>lg)b,j(ApO(Y}ro6/.?/|П F>Hl?< RݨPA:w[jCmȔVTto_HSe;֗np3کW#8qSI(8 Bbidx-SuLRB lvNfC2Gʒ 9GUǂtJ5j6$l}>XĹ/R,HRhG`٤iȏJYSS]W(O?7Bʖ `+l+6G̶y}@ ?n[R]yIkd& Hh|aU's ?wܔal'׸'=^D޴y5yOu+_=WIUJiҕƿ쨿QQYuͪkTljVjMU+ժ-kY-lUJg^5^5՞] VW KK{5^ZjQ-6G/o0UGŨhT]F=kSƪWj_')QGXT˄_-eZ&e<>Y2wS'Y3JdOV{7\A_J:y7[y :\9m9nkl^&HTNgЍݠ܍flS>GexSvGMmflC'!y ^5l .Ky՚QyǎᜲF)WFfH<\85k2d!SU$2%͋w[W%*K#/ͳy7)O]eJۻ5uh ͋w$_@bYþ`8M36pw޸n< ޱn.Y.YW@]b^n^ p!y1?Ƹն:$P[jޱv0b .b.hb.?(b.b-`~-޷hb}-η(b|-b{-bzhby-(bx-~?bw-nbv-^h`u-N(bt->bs-.br-hbq(bp-bo-?bn-޶hbm-ζ(`l-bk-bj-hbi-(bh~bg-nbf-^?hbe-N(bd->EbQXD, C`QX,}E^QW+uE\PW+݊mEZQVD+͊eEXQ?+~]EVQU^UETQU*>MERQTD*EEPQT*}=CNQS)m5ELQS)]-EJPRD)M%EHQR)~=EFQ?(^-EDQQ> EBQPD( E@QP(D~>QO'CzDf2QLDDb0QL&}D^.QK%mDZ,QK%]CV*QJD%MDR(QJ%~=DN&PI$^-DJ$QI$>DF"Q?D$ DB QH}D>QG#uD:QG#mD6QFD#͈eC2QF#~]D.QE"^UD*PE">MD&QDD"ED"Q?"}=DQCm5D QC!]-D QBD!M%DQB!~=CQA ^-D QA > DP@D  DQ@ CP?CP~?݇CP}>D͇CP|>~CP{=^CPz=>CPyCPq8D CPp8 }CPo7 uCPn7 ݆mCPm?D ͆eCPl6~ ]CPk5^UCPj5> MCPi4D ECPh4 }=CPg3 m5CPf3 ]-CPe2D M%CPd?~ =CPc1^ -CPb1> CPa0D CP`0 C~P_/ BzP^/ ݅BvP].D ͅBrP\.~ BnP[?^ BjPZ-> BfPY,DBbPX, }B^PW+ mCZPV+ ]BVPU*D MBREu\¬5Y:W5rV˗ݫpj\ekW$W*uUYUkv<] z]S]5Z}>cjZ^oi2]]}ͮQ2]뮅]]!~}&]pNnxx)P8.4^щrC.ԥ]j R;rIdR/r_;GW68m\՘rH.HTPPP@BCۯo:?9%;5gΗN%rCxץ7F*>(zvޅmiEDs7So|܏n[{Ix zLQ->ޅwTTt GùtT" ~8 u0plt]??e{ؾ uAwwwm;竏JÇ;>LA}fbz P |Jqa^h_xP vtttCmt Պ_*/6zԆӂ̻0әxtLл/::{W(U r޿3ܿ&q{TG} wu>;O9~_tAlc!k|zg}ht&͍5Pw={K [#}OT_]Dn S(/f߁wc=4G*M\xr/<!TG Kp^z0 z^/QG>뾋%_oً  "{ }w^9-N݆~>RJ>Dq9[ ͔۔|>^pe[sn\~pMDN4}plBХWSxg5ME'4{7nOtj%F>LZIKz ҢL~Lv/*F_Sw<$Jr?Cz&5-$$6:s>|@O R =xA/bi"+V2BЗŕԥ'Mk,K~E^nNMRQF_ԉ# Ea(x%oPsJ: 49Rsˍ4LS|;2} y2uS>{Z\zodt[:24WUi:-L~L= /ԥwrSpܡiBA?79/8 u#oe'7e꒧:wP漖i9\:Ŷe1Y?Y˗.M\T^:襃^kpL9&ct׋c b>aaԲL2{_P٘O.ˇ!y?ӗ*|{Df=W|0-yXCbm`a/F.4Jhn+ۛ\{ LukثOW${mo׃ 1ߏ~O;_Boȭ:ll Ji 0Æml_(ux%&45NEdڢz}OEK~OB}BKPġmEsc0'z؄6mxZY>چlB.TNX?_Mڣ*D>)augwf5Z kH&@tZ֐~ w͂SrKAK} PpbZw'*<@0hroοdS gMlї7w@x tj~S(Z(7!l1'ق[Ɠ uˍ|w!t]@5!} iw]~( kH&IJ`1D5h6}R 6h&vbW!{-0sWIN"hT}iym1.$wA߁(\@v̷ Nݦdi!-<`ʼ?/~@&m>%J1ȷM@2_}T\2ԥf-]mO(cLBRw *5^i8אl]CO\o!8W -@S ފLݒT)iB_] G[k lbdۘkbł %ޅY #fnS<%߉@ &܌{7-~@`".H;0hdS?;14'&5[\5}m%2l[w&@Z4O9Su_&/5rDlR+e鲘rM]?vpROEG;9kB|"暰R`>6Sw;FN_Tc][nw]|e>X}Qjf9$lnM./~Bsa&1.s+è5} v-?tK'.}1Ph PnKH ebڲ(&ίa.͢➊RU lYUXрD܄ET_&Bf`Ӱ(-zۨ,-BkXc(&V`^)Ox8.Ƽ(-.~1׊POmʵYntX?޻<0@.;w۬[D6! Kwc-u،y[x@5,ln&l0\N]#l˾onz <`9 (5·mewrXNغdw4lY~[m^퀂shm v %u? ,q~*}60c|8u&YԮjqgwv̯kvݱ u +~feSDGu}]Lɔ.@v}]l_ǝߓ|%B]B_6$~Ae]_ /Z•$mWǖu!z*: uj>U?U?=* S3L\NjuzAʺt)R]8Ǡ~R~tDVR[e?cg xvڝ]^58+7O͎_u; s^ijzc7𣎘(N:1۷kbju#FQOܖ:՛ȳU'qg]^G79TO7d`M;A MwW7'B]m(N:.Үcz] X75ъb꺘.^vPPPP6vK9{K 먰N?zwce.n7j:fy@ouzfىa^6/At0;.` N*ى_v]Td/Ku1&#.8Z~^K/Ɇz1}Sޭ :^酺i` O'e8_v!O ?15w1$0eg;/m4/]T P6oYsTzǢ'{|Lew.D?':~zGї_>}'cZ0{$/;WzZ+ wAjnrܐw9O' Z^xGuǀe'av]3|(8+"wiu.y⼖ 'ӥe7.ԹmZJ ac ߃{5냟0NBM^v!JB \v ee3p V\GuyAc/W[oqى\P۪AUs0ǂVYCb4t+{MP@m븯:М#y?u:h~^CT󓯼WU*tayQ5C-x ,;!B:-N: ˎ+H@W CO]CO_,TZ[IV^ĵՃ.Uم:bi:ꀚAe[ŖueWXiPBR'; ugTqW[u@W׍F0܇^Y'Mybf]YGeueu2 ?ت. *;0scT e;utU'By "Ȇ5NkwdFŏ]8&{M8xTbY/LPטO QmjiVQ'mm'emvEu>V(PvlՁzC$hFtjmօu0eO拴H.exv;[ ?۴;TF4;G Rvg$ wȫ{ 1Pa=Id{J#*B]j]]pe:7a|Ӫōuqc׭#szyՆ4*;>͵Łɘ_lY[IUvZLlM&TمQ >M; iu%> -<,"Ӷ]X?S]lUsu?]N/hvҔ?u zR:|N 1%1._Ju_-k8'M.#՚K9~(;֪ӝ uP"خjdB)N@56"EuT'Fy E9om5jsPP md9)|MgQuT'66ؙچ<`#:.īoTЙhf{zmf&;.sFMTL'dos sP.c:FjМ=E@9Ds(7ifv29o]p.-SOM1b4Ű+&!AWrLOįl.f"~!/̺!iPb#Xȁf: 7MЌ46+@OwL?TS{HyK3,_ڶ nh5B :`V~KmOq⯆_ i35AqP{_M!j|!j(Aq|>7vtbAq`Ɨ*~0{|Չ< 9N/ WnR׆nźk<˯P=AU4kI?V)vK#MlGb3=܆a nG40R#5>]XhVpAq燭.tLLj{bjTTwTGc5XV˟QaO4 76=#8? ӡK,mw6ˆ@~6I q@'*j@+$YLP/Fv5hYشOP ڇ#|l?[ OCӠv8jV6Ԫ?a!i ax*b*h< *i0 ΃h Zxȑq@#ؤFC WkKs@Vݯg]홟-ʆ!i(9̨Fۘ\L]٠/8K6 ]ՑZ,v[Р=xIJ3M,,"B.̂!1$& S*# ".Tn"K^6D KCҰؠ$x.ՠi-j08‚F`wKEG-xyFMI QI. fȍeD=tLHQȷmhZ#Tizl.Թ*sT}qCI+qR 6z?#ߎitƨK 3O&p oA@\ۆbs UjB%]R*aU`EcQV&67p4SĦ7 d}ˑ'6w*͛mp.8'J,wg>mvc.CpQ޶5;qr]'mΌ E Ν9WM xnb؉_Q3b'~gմ&jMSZܹ:=mL/H.rQ3(h~z?W %wa=p-H_^̢(`S\z7/CGoi{+r^<*'ݼBPo-qazp_ yU f^%7:;j0E.M? w]5 wWaط+4A4/lx 8YugZ?dC{Iu7NjDTNϮFAC/*d)730:a߮N4/>=B\ޕaD58 ljT@tAXP wW: j[~0&go2yʹjr.8rVm׌F7RTQ' DA/Fm5G]nV!ݸ$kj LTͦ6\A/ZSnTr6CЁZ/A!8(lM_ L {kցXoHmu!%*i9,mb}.hiG.-cgW*bQ&r7;柪D)lVט_LPѻQkl-mf@`0zHvQ vB/'+-wvYZ7"ө ̿+@6d` vA.h~9^?xu u a4,wMMvͦ&;!'󄍯߃J40wgOvJ٦ps1"S;BI ~ȗeHT|l0lu6PL {yr A:A.(Ejcl@6kúc+omUP[6]ظB/\`\V8(I u{G}=nA%EQ)7X\@81XڨKآ*Dlj}N28q8*6}vA lUsn;kXC9 <|bf4N0N ՉJ4Q11, @ńs\ة*D\+0@#_6T4T)#Ib[NSb0Jsg 81priyEM4GQ8.%">:/Au.ͅqs՗>QJWaeÅ$7wQ2[E.#*dYFWp`"x JH"END(9 .(O5.ƅx\ X\А ;>]XRlKeFftyQ lK)} Crq0AJ.p0u4uգ ТrOA` ˅1N>\ :!w`9⥣di*) t%\̅*Mm TG7r"Bޟrei Ӂv N\>\0:Q, w~ (:<4x#fx\T4ƨ-'4ԍ L fj\<ո@\)\Z%*ŅDlح N;ͱ>܅:_6[Xs7aFi=tVOZ/:q1-L+'0:9iSL ?r\y\`{\L%M ?S;Ӭܥ|Lt殺e ; ӈNJ.*f09p{NTTĴ~3pMR.H^G^¹LR\pvPrӥ6N7McҥpMA5.j tȨ̮@\ت)db mp q*eщ;H].NMJ<.lBN7_=X&F . =E ꖯR{TNѹaU":) 512܍k#m 7A-*fDPTgRͅYPL9p>12Kw+2img2%շ-.;ҥYe~J@M/J ̺)FOO/8;ucF ב6@*@d'eRbs@R()M*j*jͣ5M-U`ہ痚?TMsA6*eD$$v>lum~~[k"o1sa4%bmRM~,18i]p4Ń^Poڹ()$v@i|9Gߏ>45NLɯ$"gB%V';j}?sӗv,ʊ5W/^j _M-\)F&fB*/խĺ1|ƓtRMRfK{psT5 &ɉCYVnXXoiVn rp. G$&f%I%-P Pw0?miWl"$[bV.srPbK/lpSk1e_l6]+QF(M)d傣wȕ U1&-lb?;]!VxZ"Vz\tlKK66զvti͎:\ndbmy6+8Kk5/HKo%n~۽t?8e:3[8$vAb=_TJ"OQ?5IZh I"hl&I~ (~RZ GEd JZ_(D]ݮSelXZcIZhJDd'YYR?KgI,E$b%+Qn3֒v Җ?)Bon,>@nI!/)Bݿf&{-1U0'x5j&Ie7fOnaE$$~5׸Pm3~eOcITʅwTF}~(IOR? E%strJ gWGXsDܕԔ5E\pҍQ & IQ)I,)J5 RPwmd#fϓČd-%-EvQͨ.ԕs0ZdI,Jd09(W5n0x2م]Н &I%IVI D,)en+üArӥ(єP59MeYeU(uIfOR&KdI,=DI%Iɒ2YR&KdI,c(3$YR (8Edfq(y٨$2p8 ه'Ch6R6F]*Wwycrڢ_Jce蒤eX$i/UK|I,$' [51.MvPYI.8J0%.7Twd˒lY+K{\X6ljYfd#7=IPX2'1"F]Zd>LH.r&9)*%#rCD\ƔUPnr qfT_t:E~"n6CפrnIiSf Ud*eb&*v*{?[&_tRʣRi1~]lT<7ɅJ ل[~k#փ4ݘ~Զ4>7=QO1mJ݁t>& .]n\vݰfk[omͿV-7_~b&-IlBFeme.TMĤ5m+3QQ=k?T7m33ŊLt22Ŋ\Gg\[W U˴˴Ju1FM=1tPQ+S sL$>Jk"G.Hd7>u2UM~鉩5Rk:{z? SkLZz'6ia-Gc^8m,fmL!״$2IzMƕvT4(ҘU q 9r~p _ɪi˙Ty;\A_)vnIdUE̸tg%qV>}z%A2mBRvs@dþg+kWa @mɈ=]j+`2 ]HۣpOr0Bכ*T<~Ku8޷B/oK3ӏk-NG[!a5wv 9;Bn)v (/nZUH*$]GcYHD5}K]|Ha  |q4[ xbsYq 7Bz԰i TC0{?5G%`Mpl=޷F Hp8͸Cј0Y=6Y;K@$Ѫ?## 4l=":F8)em'AmPpp0k$:>Հ |7}vpJat2€#/NN _U m)`)*# $J#%@K9H )Z!Oaǜ<9/$F+`mD D@ ((PdC VCk` a+*.z “)1z@LkkYFV J#Xn 1L` VÖ"K1&` EV XJXnT[UF) !(viHqHZ_Z2 /vG%Z+`PW3ꊀg-δ>OVEQ*e44=K8x͏xR M9)59<[)[R#JH|4O-bVZD ̀6(oqm / FJ^@5Bتw9"ޯE7@mlӧ:^-ҍvVʏXW v/X& 7ˏ3͏~c dxHd*vX|#Zk,V-YY&@xȊ+eD%X댈9F4_XNnC5r:D󉥀ԛkʲw O;}اL1`DѴ ";FL."ʋHLEDJ#?$*ʈ8pH&#txMTHÉ Lj(/"" $*v!Ʈ W"WWUF#vFL/"""VVx$ u4&j@5T n;F]efuDy{ELjJ3v{TU$H4Cb+aDD3"ޯŽW%qqqՈ+1`0 Tl5NuTUdEEk{Nv5.*(("qA">"c".H4T@rCM+""@"bξ.g$|P1PJu10*Gѭ+"5D{|!-\S<4 BAsX[ksz#Q01UE I*7>,x9k( 4v1P;PD"DE4̈́AGPE,0"!@"DDwlR= <d }*}*űB#Ψ""[+g"*Zw^T늈*"J}xSA"Ψb.EɶCpDؠ ;F|(wlӰ};*0lj*|?"qo,h"c<ڀJTc@4[EzCUĐ"*$g(""9R4N(@aJOI;Qq%{${$GdBH47l+>Ja! ݀uI™TċTDQ79O38T:ŘU(Tˁ#!#Q>"!l/|DYDTH SqDXyq"i*bk)1P@"MHDhvCZ؀-؀n]D}TDqQ7D Lj)wIeӋ#X'+qƤAILd)~A t"`N">"Q6X"d LMl&"6K 4# ! D ,J,D҈P`_WEEOS(:(;&S;(LdMdhn^5&s֥&*6 = C&tJ·sa=s188]粕q}jl5uF"5H\ NN$9 X-\‹S"|z‹SnMYA& YHDj[16OMS-MM⃉&|p3(K6DPi@Ɇ@CSpTx$)aw" A"F:"Ց%$<=%<=%<=%<<%LXNXbώnVL Oz+2Π1K 'Q@I7OP#.F"DyÓ[J"vFX"Xn1H9|RnOɌ$̀j KH8lJD@AhAQ`H"VTg}5U±ARiTR HiN $F"ľ݀@RNeeGߦ&Fb<$B'lL܎RϞ 5 ;&"a0OO9{%M KdaŋSA}vHtJxqJ9TCY_ 8yrԣ C"E!vHxxJxxJǓ@(ΜRk#E!aݐ*p픈-rLb*Dp,9os" s|%b_$.Z@;dcc3$<<% O 읓SY,ńO8sJ1/4#hXHx0@@:>/RUO O Ds/]!/>o?~}h=DBBј."B⏧>DCB$T ;d ԈC}SB gC}\(~erA\"Yf|Hh"ч%)9s)< ◈}0HB= y; gDL$[$La.D4`a.I5jaPI$Ti F"P`=O ]D"E"̅T|:%[$'\;%:$+gB="N xb+SDO40_2'p7 j‹S‹S")T<B n.$:)%DB3Z9U$shMpߤ'Zʙ#@SE( Q}S"аS-ʇ&V {cE@AgHEDYC""'K|2)Y<?<|Hhzp$`[HxaJxaJ(ʇdE 1\I/OF16/TIm3p"DH!BBf'"5lh.!VM\+%T J)j]EBfAO} Qd&MRd} oJ)B)DNxQ 0q"~*=tJDaBR"wr=BR*)BE*t!~)z?I#Ta!H<=/#^3[Ez;*Axڂ0oR1ݬAsDo GgpG9(&q>C!nkA!M&X¾?3h! Nt:TӡFNLq'?<=at6 g vNn|GN Nk֣kPM60z {gNxjRuM̽f#pL/w}>QAO>{>(}CR(:{o8Ac Y8aw1P<ݛ|^y^@5EŭB} &#J}w| {A10>P{gxz(ap#vmjCg:NtJ'B/zAAbӽ>z&J^^{ Ngz> ^zÛ{ 뜺N W_"tMh 3x^3'|Htn >EK {x>0`Dqtr]:%aW9 $H wA{N=A à?f &G 0=7H9gн10H.;T b=gwʂ^3g=7G 8=_s澵͝PzsoAN_!}C '@@O"o9Gޔ7wE|Q) 2cGul]lo֋M'*nt3l:.Y~5Ǜp;eX|%Oyv3[.A\|5^OOGZd*581$r}2%nl}9M\ʷ~ ;|"g~:B!+|{uys|@͛V<{"[N2l3fj=vig[{-6۲V;GfR:C(fF976+x}1A޽l%d/] \ U[d{o6_-?oeYB?SI?,hndfsq|z__s~g_j'<䷎prFm@_63}zs>8Z^϶$ Wٴdeq2t!mp1>\ Se7 ɻWG%a:*u1\av=}Y,}\g TfIzym/ }%N3A9.z9:dj.7BzyΥNf.-yų+3WLַB^ #nJo eZ}MvU̖-[]&SYvN4ԹTk>^nZ+b==ˆK gO>er?CyͨUi1zXΖ:,rv raf_,_/RDsk,l<]\oFg>"뢨Fh$.v= #i|9N^Kb,C-Mf.Z㛛luX=Hϭ4e_$?-PvSz#Yc;^?>q J J-_g33rUVHQ&U$<Ko_f{G~4]e\g8Ƭefr~菏|J,z/.ӓoG7r뗏;< ! PqpHp:HS.*ٳBqT %4ymeqKݼT:^tq=zF@6_ =z)p~W2$E_{7fpWw{ߑSWsu̇|]1xt|, +hx&'Kә48X!㏲p.'W–γ;?lۻ39srSQyOV~PؼnnE+of;{߼|y-yqGӹ$iZOU2gf/{(~r,64zvd#RXh(j8XOX5M/~>?ߝ|ÝwZd~j-ϵ+w5ѼAksٳ`i営ʾCpS^>DzvѸ7zݸm׏/>xg'`=z6\gx<8WsX^f:Ϫ\v#HH出r:nQfQ\>Zgl\QX J"aln6Z_Hf }Tf>\e VyLFO ς^&~M>es_'*"l|pIcRsK\FIg0mS 5qʞw݇Ll ?Kx _Gdly8i{+o|鲔kmdSYlt;ҾYS`V/wg&-~h`n#q%ulO˟lb1Eo37{³nֹgwNGd=ߗ{-#\mH\#:W?~Z99stvf{a!T u $q(jT!:]zŪsTǍ|jw{ >|gt^)-xfLМ42N$M𥳐u2Ofd75l\+;X=z9uaJQ)f.~8C%F':PCzm7\*ηSqjiqu٦Qu!_ҳkZ>VW_sB7s*>[z|KNvT,?t˃pZN=x"[vIEGgCO)S^8RH}wGGб(k,Qw>l*A?V:q+.qC5l~ZKTa=H%Aʱm>y3 /cN,ƥ(;^)",S*f:v.6giqCyu*%#~G % 2p*};/%Ƨh\Qx|I6"ǤZ2e{0;.R/xVɪGhѕ,ǻm4*CO<ȌΎˢOsYũMD &'\=3xîd;F/t<E7okN+tpği;tuxF^KG1sfJXۨMںTʌOUzl'.i׳YSt;_u7]AoHOe&z;/,tg,]BYCO7KVԶG9|0MinHˮLi9ߛU{+|4vŲV ʹ=^60ˠ [;>ʄI?(w"ϗTOctkб(j ep<^r 1SRofUhLZ ڮ$RX=ыO^c6krlTABy5 =W$Eö|t}Bf?l GsL Zu/z|\V-oըQ-77\>ʕI>j9OHuYcQ *+/sHUguxVwMicKp]}،Tə0 31grƂc/.[C|d$i]ߌP-4AV}Rh=]m:YPN&+Řtr.mve}~->|a '\W3#(ۓ8hf]e3=W<򋒸Y?NR]eˣ$Zzf//^w{)_gf 6Vw|l6'm!,n*KǭW =5~'aV{}|`" P7cF&vQ6ڦkʱ!=WZ )}=+߮~oq~7;/ɲZNIN/#4~rvy礜5lѸS_{U.uT5ٝŲTYa bed}ˑW+1?,#9z"(NգͿU絙c,Mg'(27ۧ&S݁qۆөo+Tގ]/WN4ЍŸ`wZG˗ͭ},TxvCH sדZ6̚ίڀ&A\Ss;ٯjd.u.-lY.[re\+ۂ)[lOe٪W.۵vEm뵺2KR(4Lij:{ZI/;Zwug%ǣwx/ޢ`>yʐ't2M>f4&n_kVOȨU_v@}w7O%mj|~qRm?iVbf[+>ֵ}~\y[WضBֱ71-6Tr9Ro}e% nDNʑͨ㓚:yT#̞wBqF7SuV .y,dVur3ATdXb=-_il6SF#|`toE%٤co|r=Z'wNq t\c=#y%+ZjyZ4DrykwDϵ;?iBfF`Grsa,*T O#ՠ${ z\5_):݊5Y ps"iNʿLE!#mGRu:#Yv}#M9 wZ49S5'݁GGqo}ӹ<`vI|ӞM ؇Xի9MqUw*o ~䢼'5yގ:Kɝ:7ۊPQӬ~0.[D{UGM\xr#bYuYLwQr2wg0I+3Jv ﲄ;յw*j/E~g{57U.YmgOvtw7{o[ Y~h]ԓVټYw5{pϢ;5^TWk^"`F;͛ɻýh?O<g=:%߁F,TIk8F!pu]V"%FcCZK6k"K7JkuWkg~^Stwtjߪ*&{Zl}Tkbpֽf1ZT\'uJ`ON32NȞ|7,,e ^[ ϫBi6غv2+<{:F%uW^*V5mf<7r_wѶm:DawAJJ5_Ƭ}DhrRX 'Zg_%jlQ 3S&t6Ra|ΞWwj'T˄iXvslm]mW7{3ŘoMEEMUo|{nw෼e^c>lCgڧfZ`ZIXi,yµ9IV_= ~60aXxހbDMRi\{3();͡euU ސ:~yαxsroTGb[q!j,+E=[6U5 8p<;ڟdׅ !).u|^Ll6#{FJr+rjV,vIّ=ZQB ݅i-+dvMXY 5'Oa/${=7bf1\>y2h1vs5%K'{ieZ.x\ᰄ Z[_\b;Ҧ\7d}t ߣQv8^拹'7#c_Ľpw *;.sHlLӪrwqz:{v鸲U[C6NpExǰ)(k8_rީelg+o: _M9.TY*z84s,!6m=}RK|C^N&qwk3vTӺ7GYyeV'Jhӣ>{k%ڝڮ|$ͦu2.w.aӭ;L.T^/Yw#&z40" |ULʘ϶r}&6Fz't>G#b0~hYmՇVB_4!7J[{6HqzFmЏ-YCb%+T]QN6}mkм}Kx'o%{;Tdt<Ό6S:lK2=+9BM`2Z>g3 =eB6)YI.#[L7[teR,iV4-`1|˂|6m}\u.iݳɾ^?QT[yGYҁMQ}R֧BUlrI-SIō\ùHP}Yb_NMdNnWiגJݴdSzUBpQ4Rd,QİE?wiO~Ƶ4]8>R'GT`AShf_W\/1=5Rk>:ҩ#KZuO_5RXں'%9=S'o{bO'sU!Tё_}sNEˍAUDŽQ~ZTמ2[MY1Ο6[Ywհ\,buP-@pSN{V.#>V:zt@rAԨJ!3lk񺮔ڹ-Yua[W[}wd~U3h?7JVDam:{%%Uv^,aFbmQ#9ςtzUFֈ,:U_ *ox8T!UH~YޱqԊ>bq<-{@f^쉎pbڙ_zࡅNRtC *g7TӦ3NzYvpn{ykv_t>pn/Woj\.L}t3]#ms-GW]Z@eX JJu#/j~;[-kThwRоm <bJB 6}!9ʚk;;טw6ۈ|P\,jjKT-I7۵V=eKr+PaDU) h];j-^{][wږƣqlRKXۇgcISe㉲Iۛja}izo'o*eI;Ki*PD'g8b*^ԸSpxٮG6m`aR;sE6>~5~Zs{m7\0x;4g)WM vӑ 9|h( DI!_i,j*%KLWo>l8&_ ׅO9#*?eۭ6qE[w753Ee砯=Yqx|R, \ŴVxQ@mwa?#Y3+z2@2@]ҔC5YѮFD7^ II9}+ʪ@ZE#L뮬X3xC? xiM%'y6Ȇ K=Gr+cFNfÕ} oj޿(AXQ \ P YpEZF.#ì@*5 "oD!X6DYC&7?kȸ$ix$Ncpz$Oe<8i{f@D/ ](~wE*Z.O-݈!w}P7np-xRX9qbҺcq-6{L_;)5Sx|HŸ@mvSB4!.㫇?s >0OQBqܦ9*CAHa `~qdW?Q(tNMdKꆜt+`Iʇ,aiۗX4Bw>`$Ci]%?J1;D'clG ޺}wnܻ}=^{۔o;1ap7FUݯ{uDw@Ld6`,)c KJ:M1I2no\"\K딚ۺtrYS2ʓYI-oxp2׬y/] 4 |¬$._ti@ &XZ@AP-qaacpxޣxxƣpd͉y,+3Av -%R 1 K_4ep+(wsG'Egr8SYeCd~Vc$@O3Q""%'8ȇ_z9̐߮`*>C V"MYl@] XR(|c{~hՀ QK Ca-8zcS2B}$})`UYŬ (KtΎ[s "|HW9ijG  jP$YyK0Iv,y1?DRWn;9ȯ^ofTX 9yhA}밡 vֲʡD#q[SsR8b|M#l36]}u/1/NhPԭX>dؖ3 Tjn3Ĥ<}D ZO&}+lh> Tf㋣\CoL<[:-c_m&蛞"M'<< A<؎IrGDxS2$pQ$o|T2vi VHa`{œ— מ&!f*bI1O%2-VMW!1,:ЊՁX%hEUQX`]^B~0i aL>ou-C.KYj[2"͸|4,^c xVxga7n̟f)0̓Bu 2 d4_)`ObD,?"6xv|Vῒ(D+;tc\DG"+NZhʨ$8ȓL}Cr =a&XȁɧdRb*V&{ |I\5 'hd"qZKϳ Je-j&C5^Ww ?ěݤ 9 W@_'uhy+#xs*Zvf$ҍG,.h- 4iJQJ@mPzZQ- X\ 3̬JHmh, yOA r& UߓQwA`uԢȐS 0|qqI 0 4CU,*!%;@P=<9P)%SLPAjx@;2tTg,<7T=0W ]X<@E- ަl'ie>2FABȏfJarS[PDu\;`h _@0fjڎ~zZrXRj<40/}IY`ax-m Zݿ5SWAA8ح&#㱣[Ts pjv)F]lj`)W*%$va7N좵Y±+ ^>3ՒexO&Mq) LYjPмX ߚL٭Y&O+-ٸ}H/^@(\@Pq-Of$ґ'\~A: M1NPM6kfTD=xnjh]")6^niR zBv޺3$J{~NZS` !i2%*[mt==wؕy6_P>bi+*J՝*$Di |[\C/b/m}JzM@a!7@aIX.hUh2U^^N0٢狾$K &rx/ܓU(LOЊ}c MKks2$D$點20T~_o a׻,wb׼| |">¸>0`9oDN yR_#  5" Q7'mE(X^e.|Ԝ X1  bE1i C n SPBƅw=ϗx=#PFr^rp2eZIm%5d擉CJ 7Y ne5Dn0MHh|*,~SYYKh L߫ ],c\T4uα7 GңH30AۗF˕:c/KZ`U#e՟#*PCAKT\4ϐCҟ$(>[xǿqEKhklzUXMII[T/5kCcs3־':t_)К6~f98Ht[gj}5 ~ȹf]"=wiQ#f *"EtC:MjQKlniaS(&<}ו&4!$yZ] 8m΄xUey9Ҥ@eXa=P ]'@8q KY!=U*YRְm"ZNU6 a~eJ4)ώxGPva&^ 2'jOO^KRi̮jVP7oJ~"u~u^o>Y6La+ڳ7h`0Ac*GxLe, 8#"flzg>-$j+X+%;"6MR_E+Z;]⋡# 3".5Y~;Qm sK~$fYMyRyU/2THX]ȼז 7td> jGCbVa]O5{ڻi4KxQ)fmP{^a,`&*ܢMm&>=4KƐ\Vyz ٩_ m!B7[:~Q}$ XDxStZvT"$"99B["XiM9=C>T_V0<-ai74Ӥ屸,$QI|ۧw ȍ|8M2/}>7*h|nm !. !yɬбQ?K~cxnHNb9T",!<7ӛd]4MO">:Zwn֙:b.* w+0=ud>2{<#TQ ySwg> srQImyHBPWHƦA5 lk̑EƢPRP$NEl܁Q[y|(S؎5_ߑ 3=QZ;\ K6WBGj\q?M%Z3s' I6]ML5ʟX'Rs eD *`h.. ?xt- x&Zd8-7~L v<%+~GhMn^K@bM<`4AӤ|7ʊz %T`GHxן䮢kdjPe9f،ir'o1l4fexDÝphh-QGb2+TXZvp8dih^T:6V/Fr-0J>7, {aM3rM-Xp9$8ߏYr)64ş౸} ,Ny8/XcjҞ߽ۂ\x-!h)F(! ǗlCNaC!-H%3+^?rb?x,MK.4cbj+-*>efˍWpe’m{fR;)ؙi}$ LYAQ1@=i˓2Phb؝ڊqcNχ.EhN1IS*YY$bg- .(RHCݶԉDZ}V@SϽmÖp0ΨZT]\oKݤ2/cr'tONvQܐcrO#ЊV1( Ze7yC^жRHv@wtj{Hf,~L _}Oop۲(4Ca 78>ĦM nlv'y]04h{k :`Y YR TO{M2E| XQ4[|ֵrp\/{VK ~7OGR M=~rS6cq2k;QaʷQDba#GJ5@Z~ C: ~Xs /VNH rALܸ[9`g]/PiD1!GfqNt>f,}:; zeyH$&"Be]Ap8^%ai\Fwh24ևoBGͶPo⣡;m9굫oY~6)&s"|9S1#?L>qƃf8M41{t5ԁ-eF+1ᇰ;z)Zm616yk41W?_Sr 7xm!d,U|_{O޻{.Wt,P].&g8I1q8tCxx.KP",sP }WQ ӣjIH:N_瀝/|ƴrO!p$ԗY{#S'^F}ہEDKJvQu3&l*p3) }SPbTw4*QZfhX0MaEvº/U3A IfΔ{#담~͇6oj1VRb 7e$JBYr+ 8 (' X .A$V)qg>(0pX(i-_/%80j#]Z?>{K1C-xcb_>K}a*?eI^S ")e>W*}'ѹXMZ6j,-N^p~"UUo lf:(}Q/ "J r6XpE_aT:!RkQT%+z&Z> /G"=AwaT-E5ʞUiu+FۢguVAC8%3 4|.''VNt؏" <8 1Ude^=7RY-+.@mmUw%xmqNr [Jlx̺aUrEj!$c>Xo'M0WgX8G2Psu0`y qh1l fOwl7?qbCƝ认$j'%IUVVؗj1Gpq!j-|عa[{ڦ%R#A7Pj^H=.KOHn$|"*}v$@$XmƓ'Yg-<> oe:q̡׽?<{G)&(ZZ<#!ќR'n&d7EF }*}DSlRciXMj2]zP3(Tn1)Q8lM_(ހa+fMw6k<]hPKvv7*mŖ+~!%z fԮϽ=}?_j{wo߽u==unߦէ;m妘Ny6o#Qp~vgS&vDcGқ.wH(sUɹ2ŽjF5lrNg}ADJչ~ni0v˟LS|7Ѵ?|>rn:pm[;o?spn:'Y@\vmrH`:Y@#q#Ў2eѶ &~h+Ql6d-`mo1H> BKF @ %0?<{\ r\^ 4? j3L ̏ ̀ãzm)DzN@;iJ;vL:pFNfXPQD8.aX+hLGA Ɇ4AP񷭝K< Jneu^s|ÏMT-#bQ1P87-t]ʚ,У ]^11vֹ,4҇u/]ö K⵻A烍띳qRɧZ?5#A#ֆsX$JCNOU_1>q_$Y&+5nfdM=nE#Ta`~5]MyxePh.=`G-#P}zNq:iUTsI G/ӂ#ێ>rKZV )]pFU { Ӿ +a'QՏ8.USI!bj^ƣ-  a/f$;[^'Wzo H(A S҃Vm,pއĐv ! ~)u*aH ``S[Sq_Dˤ1ۘE  ;G]ZAe^J6+=&e{My5$)D# huEs+ ?-Gchx>%Z삄hR_^dQ~O]Sg$,G7Y6|P`:`3q`7w+!9RnJC}һ U Ó@:ѳ,ՠI\ܵwEEixNܔksS>'DKaY vK["UeLpyƻQOR*!x 6$'Y\qY@{9$Uo*lk/V]ha FJv袱Y[<㥂?ha02˴4x_u禇F F\] BL?lҳyl#Eӛ-tқ-?.8s4ڑ=Еtb¸|\W "jҎ-dazv&:6)TͽPDt|u1.y^Ѵ"6&2i$5_6 hG|FP{x#25VYzYkմ9uIܘy(+ӿR`qmOntDWmϻi/Mސb4qZp%*yVZ. &`I^iWUm(wI)TBi_ؽnO;\ NvT)H ڡ `vaQs VDCv|(|ɽ` ]@S,o]O*E*m $p?:<|-W6Z|YS8{\EG?sC2tW ~@F>2.c@]Z')h]&2tLwXV=i4YOuRvSd!@R%|ELq" Eo6nqy4ϐəOv![\Q2Mm2pk8(=F G&Z},چ dasyXљt"x/Fgۮ'\W q0^׺1`gqA6jg"D/YSTx% :i' T(4sD21Эf7sՁ)Ŭy`a-΋"Yx!$npH(',MP< *Բx`41;zkqn0T^ujy֚zEO`ؚ d6tbⱯFO@<{\oIɫ|j(5hpx\d s Vk75G (@eUPxG( v`.QR9ƲHEhk8F+6Jll!H?Nֳa^) 7Km%Ӯ?Q=rC1 A 4OqA^b+_yDF tK9?zyl#ݲ_ b<G3htJ-c=cFcI<"ʬ(a&@DyU9Mcyٳ^^*q@MnmAzWbP$Ku' [tlկm͹Kwt[REJ30E-i]v]6RWlv*`ɴ?K^B]] ʠK=|y2_ˬB]j:ɻ|'3P >MXEMWNo/;v,w|,SIR^- 88Fi[?q` 3_qee km P;jsQzZ}tNچŞQ1t6wgm cWÏi22f}\Ab*,AZx궞ͦ $"h,~jeR-n8}: 3DY: M5atJ |~}hKw߭7ԛ&$@xV1}!>~D 'A Ӭn&௣svgQN%6\8p0q7[B#R:նԘu~[< FRZYbN]>RlRzszQI&ƒO^(?ә`wG=4>ṊLMc[8++ڰLPE8ֆƒ7t!og|d[@7ݠH;/U YOZDUu=UYY~C*e m rIμ[ۮr̚=iﶆAM|K+UoAx7zD25`{򬥇.a6I/$ yV/A8*;ȏQv||<<>zfS`oɱ}U\go㾿(*I݃x(*CTji{ÔI&lq-79h]Q tgk.ߞoPs t 0fNAዺ~dE!LRoOkVlv}/z`W}\O/tNƓ~Ozmog f9GiA⟔i^\fL ,(o/62|,ێ(=r!"N4Ɩ zGj{>ok̹`] ^ vD4g<kڃ>KƳu>҇mf"nMzaU7|^,{B'jߒ8$&d5( 3Xm Iv]o: ddyJ?dn0:Q\#}@/)P"Auoys?r!23auwwS,kUѕ@wsiwzkgI5k'sj5\FkS(N쉋"$ GҴg3OGwoǪ0<oV"  jY @@pЀo{jbykuX4s{OD={STAST*`_ɣa䡦{UCYn YYj^k9t*E/NO4W'fɛP`3f F}lWECa-3|@BN;n5IOeLg#Uwuep!h/\NSqWs3L `Y^|Ͷwp#0H|g}B>xc;ܟ$1LםQuxQtW4!Զbgzߝ$],C ]}dqTμ|ߪmqqx) Fb]f Νq]Ezy$b {'b1^"} /@JͷގBM1̇d7RAP+˫-Op,Zu[mQdl9&e7bz@zZRgaNqt3oєƦ0;0Ȃ/Ox.{ ~"cO[ d&DӪAs@Oir2t1GkTXfKy1uu2/ۋwc.Fzbҕ;ݫ`4 u@,mrA ,٦1j~Ҧp1xca5LGbzŒuahxidv́ü/.򕕨Pd6 =%/xG̴'~շ,I a[[=gGD@RT hT; :ҚWP[_wv?;i7 Nr;l;Q"jIz6JjՋᄊ$c6Yٶ] jmV3DQ]$mj{lweQQ!3eG5K]7lTd:r`ܮCpll-N;3`Y/<֕t jܒk,(;L \o.~ !7ǡkOr狪jW,ߙa0]Lv=eXt G$b dJglO5~^`bݕ+_M ŷ2 Hx$ək0KCWhoA4tqKAx%> HgZɹE>S"P\ˆ%yl~[ʙqrɧt42+nCwb$ ѰpNim 6ѩ4CAZc@W-@&֐l/ٿqD$FSD6A=lv;_DVtA-74|i {vKt)${o_Q\$]A[$bY Ye:[w=mn^V=\r)a/Ӄ?c`srw!xӤ ^( ϫ^=QkgϷ\f~yѷxܬdw΀Vd ّX5e!~ϙJzz~SPg-VNPLV%Y5 ĘHG;vkm߾gaF,IclIų |9鈗b",ENBs\w!m&GYFGJ/$0!HhK|dP#$eYK1f΀>&G&,${_*=-Dj1.XUJzo4LQ6]ir(eI*|t>QF"5"6ٮ#\q`bRۏ1 iw%™-3_39< m`N=/ Tz%jQeh5".)9zS͝:H_iZ}h#PYZ,miF%g#G;/9o^Իeǰ6ϗ/{oiѐ]bT3*jIDs|I=bouC{{@S/ɇA$rGkyͯO%>&C4nd{ *kLd(|.t2'ܝZB(V]!9pÕhQZ8{*ّPVT񪝞 ; ˵'mM/ޅ?+󷉧YX|N1Zr2JK#WN̩X m rOBjk svd%_-ePM"hJ>k\{#J\H%ؐ䊖EQh`\L(f"p31p$(^"_ DjdMGe'î%RTF ¯(*4_bxd9d0a RK*12 A$2ɮp/'tL.osFƉcAo1. FαZ[u/q` 6XpVQK(\ⲕivCAS_tL`!Ţ?e44"Czz](@cX'r򫝿-hnzₛ'd4|G(0a]NWK,ZNUE&ɽu},鯤n33c@F|u jjIP+m^hHV̴ /DNv#t/c/%mL8XSV :",,ٲ J !y=PYB,̃)$g1>#W:IM4 w U|%l0fgP(#R-)4`;,LT:zzYy;NҀ;Q_D :|hʎue}aҗ8(qGin<@VWώK6D#Ji8h )gj#Nұ5:naᵭםR؜to2¿IӔG\mty+D7-%Q#yئQN^~!p?; ˺U,wN{I*h(\G5(G_0a~d|_EPTqEus6::\08o,즂*9v)9 H%@Mw9GoU߭ &߯+M|on38ƶ,ekѣ =&$v%R(-^Aa (ŝ=EE-/@)0KD́X14 X#\(9$/1f`ћ`AkLV!E ApdS0Y"=6Lpdz%\thOxgZlM)|%.2 Y,m_*nQfgdd{QЃxE-:,:ņb4!P)V?Lbn4\/Ta^?'4PxXZU]16ݜIbK5ll+/*sN(e_5 ØLhg \/(dU_-8Dr .ZskI;hZs< $!UGF~|_R4p.7!YĽd&~óo_(a`uodRgޤ&.]z2u͈A{ y&)N$LC ԜV=[m9"r^lD |9⮧9`+سRJO*Xa 8Qg gRXH)zbaн^X#PkM[w<<24{Z9gx}orYO4:x{`f{+J-o]]5ȓt5ƑË'Wk6v{,ŏi>Uv$K0䛲M_?{J .¬Cڼ볿ыK~ %M]ĜTv4ty3-&fA4# ́Mi$ڐ` 4S.%X6-6˺1tPP,VmT:r8"J.StZρ~j{Xo~ 7j ox& &SJ|fmAFx<{gZ~_|vYPЃO''ʑH( ,+Be2cޅ]]rCLT_hL# Kda-TdX Țbe93Jǒ`dC&Zq zJ[HJkhE,5tcvWg &ܯ8{4$LVS_M镦ɒۂD*#V8(1C;ښcC^)g!v*_IV}[1@{~W𻴗hckmө&~ /å  L>iw1-2TmY6E,t ID_1l/A,PMLܴ3"d*:`nkjM dI<)wLgChh\k^^feM9]c1?k˅ӏfG$N\!_v~R(z# >$_'lVL@mdϊ>g̲2뮟G[* w#!tPbS%:'BѼbg6=ֺn MaЀ,OW,_o(Th,iWX/W lx\ߺը6EyJWrSwWS=بx)zU<ՊR=5T!F2}OSAժXe?).`Lj_|󴼦ܚڝ>b[cV-p]3($pha; }?lYtc csd"xU(?ْKd@E~V?p=N<Ê9rљx~p@ ԋ>)P(gG-\0.d<=}:_S@#~}"oYe,po{dzOx5 NZ[F¢& ݃i'nǏ8ws"n)Tfù=0LVpK.Q"яحJًJԷ})r"âʶ'hLaܬg9۬ڀhwxDGFzK ֚{KB~i1ABN0DH1h1Yl""ZYјm@$VoqQ: VZz }qOҝA!&qyX6 7 F.\&29~PUt7a:X!%P(D@@dxW"Pi+^g[RlQD,*cK265 5:fͦG㳢i&u{M3&yٜGdO )>gTGNrI=x[tR~ rr6@A)kfHD[$Y& ̎-ʒ}(]s|@dbcDirP~Bc"x"ǭL.4(3YwA@{-eҙp_8,KuZ~{W;_֟&^}@0Q 4 GqM1^$2R 9rAᘫX"`L^zY_I)?=  TMCǘsPc,fmo=###U)sB* .pSӧ? A6w@Jj5>;gO yW򪦌%Mo"E< sYv rbyj85aV=t,D),'(‹Np"nlsˇI"F$X">Ax-ªH\*W.Ő|я) ٛI&שK&p ZNC\\h [ԽP8wo}yty my%z^%#zw=##э~|]Ŋ C7LB)2jtbaˈOgE17^Uߋ]<[րRļ q`samdYtkqsukYk%A,UcقnMH/{LUM DB7wx f4 #᪵0N#JjZ?.>,/27N:|Yvɿ|qa d]]SoowS饜- nȅM"ܦ9*VV. XQ1gBGC3Ħ(Ԝ ?X!a%|SC͢U,<b?.Pmn3=Е21 ia:2FJb T6₈tWZ79m9Rļ淚J{e`۽Ю(Os- jڴ4-Ԅ 0^.4Otq?L+< Se$)#rVnә15nT-/?diPpgdg2g$ځ}=vv[y&2"xny-,GxQ:-cK "-eN W Bo8Mǔ"ε:W4o3ݲcb̒bFm'-O,+lYǎ=U] =Q )3<׸FTulϺ!mh)!t{y͊p(#PHŤ 5.*׳Y:q=#b>HX:CM+AyKJeMKjQ4=/ FsRsKYݟ2ni&_:K|*_kle>E{x֠ i=PFs w( X'P'PxCMxCYxCY@kug7 0%lDRGgbX<) L=MI)0G\F>Gbבc$K^ZZ#MŪra5ôLqlMQNL*,̌ w]CӴM 4_aQx{/4nU>i(?=&, :0nƠv]mcŕe'q}0[$xN~\esx8оM jm!jM{N;d)0B2r`-xa$ wR׵*"`IgW5_dP#-VF"/-DxB5+ƀ,*+y:]א{[٬PjKyfĹC {V|/r{u3l4@cv=EbyѭghKGgXn#>pU&M9Qz꿶Uk۫Z_ŋtsy{^i!J.݀UڒEܪt\X)ĺ(T8҆os9:+O:K9>f!P DS p sk'yK<[9D>-QeO)ѳcY(E=3Qfx(wI#5C:۲B9@OodmT²GG@V1< @J;KV0Ls{U4p)* [Fxg"PB`%C?a&_ ^gx^{t4x|rldX <3]9mizmE;qHCa CKb HtJ1DF]  q'5Jn?Fx)Q,F.@^2`Ls z/u ;UB=vu0!b4Ry[//t΄ e=f[%TKyW/"vH;LoD+֒e[R*'swOdptRjlˢ~XB>oI2*^.(W,hٿ7 *iLؼZR[ICwB:H:YẎW->+YDQa޲}j^OA yMPJnIK"mvs[8oڣl 77R[*6Wm^o=ĂC_Obvy,]P Ё2RbnuL-'\\oͶ5ȆB56X{iWoʮ0ʣƶ[[zL䚵lGӪ;zu\G@ /y Q !5<ú0.Q +GwnzwP]o/ u_q*FmaٕP[ z/F$>8\ vEv!pL[%_N =ҏ}x4u1+0 5v& %+"Xn+]tu94kU*`8^qm&*߿uym1\;JPΡfa"sͮgx0&0+Jb芲+ޱXoc4n-)KP:+dXA2fnHWS NVrfu\/z D+:~<]N7ybPiT, Pju hb&.0.ŋ$n,%&@rW]3P)h(Vƒ݅`P@ B#9T mmR"D'-[s? d]?:Ms$DUrt&ݹcawA%l+[w>J g`}{nwMPh/ФnjNJ\kLhK;/Yn!S&:)fmx&|},,jzM=KB@aՉ`Pi?yQnA|vc>?}9ŭ\e/iΈ78+O?M<:~2;|4zXqJKVZsqIEU,< 0e봐TXVR=⨅F;2;-\B4I]\:J LNS(m~(*M0glZRܤʕljH!_Hb ~tHfzNK`^g Hˢ1w/aL2'k`e_H}L m՜A]tyȡ Fi c=Lbe .b6)9$BZ!jsSdƼ#;_W|CѼ_2EѢlNRrsJ\m*H1Z(TcP31(dѣ 6*0< 2" (DAҫ1&Ԕȡj2nM 3GQƂtm } 1Y'v͌SzusFOu=*;}c:~J&T m!*1x]&U& 5 A]p-q_ys}RNO1S΢D{s :' CqJB3Dk,AH'5!p<66f!ﺪ~kB?'F)ע@Y^wk@]JP ;a3Fr]cY* `%61,rJQUgKhJQQL+CV%X?Pfb3z[MNVsηHN gHU@>\ {S87(B+Ic4wu|\`D? taZ>&=8lޘDŽ"8 `ʮcލ@Ѐ| V4O`}CItB%=$}~"%Swu[ˣWN -eƣ&Rي3eDn~`YF(}J ٌH4Æoqj*)q1e?\f93;xp[T-,W78DJ{xJ_+6\}HYŔ @?+s^  w/,WڭBBe|* <&;F Ak"ޱ."#`LVv1NfNb0 FL0Y:ruO2 #X.&|ɷ7$e%z]v}ⳙ  (+3̸*]] C%=ج8!ժ8eh%?~)"QkTk?3*S) ++XuF;\9)n SEqސLەչ9Ik$ĩ"& |u^ΫaxyDrKt_l"N0;&<\'29,&P$G,Zh2VZoZl@G^L)Sj,}J QrVrjd*_ePӫ3*he:ZVh$6"cc<-)<_ BͪlS,M:7ST隇Nm#FQ^"-yK?z'%c,gkC P_c0G_r$]^/?) FP^6 A/8Q5g0R Dc+i`Z ߊC?mʧ,ɱ$y83|tose ؼT4D;w);3Wb_*L:+!CgO7͂ӠeBlQn*xjR{o@V {_J5 $.4W%h23v(E~uA韶32 g?gA{v z\x{;3?qYO#3vj'Z'rngb\:`wLlh1qT8:IMt1y߾W 3k\&',3_t7:gd-=SU-%ⴵZPX̧UTn-*O]j!aAN;1x >Z$mR _g,j,[&:o¬GrtzJf[32vswF*?"cq8 QKwGȁJHQ(F g-~,,p &?8S(xNxDLgT7B(א10ŞHh\Z/^ -I)^Ty}9*9"]Uv[دox0fqu{m@kע1R-ǹtW[?, :~IմqgWLYc0655Q%l%fLH)9r|3{MxIvVˍ4(Wm{PO -ΨɴD g[GdŲc+m-]U^< 3Bxk+0kZ2čGdwwj!*!|nv%xmyBlUmf1yc⑱bJW&6#r~7D"BiFk4t ʡm_flY6RE.wp_#V !WW[p;Ɖp j"-/fˈJ^ |=`k5xObbw J( 1cC3d^#~%:mË[qDȒdfE#U@!"|V񯠢kVh\NlyD ?>mV:eM- HTO '@?̬wCx.ΞsLPS'`.R,y%=_hPǼ^0DXk2dYgOFno nޮgѓxW+.f(nII,Dt ɏJTƘ*<*ȩ^\QJCC.v5Y #koh{D?^Xik1r[Vr@"gq}]Htu.ϛf3}y[aPFc8r$նBoKu EiWW.%do^œ1)iV[zW+vԨMi%EDC $NGY"(G wN̚p5wbL. 0|*3G8:5['^LzhZLpLV7YR’f,#wҍyʘm{GKu8*:G0E\ b+$C%f EV.Md2_/l~o4*G5\7Q6o3]1&F^[IgBS^%:JΚ`tK@44eO[Gi?Zϖ> I>[7[Ibpǜ =ykYhMC\1+cX'U~mDmn@^kr) oA}m( ț'@33:rW 5nTȾh` 踼dӺdwt9vn vG >h%s /_NF{48RV/,ag7h3tԾ?M3{E3+9hZb %+{R̤$~Q]=E.,8헇QOK؋ph?K ^41Yy\wýw`%>Qe> \\qԂ ڪzSv]1( ͤI7ߪa;±1WL΢͟?Fꦖ07͓O=m}~ ӯxدaxV32>ڿyfzW5,K6:蜢c&gg2`SDq`DBӮ0 AZc8ȕ%uAH L+N" X1hSԎFa4]PtG3CncwA}ʝlgj'Ç܉]_y,yC`Lznr/Ɨqusskۈ#9!U1vWox'8/(xF?,a?]1528x٩ B">KwloF~"S#?J++m6Xc{pIj䶸r*Fne[*dK;_75"{4IˤLg;/S(x=v0 ˬ=]R)q=̫S].RKjĉQ-3G:ky9}N9ﴖӧ:oyZ^Ntނ^jy9y/8E-/_;]u r:$#5hF#Pt)(֕<"=w`+L@?3D!T2ir2Y=*oY=ž!{ 0Q68q^G]%7IZ ٞ[S=jRY⩍^*GP$Rک-2.gQ50ES}Ǧ']赐08HzF< x@y u_Շo6$4} n25Q-bA.[h?6SaI]^5co Ifej/]ږZ W\Y^ Љnh ydB4FPXq\]/H>\ 6DOJ\ѤL}.s#@5)Ҵp(2ksvp>Fu:Eݿ9d[n'$:'Rn Pm h<>u,N7ֽF30\"\ sI,4t#{/ǔq[Փ#A 6vtY(T6CgvC#6\aLiWb6;C^ۍ9+YddY͞L6D̳Ǻ1G>@QaEGH2*ݫ/t3fLMM:vϫZM}m^k\fy Ɖ#q(«׋7Eڗ[ Q[̋-\ܺr˴YedptwYx6ϥҍaB2{ɹ;6jM2^csu[.S$P*ͷ}څD`ȑi؜7imMFf 9A TD7VKc2kQU0ʰb&Q7%`o̓ɃP'y]®>Y+dYL,WDS\l:kvS&I]x:pɣZ.u!E(JahN氧+hú ̼gKxHT }Cu:glq7 f_ D!޿S$+Y &iLqlo +K+?܄jJ,8\R/ǃvZODM€wB2ȁ%^׉D-wxhi@q-;MÏ 3&H9JW̩`X EH 6 "sv_^#<Y4j# 5%hUx;+Ff]N<"(m{wǒĒCZgZ3HR+G 1dQz@;>qE-vl`K<%ys{@$:hH$+82U@!UKg#J7D4׾=3fa qꂝ@ܼD.- ~[eƆȐ 6TZxqD;W6Z߾ЅƲ.Gh/TWәY!d}|UCY"Zlk B66-RnǮG8#N1[c7JoPrWo45l(mH9v4~eq@Y/34z ]_55#9.Hݦq %+JZhȊ~%}vߓ5*`_NYZdwhҐ^[߷!/XU*ݝ>|FVdb3wK;r_qqDxyUW?u80 ]4gcd_ >(]XT94,[3ڌ@FT˒JZ"vpӚwߠgSZ<[*~ǵ oͺ}=mJ{bgyG9=G cR/yĕ(]H(Ta9XǏ(TUt Ft B_/Ը-[2 4q^N kRA549$I%̋Qa>/ҁ堈+eƆƤk2xD.aQC V, H2;?ɋ+Q &2j χ>T\\@e &k9r|4O;wB:Yh|ɡ̀xb ׏l 6I3?b\F-m^&c?5l.٬rIݯD6QG$z HHM/m]AB/N7 /f'D[?1Dؽ wt{ !B->S=_B%8P,OP O҄y!&OHKZ}~*`Ŀ2M (]fYRMȼHl}}:,ߢNg!/&=@3`'I"rAQ2 /̵7hLX#nϜӖf|ڠ,~ᅥФZpQIpp15`IyCgct1`16Pgr,W D_QV:(l 2Jes:lcY,r[@b?H IXLR]V;1g_ܱcrH0F n6 ]z?mǭXm{YnRxj|X(K$ԓ<ujL7D@)~Q׻+)CGOk|-hI.8OnN/vAgMIK+d "b1ȫ^̂])lyMqλBi2"RNp4nb+ΰW7: ] YI|U{ilљ'Ao''Kc-S&XGi^d:Cq,A S9`-ՒS֝ZcS|v^SA=[|xlemo`xK,0 " 5``M:<$GҖ7rvYoM tܗ!SC@AY@`,M]jհ҆qiCKe#ߋV%^Q:WZuH[.P~ǞfeD ĂU8=Z{h3Sϓϰ}fx4yˇBӲ6>Z3ՏBB6 }/n Sz "h Y Owl(T`6$s@64W,>-kU5u)|kL… _j¡ bO7e ~r˖TNwpL4я پmƩҲăng&31*`KMnz,|O}g|9}7==4~~!CZ`ZuuGI[E]ᶪMݬun?׿ŪN~Vu>Gx'!B׶>Txj/m@T@ 3}Qc2Opܸ*x5 0k= }Qa <ģ{@GTU}?g7j~sT%>IК@urQ"ctBGvH.>\];n֚(GP*ƺn]װ44%wCqϟc g-$1۵A^8c3n8xHҳxʏM[`0oHK@jI/|x1{]-]ծEDzggw*3########3N3E6b[~Ũ18^4:8s#3n} HVY}^JS6)3z1~b0I?;%#|:vPpJy!JyLfL"0K x[rk$T +D7{+v,;oy1 f!Zj~8)#ms$27 wHX|yt\4G/irjS,eKSGF Ͽv{Bp٩*B/{ ҙyޥ2k5=N *|6x[Lm]k\iՓZ/j~q^[]»MVBU ,N_]`t.X^V^0} peo /n!8yqRTOhk_k tfsPl=1p$H,W^Ϳy{{g{pfCyjn_gs[Swqz4ya1-ѓ~u|0nF봌i #s.(FhYD [+ q _{`è@2bJ27-ԟF:x`s7%UUDb}O 65Ÿ&ET(z(bLЮ=W/y&sܵg&e:9?gƸ> ׷=} |7}dz5[kJ+ xjsc cv$twY"Ty& ;1N DkGAGtf"ggqfr|zK߿h1_gkٔQOpJHqЙ&&ݮ(gz-ߝ ¥ mb|k`W{Mu5roRz#;wRf+I-.5?>$ei}hn$RX`^=MZ&sV$)wr D Asnk(b=  _L9\(-Ps_ h͏"9iP'Zk- S[&SpC|Mi]&cd)$RܚA!jc; |(): , zh%׭Rg9i0I$Q?hK5I:' *ŏ6/++Z/2Yy4)06X.H o)tiB~( rbqW_e/y⑕2,_jSb"ӚH\@墒F" M "jf8f6>PUwB8\DѪ:³!Mn 8aRHN9c   A4L)2:46р"c0Ȳ+bOsֺB'rB`tKV|GKi<ȅX(".g<Wq=x~$=37Uc3|̱iO45(eGL e7khr 9y2E’PR Eb܅pE&".k(vp,3O3\A]ǻq`B9ig4ID"Ȭ6~R D=҈l c|. U"#չ"Ѭ3O#E6P>JQڋx>R+P5.M{2b8)u,>l6HtϽֲ0"\bq&ZO;k-N%{U{THpa=0xiDZv)6pQ>FBKʇ-'ip-Sj! ֗ LU?{JzGܝᚭLwOAY8 dL'\׋!8!gKi}1NO )|BSFF+1 U:7bBT)V݁K<3f{ɔ,pKK(f|X'MT<[ԍKjnW- FpGb73&i{7SD[IҟJR8)#S;ĈA"aPhu.=BgtVj?5:9q:V(.^sir;?Qe9c y> Pt(!*hJ%)>MͬbA^t8dc)˖Y_rR 2Ԟ.Xz,9g4GMjԇxcm"0L6]x@[> yB(NC2^Nn8+|H(BbA_USc ~EG]Uv}QDНIz'4h]wʌ YhLL9^뀔XxCPOH;W\dX~9~@Bp8r}of*GF;bZ":sYq2_ FO v #`pr)<죌Ti~gё$1bS ;8JCЃ.~b@H 'O Tz0̏$[~cj2޾aLɨ/Ez|7oL:p0O #OJ4TX,e|)،-4# ^tPv⇥X-XGJfB=a8I/ttl0ǧD|i:n A51=S8R?9A!T q.!*qX,T1愣YS.M6d24qLԨUʥ0G  %W.5I%KjQXQi5Mˎe|XT9[כ(=1Iۜwf2,5}'48YJ n#y[sA鲖0tekڠ 6[n~=PII)e4_zsmurN8 8ld`g &y1=\g7_p~|n3aiըTIT-F#b} S`pXOi1j;I㱮g%B<5馓_3rTq꠱nFɸǤ7wlҜyL.kso rmϩŘ1 Y!V;/me>|~YDrWݨ9oXgB(PzɊZgVawLxf$B*G]sI*d#zQ&}eQ[ozFn+ywYa~SNځPUpQbH4̼fWH*>N[6n oyX2^K(d2964)Q 2z{JK|fk/WÇ4zCc$u,Avl q[M&iΎ(Q\IZ$`g::(LsY'~mlGm<P@aכ}@>$2He<qZ>V|'$G zXxB< |ޡ4" ԝL9-&[ks 1\~gdˉ?+v݆ @-`[Lt#Āb_Qr!ehRJO^RwX:3d T8վ8=`R)$ݫSt&,MN?f5LTMtBs_E oxa"f|6P t]0EљבK&fǐ/<6= "Ace{ T{i,59(3{#J37Ӻ*yetz>ŘUI|u""6J9gk9Z51GWQ`n|h[,h j2+|:;mFo6MKKy+OU$ 4ꟲ:(y UX"313*~?lv.Ì'UNhMnxFrVw{>t9% Aza?>2ɡ%}7<հ״ %kr_wT#TOx#(S"ծU|Jʷ6Mmi$ `[>La}%<=S/TJ (iD2Ï0(v LIG OهI>h#" IC$}"B_LHS/,ei 7):qN*ŦyD숝!W87~ p.NeD'j7a2US O5Tp@~P[$#^g|b+EJRML!R$bg*>,r75|I۫|zǵm_ /}5#U<򍯍KKoN>PΨ̏p0_U1,-909 s#E j8\PA9 \1.ܾ0-Q5Ƿ<],~–'+9%kU\e$T,ߺ]90QibJ>20|porǭwgJt34[fLJ%q {r'4^u%2napt =CKM!|̓p"9ˮ!ɤNvI}S.'`]KV{!¶ #G[ŤFU;t]/q绾J|+< y@!<`8ʊ_.[fc}YO`])@^ 6oCJ.>oxk;\?`1ce(]V bOMCh`G5if.Hӡ}g3A5}]ȹP4'" ȶ' *>X :tjz@^ GwF_v2|ޓ@-? zK{ %׼ȃ+ȔR'=ޖZ|3ǧ"oa&sUkٌfl{خ5c͐,s]ѨD޲0iQܲf(}CFAc K07œMTs.eUw%T͸q;+k f-\^ZU)ube!îi?eZ*Ob7"mа ζ ~b;kѣU'![ysOZ vߖV+D>!pj!XL*ޅrJ,eh |>eg[t+g86{\#n_ ^($`mT-hHAmѕZ7Uˁ7rFmX&o*9hZ9oQievᶵN-ىܳml{k-e[Yx"ly(rL;¦HOvn\֫2}^#6yK?[YqU(R 'Vܨ %HzgSP'pXW}( epp̲߶0۲HrF͢j5w]k mX|Dx27‹CWȳGSg88V6ƥlj9p*9X=ZD?e)&>'M.ŒOˮd~hEJ) ;wbR-D+wu{ª?V~c/oeW-Q4X1m[iS bl{\2bh(^PeUҾm[}XSxEt9y?#v<7FS='V8,YDmPj^ w&^~pF ZVKd]uml0N5.ٍ_I ؓ)uSrcmӡѨ7^sD*#h, )qɫ5PCNP>]lCБiߥK>a/e*߫Uz9L8@6M]/iJ9>YG~ޛ/VߵO% '$˲'R6 InτǦ_M[kƾ+Uͳ6_iou1"q}yF\2?* wkX*L@kYE6M*p]0~ +ڵF?V7n4Gn+`2 s%ZqsjѸ9`%W-d̗ ztux$3ˆ\G6nD0ddʺ|+wjzId|$M"c@-bl@fzHmuYmrfCx>+mՋޥIMJNX-WA@[r iIg~oe+HSCܩh^rCIL[d7WKZ]^]tk ZFw]mnyD@/y:'$r/&u.I~WPt"@ aɦK?_yъீ\Z7-W<:m`4Px\VshdHu:P M8%N%|yxC@)#BS~k]FIdvjc@LZfȩzuQM7oG6/5S4/5Z-`G*źUW-;~.dxBN _4Iro/R|xh-s]謻\ZJ*KݥvZ ;i!W8+fR{\ZJוwKBഖJR j-kh5n]D._([`|Cm r@SII<텙v(8Ƣ6vׂsUJNJc]^^Gj-p|^nhvXQS8#q՞iGz6IqW#U (tgl?m)pQ#?^#GuMn%]bkG3+fbf5EhZx^35A@?D2A@j.$"72yRAhAip+C(ա4 ݮ d85VWm!!"ߕA;li;Z Na.?j;vQ8+M@o#;utK1emohG/M7|SUZhNii@ȚolOJ RK/k898=~{g]D }෽zG᝷ݾ_m99*UyF9ڀ@[mxjjSwT0^"l.>Oͳ#_\Pb8^w߬G|)ߌ[Ysq 5&ȓf͇_![H{{ūAo~ :+Ue^t$vЭIfU˓VQ&niΩ+m*Z/: tvl\/Af-v9żZՓuǒ:+y!dDᕍF0CZw7֊5Nts3]zcMjt(/ֲϽm^^IJNyH]蛬 ^Z?^MPVАI)F|Ay- qP%q~#^cuBeωsi7mK/ȴuһYwU] ;Ԁ!rՎjb`nZڴݚC[G}~߆{hY;]-rLq6t!`&'9?TN30d+LUR ]_gP'U7O_\Ӯ*K6go^xO8]4( Lj+W ] ܵJY-q6zsL./>ᯋ++I(1d"aͥ8{מ 0߹.'w{+˜ZB'uMTK+z2>y""lU18) q\1!ߩڱEș ˙'rB"]kТ ݞD\|\IKyك{}ppolPyK >q= qcUz>}nq^ KKϻ)ŏ|/y#<ʋ||ӳ{O//|oiXU>\<&5HKk-(Fc-=8lߖOpiK&i[RFI!i&țmH^SRVj/JǨh|GX|RL>?XBd8A( ggf>LDVE.& ojȣt?"_9JV"b+_D6(X+.${1=MrɛEX()[! 9K,![56 e:tbF.axM;px,1Y0=qX88!,1rV^-}#P_2`hv,ĢEq1^\4}k u9Lpv(y4r{gy1۳%͈fK#FI߶yYL$<NJR'9S_mϕs.#\G$NmSv1qfѯG*w$V Z@I_s@B22(o/w&a-vNƏ2,9}:Zg Z@> h5:%\o[`6 +wŬVTWO lf|OFE,Rrw?>;ӊ#eE\ k)Dzh.IL'ˬo#ET}L$[WlZw)/u)"Ah2t,mKYiW$d{,xAƸ=]E>gl"~RE&_2jF8 "A:)95GG=4?,/>&_p]{:3`6lQ-Hco׿Mp!yG/IQ yEu1aeOw|lllyI%Zb_IbBug. jj ﭪ-M+27lAPLl=BH^HD,^µEz|׮QnC~L&ib:TfHQY w3vivY,eGLِ4\)3!Y0dv ɬ]I$6vT}UHI޾ͧ k638iT0.xH2"u|X 쩏 I8|%ٹ#Y&~yvIK:C|o)a YlXdQuHEGfD3F3xRRV@rmLhOQi7hӼ-D~Q&LݖHaO2gŃek04`{TJE!C#dD#Lg,j0lJEz[`W?F]^{NdL<hL=DlZ!Ј%J{,spqQTÆMf`רMnm4OrrucoVXh,|; Y@JUc)(T=T@B 8F{u \LNC{X bX]!RL c2 }"6 Ħ܋5FL 5` eKB@/!+FJ'caR&0ʮF|ВR0#\vN\e;m;lbl߿v57/>hiQsO:'B:?,c|U#&I,Ġv: Z:$.D;bZ&I|36,OaoYΝb *VT+vREco͍ӻ`:A54i/Kͣ{eC!8!A ׮JM v-/j晈9M!'<&WSU^րΕļK\D'8to54\Iu@k)K{Vx')k=?Nyỹ =4=N흍iӷ1>+$CXitӞ]]>CRd9x}@G"N:?bt] A' @۞7u"v^3'6Z3Sᑽl,/XYR!LA xE:0#3F{loyg'`t^GZbR?=ڬy /sV0$UਡfX(=*(c?XL~)/1}d^4u2[ZB-Xvf s^qzߜ5'8$ &ࣇ p>wb%I9;BCKh7(5-!IQ2k$>aҾM~5;ef6Wqgb̰`{̯r5WM!Nk|ţwƻרF+d}elv1ZMVz0떕/e%ķ3Bn8W. KM"vU'ǹm!v^۹Kb$a2v{r20Tc=&;DIEPY*7W̛**CӃ0Wmt~ Ab@73jH5@vEb̬yUmH>i`XJuv{|ڠ.bl]LJ3F[' Y>?d"CsM{+!poM6!͈9!GjWL~'gÓv"33F 1nhz:S w1N1 !5S"fk !/@7D:j!.u:qFҵ'Yw5{ɶ k-U#xh/w+0yޢ^x`1&6ż!r$G b5ϧcuyڇ$5* ȃktx[v#h60V|@ Nь@ B͓my9O4{AC-ί}`WMOAeIYT; B-^Ht`e$xjRiݰ]Ky sO0Դg(Q˺:[:flVQfikf:jGJng2/oUB2#YQMQ/7̻ƳM-/;fc#>]Qo6M_Z&0^Jp`"A|dހ X$X6.Ah1lyb < P&dWfAf^h׷ jvyE&swiXduzU%$ҙİ(o=Fn,x/Ki?̓i?O8EY)K8EY)KqPiRX)ec[X91J[҉mq{pbk/ULn[ܯ}' |Q \u<.7X<Gv;teRTkyVԳ†Tjkq*TS9z8[4rQ|gU7U4;OH=o|psB{SԴ,"')BB6WB:kEҒ֩\+Ҕ[YҢC 5 ݻgX k;xL.a֚DxTMI`=7 Z yu R<]]ä ~#pFT:Xs#t q[9AS*>h>&xS?$ŒtcxY܋ cɣaMz"I݀,";o yNxnT7sN OpG74ӵU:fuer{8n\ DLw r'o)]i)Z)ȕQ;8$1 nXy7?>mKݫI]:WoOTo`P)Ojt=\nZf 1:O3L.=??VaR^YOwBu#^eؾNK`~`/s:b5]j\QveNd Fmo/*N?~AgU/츯e)vt3*!,2yg`N4&P6BJQKhT6y$W1^]lk97l e҈ceʧqPB;xf4i_z3ڥ$LCЍhi㎶W"XƋ-POduC.O L.H!`pm_oewo;i OM4/1YҌPÝau쇰=<}hWNS掶[؝բ'#u,]ڭU`AŰIe( E߇,S|d)~oG8dӾiB;0i?{ ,a I g|a>؈F믾$\I~[mwe\lq Lpi'_VRGOo?^>$r̵E>wk~R uF1U\Q=ox.sg|c9uVX|/N#i|Q _قZ-'t8PiM(;/]W5鮉ߧlUL_pi!~Q19) !!wNxg-( {,b%)ZT!{-(pSm3s @(Վ,W 0BզhSL4w퐷jG$8^s*. w nD仗?]I UiwJبqpj7˔D2WIdׇ<=z+*w0{ٔ6c\Tk!&ԁ+"+AUj)(koy`QZL>_hϲ(0M"UR%b iaGSdܚ_u`6:}dzA ^Ŧ4/?7s8Le|[I\W~K3{?/E.3ȿ{W)O.ٔ-|^E7 (7@jPw-6~|gC&V s1=-~̴ņ * >{ 0f䨮qI9J{7'Y1Q[ ZH9ʰq>>MmHbʢݟr3: MV\")5]u]h`Ӊ<-ZWYVXá0d3*HՅHZ)M-h*ŷkEY¢jQQ^Rb^Ks@AΘ3*m*JeVlˇ xg,f7IVxG|O$^޶⪻6EbUP}ou?Wٷvon~/WGDxs߽輛;< 7֟Z &3>;ùs'E8.0@X@/3P*S2FPr-02zѦ0nO I7T<|Vc0Ί5,PYa / w*=<3=O$JYWeRbIԂ((K- &.')ʓADʃ; %RQhŊ3\yD+ d5b`QZ+/+V]&VS+/?%VA9"Pwb+/JʣЊg~oꋥj6\Iw@Y˒f1ra  (mEJvrbAVD't8H0DYI_{§1aL $O.X]\; O2CE#0Q4 7{XDxjm* !sV 5hB T vx@}g/tCtj5]CMס먦ÍXS5e:J)tH\:$.KĥeTPpՉv\OI_b [m&c5teЄR3tH;3 YF ɋS  աS98>d:ov@1&ׇt;-10:S= 7b%)(VԨLut/ik9p7!TQBƌf $p8Nffbژ:$b,-Tv+.5k+' SX:LT(a>_3_8HLxF$ӿ1(nj\[,?P$ v)*V$i<߬o(Ik}cPׁaEAZi#0HE?rE<<-,1$`!4F!3Ze(s)XAܯaE?A3U4.H!lznϣc}kBhWKsz2v*drV~ |܌NAa@A ~ DdU`צ2cȂ ;O b'ܪo)S}_iTAt`v"T"76r[W1@s eYL c`ͯGv-Gd"HS}wWA]wUZEYB}2 =S0+uQd;ZCKLt@[@u1@:%7d@d^C@m}FZYg:+q3;0udCwmlDͯN.Ұ \}׷A\ǐQ\~` ˸! N  N X0Yy[wiJlXӵ! fL)mLH1deRJ/a[p 5&`9(ozwj01hnӁ5^Y%55Y kJK(ʘb>JSE1M@ S0 =iԪǍ@Wnqg} gȍ@nQR}Tȍ@n0TI%F =IՓTȍ@nD*l$Oem w;VRL RsF2LI!RCr#?P^`N cr?r,n 7DL_$ߩdj%hOm5cT E] YIww6e#[.e6mprژG %: 3 ǃ/MGOm}4M}ӫ7nG}2KC1F%Mu,Nn=؋z$5|oo#7>_gxVmtaW5'`ege~?79rt4aQӚorLuK3a266c >5KĽ;@``Pk2m&HwOprSP܄ 9l ID`/_JWy`jtM?`jCO'՞nl:!:ԅl"l"ܭZ[o`РKiZTU}i/ 񘩮ɪ֫>xz|ٙ|yj[\OxzME*L7dhQOP :O峋`N fݝ:WScv8XIǿxyѨ=$ѱb':sҽ}bA_\yyp P2 W^犲9s]~%+I yAI5SOޜdvqr]Iyx])%K_-?_JB˓cB[G?hvti8rdơO~xG%O*dRjDDAU pV`|9Y- *ȖG ](C[T61mCbIED**ŋ/RE\{TUDt"RJ*?N]ĩGUED**ŋ/REyTUDt"RJ"yW g^QjJ n)`NWA:\@\:s:.NNq*8Wh#GQ҈o"QQa5VKqLk'UU)^TxQƸxE'4N=z R{M`sy =U)=^#/5^_Å-&1x@LW-NuXZEqE&67D/.u_nU&p/+,GujW hgvMStVqplZm&EA-?ie-7DRzJO/Hl\,V2 KvY 'R wN|,+Aa%9'h#j4vӇx_?>zO><@o-wMP5wEb kװ^clC`оIոf{DWd噸`gҟuʄsxh Cz!ζp gdi[[ݥ\qM\xKO!ji !j) -jtQ[w[9lF# AޑhJ&pO{lLi>.Q]Ys7q*tc{)؝![Ql z%۱ƍv 4 m8F}(GhrЖ]B/ ;t9~FlSy9|t'GPif73 /؇%'auKE8o'; ’ܹIA=0~$*(l:ghAL 4RV9;ޮURJ ^qW6PN +ײ s ~́|@'$~a\]%IO=Zas )'^!Io;m:z] %F;f`\}>Pv!g/=|/wlBv2PW(M@dn u'ߺoDaxp9͒4u-ҏF U6Za2+?:A{P=rkNK%Nf⇧Rx0uIz8hk83hRhN{@j\0c*JHؗ u+?Mq㍖%`i7WU8_t!-y< v4,>f+Zwk#8g 9nuu=gÂ?vhcPʑ#iF|1I-\ $p!7xN#S^<4kYvz5__S`SqzX_C[ڄۆ\nZ"sh/̛1]neI"e3=צ`]*3m5 RYx.RA,r|;ہ'OxSA"fP&lx:D9X5p{[T>Jp뱺SY$GS@Eb,!Ed&ԳS>h! 1Zb5p#5ww k>Z׌_ol.GMX(GÒL~&> Wd ^m@@;樵w>hK,Xel]s8:aM]Z!kD63JL~/é(`,_CBN$k&\VD4fӎ9}{w  G:_Ol[pz_yOaZEؑXXK hËe}{30!n3Pv]` lB a P`=xMDz7w:W %ƭ9ܺ&d4+3z<g yh^> 9) YVYnw$ ^1+z;'-+sh9[{`n%'x$WKdGCDb'%r&$WuqЍ [^o~5-s?LEWe߶Vb-ɯ$SߵZ)RJ@"ai W\@@xq |FF/z!.Zۿ;)"&A'iw֏ny_/]]A`aaAʤ) s,]:d6R`bjPZ>8QkD`+6S:l)7 I"dC=n&eP9TCetOG`?:nuo_|HpE_z<\k8}+?W~6z-$HO`8TФmZei(ftlMwLضA||.o2O^>Z?;?D4aؑ.I1>:f.>3bHћb JAWMv5 E̾lʙt%(dmY74#V\pR5ha-ƌh6Z"+|ja1ȣE j#jxgAC"mdS$MLM={y=R3Pb D6@}=o>n'o[[0Qx#~&6I8nn"bm| 9_^BOݤ1Ra NG7E| -;\WZ>ԯvqt`B<AZX|ci_;Va' =e+unJaLY,[׵Zkr#*g]_ӫ>qtpO8/ b('୻<~_NT.oL^8(LB"fEpBa#eYw˜ .Z[u o;:Qɝb'IyZ%Mgѹ'aGgsZ`2~N4]Ӣ{Ba'FRLBa~zիPejfs;{+3,v&znMa2ee{< F'?%ixnmn75;*5<Y6s@rfM{1ކRgu"qz7bM tEi YX!&2f%\z%9[ LE\&4!iL-߃Z 埦&].]%xyC͐!jօ/QRŜ˜_lze^A+ŁѓGv8~H+ͫ:*3o]I\ ÕkPB%g@f[ZW7'G-Ѷ?5x_4)BWv:2ܩ\Xx8/e%3G)}'~ RU8BL|-hThiIܱV#xIP èp2sDpnfR;$\ =iX0#^3\*gu ;;Jc5>GGڸcˈ,r[L>bN,J|;$ETW,;(>{|-wAKb,dL'q#y|fy7JQnc$ 9Ӟ[;r<>%[/bq {l0U0miΙv%]:^5] ۙ { 9m;tOڿvNYԱ#iX,m]'4aCxڳ8"9'A^QKH;ķ׋JLr"Vu-ᨩI ӽ^1v|,l,iTWPrW$*1: n3հ<^P1g'q_4Y 9eZOkz]}mӆJ}IzslNAG1dG<7IEZ/jM]T>_(L͜>Фk758XȞIh Ľ^"*gqipwٜx~8Ylf.hSYuɏBI4mߨ*YtG{R=98,d'tp/T:˴X d=kȷ:JEjkWQO"?|2 J*'*źTn1aLENL6~,Bʶ)X<4XKdqߌȬuT,_3Q9R#'6ybLQѵ12Z$&VE;,`I V(bVa,iw6XH[SM )()}äl'*6=sD FYwE#Fjݭ,&,lzӄ]q[i^8Bu/\fKLYRH}yfdAkӱR\VF+ɫ>I 𴅐h|Dσ|_NGjOON~y2xd^\'OOxI`HI`49-\< Dz%v%n1QKYxٕ5U}ٺص2 ,heAhK$6(Xxځ ;х2%:M,oYG^`d˱D"-n {ŭ}"XT褺RGU*p!Cd dYhuن/8粲 нj=y~oXVSl3&33Y6 Ęԉsѥ;d~LP/#t?W,mNPmi]3'7uaz^rtgc6 \kߥ\V#i^͚^56-^J/v (GTH|brQKf=ߵŷۅ+EXU[hAu . DlY|#(XmYPC:D/S|PSk)\:1^RMr.+p5!!6I-OL>HTp"]zW0+0a|*3)Bfee}q&Q}8oGbszHLK+t}# y[mt!9=$.dѝBOY* ̑YDFIyDFv9/'%lw-`m~EzGz_VLo)⮙bt)>ܛlZ'BayDN v/bt)^)7,Œ=H#M:߬Ζօs*%yDRtݎ`%ό:縍4pȯqeMΗ?^ʶTo= 9_{zW͇vٓ78(5ߝpo%i|2O-\'L@&˲e8XI ("aѮIdLbwY8[Kf4 '4w5ϞZ@7pܿ{wY;p H=AŴp HA* jkXfio$e/#̇xC#4n,? iD%-5 O;"=3村mn-l}W -lܦ^ Z~v19 QWZAy )ʼeIYxʼq1NWyD!mu*FnrzSN+rg0:)tq.L:^'ӈ5U#bN&+|AȻ[꣹}P4\ˮqzH^h}˪cӠ|B[q,_JB*ў_/:e126H"ޅJx )M\iv12.$;%eֹUCcIg>[MMh]fOAMï:ġo\M?. ߞ.?^K§&㳗'bM}Y0:’áK<~dON2ÄhVSdR]see}P[0lUҵ]~dE/3 0~dQe!xmڎ(\UY-0yD߈ZigEi}E>TOmP%ӹYf)Wwa{&Gwe[va=oܩ~3!bɖqvLf##PQd~ G!C޺\e0X$qU|]MkM(ϷÁLl¹8ߢ ~rF{_gFBFX$ HOï&#e(| )?*JVLL3ǝ]$$@_A/2ϣT45+DJ;V*ZuU_MA&W&E _Ew7VSj2K3 إ.ibNADdfyp%f~NN,)j42e-N罽Ș.Դi7di>H"e5u(`y =x_M Ӻ O89{P $؛Ar⸼h /f[Ų]|(N@xMjMt fd2ɢ%7]I أ:tX1 DV6͋lNv]P6څ*ztFd),v'"3N3Χ;g%+B)j@6Bh )LI(%)h0xaoL?O7;01QUMl|D&/5Aޱ{C e{(mYL&yA}ٝ0g-&ЙuᏺC~0DZvTKST¦dCLW,zc*&}C2ASG`U$aT!g S4e%e, Dʀ.zop֕nT=mU*>2zYl5.Z)YEnȃx P׭5ݯ 5*:"')Ρҝrq!/NRonEݵ2Ɇ:`9iWi>HiUc'GTCS7xG /R0,62I šP.2Q}\gdr TA2$՜1/Ps_+vs]G5 Խ:9KN*Lw[L8 E| 7~Wa)N615I"Ԡɘp)DK5 6H y5Ҧg>a$҉rW 鳊ZYB# Q@LrNan<' 4<(# $ieæZ{{uI`A^D|O|$,M#? 9"wյg sUL.#L5͔XbbMS3@a1 {)Qb|N} cE8K1UiI!)2- U&j{ 9ITЃ=mCT8h+^F"-W$Wa^V\(Hʝp*!כR^0\6z,WU`D|"||\  g;# &S+`ݽ{UiW}N`hIkb,7~XLD 2Fr8ޭf}==,_S נ H/|"x?#f'GZs"5 >&\AJ ( /{:QJ _c\#UW"(hV0idV1uv\4_4ӽ2fzX Z*hTǭLQ&V,O ѧYFO8sr`c# hU"x*R2vQK-[>OYP~@ӗD\;ox; ||QNwbhAUmeo#*"]}xva8ף uSs(9^t+5#>EE! !3:| ADY*1xWV ZIJn2Xsx ψYJcΚ>?cVN><= ǏGܺo/n&N! .^0ݻG<pBykQ:I%<;M9F} X%(k乹1u=ХOtVsb .AL K(On 1D1锏z]%|UӋ"]DHoDb.r󀔾VBr!& &K3lƖ#aIE7F+z$"}Ձ\O ܺTp!  66{[2흃r0w-;Hit#jXrc Hg[`ys!2G5 D-wd?ƋJCqNt!Q@ ŸaDŽk'<ì,wh1aOG*5tpֿ*8Xw,X^rWl\2 KЗ;"{km{A@5 WvPRܷu5Jşk6S_]{?SP/w63e&i%DM(Lb4=;NI k0͞]Km&5tD\ab6n\T. Ȼ;{2Ȋ븂]c'Q+cʉ8uz~݈?՗#2z9]r`(T8 D́ѻ2pJ%O Kc:ԚwO&pY+Z:֖إ HZk9L= vzyէ1ӷ6YGQvc|&A4+iv6#.`dL1ShEx:/(7qvcPx%f(<"Ѽ07E.@^obd i'Y=[0 qQ)N A5E<ɋapy\{PWU8c`qe`onou͜K IK2Z𼦥GBÜhB#$?/  #l;z'{G-Hjt$ռ7aQ:L};\V)^F$D`D0Z$E(Kj?& ]Z>k#Mڧ>DF^ْ3+}s FWVa:TJ!XW*D튩R Y zS3D`Msal[omW%ȸ6ӷ. V*'nN_ZOHO<IEQqJ\qbs>B2}ezj ;r,Nu!RĒvղ燶GXdi$Fy)qεf]јv-DI-Qh]oxȔ0=l4kʹ<#>DS#6!֯Io$*05 ` 't *UcEO}~ R5x'4X@2^#lrO.O z}v[`67ǍzZZ|Q<\Ĉ^Հ]~ڐ:g `qt~blPy}%سx8, % k1+}|+>qdّS ?]9 =D(}v5vLvq‹!vq!W6II$;dV;jg˅~~ GlF8 ِہ]@=!LA90fnPS9d~fzeTlVURW=T_e:>b3-+^>W֌\3 7@!">gxŷp rGF%p:b/\w{ <-l}쭴H1(\m_Ů''{H{=DY>J>&.DMz{+2v1zNŌ5 ڧ& Gvqm>+ӥ{ &82?\#'>FU_^fׅ+6[kO.?e˯/ik6[?SETR?߭ wmM(>m4u-܌Q4_ k?r"$`MEŐ5߻ْS%7[SR?b|f{GpLC8؆1:&k2bfa~x1rǔA}ko#GgWT7 V mX`YL}pP"RAdUZgFdeQ0Ԭ|gd#r߯y|? 0G\I~I{wpA/E|%)t[,]]/xx)~̋?naȯ&'09x S1J{V=ei Kb\\7sUG1JƊYxb rLuh{`yac+uAǑ*&%ݓ԰W64 g~p]}LNƉG#J dz`.k佱H쁉4X? iVDRTՁ(f6t"$Cb:*~ {&1\Oz_ [x*AK-<pbW< 2B4t@/qI+b؛܍dZH*&3f T Ԡ7)FE| NpҌB0P po`qφ2r-%0hBæߓrVpG@o L9@<E癢I?܅ eM*ٍ8i50Q\иo/ >UW3+ ?lL*.ؔܠ%^Fr̘_t$`ӌ,N+dS|v p oʮ8aH\f]yط!\/E{WbH2d&H)\OGVce0hdm.+hIy9 $I>Ozn- y,O+Κ2WB ,T%<+M(aeK^jhKi@Eѷm`ݚQ?xQ='ekI웂Ze2]-{m4Cݶ:Rm ‰ #SEnj r } sRaD-X^`Sw> pȇʇ!Ԋl^Ų6n xCCNBCIq44<FmzR!ٰ$ݠU2-x+q q< X!SȤ]7IrMo w>H^4wBFfq (1>[Oyh8/]X󓟊 8DOhXj[5Jf]Y+YJlsꭸ% kH6(OO#ϳ+HM Jt܏yWnk;BVh|.oI!JdP;/;%{^#&3Ӓ-kRF!>-Me|VvsGa0Ĉ\$NVMxaфaNf=4R2ע<:S7+VYON< {Dަpp$4*ba l0 {[:jqF4taS :faɶ"|`Gf-CQ. bǚ >/N *M{ :5ؚ>v>,SY3]]5KW6۪#mYFT\pkA(r*f?+¦FО}Q%BjA[heWZ%"m <Ԧ_#rs ܨ))?f[)pT/Rhwv]äDZT Tq8Kv:ShIЁFRܴaL|"ꦫ=Hx'KSUtԮ.dFR=7xHU0R*~k *<A_jocC{jf9B=8a%vx`~XD$#wffP[B}/<Ґ.֑zC47 #zхސ[ɷ$h^;`]Dk{&6ޠOG5mVѻy4 Iðb~F4tj(#GP8rw>x*rq+H:XPZ&C+Ya<9sU^8kf`;3膓FYA՟q]\vfjgR_N~[j!\0=KԒ&}1&nәֶE12_EhC<r3(Ml#hnxI4npp+5W5nmX1d|0/ euUqfX1e5K8Ad~4bA8CL-c pEIʦӉ3ma | rBۻMX=+~ lls/8Qܮn UA Ԇ<[3$qoH:i ޒ+ WI}j^׾,DˍL̕S&]"i1J^ ׼xS$K#E JgjkK/\|x`Bx腯5dTNJ2 z2N'<ڶN#.>ڔq%XV(磸6fr3衧a֑2G9w.mlQ%1ЍՊCuwV3M-hwӻ6ܔ* (O!au$yR18c9@ u'Z|_BCbqSեFdzF 5C.IxFL"T̯$Rv_|`xپmԣLSHۧìZ% ^v2NS  (~p- ]%y]@$;1ڹu (^w<G.a,ZRbBūjٲz.0ڟrQEv7>J0Id f@xM[B;405X:8A$& J=/% t |4ҽĽݝ`AMcJ4j/z#'y~d:7aŜG ?34d⏼**6&e"/|eup-hy D4^;$3.•q2 pvѽ܂-Fx,wMa)kSdT|wS6 H')p˝{r!(ݴ f[:Et lV͏EUgYBuKQ5^#ӉUK3()y{V2vrݜ1ys"3 L8<R[D$LOXܔ<;w=Tj퓾IPO?䈩  I2v>'wj?HY]-E"R'Q`Xnv}hAW +@}j+n}tE57.Nd<ՕV~ĭ[EO 6`6 X/ B] rmȩA³))2hC*@{둖3ٔ^Ys@%ბ\-c '`9T8$|0- vM(Å2a=E- PlQs[A dt 8Xc$CW(cqz8Mh fƯrNOqާ<eꇖ<lj̉o?l` ӭIm*;[5(j REUC%[Oj@0؟g %/3[XVЉ,'bQ`Rit&2b y|v&pȠaTZ@9C-5_mGָIz~0YV[Q/j'].l$rR2j9T6>̴OZW+ࢨb}![ \n%ZkV3$Uu"iS L?iaR`J5f Q RHqօ̝,s`kGOi1HeMl}o}D2uyO\ /H!]Cl0[4xH6pK Q J?%QtnpĸfF҅+A:;8@3A@:EjV&+܍a!?v2Nשe^^ 0,zl- C te60?o4˴T$Dp J^ǿ}ݼ_#umwmob1CUj(+4P R?sL&O[2=I@\G63Pm'2opGᢞ0!jOnD<~)>ca"> %UVR[r}d9XL3 k&{E0C,A°IcO ZߎTTjmIT6r#ŵZ%|C-c5c I)\QJL2x W &MW`y'1b90k=k}o{N tl\~|}$\WbwCoU-t(qiUv78ByqrjK \Fi%JU?C)娠<*d!ýQǙ>N jcĻg,wݭJQN--:\_5C6 aLt<:7tU`|>f(8Lc~# ^N$vb[ͫrܳ!mdGcJ C*fÉ5D ֹyz&Ff/.H{L vpҞ0'I*aA\\XGbU3^Z1/rރ5n*>gjHoҔj_"\1(<6Y8`+Bg-9tO/eja߸Mҙ̲"f%=a͍P1g,/x[E1;??JJD(/n\風ց,H&Ն)8$G+GY$As3!=2bg`r4-*Dn dž2s6( Oix57@ _mw*my@߹ف@SS 鴦bQL < P3iA"d~w L!;;7! aA:h5ϐRb* y|CO*#tr+8?Ʃ$}Q7rӑzRm@DuoAΚ%θ0`!.rX^Лl5+iI1i& CSeKw-ŠZ:%O)~u*P@d`Í q[0s3.+ڭ Y DjW5K˜ bn6ՂFh)zA80SO\;`Kanbapf-1QBܣOkֈydUfq@9^tD֜`w\)Ļe7Q"7l%/Vk<3 ;{qS><~lګ-f{{stqL?nzx ^>h?d/%_/+4ht`F WwzT NB1$/u.˱c* n-٦ӦlP4PZ,:#Fp9q>Zz*/?~%*!+瀘]6FQG\<{N!@mMSzFjwF>c6`4R]VjBQ vȈs#8f jc$E/^g)#th42n~QH'cbkkѰחExõwd~}JN ΄T|@!tPwM%ud՘̓Qz+LyYY8$^o+"HQ<ؓew5DG[8!vw蹙=k--1]I\Q5RP9Q5JCQ_7-lƎ_܋b4u/)7=ʍvV@>vaya[: 6ςLYNR`Xp5[Z6SO4kx+b/y{h`(dHA=dK-;KfvD*&sӄ"OY2aLgv [`|$fQ2KeԆK.>T :4I˔MIVWRGJq׉9>aq@KcM~jOkqL({jQt٘D'1AF$98sƉgCʳ1=%>Yz^ y}a:W'w'w5DU4'Gxd3jTlxLjGQUf ݻmWo)85zOa+uQy予+Nzñ"@͙Ql0|'a#f 1{U?B։lCI0M#1;lVn*̩ؑ $ LOᑾf߳N~/PY#/Q.]]1.Sgtx 󛢐F0|"1@ x6?Mti[NF.=g z\7X]r2ɚxvSmlÖ:rlȄQoBwS/{pT6[Ns`p_$ŋ/Ʊ`Py'3f3%Yvy'](^݇^[\ߙS@\e7%_{X3m)/_g<%6O0X/5UzV&u|}MiƑi?٬cᗦDLW'3C?63r:dWVIDe)[N%qЕo -q+j^- #> bddK~8A*im H1q%Aej䃠|hq:Xӽ&m`"Cӗ%C {gj^xy,Umw|a!Q`T+W% O.<, d hl,= ~7.~'?"w ( rGbնAEVWovs-𻩂:Sj'KTD+< d4h,(@SNA'mr$܋&r8vCXc4p# v4v%%;w9\OɟI(~v9N0>^oO&i#l):H.gl-38<`blc cM ss/ DB< E zr!AmE0Q [/Ex L!3:=%ZZ?< UVK@7x/8pZʚ&\Ji㙨f"([f%n$D&Ȝ^9t߉d2|zQ/Lum|q48<%brt,!wtKHFzgslKbݼΩ}~FH81աvW=Ț;ymx><͆Y,< ̯!+ξ^{ nHo/W Qʮ+./2ڍcv]# =62U}3_loc ^ߠ 8l`W0``?gTwƒ9G,5.z vB@S9.?9iA']7(#{&۠XW`2ۭtrh_bu;3X`p2>U̱ M%8OҎß1bX7o3k_WC=貣O.r4D Y*F>(FǬrB.y*vр}Hh3nJpt[[&-xr͋u)ꭢTE)utk^?Y8O4VI f^_z8HS89jvbN#>n㱖XhY~q1ØE׸?~kT %ɏCr Am~9HC4jUoLhhUP g.#\Ҧ]d߃f?)[sT7=088@vIfIn$FIĽF`s^7z}A[$DF^P) ?|08n0 z.᠑4Pf3Y@s M($b^{fL *\Hڱ1XY ;ǤoJ-?Jxe*O)"*cpYp?4CbA-_2Lc=uy9] }aPQ~M!ֳJ 棁p,XTB~ژbc 1< ?rk;.ڨ3jȣUڇVx˷${Py.02'Uv>bBk,$=V߇'Xjr 瘯ddb]຺jAM# eFzf񲑕5+; ~f^jm@{r0xP" N5ȗjzYB5t5oƼyI:7 #=A#erC;ӥʹ^!a ]y I=AAgŽ#72.m{b)4\-N4`޳b])0 E!yVI&3>P%gȎA(oQ-a ju8W'\ܼxJKUz:YXI QD3_D4ix{!+F6Әٸ~)(3٭ڿ\!|4cMIfR< %cٙ[몿撾ISڒ{jej}6qy# g`/½P%laJMCۤc[ظ]>jt9ٶpw?zv=;yXFIC&A= 5%:5W/R<)p(J]@3XjwWx)(*4O_bf ={frޫެj'T9Hx_ڬˍit\no~j>o sK#&a oۻrՇ!'pH.c xh0/Ɗ_i;-Va120Bx&9-eF{4SKlـnsޒi+MHd߃|/|~IGKsc͙g8<rp>>e{ч;'\/ȩ>` e7dj.YɋΩYQE®8|L^+`t1NQQ=4')&0䙐FhfT\8bF<'ETGPA:ۂi~OM@0I`l6 4Ns*|-yU@ 00׿X ɋ)S+:y]ZkM[ f77aaq :=%#Gq7!8ND"ODذ@?C`JqeBS^)Iy &Mٰ3|E#Ra阇r*}HeVXqN2'5XDnw?H__%"9lwlĎ؉8+7 A hEz/ߕU)f$tuu=295-hω׈Ԡok "/٦Ag}`l&R#LWC G x7L>w\d+57]c~XWnkk8'ugO2K~:LD u̗BS0Mox= T*gt(T`%^g}layZ:- r0C}6|EirO,!-pDM7tډx}38h&WW<&dl-iD:աQ |ӑ-; ;,"j_öžXL1fW1>E"VP8N/G?c暦%o* _r(kt."r5NBr.Wf~__b0_[7o lum<o7#/f]?leHC3+a ¯ׯKZoQ=m j";u`9ao*D oVRuxvqj ѱ_5>5ԄavW%˪~ +a͠Dۺ)ouWb+?d hҽ&>9C5tDdMm`V-%VC>kx"5zFY9pZvŠ-O)HGJJOK,H }T"}B?E~|wJBZtd;ZmxŦMQ[pYf#w6Cd~0- 6gwՇ$#\R2j> pYzTt5mߤj2M x>I/ւ؝iiHg&HR 2j2Sv N@s dw!Vٕu=Nk6eY{NT]bW)&/`a1n&%x].ǎԽ3kێN& &{ B3:/t/$ijE d/| #dEAX!m#< x(LP=Ɖ8Wf|1nl,4V^r/DNb LMf!8RE 7I7 N1QQgѮ dz`۔U gV_'NO7a+N"LG]Q4kOMF¾Q@okȀZƜ<r["k!!$F =k u2A%!q~DkDgآPYZ`OPC!AQ\)kR vV#W1#1ւ}8%# XR 2(kff{D΍bŒʿI7lCx)Sv ;3:>"[jR9rWHS ;P̅{Mj$o )MX,S[8ةGO4IU锝i bz3 ֦^Af/ s&zpP{__8ƻ7pJ2rM.1guV TݐB>YXԭ A4D{95a 6cq ĢLFx=ݳ?o@G7h@ ף+X*#wSX5bݛ^\Ev+$%pHd%VHyP{Ѹ}JpkLuҏ[z#ν%8S_,$1i=֫5"$( [v+Y,:oSeAb'Rt]b.t^ /|K0aFl[̆ paL3K-fWůity%K?E7|k,FqzI<,tQBoRbk&| k|Y<!45Њ7YT"8 Q&{*Ö1vX!WNE؆m ޱ<V -+J^09@ dm:X ˱x/h/@5&fDQJP½D^+Ԧm xkaiAgNƦs-ږ٨֚CCe[q 69 S' T}h3R;jqFQ|~8o 坼̞$ MGthӻ6ozi#J$ch-_$?<1/?Kbi i *ؽ6 3Y lR0!ff8E +žM,Dv {lnih8o~ Te[kb5Fpۇ sBדHyƋ8 {Iw_pmtiSw >q݂]ɛVCʟM͝'-i+Lsy GIrdVs%KoIV C;9P&QjΊfŊ+\&qkm8ڵl}}^l%z'!#c%K c=*ygãc_ #}=[fڸF.c@ ,ZsbQK"8 sDFQe%jW$-$Ǐ-š~N*;zojr, ĊbbDҾ }B%K9׀_J2S]W]d'Dh)>ILxiC3:dp{ F:g:p5-A25U߷&>j4ěoM\G1/Y䏧#u+MDoM6_=UƎtNbxEaa"7ER. !j<{u٬ȬP&i Ͳ}^XSduSopp& C EaR |#BP`f?Vd}Z Ma`ؠhԺߞ R7p.ֺH=+TVE.tSVSVH3`UE;ڬ`SoˇRl VHA =Y(45&W;Хyb9*>īHbuhrG@#K#g( }X=*?Z,s?S J5[넒{+`;LJxp hydyNMq!{+h#EEH;80̦[ى9|c {)V_m|_޽I [Sʵ.8+0GH!(_$Y"=V'o V:tڠ{ƛ ]c:2aN 8cAkm(DTɟʡ_ԧÓ$'03mZ ~7J壤W4ϮppfcI3fҘ!k]Y6Ӫs5rSF0C%dZEYߔl`8-ec6YBV*Cgl( }uEd/-Fa,b(*ZŨhͭ|,\2jbK/s-SL,Uf~԰~iq`3ߔ1< }Ey'X6;m7EE>Km  f]͐ZmۻNw&Eܮ0 d):k\J{У]5+zE?ʜ>t79#^%;t YV({22(R1 sle /,衬Svu>re ?^ֹjѳSvzq5(Zugy!^Ny 1UZ0лap۞c*k;>"P*Tl{LqRn-$3opdf SEF9Єd$c'[ 7MjS?n9?r|v ^Ⱥ%ڥ+J+ȟŨ)Z+N$xSEQ>~}yڱC]ks.옵hO\ߤC (WwŽkǽLGXF%Sig*NPX!۫P9bcYܣE]JYڧ>W. 4R L1̯SDIʍrvSk)\ɜG/ 3͕d~)xW/%P"b0uR|rЩ^O6dOɈ2PENn0+IƈҎL?KrO#4a/f[.`N͔](ԁ%1]_̵5g5Ig۟C^[TȴqV٧ ZSrӚ Wu^YqߣvZR#rWs/i d8l|wұ/'{3^Ssw'h, EUk)IZKDSG=>i EY@([4w;BLG's1$qMuЀnb*~S֐SR/bE޲S*0B:!YWIg [gX.fK uu!G*[y\b>ul:'t0l}_a:ÅDfQJȢꙃ×KWiNPBwaü(#׷ hg©2K)mlS(rAźV1NŧranzBCi|P ǧce#٢o@›d2:6<<*&fD3m<JL@b䔤d)x`,o 8v`ݎ%U|Ui%PWLLEJHuLzCmuqGs;]0 gJD!IzLg8 dBٓ ߽ ҉[Ec,֢=+Ѳ Mok]z;=m Tl $dz٪owVٚtQpJ|"&k> t|= Ϣɡ"PJTr+9`D˸Nms~6lDf r 6t68a@&ZҮ1zK\ɢ8& Js} i؇.&Qps#,sUfg.S蠠p $ ?X znۊry^_wK5ꭼ5e2I~,[Uqh3>hf2,s WO䕝2.KXPDynz?t_E2^EkHi+6`twl_]?6L6t/ $)S\:}4u^]Ǎk4jD9%2k/-D`A.6"=Φ'\p^3bG8^E4G=lgܐ*r ~։0hT}$8UQPRBJ8V^y9=={AejWaiN+ 82ᥠi0 \pj{o|p'γs ׂ>/_feRr|DYu7RaAB.Fٚր˖qCCr 㦐@N;6S})9FGgQ3]xhr6(<LBH9GB"P?5bCF*rL9(qdO@y9[a Uڐ } EkCn VLٶY-hD䭾tdlLvH#4q)V"* )7J(Ex!|7q'Z x›#BJGc83 w'wk0E]s$A׫JZm+?置41_beq:"aw7C@&-㫳]/״ ##tQbċb1{+{LSrO I`o]$qbi圮@L["RK<ϕCRX%^~˗Y8]= ~1#5A'=Pxaa~x~fx蝍B|s[j|! %;ƻPޗvxaYFy'I&YMMJEqnidC)hS oB2ZA7٦+tڪ-}xk5.2LEڞ;h|K@!D*Q[!)8Lix)B@XMq <Cǖ~$˔Yb>o'<(.O%WJa];$p6*Z4Z]BS$kZA-֌qAO v?i=UA$@30u 6$r3q꙰kG`xE]'+ 4XKL qYq`GT^Gy$4>߫Mr5.T!#]"G8U.!1NL&.ݶbk[ީnS8,G|>StB='zds8B+o,Hz$>Vp-vI@ᘤ[/UbP=SzTȌmF92c{/MnjxE5Ǘ4OŇL;1t,h,F/{3y }ӸG*pZ5~sTŢ\mEFK2 -g xڵFbVdΊYsXaIj_e43IVpgg<UG7ł!',/5:c|dj: b\,٦ OeM=Y*,c)Vx(uJ2@@ 5+8<MY(1"䠬P/ )aPJa?r][ػbST"'5 ԫs>*!`J!e0A-u,OtaaA2E-޽.3RN f!NTFa;dYU!:HyU܀HYɻbH|{{EGrB!lGMz;j0:'}Z%Srh40ݔz9}鮜!>]7"3TYAeHa;1mA^S $&9| Bo侟ΒRրAO(.j6 kf k ,&YPxW4tM;_C"" J_ғ)(GdKJjɯ(+D7ZV$MYznT GHXa4yS)?uc` N}vB(Ӯ 5O$.]j .3\eb,GMy”E m0QO]f!c Z9I\nlZH-KDYb'N"{c};sq8Seig/՚lYvA !"v:66[Ng7|qϺdk i;طqQč"ƼbX ݎC<՛xٽ* ǟ oC+ jFr! Wyj㭣hȂؖS|ɘ*M);n7o/(>> L lR坖axklO_SƯ J9F ᪿ;N?qAC8DR W/3I߽w,E KxNʣl$w?3o}~ߔCA#QSC=#mxw%GxXDO3{Xa߸o۫VߺէBn (K#,*)h(XE²TO#K"Woc+-ʦ[R|hdt e>W'%c@|ϸ/ilRrwN;y8L&Hg$ׇE{$^kTNT!E QT=ɟvk`Fj<+cpEML-̯-BfW&G% w})Is0o)8:I]:qKݬnF)q,;A{/ww42b("$eY["S& EU$}FT4% Bu-XҒM{!N[Q>gEL\nPc=;A }f8_-ā*CT) `hi7Y9@U]6%ibRp^04f-=s/# UWuH5gfC m+ptܠSfQ%7OTQߎ-\Ɏ81A#mD.E<0| tw=JcĤZbvyV?S#a@=4^hc#?&?*Y.<`tο*w5}1ɰkP-i^v+YiQ>`HT G,mkxfoۖ"̞fbBI>5ȯÈ`SԫŃJb.E #]dDgԑ6΋%`14IGǰ`^pCt\+A}C{"zt*|^D{}pd=c0iAK 4'nq|DѪu&zq[m{~escd@ CKgmQQSE\G̃9ƭ\up53Pӡ|ulZZMi -< -Lr~#SKjw$lUwg@X.Jq Y̊bx:h8wVEFSlX\s}-!^}2ҤzdmfW):&;?/G1V %CY y1<ۦ!" Z7hNU}Po{,xq- d3r(zf=~0|tFPB猲8doIdE/'XFyXgJM>V% O!ڝZÌGm`1j!ZXv O kj4ϾK{F#?bddw6" rgc#rJk_׳3J{Ş~VW׫S+STbP[j^;RiЎ0^`r+4ue4rY8bn~Aiu5G~` _+(QhKZ53|(ijI8k8e tۜ\ܜD‚;.ŭ$DagrӚkk^^n!B^`z':2Byt >B%Qm+&T?oG/J<9f Җry]8Z+B=/>Q:b! Ĥř$=^o9c؉o?O›#Q(vEqvpy:0DJ/aEݷK"I&E-ƃ^Fb}ժ{ч Z ǕVwftcÁ;Z95̯JA />u#7HW$9I/I`| A1Ęw.6q&@<1/6L  yB#Q2_;8,FyA%(N4]E=#;aNa^Spt,hIn=t"JcT>=^@koxG^خX*xt?=Hx7-wsg!/A tO {ĈQ̖'p7<&ߣ̾ *?TW`3X}H,piWnW|4 9.ZUw(u8"1NbQKINu3Y0FHEF-\7;zlLJdpÀ .:?13ɴ"L";G9Dp+ JTQ3+dV 8WǂBNW.^Q骊!<7F-íRG;tN:.@{#FN}1R1I+#ܖAK'X["qPǂF #cuBkص_; xM#aZۈ0oH؍f$,UM}>}("@ ! ϒrC\gdwXJ0]BMnrxY6^HLɺxڧɠ-ѸMb.1tAk o* y 7X1vɲAK{_CҷUo_7 ݽ!o>8~HH7<#.\r?~y%0X%yeY]z "QaK< y%'dN8/ fcYa'8A?_e:Zb𥌤]x}#@L7bis;/d(K}]Y|ZY |{Aը9^ܢ;@P 1WQpa /)kİaP3KPhL[bWIWxDC-qy㹗/Oz<>nhג! ޻Fݑ-<6dp~y?<*j֬+gvŹuEy@?jUooړoQZ;UJ B0sn3`rUL:PnւJQC^k]U> %~bKҠ퇁1$q;m4U#9^|?(Y Ic$+#"0q:5|5hKNubg {BKlAJ9ɘTa&j6G MXF( 卒aRIDJv{g&赃Smแ}i^æhp_J@‡ė.xe /=8Yt1qJ\akWs9Zqi]UQBWMЛ2x:XKNmFQ|y$U0՝֤V@gDˮJ8~`Ғ]%Ns\JfN+OtgOk׆|z}̈oo;$`$G"\= SxlfAq:q~B@L% >2*8%{rRX#)5weF# \/9n6/A-t=V[WP6_RS"ÔKsŲɂUplab;C3znIpt 8Y+9 r\4EiD~¸z˩?r_1XC0#x]ǟ 񦃑XeiR)5B6*V0p#*} )10Z#&EЂ;2eDY?09<&oML8GBj7yosPQ!MX[xZL Q¾:f). {`"``&F"*!bFugbπ`:Xs^cjBZe xE9?G._Ng`lyC#[-% ]?aX[Mæ, &)ɱ͊#Caٌ3@sD"#&4! e7'Pƌ>n#_ $~$4x#N 1`$=i0Kx̃ g//&y:# B]g `Lw)i)з g8r'n gdA ̢F9(ĶJ*m@O?s xQ\ ֈf>ezNw=lj z#B'0wۺ2xk¾B"-H$"=YFatDž2A2A;􆺜9 Cʐ&/U]>FU`V y0ɬж[[Ƴ o7{0DB1\A\nlxZxJ:sv!jBgY+X赘(AR +=H j=.*DTdt\l-8]ӗ+@0%{˲ ?f({'XGR&X;([qu`K.k'poϊwV?z);PA_ X:3vق5ޣ(xU=_恫̍#D`A$:c(Nyd@O0ڿ>M`&LqGP\!&'C 3Qܑɱ +fDd|gFkn6m )[]8Ë_M1DGqeAxVJG.`A P@~j\N(D= l9o 즆 }˯z'441=)*qK0' m1V ܱv>Vq⪀vMYIpFEsulGєڽ*W%dG98}mQܲs;^$xM ۳?Gݔ۹f}LqĥlcS n=hiHDbS̻^EEr0sQ lvn[&2 ;p|Q m,k U6iojܬ+'~RjL =3i*^7cA]ꄃD|Bd;g h,m*܂|\t9 9(mIxA8a:N toХ?e@ԻfgcIY(DU[ ң-],Gߜ>h#ԥS4338G 'E'4?>w59'O HMDܪʮb0KԮkCZzVhQ!\PM j"I Z=Xgd a"n!"vk#҄c_Dw, r63TgNHU{)lտAJG@­"gpjf*N ҏj/n[dWQ{ǟX ގG Y⽛\X T'EH ʽIN>6[ӕI!ky 67jgHO.ݥ+t\tuѢ1KyxA4켘ΰn85B/, YU8qfz \l5``ĂgG\X$^ĞJ>^PW!T{MǑ|ѼPæVA jTX\3 ݡˎ R1ic#yBFdSכ\/ZVs9ݯ #q;[|h{Vaŏ&=@c~ՏUS!f+X9wt>ה{LqU0%I 5SS/lֹ>[ qIxhQV!i_eg#¹mxuc$FMߏ+A,\rz4tUԉ[=]Kd0ҰH6 u .>տzÔuɭ?W:u#L0TGunp- C#SrY6U[Ӻi+T\Q C#,lfbA)qqfRڮ wkcPxdFg$L5Cl"ɽ4FM)L=fЌ͙h)j5<=k_Sh2M2P5ƆOm]j^۪\~+  &·%c:)MJ[mwf[tk[LmILs TH,RGml(^sg$}_n6"~PZcFo=sV$"N[3iAz]eo]6nÖI>uS[-qs;{ y}Q,o9ǣ+tf9fȎGkvօ}=M=p6h| 0̊p |owų3ͱI/M1b!AȄ$zr+E08W$&Ye$/ @ngK`3_FԒF E #| }CN:o'a$k y- ceqgO^q9QR1:?Hb֖@!}덪ƴA+k|wBg-m} ۨ M_ZziWlL$?K@ض=iKԷyrP[KYT@Wfa}.%>B}qgɍl)r5n/")kzU0w`fm#Y=`c7/@x(;\Wogr7CLD{9uUj-r#OLpҢȄ$ 2Y; n׋aa$@ZIƎŁSqFvdMϠ4w*a%ylڇz:l)zL@gJk0c}#[m)!($8yAkwϵ/)л ;(A@5^됢TfQK Qnߍb>c"ђjP,E6?X t@H0_\B,-K7k g v0xYC9jfPOcpn9['%D;Cd?|[.36Y )wq;i"K-ϸ ¸ ⁘f3`Lnڅs|IbCr8 B52H4Rt5V6mN;4yGm>qsFA=XhKUKC~?~_1I& fHsV*GRQ0CiʥE?9W(l`I5' HJt싡ķ)UT9 O't2MIѺY[gf83nW쑳3 q&:keVa% l1\Zq="K1?ķ H%[CC aw8Q@"g<w$^Leޗ$_)Ӎd ,lcl-%c$WXf}hm}X%23222"22R2.)͓<.}qu`]7Xqy:nYM֚t$t^J)LI6O⛊ -ZͷP'\3_TqlO >6bg~+ qhK3]= wCfu9Pm׏/nu8F~"& GTO@ `dS!x "(wxs7e7T>Or*샊g^C&꿬3+ ᇑNAAg]Y+''#(T(GPa9?Z1}EgF:mR?L*t&_cТjZ1ԫyQy FQ{rf°?WGx٬oqi\< N1{Zp*Cz`Ͱ Go;0U]:P4v$]jjys)죫d>GYT?D) gKQjSf1*]3=8mp pK+^BV8ρ*-?kXܪ Ґ5ed]cJU2e]$;NZ5ҲF,RI;^.?Ug5NlM<ˋv-> TEl)*w= vwDv3)/#Oa),_7`Hk_|k qwuK Iѳ[,xN@PTˌYB?ÿo^wAr)=9MbfMSWY6Gڔ]tD*(w(+fShoc@W:+gf~fZ )w.B;G">]vp047͉hąkԕOk/o@U<MU?z.!7fQ43%6^"]젭k8LGԘῪK[,@DT9o'4]]g~w;:0 skڲL\lR3Q_F&Y凫b0u(TT4K-H\9):QΠL@R8wiٺfZ-O@~9^&vzĞ e+f?sIl8 ,l f}ĸ_2aJzWԙRn6cjNsTWI/*f dlխ gw E]V\'3vw I>]zo9]YzW j2vmvLNV "AM\<'US;ʶPq|fHyR {7^FD/pmcrP|AQY+zEwpR!($6s(̹طG͊SR?ȑ 5Zyd3i4v'!PF';س`c~r2J*  #G֠V|RʂD_geAk/ EcfwҗMubV(ю|q́!3Jn7c/:u@\N1b4٠m#lX$mCXxG#c6"f89x1C^3ж4_~PON(b?SCpn8+p6 qEN zvcv1?:&8 [)Dښ~Ji'aۋFD薢?w%OfwYX掬5O<-t)5+6 ~S> ETfDMh!eqHB>`Zp˄F:-Fp &b.*vljv{ep֍v%Wx_o!0::9Į:TDjJBbƚC,`K戆B/ÇFVG&jo#(/ebV eASۼZU)$E'4MlUQEUK6P.T*0*|sNIegq5Bch7Fxb2oD=CtVɒE'@\:|} v`RDbVe ߹(Z=FYY!{f?UYâbtt>We*ZfF9d4nj^@b `ǁP 2;f@o<3HvP_ 8 ?Ӡk+z$ɍɭKH}i!w ⁾ Ln$@ıUmeGT^CK~_  >} m3v8_Ar>Hj0m~~ {Ec! x:)޿~MFIm5B }nĭ2gi^ii<_8H/_} L RaZalA8 ؁%/Uf eanhNX6iYl>*2@j2GU 2(F{2m Ah[qL!Lb?saMӲ(6잟vCtoeC": "7`/[@$6 @$MS7qRv"׮kU&JNcK ?!:%mCiI[ /[GX">ƞV["3@mmfPQ%Xև|J09G <o(0Y-^4+mf"d~Z.HDX|>Haoߢ!297x>!3C|AmW"(J[!5yOӸIFyMH#,YѦ)/WItn$b٬k`XlKQ(SnKR!ҵmٞȝș̋ U0g=! 0ɺC1 )ˡA::S7Q J9!':bBZJU2?cSGiLh̸o62'1]>0հ͡ ^y"?۬u5m+"+^ Z0w \xE]Ha4tWoecshAh15uB 8b/ؠ<]MmE)uǑxIJdsmϊ]?v>Sd.^ Dܥjw%r8kk L84Isbo*Z̛Oa3_U|-Q.7BG9(,C%v F?$K,+C x}@25ӀM\P8ˋ :IB8e;:<' ݉_ {ȱϥS]jXw25~g9]@HKvnQ~X!{ȊR`{xVEHWK݄ z #10`,#$l}38j]oyΑEBaN` G;\v]a^Sڅr+ i_U8U xJJUqI9]P$]䣎f!RPt?`zƱ?q?knf`ؿ *@mZkb/NޛfPV&] [ #㿾_UQ\[__mn~lnn1n[GarM?+g?/^=;Ϋ}쿤/Hua?oGǧRCc'Nѡ񤑄X’r#MLC\QZ(?hlwI%{a_q 7A!1^c6'URphD:S7 :y~$>>w[qWjxhʼn+TpGPj? ⃬пoVXl{<pwJRVnxGڂ&­:C8?̓<{+N$ -5n=TCU| i}s`aj{h `Db(NtG</̞Rb஄!- Qv)OE^Q<?zc~![Ÿud6IWŲ]xY`Xr-3  ^zN-G2`Hq~Q),Ϋ'IG,`ʹ}]_,x u7 {[Bgc/3l@8ŰcA;`4h- eɴq5huqV'3ߢx._&4a5[ ΄# }x-a+P݋ 1l]:cLQYD@dLXln1i1hC]G貆< pp XJJrR )טVeoQ!UT[~Qz~r6yĝGA}(jH)DD:[., hZ.}"1\F;fyh@)ӿ䭴c(&Htl u(t8K&>|?"abM466WXml|.cT'-AXX6A$D1y77o#=nesW3m6V_ll>ns} < ۃMhUo#ē򚠳ˇTm7Nu#2Rb$ݨx]-=oIv{4w>xƳ>aZj[O?<:;ݟƴ\k"_ߨo56u> g~rz9?S;hBo:"J=ɸmjb",0!!-)8a['E>gz  9%WrņOk$BgѨ,7-6qp\i!9ZC(ƻ^$9;.>c  5Rt%=A\Şw#ʼnu/w.V"sS_C$o/VÐw)_A<h}6cP0dQ/f%daGs{s9["ζE^17UU``ꌱJv~+5V0*s%z1lmST޸_G_vNNv~&"FRp%oQHF{GlQ!P~˃ߐxϏNx˝>i@&[מؒnLfrIfL%BIv9Y"b3&wZx;I A^7\8^W;~Xk}H gAp.ou?kW&Ao;+a}kkM뛫(E>^Qf>NrmKo@7.[E@ܸ~<hΠvgK9<9y +G L9^ݢfzQj˧  TϊHRe@G,寱uYw<]YX8,UzXzR<0$YR-#j2!!?q.N!H(Srv_aǎY8OM:wRM*8/B>ߣ"S.hg>{a'xa GeR2'j(6S00Z^9M|r֖cMbp}g0mTT8c" 5s vŪ5hSj!IIQ!44{>xOC#=M<j oO p8al}'N I|t!ƹg^`Z[m9`fuՠ5~̙_qrTKۛ{5}ƭi{*HaJ?lz}=n>rm0Lv@Ujŋt&埲L7_&h` _eVS ,,&^-\V.Y3|f=BÛ[ų3`')MM<:ׯ+jR+崻R(f ~>q;G ڦ2:z>: {?o6Zsf}531hC¡Uuƶv ΁0-ёL S.0E5}`wV' |חVqd_\3hAZ1і=@xFWYkX]][_[kQ׿ֿ s@y@A}v^URKh~Z@ aXnU΍FIC!X״?S{3enf?=\biڝJ`p r6; %[g?3FY*sTD):xhX='cVƓk&wKP׻njd_tP{9:ysHm<~,&O5z>H.k2Hї!Vu-F\.bfYE=hJ"v&0Lͺ66dk~u4fCvýW;@ٻ?Werɕ@D* []Q&(ˁ;.+Dh,aE$1lƦkc*S?٬2dʗıReeîj+ϰrTif8Z9[QlX g9~Ѐ6Մ90ɥBpka_FX; "0fV#ӲtŮod7 A*7{nR JMnI-,oQn&/jPЌEYr Nx(V1XD%dpqqE'|Q;fi$;y:g|R<6L16:>M,`Q oA 7j+PSd|¦0sc0>xL*0+qnlJjЄ3-1Au6 =ia /X o9TH`c|` {s=Ö&@’&DJO4-M>6K-TI9 kH4w̝3Kkzخ-b5vs}ÎH3q[1΀W/8@&4,b\wn&i0؋ĥ,kÖͅ]ۿÉc11C{cuJ1 Jڙrz{+%j?Bgh2씂55^*Tʚw&C3ؐz+~Y8Flh B+*fT1o8R^,іi_釅);3=17fYUZ{U;ö Pc~wl?Ik!pO1H㘎xi۹PIY&ywf B\UܒE/;.:¤-nr(P(J_,_!}bo]s([TX_|qGn}sX_?Ok{_J D~&P2֪!*kC'vjM"L#TIМ#(HBܯ^Is|DMXj$U`s7sϟ1Ida>a{ Z}ka aR$aN&'L=+4:d hCU?&<;8$B~&y _|)?ױԳ{'m`Owpބ_Ow d_+8|jdlOG{*rB[YGϱܙ* EL3eO穒?1#z0ž} SmO[軇jHXM0>[=&<]]j<3 L\9-8+ bS&qe'+bRe!aԭuFkrT|?[C=5^VoL$#ܓh3ʴf{s4{fܬ\|vhstdE_ }eDj<Uj̮]N! [}jW^1Zal-8n b\;dt@`R }ksƒJ ioYr6[I|JAP S7/AQj#%3=~H 3S%/3Cźs͝keDu{և,M}hD0럯Җj F4s´z6&-]YK #q|ΐZ l: `B2bPInE%W]5Om$ $j?\:*V63$ \jPr8YQh2P\hNEeo^D;̵U78:K-6:(0l pyZ2D*",O,I0^3@;4Rp=gffmP(nmݻ{cEH5پ\td&O_u9.u/_k?(tԍomr}mFp OGzRIZ͉d@^@{\$~,k:]Nѓ "s3u{-f*˾j̕ёm2H9ޞb,]}{xɜ5 .N9M%dQW+fxۂ(TkEw򽩤a$c4j$*E|zt1 _ZIQ, pںRlIUWkS@ i 1+Rh"WMuV*iJȻ^2Dh+y=NlFF2.&T:ŖvztFSq6] =A(T.H!A-ǡ0Ş"?X2M5:tt[xz/mk9hU!<2X[/TΜ2jr2|~ؿmSf^l~ Ye _IOY]3O6lz7Ƙ "UМUZYmT> vPG8L!{/ӟl4Pw<\-'// 3j9^ i>"!` CNL^pu=;wFĎ@wR`ƃԴ/MpXXc?}*[#K1KBq[26==qyJ?nAN^w=ʳ<[\wZJ0#S;BtALwmx **w&2NVrEA ;Lyh'k}pmlMQbL,]dU\S]XRSaw0 6*i1I`4gSEh$ 춚Lw wYf%@Ž/7ſ,UUHAWߍC>pDpt@5[hU3% >&bg~|6V݁C@潋篎VOCMph;9q𰗋 rBg@8 @Fx:e@6<ٗWa(WD"B#b׽dv){M@ąxn*ŬMUQTU+Y^ڻ&7M_%HRP]5 3 V(9tYz:ئZZ쭻]^'ٝ #FT]f E7xݘ-$ZgB-̖(ud[el(,5!fP+޶'bZ)IkCW<(ry܎lbHBFeȰ*)%78ҦEɂ͐2aGaQ{5N=? -:PPK<\V"}yBBUcf?($dgZ)RTfPo)jܾ(K7K *\ڮ++Nx2Д `+e'ØM1CpڟA>mWgFQee31 9-qw88!@*Vݝ`Nn|۝FhoD=ʳGC~YZ_p@Mz(%@ӌ~ 8~R).Dwha^LfԆO4*+’K[ǸJ!W̬|Oݽw1qYZ뇋DY,ə5֊$t%2"4B4` j x #\$~R+Ol"rD>ɮٟaQvnvMZ,v .2_,C\&~1͐ԖV +\!Jwue%d@Ѭ9fX뢊V\Ԅ8VՏ482(:Fʫ)2q3Ҩ@fMdKj3!}M,#I|9l@OGyW[19YNJWUTw)w},znZj} tŽ3/3A͚3FЪ5AuR;W~bY+AnZߴ'CDCobN]n:*LwK!Ȧ‘|IEtˌ=H׋rlE~Ȓsɭy|vnf 6qN^.XeM~3x9UpDQ 5N?0x,$ {)8ڧjhr bO}ώ'2|'?G΃#݁ni:yKN&Y "Jxשּׂ{Oo-z [ZoF:9`Me-+f0OjF- 3z W d ܪ8b*8HT)B".`,5Y%h`O4SZմl" #-b-EDuի7;+O?DlF ҝ,d#~@S0M\wbrEnmkB+qz @$b1kX"Gj[e1~{,fV&NO??Yx7d $t>j%ڲzoQ0@t66-f? Q}])hʞRrS2!)d F*\mV${q]‘C R14ӉuyCb?o#_ #]jΩ}w/cw5 *#?C0N򐴀)w.2MɣzoϬg~gͶ+iTЙi4^%nL ];{or3'>4Ja8N'C6l @+'ATGGAt&?LzJhՈX \kSQ ,Hbay[3!B*: &.Ė,TU }opK&S l3u'IA9٦:F[uIek*%p6eD׵~بk5ݖs2 E2-0y {x]X˚1\'aOWW;Q7 T._Æ{gj;/k:O_ o ϭ+Eۻ8)a8 cښۨ]=#aKT a-BOZƞN#wi2e2f<[bvDc?lJf( AYK)1^ CS(¡hns283P9]KnȖ1 uR˥Qcl2-\Re#Wϣp[ѦPJݮ8SהtB]i_Y߭f_7wlc-C[y$;6 J`c,4ג )%ؚIN{UQ/zAJs9t>s&׹Z1x=!+-όPxIU C!QQ-N:9Nq!Vi6Tː^xn3粐kEs XI:W\[]O`8lᏓyꩻ$letc9 wsRahu/#i t+ ϧ)/D#pA0-.㊒Zj^d%#S3n.^=%O%>Tr'uVk)FTY >/v Ļ3n'0B1R4xa4HPhf0u{ <:uԌ'D]?-k_'W_$4 /)"- (m )7\Ƨ`/&FL ;cit6bK1Ԯ}ˈ(e3 :1]YpFM֕d ^7A&,,bj Ri< ^wi'|e9MFHP3xU5RKY OaO'j o}tg&[bvXTx}q) ]ptߗ(=^`oKi.6Аot,3keK8.%b-RyOH}㔭YQe[?ɸoOhW(hڗ%On;Ƀ;lןx$aG7ri ڌ\kwK]PӪ6,w+Tf$٥Z ,6[y&'Nx [gFFM4[VIoRۋzLT6vm<یt璣G'q&<ތ>ΆGi 8>: 7::aÏXv4bzF7e9oΗJ*C޾!XǏӐY7> Y,ͨOu8:cd֢-A: 8{3( nP:B9Ia4(d1"IwrF|!qYuu)xDSDNO׷%;R63e~Ȑo!I LdX958k2/hҼ(!vI}nbSY"W%nYSN:}Ӯ*i]g7BKSBnCR[n h 9¢Ҩ +svq41G6oi7twWؘtRI`! ,w#ޅQCB IC/4G< ̪u{']fd 9 Q Cz^aRRn!FqTG)iҒR8ȼ4!gF~"0W9SLy0+tf l[D)|**exDkhhw4'pz>u'?ޟO{w418 Oz|)# rS ?N9?psyS?TL_8U?  \V'*x~ǾqP܇ao~:j_8?(n; N>Rt*#V{>7޹8ߓ:D{WQG_Jp}.o 'sySя{>7>7ß %Rα~S|~. }&p)Ye BԲ-q :e~h 3ọ(L`iպzdі</d($ۃ:g Wv XQcyF#$$=yH=?#Z86IU,O"rAy0nerFlH\q.@"|Tt? %0Cg+aBI)v5nܰ J9Z/%hȒaj`^:D`/<ЇveIE +s7k6ĀhDBM0>>Xt~JGKřZJbO$0 PŊp%(WG㊟Zr“yQm@Ehy+w}LW+iWC5嚓vijZ>OpMK2|$T<}X>Ć1qZ/73Ir[sGgr[P{D[w1 ={3ZHy,"=s[b=.i}s큨V 3G#X~2vgU͔=jxnDۣ[2 ec9z6WϡEZy# QY -檝S\qc\4BW~n Ylj0CLjIy!K]!:-)#FkQcwu@ L!xSۛ7(x -ƛ8I3Q;;Y8tˉP@c!p82*'cM&y[R|ʩI'%k\ep4YJq |)_T{8V'4ZƝz"1;bMSIZue 0qKZM5$>} ;ɶj]lq`w&ÃJ/35B^R;+Z-sbn!:c83SAgڴf@<\gWmM0}D'*FPj߆@Jgd>E53}t7c:ݚuZ"] :iN1]ioEF6yuv &ՙiR62<ϝv!ū߿s# ZVYon{uT_q!Vu ñ rW]WiY1U$*V&0قKڃ~Jd?H;;$ 5A "HЧC <,T&~zz5 oL" Mec#{ӍUšSSB* O e}LBojcA[4 .Lߦtm9%VmXUjd_BW|ÅُhE1~KOgnQyd݉h!dRr@2x*E1WI4|WLI#: zHBt@g3XoTuD"A[}8h/^]Ӱ^\~q6G,uiāg%G賴vE;˂hVx,$M C$ľg!3m NCfc rZQMVhHѡ+BRX1\1$<#SM8bmA.<$UW i$s%m5ɿ~I}=ttjDO[R'-Q+LbK7Q|y)8!cSCt׾~[bV[qڗoGĄk_&$׾=Wzy;]>,y>,/p{iuze6hfԎ8ǥdjW"j!g2n?{q3}Q%E Dg"ɻOԗ^@SkK| ^@@cT)`{6 +vxl*닛:DC9,- r8n6G\IWGvުjF'95bP^%Qx) UF x CT,(I$`T1NE= BZ$?܎[OSƁ')-OBRZ ݾb cU܆=YN3z%sqF5wjhzqHOE%ŕf8=s͂:@ E53fi<;+\>}5UD^['i=yasa-:!a,>4˷"O& mh5q!B]H7Cפ]μZyO>s3l+y?Y}q1ŔޫH_4%Wt]ɺ5GsW.fn=$.g8u0rԱ`S?Ai~n+`SffgF] c4׶ 0yPb5Ah"e[ eGМI-C#Od#47Z0bK {l9˳ {IE yN9z/MƂt eXdAQ iV'MLL\^bcZf\h(aZ G*[JP)ğ ;e*V@(ҥ11ZW9r냅-5b<^$V0n[_U5OϫUUFѡR=4'ˮ8JRtL (pxmzpk9M{/"3X!NTLXnF?͘3r3/"o tKkuθ6aRXB_k]ī9[Q@Ƨ]&h4S:Cd2aJ=K @]W9[=9_f)U3 ;NXwnMn*l=hCsbk$ZL:C*I.G ]Oo F'}ZqHH&CqѸ4!k:G^R&!㫷79 *;>7 @PEf'OP,#;>x Ib1@0Bijr*9.5\49xbd4MqTޔtz1WߓR u#僱=691E`1."!x2ܓLFa5b3vDIa2WzJXiM xUgc՚)h@xofḂ#opʂNWDZ\z,_klyY= 񟻽N<;s1 .A|C{a@ZkGg<G8 y*gafODg\,ńB%hwf3)a>f1 oηޞ`˰YB\q赽 ^Mjش %rA|eAa$6s/zo ޤ(v~y~k3OEw֊5,plz1IYZZOVͩɐ•LcRqI.Vh^UDY;j/琡 U&R -sr|y/H?uϼ^L Ýz4X(ztWZ1obv 6Yo&/_5,݌4Mjz'apD|n.,!Tl*ƹ[H)ČdqR@ 5oVZY+Cz582yTTQ/\5fevwH;>. i]E!&@q\P(ԼvHh/޿_4WȄ.!cs̮WOkbӽ52E—7^ (uȸE2PE"}HϺtqًk͗0r -,\/Fzт7@Rqx]9yg8S >|n}9]ԯy@Ty@Tcgnޫ~q03߶;vwz={"Zr^UU[}֨U;+kw% zZrr; 兄oPȯT(oǠ ̤ϟn0w__ӏnԯ8Ea9Q(i4kB*>$.r15SzH&0uME,SFde@ŔLDG 8u-#m .bi1g`6VsW(LӯSSsU 'nyt3OK-ڈ7LuСy6Uje UXE{QZ@r`ʸ|\yy omnwm\۹ nmԧ}vDcæKߠRZ\12 o0 ROZuM} iٔvCl9ѵn4NϮz?x߿hzgn@7!kCcoZ#. M.fWw :8[Zd_?\;S#VjZKyBf|*I&8ëc8[̞ wZ;Vvߋ|Ԓ jܟ"`տF~>#@h$nHE{.pt+:on \#>hjs"-t$~'pdX n#GsQ-^cUl벚ⅺR =u7 ܦ^p `гʮxY ({! ]̇{z?Ed>& LDw  ^Xj,L$j!{ylUu+mMlnO9#CSK/wR )pvbG,AVF|A1 t&!,}fޏ i;ݝG7]蟳~|?`ϹN71fDBў77[L/eQ< 8-4İ|(˨ 7Fxg}0z,PTGϟNbN5 d I?&,c~e -#DvuUWJFEu a^`<Hӭ$ `9'Dx1niY#3-ǹSiX"#IvfRIHr/-:3`n$jrz#!4;UIq<wکg@b, qkTْPRGW3D2׺>~RXdXQhu؍CJ+$5f8iD8m?Ut/qk H"׋QQ#AxMŹE:&xOzȘAE_{T,x'ͨӌtTkuMi+5%:}yn]R"s(͔Q' c 0R|ӫgYB+B !+(hђDn+L#5Bk]}k7sj{?oV{E>G+ 3 ];lM|C3myO?a#p G"rWz}ʱ2&esN}`8)H>Ԩ[+ }*iv;v v?s G'W}Fx Nqڒt K^WKܜ,.>犡y8/|׆VCrBǑդ`1.O򣺂pLuU )0EeP9J*صQ"q<\|~q?DgW{-6nZv_sKnUѩB EGLSZ-$@rtÉUQuu`FOTyEE;dCUͅ[Ej4KT q2`7U]T9wY~X11-ƃr sc)y.[vvX\<\<˖(B]P=0’I0\ ԝO? XtyXw;m;W%Cg O}>_gpE8f,'t08$29ѽraiJUa\^Ng'KquCoGYfav>C'0iYuI_2˟Ӈ܇?Kwx~y*E80uPGGҿڱLZ03avy0^255|} SOc4>̯רGPV1S .=U4fFHOwߛDʼn0<&Ne2oMw7$C::22>Q6\(1}1 fRE ںOm\O33V^mmC}U|xO`F9^}g|̟(x5 `F+]'Q#7dMaŏhf~2)Ɠ!?+#]Έ|?GY򠟟?YY~l7æ섩~~xiEv8uG~>)gP'C[+,! GacɄ,g5lqj" 6LfŦlHu^}P;3xqRv) fҡjfC,x\4(#&CySJmwAB`jl46::!)iz`JťΔӳfczvY<( Q4f+W;ozt%AA^jP蓩MER%hQ=L^2+ +jB1 RwN S&7JvܯOCyvnz-orʖfomBL^m!QEn,qaGDw8 gkA2F(U4Gz cG;_=+Íڡuq8aU܎Xucm" am]4-QR b|wK9NsVvi}R/K,F0C6"mZlh&ǖ_4Z 5^4;?H+ʓ//qBLv?ޯ-o?`Wy^h[1YE 9AbHc=1Qb"插Y5Izj4a2Sm4;x4q_3Eǥ/@_oWχ*vn9:boz2dƲVfӢY|3_Ӆ( DyOP~Mb,C0JS~AP?l/T"z ps7 \Ai1Bw\p~SyZA|ux9EYwFN{Sx5S-x_Pd֐:ue,PzF?]$:CʥUR?qJZMC|~vyTJEZI_jyg'xpc?ۇWܧ>/*+tgWWV] lhO%:?_ z݊Mc%m<@@-''g1xӹUi??}h+?N?~[vW_ wߏx hn{o.-1@JѬ wJwj5у q7!'AR$zĎcݳ v5nOw3RJ!ZH;WԿbXW~΁$~80I}7-8*/Q 0/.NO*o!`G=ecFfwGwߟN&/'ëSOtYd)^GcIvD+cNMo,R8 9}@O` #PmbKN˺}yg9.2 @cߣEW73#8ҹsy%CN<}8 ᄽ̚TaAI<.|s\HZۈYHP36b^D gпU,$u0mlb xyz$ Ȃ^S,:N*^b/wnLl,㹀 awHneLl6c0+Ma/eYc k{Qx!QO*G:0j T 6=V!IqƭewW'=%`݆ok^E>".F+%oKR5$3h_duxrv7]~{ez;[s7[k3hh<,2aZwbHE1%,':2ABiv`)J B//IwrZo5Awjō L"P6ȸw6 !;z1/è*4IyϖWu>S- uOzt>?891A}eb @)lQ(*JBaXvN%:<}^YOhtz5ΜcZ,`%vW_vx5sX~>>M`k*h5G%}TիV5X#̩ைe-'$}8\˪  ndS#Vؙ_-9 JWU%9{lKtX8dKQ3oʕE(c; үpiR}>`^E5E]>]ZeO 8XݠX$3K-M LKй,&.mq"F+uB(c7k'6+߬pӷ|!O'VnZT Z|` `U T,SzbS [. (۶)z?m '!_ R~+Sχ6u=Z qO fs$f;wxK$u=?.ߜw"$#<+g6TEvaT\lȝX^>&q툗0ܲ>Gvp/xGױuCZ&b"Gn)d&`-r[bo.ys$fbJmۂ@75na}m"NBɱqf^#-Z;c]GLv&^:EC/ɘP[YL/yiTsPJ Ce،"dG}WxrkՂ.-ۭv?7**e qNz UI2Ev`ij} {~8 ܒ"M9tn,EA2j2uc*s[l,F~EMZjD;Hϭ) ZֿOeR:SK[ .()Ԍ$ȢZIB/2Je+rr~Gy[=J KNkV߿(`Z=Z;\sy<=4<:8 v_&XI@~md2ʐ{sVy'\-'og U>bd-smYIsVqq)mXY5lɡE|B!gNm/`)xkmr-cHua|%ʌ!Nlu<[*." [ͪQ e g߾ABBX(1tN *;2j@2k f=C*,@5hřR, 7Q}bT웓 1铬T} D%RYB%Sy'+M8nR-Zɣ0uSjI}[if]MH6@ys`pXM!siWh aUR9tvkqzZI6!`9fu tk1/~?U˖o'/ޕ;3,j4ȟ%'A# 8Te'KҴ縆<1(nL_r$˰ nOQ|~,޻\)+=Zdv%^=gmw~kV?:{p?ݝ\򆟐7\hW1X; ->fMgHւƾ> gJae஺Z_W@{eā< Í噖\1/m,3NVB4صB(2Ņ%^E+@-% 2LejSgXH+jP˵Jz]lv8ɋIMkz6nPKV`7}Mcnb;|tiUow@Sd= ޵o[yPg/ xq3fO,ޠ@9 ʩ{;)(.8bGXa|l'R:/adXQXO( R%4<1=t0uE)itqӏfśQhr~)]}]~L.OM~i+qЯͶ)[gJC|7QU~xY׀hϺSmliYn3_)#"L=QX=Q'BT<-(RzU]Gy`@iˁ1ilg*ͺW PiA UʞU7jli R<@[ Z~S킙&iUEel {w,tG[@9}eıcPUJINŦ{lZR $;3Eh =%Ю0Abe9$rt }0ETSXA+׀Z]ZfZ6XrP s'1fffC\S̜nq52{ީϾYujad{,Q|V zd(F{9Gy-rE}To;mN".jvV4y>vtvX| Jx );%*E1ZBt;ye?U><'jWb689+]_T@4~U2'Nqی쯨!-2!t'; QYy88wF-wH3Ktpy|Έifja0<9 C% 8<:w p}%Ύh4vˍMc3 ;)6(߉%aFz=ۙ; *j3l}G߹]1{^O{Y~| 07 gYρ/]"J`|9`WKz_ o/`\l#6>qJ{>x wmgRzzLpPTQ]UEVkK+βQ#ݪ2SLz&@E5=g<"=^P'\=W7YsdӤ[D%d.Fx %/ 1$!/P:qT_ݤ$ Gk~ZV_x}NYnr mĉ cX6kcWȫcڱ1vMays[k]SGcӠv[rЏZ#,9Ya. 󀯊~l3 ۽y8s }|8GQ[Q+JOԫJ9ڬʦ} S|Ƭ?/ >.<Ļ0< L* П; d@&n2q?9&Kn.f4(u)M 3|MiѠF:62~KB7ٮD"*M4 Jh莜Dp6ws3ftsXD,NǔV!lsKP"[2(>\!q3XdҴ9^3ܸ5/gL6n CNhd_"~eI0+ǃH/C8ADe7BB88pE䭩I`B AёRFN.V.v%'N`E3a"fJqb69Z4>AxӒﱶg{,d&A.4M,By1@]Ɋ>Lo6E\Bxr۴LLR#1#68MBX87Oˌ>!U`< Kx" `.\3 K`0SJ,! rv >2X\}Xaeե(.ōD/-{RK,1СaJguHlBH)P 굅U0D aڢQS_=+l3fهA1n2o" O&+Y4U!Q9Er466EQg1$g l_z!zI,|tzH^!-R*=8N(=?ÌOX"'3)g1ۮ혟t /<ylA$K^':v$Oj:r1M^.K}G>e zt8/ OFy sTys =(}ӲjK̾|q1}҂\86.h6 1^*8LJ4?gjWCf0P( Z ItR%/q6OqhPMv<ׇ{@,?;';TmsĞFBK&L5lF߭8`k' +x% Am9_?%ziKPJ|tNYԖ"/ԯҟF/@A*iMR6PnOBKx lui'/^TV<2UI4W~U#e-ǵgz'c;Օ_lklF'C2z< [jфM;oʉChWpn~N/U7dX߲<c6Dh Vh ./)jt+<#XKxrz&uZf vsg=ϩr7 ,Ҿ^0罺½]®{yTlnykYNP5ٴ<+ХQӃ( G3Sx<^fUiUq_%a%IXI2 J魩3Y&àhC0TK*Z\5O'|nIZU?:lvWos-!@s3G^ ^0ME.ً[?ex-3')䆥U$ǵGB#P#-Ki|ڿhTyq4M|a,d-"9j ۓ;jtS?S{+Vgg >Nkԉ\|8CŐXANpvVX` 4l!>{U9f~asPGs"v$RODw '\^ =nrYݪ`NppCPhc+YwYCB3$*ܢPP3d1=66psv$uE<8 =&L(#. (GA |ϒ)>>ЛaՖc_2_}ƣ׫BHgW A8=7֚K\k9?OicQz X[=E*6jZX5X3.=( a8U ;3P*qCy8OPV R؇GKp Tߪ_DM4S .bX!5D}őy*ny0Cc+*\ NƤ9鵆UYK‰P5vk* !JMߚ@I`NЫS܇[e 91{! @'TsHadHJ_2NP9a=orKr&06~QL̒OSV1eLzWL PmT2o]?O'-7??EpKMP~n!7;ͷ#&p]>/sx}̓0rko6oBX teGҢVfoęPzƝ=swG`ŰCU1ӈq$ԁ7-8ƕIq>@L1H^U>'}j Ԥl/476ϟ.G'RDH2vފ/nQI/.+JL~9|7ԍCXD*8O@ @9i{,hJ 21 RpF)OAIKT*4E -Z-Ȓ5i1 odf] :֦P$3w;,O$g[o+1^!5+m_Has e=8=-}{Nn[s!k{0mjsfs3vyKqi4Sď -w{N<]ķ|:KTlX4G)hǂP$ijf u5i Ծ9qس}eȭ%qp?iVCTbEwwmOy:vd>X[`xڜP  EQcSJj<֗e>H8a֏Ŏ.QxOv8f`z߾J iʝؕ=({C6#BC)}ϡwf| ެjnx?ILc_R2$!c,+p.}=u^yvviuZ363t*[F[VU^}iw^v3a uhd'Nev&χ'ﵰ޽?Xk\Xg M " m~2 =9_dm-gE ~V(Nifh8(vn2fc*C뢒*bfv~h$sI-'Imw­E,GUX(r\**ݳA]<@y pL/vXiOQD |f1~"n˚Qlw3@vS"R/[RE2Ǘ.YxǔAe}g2\P !/$+<o|e78zT9NI@tH3 48P a6չ( &Au1k8Ng֓//D.,Aɨ8X"YQWUJRR:fpRAbZU,!Ps[W$.1rWZA-{E-AgmueQLղ߄ZJĬ̦ʳHkoF&S%pנun~7J>VJݪcҿFxbȇktfwq]ϫ̘Nhqix"h%Σ9GiZsZ0 KΎ:m=E?9::2:g,cn*n["|ہ3x z1 Wp3Pͥs<_9x?6{^lp[sg,qː7@1I4vvsM!dn~1'k'g[X{-Vk]qcwsqU+X3J.[+{v.Hb,Z#u_|IX? 4@hU>0L`HLNiB }0TT]H %GzX#I|wյ䝆)]us7T|j+\m݊NgF/WmL 8wk6xJbX݆1Za[.зg7e|tzlߊ QE%=d8##A]ņ^LfnGT)?[RuqE^Z[`Qoy"]=ІmBZ=\o _WpUKңk9᙮rx> D/NO AP*5B:en!D3$.G%$gcpЅ 2bZ?)PPweaXHؒ sq\ZBV)M'6*EUq\m:?ǗWSd0wu8~agh݅IAnqIP8 Z6jUXJ|ߚ6 5a+(v+5Ӻ LEm:\lG괼ds3Dj3|=Wo%{?qP{NN툟^M#'vRZ"5\6:"'A8"?H#w!'4Ӻ''@! XO ~ߵ[?VT# 14YwMrYAk% Q/yC -++,7oܑܼld)hM7+CxY f҉Ece]kd_0VJm֚ tB6'ѐopN? uW=.vryqrAN'rx?>HOĭQ<9:/8w~yZAG9j.*XJr[( .K(1HSOxe]^ LJR½av cq4U/cW-z=>`o8nggo_;[o_QOJ/|C1'=B; 0}9iRcBL:샊L׵.UM+Ar$y'^ORxqM2Զ5)7t۸{G=nn9K<Ȣ:<ÖM\(@e1mrN]$pGǗ$!MG܎|$(vz^l`3`bE<Թ1w* qs2_$ʵ[2V mluI̽ x Թ#?O0 G45E %\?|.m` >ku- A.IM Imy8R/jsw21Pd\b>iRY&b"ԡ xPBooyY> \j͙K׍Ĺ?_co{ہζ}z|U@ } H⧎I&+ˌ4-D!VRi:=n~dU9LJbQQI|k Ex\t`Uy-1WXrgn>_ǔ\Lܷ23sz4 :雄\:L]GFm+SXsw:{bӡoo-πRMs9x!ĵ&{]nxpz܏qÊΡ7[&;>떤\ 7V?m7>mQ#ATIZ'T~-,Ya F/Dbb,(Ql/ɭGg@4M$1UX~ŸHjtp:x/"$`ڴ+ouUx:i蹜 Q؋;>HE1Q7Fcm>N'yv+=+yL'N=3B T݂11gҳz\ㅝJ25oa* S;@^K[E o+: ;Ã`)'0,l\@#3 Fp{k',VNk~'t꫱:м Olq7v{8ިRB9_ W2[~%TC]Biy ҺƋ,^mšLWsU$G TgSD(-/;tfƔSۋB D4XFPhDPIjxDj줩>4w<7ԥa4}@~?׽?q+y^ůz'uU85!f*X/|w~{[[{]@M6Lo|sW:Jj|@=1Mļ˜T+z`iW/ n1jەqŜWClLXqӣ**vvu,˪=CA~Y6mU{}Mq~]ꥋίzxv?v?Wx'y\Sr[[옅&j+{lXFHBևPr'/TELF .gZVur)hs^U;+ᬖWȳ9HŌhҡD[[Y5ʹuH"..rM4&7lSݝ^^ňDw q7;<:W.o'Wm*LAݙd{b؜g'6kBUT)5BAʭϹ!qMg?;jZ:%F6ͷ;u1*?3cMWG w]zOh菐֋]|QNOֽݷ#V`LipZ|;ҞZ~.' jPo4@]'#j=^DD /[$WEW(~O锕7)Qœz`,`Kmد&n0"5`UřIdG8cwJ6}N'. ԊՐgwp:;N)8}, : 94%X 9pxbKT6o-QE΅,\xE0@E0hkr*mぅȦÁ =FJ+I莴ma,9Q#l$AY 0P6YAZVZQ&+{\/PqhPo2 vB$C:|CUy͗Kq֡rx Kk'@}|DQ> 7m< d'< kwh4eia3 -#?O^#8)`= rNyP6v8pzq{IQ5#DLe4ٳU4J#3>ot8Mb~G&łrl*S4RMgɭء&s(&]ǽ24+2߿Ɩ64-nZ3O [)v˯:]顚W$PUJ82m\/"SٯK*|†m%ЮVsT3Qh!yő~Ÿcf=(1vݭ8* TT!: xc }X4/%eUO^:4"bg+gn8hyX  Ek' Sa[?yѹf]Ǻ1I̕/x/=l:.|qA v:#kӘz|#Ӏ Q|zg%wц>z7"P{ɐIu@ U\P+ht_,>/|U!` ihEݚQT-*#ӔEu"<'`}(qޖo(6 wQtC=NaLYˋ?XM|ͪ75k6nS\:lʡ&Ls5N )ޖ؋Ak|;zP#՘ke,3K;NQd@ɏhЮw7gWs>VErҰ^u4öHvڔi4q̦Z؇JJ, 0 D@@`4-FXeR(xAml^ rxzʌh#NshZltRv 1Z[wIy__^Xwkowgkr[Wn1eM6˝7C/ ƚa?j8IxAu8{$UH&!VI$JY]@׷zϧ]0԰FddF1+MR-";_t5d # #ӥxu\đcWKgA2sVGg}:C.pW ԔiҰvnpתdݖ%c|>4*wRΚ![H?Wj.s<嵫.o@c]TvҶkuh)fSy އ8 Gx?@G;xtFlWu2 D8wS<-N [' g*X iњ$~-@S<N_9Icڬ0RJC],A V:Lʣ<~"'yQqcZًq"c6ۜdITrZ /3ʁ4FfNh0":2=yXd]`Kx#'оM0>uE&CBr12/ـr=yd؍v!XH L!,\sk M6ha/,k=JXɗc!y[NGC 32gyҭ(f4V㻍bZM2=nިtdH)/z/"]Z/2ǬojpqT."!/%Eŝ:Hٜ"Ε80uQW< >J9率< 6)ajFKG2fzҜP| 4x 5ڒKY,:=R f)quaG:_Hp%eK0ZƏL@9vρHzؘB|~a PB aŲKHW߻+ATMmDU9ՉMù.sbt=O/ҩ>b:tlLsVZA * T)oHL8Njȷx5 :ɠ偝b'sLn ʑ،Y)RXTDQ(~hX"e V.=57UZREՀNOc_éj`1:`&" Ui %*a- ]A*b}7֪a˖Ms\g. JcsJS%/bkbWi<}Js?B;[;}g)_iǃB:gt^-rp?s\u&e^Ac 38U cZH[w&㼇2P7:4k2ڶKpv^4lNin.PXP$lYu1¶77yLMQRѱO9Z\ҝ7 „ͼ@䈾D^ka)ٿٜ0q$,gܾbLDa<\'LGțj޹\شދI>)O{ph~wsE|&A@Z4${ x, x5#&h~.gB QHtFb> jב #< {]^ z#~~|yvT//ˋW<2^eM rU.xĸ}'E+!hYzv .{zt}T,d`1 ( eljMnBs v |Bo>p|pvlֹ!e-__I W[]ݗo߫|2%y3*fS|#=z5kl-"@6ʬx)m-W=oe_楄 &^̵elv!:)>;/[5x&ۦWizK sx4䤆 0G6ٖe]זa2|lglZC!eˑI|NsCpkr[DSn yfP\; |ѿP%r]i~ /To57hP':dQ|ͣŋl@$x/( A=:لd6jW ˌ^?Md/MCcw,k ,⑱dӵ1tRнs_t\iJzy9 T!8Pi]yU跭W[J/,!n}<_ Z3Je b>`Vy-7_R_xK:[g7e|r`eO&BFv$́8@3ĥlӤ? ?R[ϋлE+wUv3_?It#>sw3^kLs1)zgǟ/Dg!\N|;@9$=YzaTN")@x<6I9ys1&\ꅨL9rJ_wOr0˻' @yLVAR@=${ L ;`e~iV3 ߌhER(=d5X%^hѓpvgߟ摾nJ$80^UIs, 5lm&K^љ㮟`@y/q?.LV2N"??y`JoR*Z=xbyTo47AQ1H:Z߷O-\ EJwtFYn ?_vJ~ _Nw: Y3Y؋]/無* +]d & f+{;ݽ->|k_2 `9 PGCQqZco9GB_\^P4M%b.NQ?"n vV^_x:!n$>gSc9zvOH)赫:+qϻX0'G'׸i?\42 $V:'q3&r| ݆Gu@}UThmV X6m tQ='I BBVƶqMͰ,:3J]-ٟR^2H#i6cq6ྮM*9 !f 7l[by(?~j_34S^X]ٚ8+[-m/yUrRhjzc*}%sL6uʊb[ p?D}/LrxF>2כ~I,3S9L7ء!MR9,y\˺ =1CSK@3(}| R}>^qtH8p~Ҡ $כXz1:g]# * x {\AQNl߂XI8W65wUP8yߴr ATLCm%MWO$5)+Brx8e}uA M.g6Z ^q{t/bEhw ?oДrQQI=M?qt8!Gdz:8!i-aw>v$+ $pSϋZEY֏8+F`'VwAg®A/n&Fwd:;pM ·T jLUR:Л(a* h\YJUxlDQ~I@蠐H,"<rP楸|[ݲᑲp̼GP3OlsA⠡=Spf(JOJ kn(bO]_fXehir;VI^7vcP,uUʛS:0_t?OqgD{"váE;2p^.e⌴wir^wz~rebcoP:'Y6'+ԋ^wU aPj"66KtWZ*zWn<`A7oQ]"p}݊T4İ:1u<ѫwIh`,,7jJ H~(sl&!K 72@vq*IGF=kN|[thׯt1t6˩ mۀy]1զ7xjoo}?^8݈$(}f٬!i- 8~w|ƃ7&<90Ѥq??5ѤI#(wb o̷Qx6hVB0 Q S\o+V`Q/#O·xěz$a[@b;$H>a! I).Sn*'ߔ=}Sjũx`,#c0&޶`Ւ ݵ>Ԁ &C̣P2JCl$$A>GO @O9iG)L=J9GON %@1]i/Mu!?r>ہd֝om%Zťbt㪬wfU;K Y/kU%\^88HA Õ Wyw6+pӣuUxZzX\odBgĎ x`M\sfÙEf5V3-Ss)[<-_cVsno'_4\;#ST*gRP L!ctj LO0BCi(Rj 23Q) yn'?c'(E@]mV~;`j>A#x ޲X9;B_ jT|VPً.,!ec@NcS&pei'b@'B|SU7b z:\O zѽ_-rpf_ܺ}^M)+;}{Л;?5%r#w_6$8J(]fY68g)Ed"(o paҕ.Пr6 1XaA3}N3)3Z/MO6zW %l"]EجxD s L{fMQ{oo ^- I?xxz$uP" A͒;ױQF$"V\VtP*ϊl %Ѐ$S<wY<]GlQbQCb-[B3[hڸƠ"`ֶ?fe6hbQ|+-4 ạ{_ӌ:N`d y&rW$n'8~Z(e $/{jrALBD{c+(T8%Jlv]| `i5;ywhuԳ0;JFW :-JO S]EME!עR!.jH9 Eyb)3/4l }';:Bgː…xpYyJa[$9~* /'#p/)`i\ONQ,(Q@E)85"-Ek$:Y<4{;,G8d‹6EDD,Q5x+*=Fd) +;xR ̅RRqbBϨh r>"rlQDլ7cRUY ֬ _ru#/Ek l[A_<LwjuݣN?N8 nCtIE,^-:&2e:(gb ,eO_򛿊_6۰g޺}O u$n5[&%"\7&Q{d-H1+ ðIMA ,sbd`:q55]VZBEN$K^4:6e13F-*nYJlЖLYhe>z.>@ꤰ-g/xfɨ,ͨYϖ 5,kRpDB[U N6}MrR,*pwn 'ٺ}{231H2> f/M-^?E7 67p6]jv hʫ0$B])`οDµ{|j״̽IheÅ4,H3IStY@B /FD:TC@M-#5iMFjzV20 WT8yYxڧH.j(崯XAx6VvX_ HxꨳIy,{@ؖF7ɨpcK Kx_l8uI-? aŋs_ߛ..u'߁{/\2~B> BoN}p3u0̢;a?w+yMOx^sC#A[APA' t0dtTC~!?@ByQ;Uq s NhN"'j桵 CP }$7`keyرX ̫oXM8F@sM^eFGn9xQ{{L _u_\. aDv 值uC~.Ju*gYpӱ~eS{ijwrۭ?uO@z~#]냫J[JlgP;']jG~&ڊ',rPY3}+pc&)5݋)s*徫 464v)WΌjأ|6i>TTTE٬J|VKi zK`/ҠYᲩW dPRҗE'T_N{\-tHW  4:4gT GFj%YW1k"/_#LU8t[ܹ]k8sRJ eKZZ2蛶j}a#FCL`t &>|B#,}-]0HXL_ya ?w::A:q >L,{)Tԧa"'faJ>l2>(KEq^WLK5ܶz_Wrkd = Fǀr'/&lp~Jpej;Hg]P}~9LtS"hbR@3E tm?dk7)Մ ǵ{ްWZ\!-]6j"i>|1|9m+=,*qn$Of8wPR&l蹏p{:d_ė:1͙|\)0o ְ6Lhm>Z!S2aq뜊Y9iȅn,-kPY;\U[8N̽믱$kZ]Z4.3v=MHv-j[3?L=fhʾ@Gsoߌspba2+ׅ(1٢GȿL/&ݦ:=zT_oc)e4(b'Ky2\+_ab0ʇ͕ZTzn_lYK_(99W4|u ɝ%m}"6\KpWQe!p^]sJR-G-#ZxAHnwnKFQ7OOEnOuW|$C _U6tH\oFb+H>d\zԲD]Q\tj0t4ާs-=HsB"\Ima ::xg70Mh:u#_-TQ\u1ߟs ,T'na2XU5[O?r?گj;n$^c7zȟ   ۆnw$v{GBWUmM/̮n@JjyI"΃Kg LG. //q~~HFv=8?u i'"_o8340P\ԂBYg1e-wZĂXϱj^ _m7_!ޔ/( `YTa͊5˲4g@?N&(fujŏqߖyrVIFQ+/:v>::R1K?8x +˼BnGFURJXǫxq•S8NR!Qsk ߏW)*#(15V%1uŎ@H} 102ҩ?[ .d$,GV45fQA'Γ %$"uo>(}ؤ~? QXDMhE[?rt.C9zA29G: C>K Fvod :^j-Kę7qg(xL4E4_YtA YAq@?/g# [5R×Q*ݗXnc/:Q ܬ8_1;d53NEGL,O!9̊^8ٶ\ꢨ?N)a rM"sd CճIW'&6*Yp'ZZɽRj6x!i6iqB!TC<\hQk@"~L>d7 ՔjcS0>,V,ΞrP( DŽ"Pd^Dg v{=n67{u5/]oIS%xrnUִ(zvvRh :ۚ'8@rwUYD"2򎌈 i+@:H+^8̇ |,rvŇ?[+M gShR qnd+!Y{J849&v _T~*pEp@Te¹*bZ28VX[B=k@00ZЂR×4L#PM01<1_mOk-i nj]a>j$ ߼]h'b<r$hy(;C/dГ.ZBUD+YeGzI2-^4qsU N*zo{ч8EPM~t H-߷|+'ȵ߆F, ŋQKz=DҀUco旑Sy^Bip.Ǩg[, d.168v{bWMR`AT& T_LjWQtz-"䁎y jE i07$5k,r1ps? wQ47'-fȒ;ب̐LB`]>ޙ!!JH̊'\>)b7n-F|f4YYV u&$>r ]oZνYsC7'J$WRaIP>@3a\Πiyiwz<-e^Zr7V*I'mNBΡs8Z6xSAZVTTs*yd^.5LИ@b>]IIrA{0>ŦPv~;8tk;pl_hOurP`'I1#_tLدLEn(d OFUcb)#¯ 4KIY G<(yꇁGFةU-0A.dYV̲d;; #O})"/ehG[˯kPy UV]SnKfTz(}yw|:<Y#!_N/O#g<o7]YC_r hzz\ޕ|:p/ f C zMl[Q ^i!*ócija^`5>G@O`8-dYPIjwxdݗ NvdB= z'_"4χc|O|6<&r?oQb#9'`(́P5$rDCCK3@DW;Tr߁-Ow({33$á^Tv:i `!0(S#yV/B'?''"Anj,}q4(o o3J>Q6V^!ك^ Ї)Ncy,J`N4W|*JO8NXLow>uoyPR`8!S NxZI\&A{r[8b@L.C7G3?/9OYNCa s2* KMc]13ly {(Tـ߳ 'MbC{P@я0}I  ȍ;; џ76  ˓s윞 yZ<|";jQy?u~,gi^Susi2oU .s4˹_/? oDFl8k,:\"b Tp(~"IKAqv$2$X8{˸t?i^ hgXFC?3*8<&֮܇2YhtZ}$SҋkmD7jA?6rN =zcl#4EZȍPWRLL*S|UhwpwZPW+,W(%t("R+ |)YކSX e}Տ}dS8*<T7W w0B0`|,*Zz<o7r> 0S$nzHnaߑ_Ixlǭ-?9C^g8=GB֕e3}5E7.b2Mb]Ta0q-+3o8Gj~էax׭^?oz~wk'$j|ab-+oJQM}ɰZL>}9 5\/W`Húm`2YmwQچ#cwR7P֍H,YSSǚ8Z+R6Y*2RV[7Ua4y ^M7KIwTpB)**JAP4 hF8HwO .\^.A+㇀a$ 1 l -ZHu~E ؍ @s4N;f;5JglT`_4 IPid7"(rY2`E?n_{bgz͵HCHvJJW scW^ 2qUR8'E{J_n kK`XOGy֢gQMf(6*$|"T4,~ŠJR:詍C"BHq#/D[ALW*( M7$yHn)ƀА󋴾 ׊ {̼t7Um<o|\dHg7qY++H95Tk DW/`kFvOŃ4Gdh*W..u1 fI]hl~ܩhGX待7hpQίA]T#Lc {%VLmP& &KZӌ'q% 's]Z[4jY1F9އB8D¦&&ʫW9SG(=V:1Fq'y(rR)*+V2Zi:VJ4ٍ-)Wqr$7\XCX6&HE rT};!AgLddQ\H`<|!H ʲ_ *שb?=(&%?i vw q8s:_E("V ly.)VaNz,~6nX@q-njK[Y3z_D_@geE qMy97'%Ped%?5*v;nB * 0wOV›~m0"@Qp_F|GC7INeGCfw$>roC5:mW~oYzY(uM߿ M3;Ҋ&!R `½ѩN꽶:e%RC2']ܽre*}#уm9Wj&:ˉ.& kMq{q֤&x#"2B5F\bߦ8j\|i(R<}aSNLrT fۀp\׽d:R87Hw5nLM7%L'M gvF'G3_F;ÑZՔ4Ȼe;9+k}Is-ǝ߿0ʔUⒾ,Qݨ赾O)+@-]}}u^DD,tq4 =z7؇= ̖BH=J}?0?/o "xb1@όĎRڣԓvS?}e[|SAO1H90}){Z1'VxiUryvљ#"qS"T^7İG$5P]̋ w6:aBm: ]\]o"Rk ?c_n86KѭyVv`6)"BMV[2 's:.kEαQ"Ugq䣅(tگRhHZTnL;)()Qz)4ិk㛪H7JbNR f̏)3+o[ȶeJ /p)YJW9K9d) XT3nYW&Kgt}:ޖ |8z5V sb5 2ZYo҇dQ-L|lPEo\֌Xw =X)Yn]p\[J q9^Mu 0[[8zkuRTWq,s1"-tSۛhv{&l>|gDC^kCj񍤾5>Uny=HAc^4F)̣gQ]F@^kT +;0YCjrh1quX_gy8\_%]! @E]Qc}aWT(*6(fF-S~ []]̗=OZoS;DWQ-"W/ގY\0<×^7ǑZDABʂB,wz)Џ+?oyF^t^8& @ϫ."G//2/IHµC޳܋d3ry?gWXk C7m]iQ9K 8mX^ G Iw_O8}૟ԭ&kw:Nͧ(ψPa_A2a+̉IMyY)~edVW-P$u rM,'Rnn)+}E׭'<#1,$bfH0 lOhN&9bGiy#b?6vfH$38^Z;WV.\l1 c'2?dKݛoOEXj Z`d}ΫOp.|~j{^n:+pbEֻ+ZrJFa6;t%INF8u'ʋ.2$HQA[G ;6x|6(@Л0 y6y#(_ݵjE$(ՓtnBKI>FdJR4zxEZg8K375.]h~AjksUE. .7dBϓկI>*)g- 'ϏĐw!sHgC%*jKJh:,+ŃuL]NZՋff+U(RiąPyw\Oy}vkmvosQ4*nNqi~ޝ x̕"ϝ rn@圌8mL -por~3sooAww~Co.X{چ22gJ'4̝,>okA"-f:>ǯu,^ޜv`j22Ϟ;#R,GĂ`WKu8D:ZZ}l֕2RᒷHؔa )})Ԓoo=?~}l>x<`V7@vF;v&/`Z01a^YZS:nXmbxTR5pJ :"C\2͑ǮLCߡC7E>|O;.fhgt~1v:hdgj%vEpp&`ހw!p1}Kt>]RGx4jDb:OÝ#ڡ.|85YQ?@GH=@tM#28=tb>}ݝCߟ ?"e=sUUst-!E!UUw7z%2~w޺OS/'a='Do; D#\( C8ǃ]=8aptPyU@'O@IW~ ;鑣ӓ^ɴÓ`Ϩ߀<=Ft. POʱK0KwfWq)!@i@vb]K%Ml!lTT"dAXÿ;}pU9Epq9D"l?P˜H_F $Eq6˧ Pꃝ(?dN@X&-Ʈ 5Xb@Fy)ݬ̼KfsTWY7eC.ʕ+᷎&Aޡ3һ8d0fu#"ꭀ"W V[v`q`(IۂR&,($F ϣL;x$i[w2֕-kb{,_o;}^N[=z%ӏ/ sŊә&ziDM1ԗU ]c$S`nt#]9xQ"% 2OIofNL #=(B'uȋ J ]Ӏ F?Ea's i&B S<6 `Dł}W^$Q_7r.CbTbJK g*vgeK\'o,vy(ĝ;>"tInx]4AIۭNOz:iP9~: *:ܕ fevs1,n Ynv%-Ղ 3r36  vx\]h s&woT Ab@rNȼD }sAh ^H jm)vLf %6]1`2 eXbr,\1,2FJA8(:^էoΓ<k54/֫bt0d:G ؙC F!韤$M3Q 02Σ"O'ݠ%WlP]Q`1$q O ;Ji1=dCDw6dxL![4#m7xBwG7`;fc"`FB?KɤvR|kٯmcvמi׭ ^-cFФgurQmL6.7k-}Ny/X3)WS;U:|&}L`.~#ܥ8yD."S*r Ѕޫut0r|ב|ne.Ȳ9e3<)2B4J=24KϪK2JHVx%Y'B(6bC#+ʕeR% y!J'ZJ2+>}Z,l9bVG$}JY&,<)*|.Uf],oi|hgOO< *\ђ+f? ?=/8sCV9 $7'GLSoAt;mT kdA4^:p3ʋ6݃1W(V"p>S'xN]HDPC* }vnmYw 5NϜ5oau1+@w v>rՑɨn,q~Z_g׀Jxy0Al="-P3AnO +,L7]A/LdvEe,s(qvN΃@Bk߽DMH.Q$ ac*Y :>5nrfXO?lOӢ*>^C}_$]KJ =\P*)ܻv:lߤ[u1SG|>!_H6]Fz!-kvl/1D>p@6#;GzU a%@s_\|h}k˷M{\ <*EoHCHv퉉! 8t7\W!(kdO[>cVkommuvﷺ!(%v1u\TTtB1VOSqݎyjK03WA=Q޵m$+} 6Nٲ1Bݫ4YI( Zd^$R%)'97CV/"}TW :_V;0`g]֠#v7<D:Du)y=m"ˡBZH(ni` m7>œ(hː!S)Xf%17>&7(\s]Hg3\̱'i*oO|NG*.X?;\dz(/K;J=Kf_lP,{yLOU'v-.ƬQ^q1^]L9eSYeΣN y F *HMޒbh/l/mK#WD?1ߧ?{F;ώyg?M `ZhCZ an;!B2BQZ䩉)xcTRVZ3sξ*(o>oNZX2{HsCՒo}wqeyg $p.MQ_;E-Z/wY>ZX32Z01b=2WE~@vg?MmF0{`v-Vnod7Ê|{x|.kYaNB 7zaxoc|ҕnCiT^y$z{ "]MZ4lLaSI+%s7z"ƦFS[ ="lw)+¼1{nkǛ<ѯvYs6&@i" |Gȍr-+ D)ޠn0PMȃRz& ߩžlA!1#lHZ7lmU,Ǫ-ݭǽ]*zzr'8eE4[8/J&fr ]yw2TP(Sve̹p~YEZz{<~QSx'DU\n4 FW2$jKER0<;~?9S//[SxvpgA'?Hi=;Ghq&;1Omo_ .<>~ ;~ Ыvy 䢝wt|]#H^ &D,&7$b\DH'x"Ї#UxCx3<|$mT>,} .jUǯҏx_A:,_i/քpK߯Kȋ?ԓSFT`= K%54؎sp'ؔ{a\nn_4"| XEL])m~QPHd7:l4e4ZnT2ʲz`|w*PU 2kgl4u]~ܼ:bdę\D'm)8 `[ߗ [M#[.Γ֚צfZVhCL{pxĠ0nqmG懽N.*PP~ɞf_|4s/@ fkj>Ip$ChoPz.y, z%m* )6)?o] t-"s\w>2E}wtb%)u:s&iX|{65$ Ux:?n KD,dO"m]uނi9:~&q!Vd3_y@aCiɇlq@=9mUCNmٿEx1.3uu&\aŘQG !J+ej𨖄!8[`QUXhg n@ֆDqf!H7nŀ}KdޗX(6<uѹJ\VnL sI7e%1m|,/<-^!I]O}d(j Wrq\։C20JGg5Vħh|G4K54'~&b#ػ5aնUEs4дq:Byrܲ# ̕ ֫K%=â<UPT#]h(+CLoA.}]a.l/RSTz@A@~v> H<=9S%s(,nق]H՞.H k2SOS_:77,ZځAzF+XD[\Vui~\Kr9$MnRD.:|e&~ _3e'Rf(JЀeuI-3(;mRTW7LF+h7.']qvο~*~bzn3)qM:˖ҽk@}xVU,[*v4bZ6xmF1x޲vN+L!n#pOe)*Ćʷ=TI]m?LN^% SM6%Mh6~d}KT"fU.,C/+5^]G_058c~ENZ2%}M5_ :du"ci+Rm.D= "Di\w2MQX0?Ů87|xw iQ/7糯F#/˩9BッlIQx2щ_".F=|ɺa qtqf |[+]Z0WǞē 5|a"2P&1TM \RMޢ]5+a1q>b= ='4pbI/Wɟ&LX'Jh]WQZb剷aJdpoA0U6 ߋD#N&Y"m1tN\8!$S87;~b`^  <ʜ7 %:͉ڝ-nxAO M$_l]sj]"lnFƞG:*Ѱii@ c!ρxQia#=rH QoJ [x<;;uiގ7Grv i$jd nNH*V?2-{E6RWCXN"m$/x3qyL$TKLn#d}OI[]mK*]cxPw+h[QWt+Ld`E-:Œ|m 8U d,?K驡N1wn$Gyu$0&TtǾold_contrib//pico9.tgz 664 0 0 22462 11411736550 13407ustar00pietrosys3ѧG=z۶+=GK|oK;iv8MSGZ"UӸ>>>Ai{V`0 гVW!ΖB2Zkgkmg)Zk}/\'|FQl_ZCύàn^G}8}7 {ksCFkӺs5  E uJ$PF7.])pԷb/S@䈯D7 V'ZcDޱ"P+zN% 2bB;nd^JX#^ãDžQ aX|N{ 2#ҋ8«0EY4 ]] bcv"/vۢx<^;"6v0fc3P6B?EckX"7U c @Cc>$nC$$Y2 5"K/DhAu!BM\\; d)@+N=6`>_ѕC7v ͞F͎5GԋL cN]N @x4D. !jjL;<׷]1z4`ʘ:phJ}; +1Z(D&% "pJ&B.Wf^0Za! gcµB b= [@9++PBFA%ѷua9Ȥri]6RjF-} `]fcHrhX։ůduHA|K[XmKԗ4qH Qq/oF}%N]mo#lDG H)[0Ɖt$(.CA `I0`<e('b*ƢwA05\:%- ]ώA1r0~:sEcP`A.~Kz8@ ApEPɐ{` ƬQ(!^!B+8*HCy!~3)fP[Xc!jn:Il Fp#a]TPrhO) qt}*2AVq~<% k8OU5u7Rhnc!5 =i: lF:=,0[ `P+5$gGjpXzCayS pI@*I|X[/gƹD4r 8w2PVwkP8iq2HI4K]"nA5PЁ*׆!`]G|z6-`_-Nk-Q M~ۃoo9q_C#(eGӶm øtEQ ^ܴ(=khd^+dzgqOVġ4(8TTH=O rЇGϽƂѠx6.F玑-,6b`ܺ ;+Z Lk_;D_ndOZ F/1悘ǽ{63Z~kf D:$tAĚvc,^.ne / &} i,)XF jZ#YP()X6Q4*E F)Gq(#VC 6kL@1%Íu1BfL L9k[1NNIÞF0Q _XNȑ2v^ 5LCĠ|9W$`=)NN8kx)"@b.0b' R(kM rR^ȷI0jaCρ0\kkPϬ˾ )|5x·Y 5k~|^sxz?@mo5q|FZ_E>r㼶b߹>7u]Ixj>7|?r\7Z׾ױ)/H'ظN%-4[, piK-S:s\lZ_Uq)bx9UiX'¢#N~QW;Qxnp U|)Ʋ")`SR>&JVLGhHW]?mU._Ke-0 .UCͦ+]#$=1__jIMLlFŒC07c4r^_fT"'dFQ)ȸ IczSBKV&,L:MJ> da_>~#Ȥ>;=>~ ;[B\h\÷,@ ) @ @)[J֔l `PNR.R_@2a):ڝ)Gm+I7},"Uz'UסpkٰC" Dt <КaZVڷ"˞߮l(Ӫ/ɋӜs߾|*B^QQc,Q^YM|{ ԙ_8;(ѰzJC1p[a23<%\U Fb6%Ζ~*,A؆hIԿ҇/3yp]F}I0NWEV>)e5VIu<=|CNÎ33r%p4_ (#D jBzIx, MtREméx@NT9ѥ> ++++$DS)%*sZgI[r-wL»lmHM)RxDcF@C<͒2шUjКx$`m&0ihք]ܹ6m>ykIjn@|nz.NGq(JTX]}5T1a )3d"tNqb 3ȣt9CYV .0y8FkrH>Hʠ,c/rA&iZ Z,"R>V51E~̯,SHVc~u9M#^&ic~p #@RrzQ{ʼEQ8XlC4+\wF./03ulj+e d"A6W͙lZms6"s "b-܄ZOCUcu^ fHKd<z~3 jL*`FLappiO`pMY{_xZ^fzsgt{Vm:XGkRX[ H"Yd$T\0kV26à2J7Q 5vDRS6ݕK!sd}GCp=LCI+ ҍ5)۠!:kuu@54O%FE\LF'1?=Tvh`0[6`}|xwXR>5ߦFqT@FzO錌'(E ioa#gE K2=*uiN(hRDVJfDn8U0x &+(,\τj$S9 DҴU({ 81Dyq3/kr Łc ձ&:f>ag4K\ghBhh!{Q4*!LU gAC$߿n3mT$1Y.$cn7|E*C!_+UIFG!TT<]C)keiϭ`~҃Da𢨛ە`Ţo%dAXVA^՟@ُcj5ݫ8m?lj5oPG"kڙDj&Z)ADj5jꄥo:͉OĮߞ>s3sdZ_GVC 4Oi_KҦ5MI@'Yo۠ϖqCSGUP5Z%qlEk!s(N)3SI8-aa3#ts*2JkLx׊ Ϋ\>L](@QRLdKRDpKo_bGq*X`,<avsΉj+Z ;kw>f{3!7xT 3)w Ǹ kw6cUIh䁑ZEibȍ9Zn$:^RF+U 3tчt5Da !-'5Q2#h6JN.u ࿏E*釘\),l}\"? }VQD("*٦]e ۗ'BFdw)iza (бeFг]w x)8EҮkAqfk,񼕳ȬEhWNSv*TJ¤ka8t=j;ז\|LTKM73;@@[O6OXzك!Mp6xħV]e}yGW$液&OϫF0gFVğGBgmh1S|f `~;u#iFdbNǾ=;>[Ḫѹ~*h?`R=YyMwWbQGn/j~r^#;!\b\%/BÜ=^X\C %{!(&< ,6HEKbee%kzY=c@ tHլ{j\Ov LuZ pJn5ZWD4TP⾐R^Wl*nq%uW.EQ [Ԯ o$ЂZ{qh RZb8z,-/&&"KP!p%Fq U_4L>D$Ɖ*!>oFdx3I:‚Gz%q=s&T IyȈ3 )DY+Od(Iybޝ^:.#ϕ6#z(~VAl ڭuַdffHj ](%0"KXRugŸTR_d`E[BnW<_W.8V-m"k9e/zDȗ#!-%g lXTI]d#!7+)u4֖#=ݾϏ.'oq).U<8lS>LMA.b3Y'd\5es?k[6v\ͧ}GPqQ}WeƺAo~IK]8n(+2]4@m\ip>1ulf2Kx*Q. s~4y:|W~F-( ONʃg/r5|7@<[Ű.uMxxSx{r95 B› 2]l m=89F> ps h]ŦǶgzq>+Uj:mICQI\n6(]t^eR2%Q0q`t1lB&SvZ_pL$/h}}ox;O`bF+ڵ+]&'SRftF Nl;v. ߮]fbOM\~wPкo7_XH˜XKeC.,YDd٫AilerRzT`^:3P2gg2܃D>'t5ed瘁2-4JH>b|E`S鄐;ko[k[6fr;.-=LN|X<9hU M>o5]q^x@'VO^CaX&̊F6aW*9y-tfignq )΢*4'Ɣ,,VCJHj,Yb@U'un s)թd/Y)u ,@"t/WBm![1X3A7VYp#s'xŞϿZÿ.%︰KuV5 Z!ܮ]Xh; [[ с9^|ϙICh[0BL\RBl6baW"ڈK1$#=1Xs$5cWӺH|, OȔ}RS@M܄&1$)8X9WPĕ^r2.]RT/C.A9Ybyꂝ)缉D UkyTjb.7E~''Vr>‹lw92e%reʭl6V>n`%siU|>(fQX!,3u 4o_m)g:譵9S' ų3kPۓ>*JFq&}D2=VOuZflaI麘%cPWh׷&8zy7.[GJw7!߀,7Jh,+d&uռkMz!تTW LtK`&A!؞ WD_+;/{eb[(;|ud=|Xwrj}Xȑ&G 0}GBƝ}mrNSpVx J j5;/h 3u %"+ !m"sqv3;u? X۞#/L_'u?˄ :?c5y#8S׻5uYR ΍Ǿ.yk[պ?sdWq4~4$r+wJ{Tm+_| aLt/g=9V"uѭn5j-6r#a_+Ntq$ϼ7*HU<3#yٓ Lп@r$gl"}:-?ǟN?Sf\^„#)U5"K 0z[Dau.xy+M$'` L = kNLwFw3w3Bo( ǀY0h@u3ƌe2ԙ7뷲dK+s{եQߩ=[Ko\"pKm% s=E}_Aߝ s?AݏV?2-{E6RWCXN"m$/x3qyL$TKLn#d}OI[]mK*]cxPw+h[QWt+Ld`E-:Œ|m 8U d,?K驡N1wn$Gyu$0&TtǾold_contrib//replica/ 775 0 0 0 11411737622 132305ustar00pietrosysold_contrib//replica/12/ 764 0 0 0 11411743100 134345ustar00pietrosysold_contrib//replica/12/db 664 0 0 173 10737724702 13750ustar00pietrosysrc - 20000000775 sys sys 1198930205 0 rc/bin - 20000000775 sys sys 1199413120 0 rc/bin/12 - 775 pietro sys 1199548352 1305 old_contrib//replica/12/dep 664 0 0 0 10737315066 14057ustar00pietrosysold_contrib//replica/12/inf 664 0 0 64 10737315126 14112ustar00pietrosysshow time in 12-hour format; use -h option for help old_contrib//replica/12/log 664 0 0 342 10737724702 14142ustar00pietrosys1199413849 0 a rc - 20000000775 sys sys 1198930205 0 1199413849 1 a rc/bin - 20000000775 sys sys 1199413120 0 1199413849 2 a rc/bin/12 - 775 pietro sys 1199413120 1101 1199548866 0 c rc/bin/12 - 775 pietro sys 1199548352 1305 old_contrib//replica/limbo/ 775 0 0 0 11411737623 143335ustar00pietrosysold_contrib//replica/limbo/db 664 0 0 113030 10745531410 14674ustar00pietrosys386 - 20000000775 sys sys 1199928685 0 386/bin - 20000000775 sys sys 1201054104 0 386/bin/limbo - 775 pietro sys 1201054104 444649 sys - 20000000775 sys sys 1199654703 0 sys/man - 20000000775 sys sys 1200170274 0 sys/man/1 - 20000000775 sys sys 1201058290 0 sys/man/1/limbo - 664 pietro sys 1201058542 3907 sys/src - 20000000775 sys sys 1200954977 0 sys/src/cmd - 20000000775 sys sys 1201053197 0 sys/src/cmd/limbo - 20000000775 pietro sys 1201053330 0 sys/src/cmd/limbo/README - 664 pietro pietro 1201053080 835 sys/src/cmd/limbo/include - 20000000775 pietro pietro 1201053316 0 sys/src/cmd/limbo/include/NOTICE - 664 pietro sys 1170424782 1299 sys/src/cmd/limbo/include/a.out.h - 664 pietro sys 1065515760 36 sys/src/cmd/limbo/include/cursor.h - 664 pietro sys 1063895796 302 sys/src/cmd/limbo/include/draw.h - 664 pietro pietro 1168609276 16752 sys/src/cmd/limbo/include/drawif.h - 664 pietro sys 1063895796 527 sys/src/cmd/limbo/include/dynld.h - 664 pietro sys 1083578135 1222 sys/src/cmd/limbo/include/fcall.h - 664 pietro pietro 1172591480 3215 sys/src/cmd/limbo/include/flate.h - 664 pietro sys 1136840410 1187 sys/src/cmd/limbo/include/freetype - 20000000775 pietro sys 1201053315 0 sys/src/cmd/limbo/include/freetype.h - 664 pietro sys 1063895796 1048 sys/src/cmd/limbo/include/freetype/cache - 20000000775 pietro sys 1201053311 0 sys/src/cmd/limbo/include/freetype/cache/ftccache.h - 664 pietro sys 1042133334 11687 sys/src/cmd/limbo/include/freetype/cache/ftccmap.h - 664 pietro sys 1042133334 12278 sys/src/cmd/limbo/include/freetype/cache/ftcglyph.h - 664 pietro sys 1042133334 8287 sys/src/cmd/limbo/include/freetype/cache/ftcimage.h - 664 pietro sys 1042133334 17151 sys/src/cmd/limbo/include/freetype/cache/ftcmanag.h - 664 pietro sys 1042133334 12407 sys/src/cmd/limbo/include/freetype/cache/ftcsbits.h - 664 pietro sys 1042133334 16799 sys/src/cmd/limbo/include/freetype/cache/ftlru.h - 664 pietro sys 1042133334 8210 sys/src/cmd/limbo/include/freetype/config - 20000000775 pietro sys 1201053311 0 sys/src/cmd/limbo/include/freetype/config/ftconfig.h - 664 pietro sys 1063812631 12158 sys/src/cmd/limbo/include/freetype/config/ftconfig.h.orig - 664 pietro sys 1063812619 12134 sys/src/cmd/limbo/include/freetype/config/ftheader.h - 664 pietro sys 1042133335 32235 sys/src/cmd/limbo/include/freetype/config/ftmodule.h - 664 pietro sys 1042133335 655 sys/src/cmd/limbo/include/freetype/config/ftmodule.h.orig - 664 pietro sys 1042133335 639 sys/src/cmd/limbo/include/freetype/config/ftoption.h - 664 pietro sys 1042133335 30106 sys/src/cmd/limbo/include/freetype/config/ftstdlib.h - 664 pietro sys 1044439696 6507 sys/src/cmd/limbo/include/freetype/config/ftstdlib.h.orig - 664 pietro sys 1042133335 6318 sys/src/cmd/limbo/include/freetype/freetype.h - 664 pietro sys 1091610813 185816 sys/src/cmd/limbo/include/freetype/ft2build.h - 664 pietro sys 1091610863 2230 sys/src/cmd/limbo/include/freetype/ftbbox.h - 664 pietro sys 1042133335 4350 sys/src/cmd/limbo/include/freetype/ftbdf.h - 664 pietro sys 1042133335 3435 sys/src/cmd/limbo/include/freetype/ftcache.h - 664 pietro sys 1042133335 26385 sys/src/cmd/limbo/include/freetype/ftchapters.h - 664 pietro sys 1042133335 4920 sys/src/cmd/limbo/include/freetype/fterrdef.h - 664 pietro sys 1042133335 11259 sys/src/cmd/limbo/include/freetype/fterrors.h - 664 pietro sys 1042133335 9753 sys/src/cmd/limbo/include/freetype/ftglyph.h - 664 pietro sys 1042133335 32947 sys/src/cmd/limbo/include/freetype/ftgzip.h - 664 pietro sys 1042133335 3984 sys/src/cmd/limbo/include/freetype/ftimage.h - 664 pietro sys 1042133336 77792 sys/src/cmd/limbo/include/freetype/ftincrem.h - 664 pietro sys 1042133336 9313 sys/src/cmd/limbo/include/freetype/ftlist.h - 664 pietro sys 1042133336 16331 sys/src/cmd/limbo/include/freetype/ftmac.h - 664 pietro sys 1042133336 7561 sys/src/cmd/limbo/include/freetype/ftmm.h - 664 pietro sys 1042133336 11368 sys/src/cmd/limbo/include/freetype/ftmoderr.h - 664 pietro sys 1042133336 7094 sys/src/cmd/limbo/include/freetype/ftmodule.h - 664 pietro sys 1042133336 17767 sys/src/cmd/limbo/include/freetype/ftoutln.h - 664 pietro sys 1042133336 25817 sys/src/cmd/limbo/include/freetype/ftpfr.h - 664 pietro sys 1042133336 5898 sys/src/cmd/limbo/include/freetype/ftrender.h - 664 pietro sys 1042133336 10957 sys/src/cmd/limbo/include/freetype/ftsizes.h - 664 pietro sys 1042133336 9206 sys/src/cmd/limbo/include/freetype/ftsnames.h - 664 pietro sys 1042133336 9584 sys/src/cmd/limbo/include/freetype/ftstroker.h - 664 pietro sys 1042133336 3599 sys/src/cmd/limbo/include/freetype/ftsynth.h - 664 pietro sys 1042133336 2998 sys/src/cmd/limbo/include/freetype/ftsysio.h - 664 pietro sys 1042133336 5606 sys/src/cmd/limbo/include/freetype/ftsysmem.h - 664 pietro sys 1042133336 6320 sys/src/cmd/limbo/include/freetype/ftsystem.h - 664 pietro sys 1042133336 18152 sys/src/cmd/limbo/include/freetype/fttrigon.h - 664 pietro sys 1042133336 19810 sys/src/cmd/limbo/include/freetype/fttypes.h - 664 pietro sys 1042133337 33056 sys/src/cmd/limbo/include/freetype/ftxf86.h - 664 pietro sys 1042133337 2885 sys/src/cmd/limbo/include/freetype/internal - 20000000775 pietro sys 1201053315 0 sys/src/cmd/limbo/include/freetype/internal/autohint.h - 664 pietro sys 1042133337 12604 sys/src/cmd/limbo/include/freetype/internal/bdftypes.h - 664 pietro sys 1042133337 1487 sys/src/cmd/limbo/include/freetype/internal/cfftypes.h - 664 pietro sys 1042133337 7947 sys/src/cmd/limbo/include/freetype/internal/fnttypes.h - 664 pietro sys 1042133337 3858 sys/src/cmd/limbo/include/freetype/internal/ftcalc.h - 664 pietro sys 1042133337 3548 sys/src/cmd/limbo/include/freetype/internal/ftcore.h - 664 pietro sys 1042133337 5806 sys/src/cmd/limbo/include/freetype/internal/ftdebug.h - 664 pietro sys 1042133337 7843 sys/src/cmd/limbo/include/freetype/internal/ftdriver.h - 664 pietro sys 1042133337 9452 sys/src/cmd/limbo/include/freetype/internal/ftexcept.h - 664 pietro sys 1042133337 2045 sys/src/cmd/limbo/include/freetype/internal/ftgloadr.h - 664 pietro sys 1042133337 5422 sys/src/cmd/limbo/include/freetype/internal/fthash.h - 664 pietro sys 1042133337 14456 sys/src/cmd/limbo/include/freetype/internal/ftmemory.h - 664 pietro sys 1042133337 15011 sys/src/cmd/limbo/include/freetype/internal/ftobject.h - 664 pietro sys 1042133337 13765 sys/src/cmd/limbo/include/freetype/internal/ftobjs.h - 664 pietro sys 1042133337 40390 sys/src/cmd/limbo/include/freetype/internal/ftstream.h - 664 pietro sys 1042133337 21445 sys/src/cmd/limbo/include/freetype/internal/fttrace.h - 664 pietro sys 1042133338 4107 sys/src/cmd/limbo/include/freetype/internal/internal.h - 664 pietro sys 1042133338 3536 sys/src/cmd/limbo/include/freetype/internal/pcftypes.h - 664 pietro sys 1042133338 1555 sys/src/cmd/limbo/include/freetype/internal/pfr.h - 664 pietro sys 1042133338 1211 sys/src/cmd/limbo/include/freetype/internal/psaux.h - 664 pietro sys 1042133338 29895 sys/src/cmd/limbo/include/freetype/internal/pshints.h - 664 pietro sys 1042133338 39422 sys/src/cmd/limbo/include/freetype/internal/psnames.h - 664 pietro sys 1042133338 13789 sys/src/cmd/limbo/include/freetype/internal/sfnt.h - 664 pietro sys 1042133338 33048 sys/src/cmd/limbo/include/freetype/internal/t1types.h - 664 pietro sys 1042133338 8026 sys/src/cmd/limbo/include/freetype/internal/t42types.h - 664 pietro sys 1042133338 1867 sys/src/cmd/limbo/include/freetype/internal/tttypes.h - 664 pietro sys 1042133338 92331 sys/src/cmd/limbo/include/freetype/t1tables.h - 664 pietro sys 1042133338 14553 sys/src/cmd/limbo/include/freetype/ttnameid.h - 664 pietro sys 1042133338 48454 sys/src/cmd/limbo/include/freetype/tttables.h - 664 pietro sys 1042133338 33210 sys/src/cmd/limbo/include/freetype/tttags.h - 664 pietro sys 1042133338 3372 sys/src/cmd/limbo/include/interp.h - 664 pietro pietro 1146731078 12898 sys/src/cmd/limbo/include/isa.h - 664 pietro sys 1098190249 2773 sys/src/cmd/limbo/include/kern.h - 664 pietro sys 1139493676 17146 sys/src/cmd/limbo/include/kernel.h - 664 pietro sys 1063895796 1730 sys/src/cmd/limbo/include/keyboard.h - 664 pietro sys 1063895796 1176 sys/src/cmd/limbo/include/libsec.h - 664 pietro sys 1124283620 9776 sys/src/cmd/limbo/include/logfs.h - 775 pietro pietro 1063895796 7129 sys/src/cmd/limbo/include/mathi.h - 664 pietro sys 1066647172 2472 sys/src/cmd/limbo/include/memdraw.h - 664 pietro pietro 1065098530 5681 sys/src/cmd/limbo/include/memlayer.h - 664 pietro sys 1063895796 1827 sys/src/cmd/limbo/include/mp.h - 664 pietro pietro 1114713922 4848 sys/src/cmd/limbo/include/nandecc.h - 664 pietro sys 1063895796 292 sys/src/cmd/limbo/include/nandfs.h - 664 pietro sys 1063895796 3606 sys/src/cmd/limbo/include/pool.h - 664 pietro sys 1065098543 1763 sys/src/cmd/limbo/include/pooldefs.h - 664 pietro sys 1063895796 120 sys/src/cmd/limbo/include/prefab.h - 664 pietro sys 1063895796 2962 sys/src/cmd/limbo/include/raise.h - 664 pietro sys 1063895796 1181 sys/src/cmd/limbo/include/rdbg.h - 664 pietro sys 1084212911 385 sys/src/cmd/limbo/include/styx.h - 664 pietro pietro 1063895796 3204 sys/src/cmd/limbo/include/tk.h - 664 pietro pietro 1139921300 21019 sys/src/cmd/limbo/include/trace.h - 664 pietro sys 1096541381 642 sys/src/cmd/limbo/include/version.h - 664 pietro sys 1191369578 44 sys/src/cmd/limbo/include/vm.h - 664 pietro sys 1104761616 210 sys/src/cmd/limbo/libmath - 20000000775 pietro pietro 1201054145 0 sys/src/cmd/limbo/libmath/FPcontrol-Inferno.c - 664 pietro pietro 1201046814 1622 sys/src/cmd/limbo/libmath/FPcontrol-Plan9.c - 664 pietro pietro 1109006081 31 sys/src/cmd/limbo/libmath/NOTICE - 664 pietro sys 1170424782 1658 sys/src/cmd/limbo/libmath/bin - 20000000775 pietro sys 1201053317 0 sys/src/cmd/limbo/libmath/bin/fdlibm-stubs - 664 pietro sys 910822291 1782 sys/src/cmd/limbo/libmath/bin/unif_dtoa - 664 pietro sys 910822291 1221 sys/src/cmd/limbo/libmath/bin/unif_fdlibm - 664 pietro sys 910822291 476 sys/src/cmd/limbo/libmath/blas.c - 664 pietro pietro 1109006081 656 sys/src/cmd/limbo/libmath/dtoa.c - 664 pietro pietro 1109006081 34820 sys/src/cmd/limbo/libmath/fdim.c - 664 pietro sys 1109006082 268 sys/src/cmd/limbo/libmath/fdlibm - 20000000775 pietro sys 1201053319 0 sys/src/cmd/limbo/libmath/fdlibm/e_acos.c - 664 pietro sys 910822291 3243 sys/src/cmd/limbo/libmath/fdlibm/e_acosh.c - 664 pietro sys 910822291 1527 sys/src/cmd/limbo/libmath/fdlibm/e_asin.c - 664 pietro sys 910822291 3454 sys/src/cmd/limbo/libmath/fdlibm/e_atan2.c - 664 pietro sys 910822291 3654 sys/src/cmd/limbo/libmath/fdlibm/e_atanh.c - 664 pietro sys 910822291 1592 sys/src/cmd/limbo/libmath/fdlibm/e_cosh.c - 664 pietro sys 910822291 2297 sys/src/cmd/limbo/libmath/fdlibm/e_exp.c - 664 pietro sys 910822291 4950 sys/src/cmd/limbo/libmath/fdlibm/e_fmod.c - 664 pietro sys 910822291 3378 sys/src/cmd/limbo/libmath/fdlibm/e_hypot.c - 664 pietro sys 910822291 2977 sys/src/cmd/limbo/libmath/fdlibm/e_j0.c - 664 pietro sys 910822291 14409 sys/src/cmd/limbo/libmath/fdlibm/e_j1.c - 664 pietro sys 910822291 14184 sys/src/cmd/limbo/libmath/fdlibm/e_jn.c - 664 pietro sys 910822291 6967 sys/src/cmd/limbo/libmath/fdlibm/e_lgamma_r.c - 664 pietro sys 1007982020 10868 sys/src/cmd/limbo/libmath/fdlibm/e_log.c - 664 pietro sys 910822292 4377 sys/src/cmd/limbo/libmath/fdlibm/e_log10.c - 664 pietro sys 910822292 2663 sys/src/cmd/limbo/libmath/fdlibm/e_pow.c - 664 pietro sys 910822292 9544 sys/src/cmd/limbo/libmath/fdlibm/e_rem_pio2.c - 664 pietro sys 910822292 5139 sys/src/cmd/limbo/libmath/fdlibm/e_remainder.c - 664 pietro sys 910822292 1685 sys/src/cmd/limbo/libmath/fdlibm/e_sinh.c - 664 pietro sys 910822292 2093 sys/src/cmd/limbo/libmath/fdlibm/e_sqrt.c - 664 pietro sys 910822292 14380 sys/src/cmd/limbo/libmath/fdlibm/fdlibm.h - 664 pietro sys 910822292 4744 sys/src/cmd/limbo/libmath/fdlibm/k_cos.c - 664 pietro sys 910822292 2925 sys/src/cmd/limbo/libmath/fdlibm/k_rem_pio2.c - 664 pietro sys 910822292 8207 sys/src/cmd/limbo/libmath/fdlibm/k_sin.c - 664 pietro sys 910822292 2276 sys/src/cmd/limbo/libmath/fdlibm/k_tan.c - 664 pietro sys 910822292 3934 sys/src/cmd/limbo/libmath/fdlibm/readme - 664 pietro sys 910822292 8729 sys/src/cmd/limbo/libmath/fdlibm/s_asinh.c - 664 pietro sys 910822292 1539 sys/src/cmd/limbo/libmath/fdlibm/s_atan.c - 664 pietro sys 910822292 3976 sys/src/cmd/limbo/libmath/fdlibm/s_cbrt.c - 664 pietro sys 910822292 1986 sys/src/cmd/limbo/libmath/fdlibm/s_ceil.c - 664 pietro sys 910822292 1661 sys/src/cmd/limbo/libmath/fdlibm/s_copysign.c - 664 pietro sys 910822292 716 sys/src/cmd/limbo/libmath/fdlibm/s_cos.c - 664 pietro sys 910822292 1955 sys/src/cmd/limbo/libmath/fdlibm/s_erf.c - 664 pietro sys 974126383 11029 sys/src/cmd/limbo/libmath/fdlibm/s_expm1.c - 664 pietro sys 910822292 7234 sys/src/cmd/limbo/libmath/fdlibm/s_fabs.c - 664 pietro sys 910822292 592 sys/src/cmd/limbo/libmath/fdlibm/s_finite.c - 664 pietro sys 910822292 649 sys/src/cmd/limbo/libmath/fdlibm/s_floor.c - 664 pietro sys 910822292 1670 sys/src/cmd/limbo/libmath/fdlibm/s_ilogb.c - 664 pietro sys 910822292 1067 sys/src/cmd/limbo/libmath/fdlibm/s_isnan.c - 664 pietro sys 910822292 707 sys/src/cmd/limbo/libmath/fdlibm/s_log1p.c - 664 pietro sys 910822293 5232 sys/src/cmd/limbo/libmath/fdlibm/s_modf.c - 664 pietro sys 910822293 1733 sys/src/cmd/limbo/libmath/fdlibm/s_nextafter.c - 664 pietro sys 910822293 1962 sys/src/cmd/limbo/libmath/fdlibm/s_rint.c - 664 pietro sys 1008605338 2093 sys/src/cmd/limbo/libmath/fdlibm/s_scalbn.c - 664 pietro sys 910822293 1774 sys/src/cmd/limbo/libmath/fdlibm/s_sin.c - 664 pietro sys 910822293 1946 sys/src/cmd/limbo/libmath/fdlibm/s_tan.c - 664 pietro sys 910822293 1795 sys/src/cmd/limbo/libmath/fdlibm/s_tanh.c - 664 pietro sys 910822293 1887 sys/src/cmd/limbo/libmath/g_fmt.c - 664 pietro sys 1109006082 2323 sys/src/cmd/limbo/libmath/gemm.c - 664 pietro sys 1109006082 3034 sys/src/cmd/limbo/libmath/gfltconv.c - 664 pietro pietro 1109006082 2835 sys/src/cmd/limbo/libmath/lib9.h - 664 pietro pietro 1201046735 33 sys/src/cmd/limbo/libmath/libmath.a - 664 pietro sys 1201054080 225320 sys/src/cmd/limbo/libmath/mkfile - 664 pietro sys 1201050465 947 sys/src/cmd/limbo/libmath/pow10.c - 664 pietro sys 1109006082 83 sys/src/cmd/limbo/libmp - 20000000775 pietro pietro 1201053323 0 sys/src/cmd/limbo/libmp/NOTICE - 664 pietro sys 1170424782 237 sys/src/cmd/limbo/libmp/Plan9-386 - 20000000775 pietro sys 1201054148 0 sys/src/cmd/limbo/libmp/Plan9-386/mkfile - 664 pietro sys 1201051383 267 sys/src/cmd/limbo/libmp/Plan9-386/mpdigdiv.s - 664 pietro sys 1112775196 352 sys/src/cmd/limbo/libmp/Plan9-386/mpvecadd.s - 664 pietro sys 1112775196 906 sys/src/cmd/limbo/libmp/Plan9-386/mpvecdigmuladd.s - 664 pietro sys 1112775196 1063 sys/src/cmd/limbo/libmp/Plan9-386/mpvecdigmulsub.s - 664 pietro sys 1112775196 971 sys/src/cmd/limbo/libmp/Plan9-386/mpvecsub.s - 664 pietro sys 1112775196 767 sys/src/cmd/limbo/libmp/Plan9-amd64 - 20000000775 pietro sys 1201053321 0 sys/src/cmd/limbo/libmp/Plan9-amd64/mkfile - 664 pietro sys 1201052623 267 sys/src/cmd/limbo/libmp/Plan9-amd64/mpdigdiv.s - 664 pietro sys 1112775197 362 sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecadd.s - 664 pietro sys 1112775197 927 sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecdigmuladd.s - 664 pietro sys 1112775197 1083 sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecdigmulsub.s - 664 pietro sys 1112775197 991 sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecsub.s - 664 pietro sys 1112775197 788 sys/src/cmd/limbo/libmp/Plan9-mips - 20000000775 pietro sys 1201053321 0 sys/src/cmd/limbo/libmp/Plan9-mips/mkfile - 664 pietro sys 1201052638 267 sys/src/cmd/limbo/libmp/Plan9-mips/mpdigdiv.s - 664 pietro sys 1112775197 609 sys/src/cmd/limbo/libmp/Plan9-mips/mpvecadd.s - 664 pietro sys 1112775197 1211 sys/src/cmd/limbo/libmp/Plan9-mips/mpvecdigmuladd.s - 664 pietro sys 1112775197 1098 sys/src/cmd/limbo/libmp/Plan9-mips/mpvecdigmulsub.s - 664 pietro sys 1112775197 1226 sys/src/cmd/limbo/libmp/Plan9-mips/mpvecsub.s - 664 pietro sys 1112775197 1209 sys/src/cmd/limbo/libmp/Plan9-power - 20000000775 pietro sys 1201053321 0 sys/src/cmd/limbo/libmp/Plan9-power/mkfile - 664 pietro sys 1201052653 267 sys/src/cmd/limbo/libmp/Plan9-power/mpvecadd.s - 664 pietro sys 1112775199 1233 sys/src/cmd/limbo/libmp/Plan9-power/mpvecdigmuladd.s - 664 pietro sys 1112775199 1105 sys/src/cmd/limbo/libmp/Plan9-power/mpvecdigmulsub.s - 664 pietro sys 1112775199 1300 sys/src/cmd/limbo/libmp/Plan9-power/mpvecsub.s - 664 pietro sys 1112775199 1118 sys/src/cmd/limbo/libmp/bigtest.c - 664 pietro pietro 1112778748 2049 sys/src/cmd/limbo/libmp/libmp.a - 664 pietro pietro 1201054000 83636 sys/src/cmd/limbo/libmp/mkfile - 664 pietro sys 1201051172 803 sys/src/cmd/limbo/libmp/mtest.c - 664 pietro sys 1112775197 845 sys/src/cmd/limbo/libmp/port - 20000000775 pietro sys 1201054148 0 sys/src/cmd/limbo/libmp/port/betomp.c - 664 pietro sys 1112775198 577 sys/src/cmd/limbo/libmp/port/crt.c - 664 pietro sys 1112775198 2050 sys/src/cmd/limbo/libmp/port/crttest.c - 664 pietro sys 1112775198 813 sys/src/cmd/limbo/libmp/port/dat.h - 664 pietro sys 1116435894 367 sys/src/cmd/limbo/libmp/port/letomp.c - 664 pietro sys 1112775198 432 sys/src/cmd/limbo/libmp/port/lib9.h - 664 pietro sys 1201051192 33 sys/src/cmd/limbo/libmp/port/mkfile - 664 pietro sys 1201051370 607 sys/src/cmd/limbo/libmp/port/mpadd.c - 664 pietro sys 1112775198 783 sys/src/cmd/limbo/libmp/port/mpaux.c - 664 pietro sys 1112775198 2650 sys/src/cmd/limbo/libmp/port/mpcmp.c - 664 pietro sys 1112775198 465 sys/src/cmd/limbo/libmp/port/mpdigdiv.c - 664 pietro sys 1112775198 732 sys/src/cmd/limbo/libmp/port/mpdiv.c - 664 pietro sys 1112775198 2423 sys/src/cmd/limbo/libmp/port/mpeuclid.c - 664 pietro sys 1112775198 1293 sys/src/cmd/limbo/libmp/port/mpexp.c - 664 pietro sys 1112775198 1269 sys/src/cmd/limbo/libmp/port/mpextendedgcd.c - 664 pietro sys 1112775198 1739 sys/src/cmd/limbo/libmp/port/mpfactorial.c - 664 pietro sys 1112775199 1367 sys/src/cmd/limbo/libmp/port/mpfmt.c - 664 pietro sys 1112775199 2729 sys/src/cmd/limbo/libmp/port/mpinvert.c - 664 pietro sys 1112775199 394 sys/src/cmd/limbo/libmp/port/mpleft.c - 664 pietro sys 1112775199 906 sys/src/cmd/limbo/libmp/port/mpmod.c - 664 pietro sys 1112775199 247 sys/src/cmd/limbo/libmp/port/mpmul.c - 664 pietro sys 1112775199 3110 sys/src/cmd/limbo/libmp/port/mprand.c - 664 pietro sys 1112775199 584 sys/src/cmd/limbo/libmp/port/mpright.c - 664 pietro sys 1112775199 872 sys/src/cmd/limbo/libmp/port/mpsub.c - 664 pietro sys 1112775199 792 sys/src/cmd/limbo/libmp/port/mptobe.c - 664 pietro sys 1112775199 879 sys/src/cmd/limbo/libmp/port/mptoi.c - 664 pietro sys 1112775199 580 sys/src/cmd/limbo/libmp/port/mptole.c - 664 pietro sys 1112775199 786 sys/src/cmd/limbo/libmp/port/mptoui.c - 664 pietro sys 1112775199 413 sys/src/cmd/limbo/libmp/port/mptouv.c - 664 pietro sys 1141647793 718 sys/src/cmd/limbo/libmp/port/mptov.c - 664 pietro sys 1116435938 978 sys/src/cmd/limbo/libmp/port/mpvecadd.c - 664 pietro sys 1112775199 519 sys/src/cmd/limbo/libmp/port/mpveccmp.c - 664 pietro sys 1112775199 378 sys/src/cmd/limbo/libmp/port/mpvecdigmuladd.c - 664 pietro sys 1112775199 1582 sys/src/cmd/limbo/libmp/port/mpvecsub.c - 664 pietro sys 1112775199 523 sys/src/cmd/limbo/libmp/port/os.h - 664 pietro sys 1114159391 72 sys/src/cmd/limbo/libmp/port/reduce-nt - 664 pietro sys 1116437577 87 sys/src/cmd/limbo/libmp/port/reduce-rc - 664 pietro sys 1112787028 306 sys/src/cmd/limbo/libmp/port/reduce-sh - 664 pietro sys 1140986970 184 sys/src/cmd/limbo/libmp/port/strtomp.c - 664 pietro sys 1112775199 3003 sys/src/cmd/limbo/libmp/test.c - 664 pietro pietro 1112778739 12243 sys/src/cmd/limbo/libsec - 20000000775 pietro pietro 1201053326 0 sys/src/cmd/limbo/libsec/NOTICE - 664 pietro pietro 1170424782 237 sys/src/cmd/limbo/libsec/Plan9-386 - 20000000775 pietro sys 1201054150 0 sys/src/cmd/limbo/libsec/Plan9-386/md5block.s - 664 pietro sys 985124884 5369 sys/src/cmd/limbo/libsec/Plan9-386/mkfile - 664 pietro sys 1201051882 186 sys/src/cmd/limbo/libsec/Plan9-386/sha1block.s - 664 pietro sys 985124884 3682 sys/src/cmd/limbo/libsec/Plan9-mips - 20000000775 pietro sys 1201053324 0 sys/src/cmd/limbo/libsec/Plan9-mips/md5block.s - 664 pietro sys 985124884 7204 sys/src/cmd/limbo/libsec/Plan9-mips/mkfile - 664 pietro sys 1201052681 186 sys/src/cmd/limbo/libsec/Plan9-mips/sha1block.s - 664 pietro sys 985124884 4143 sys/src/cmd/limbo/libsec/libsec.a - 664 pietro sys 1201054035 490748 sys/src/cmd/limbo/libsec/mkfile - 664 pietro sys 1201050984 260 sys/src/cmd/limbo/libsec/port - 20000000775 pietro sys 1201054150 0 sys/src/cmd/limbo/libsec/port/aes.c - 664 pietro sys 1114008934 64087 sys/src/cmd/limbo/libsec/port/blowfish.c - 664 pietro sys 1016466467 19676 sys/src/cmd/limbo/libsec/port/decodepem.c - 664 pietro sys 1084318869 1831 sys/src/cmd/limbo/libsec/port/des.c - 664 pietro sys 1015013579 17496 sys/src/cmd/limbo/libsec/port/des3CBC.c - 664 pietro sys 988225292 1135 sys/src/cmd/limbo/libsec/port/des3ECB.c - 664 pietro sys 988225292 917 sys/src/cmd/limbo/libsec/port/desCBC.c - 664 pietro sys 984710519 1079 sys/src/cmd/limbo/libsec/port/desECB.c - 664 pietro sys 984710519 861 sys/src/cmd/limbo/libsec/port/desmodes.c - 664 pietro sys 1015013579 647 sys/src/cmd/limbo/libsec/port/dsaalloc.c - 664 pietro sys 1063853600 900 sys/src/cmd/limbo/libsec/port/dsagen.c - 664 pietro sys 1063853599 1139 sys/src/cmd/limbo/libsec/port/dsaprimes.c - 664 pietro sys 984710520 1881 sys/src/cmd/limbo/libsec/port/dsaprivtopub.c - 664 pietro sys 1027629126 279 sys/src/cmd/limbo/libsec/port/dsasign.c - 664 pietro sys 1063853600 969 sys/src/cmd/limbo/libsec/port/dsaverify.c - 664 pietro sys 1063853601 925 sys/src/cmd/limbo/libsec/port/egalloc.c - 664 pietro sys 1063853598 811 sys/src/cmd/limbo/libsec/port/egdecrypt.c - 664 pietro sys 984710520 564 sys/src/cmd/limbo/libsec/port/egencrypt.c - 664 pietro sys 1015013579 806 sys/src/cmd/limbo/libsec/port/eggen.c - 664 pietro sys 1027629125 413 sys/src/cmd/limbo/libsec/port/egprivtopub.c - 664 pietro sys 984710520 273 sys/src/cmd/limbo/libsec/port/egsign.c - 664 pietro sys 1027629125 807 sys/src/cmd/limbo/libsec/port/egtest.c - 664 pietro sys 984710521 655 sys/src/cmd/limbo/libsec/port/egverify.c - 664 pietro sys 984710521 519 sys/src/cmd/limbo/libsec/port/fastrand.c - 664 pietro sys 1114008943 241 sys/src/cmd/limbo/libsec/port/genprime.c - 664 pietro sys 984710521 535 sys/src/cmd/limbo/libsec/port/genrandom.c - 664 pietro sys 1128755708 1167 sys/src/cmd/limbo/libsec/port/gensafeprime.c - 664 pietro sys 1027629124 741 sys/src/cmd/limbo/libsec/port/genstrongprime.c - 664 pietro sys 984710522 1039 sys/src/cmd/limbo/libsec/port/hmac.c - 664 pietro sys 1140531661 1183 sys/src/cmd/limbo/libsec/port/hmactest.c - 664 pietro sys 984710522 344 sys/src/cmd/limbo/libsec/port/idea.c - 664 pietro sys 1131537142 3077 sys/src/cmd/limbo/libsec/port/libsec.a - 664 pietro sys 1201050298 68 sys/src/cmd/limbo/libsec/port/md4.c - 664 pietro sys 1015013579 4260 sys/src/cmd/limbo/libsec/port/md4test.c - 664 pietro sys 984710522 537 sys/src/cmd/limbo/libsec/port/md5.c - 664 pietro sys 1084318868 3254 sys/src/cmd/limbo/libsec/port/md5block.c - 664 pietro sys 1112950686 5014 sys/src/cmd/limbo/libsec/port/md5pickle.c - 664 pietro sys 1104105067 716 sys/src/cmd/limbo/libsec/port/mkfile - 664 pietro sys 1201051893 877 sys/src/cmd/limbo/libsec/port/nfastrand.c - 664 pietro sys 1114008915 337 sys/src/cmd/limbo/libsec/port/primetest.c - 664 pietro sys 984710523 2486 sys/src/cmd/limbo/libsec/port/prng.c - 664 pietro sys 984710523 187 sys/src/cmd/limbo/libsec/port/probably_prime.c - 664 pietro sys 984710523 1567 sys/src/cmd/limbo/libsec/port/rc4.c - 664 pietro sys 1015013580 1415 sys/src/cmd/limbo/libsec/port/reduce-nt - 664 pietro sys 1116437459 87 sys/src/cmd/limbo/libsec/port/reduce-rc - 664 pietro sys 1112916404 306 sys/src/cmd/limbo/libsec/port/reduce-sh - 664 pietro sys 1140986952 184 sys/src/cmd/limbo/libsec/port/rsaalloc.c - 664 pietro sys 984710524 657 sys/src/cmd/limbo/libsec/port/rsadecrypt.c - 664 pietro sys 984710524 749 sys/src/cmd/limbo/libsec/port/rsaencrypt.c - 664 pietro sys 984710524 192 sys/src/cmd/limbo/libsec/port/rsafill.c - 664 pietro sys 1045502171 1104 sys/src/cmd/limbo/libsec/port/rsagen.c - 664 pietro sys 1084318869 1462 sys/src/cmd/limbo/libsec/port/rsaprivtopub.c - 664 pietro sys 984710525 237 sys/src/cmd/limbo/libsec/port/rsatest.c - 664 pietro sys 1114158854 1094 sys/src/cmd/limbo/libsec/port/sha1.c - 664 pietro sys 985124885 2279 sys/src/cmd/limbo/libsec/port/sha1block.c - 664 pietro sys 1015013580 4673 sys/src/cmd/limbo/libsec/port/sha1pickle.c - 664 pietro sys 988225292 717 sys/src/cmd/limbo/libsec/port/smallprimes.c - 664 pietro sys 984710525 6851 sys/src/cmd/limbo/libsec/port/smallprimetest.c - 664 pietro sys 984710525 70640 sys/src/cmd/limbo/limbo - 20000000775 pietro pietro 1201054151 0 sys/src/cmd/limbo/limbo.1 - 664 pietro sys 1201058533 3907 sys/src/cmd/limbo/limbo.proto - 664 pietro pietro 1201058306 65 sys/src/cmd/limbo/limbo/NOTICE - 664 pietro sys 1170424782 1276 sys/src/cmd/limbo/limbo/asm.c - 664 pietro pietro 1110378956 6546 sys/src/cmd/limbo/limbo/com.c - 664 pietro pietro 1143812201 28500 sys/src/cmd/limbo/limbo/decls.c - 664 pietro pietro 1166211285 24802 sys/src/cmd/limbo/limbo/dis.c - 664 pietro pietro 1108744737 11759 sys/src/cmd/limbo/limbo/dtocanon.c - 664 pietro sys 1106929631 431 sys/src/cmd/limbo/limbo/ecom.c - 664 pietro pietro 1143812452 52762 sys/src/cmd/limbo/limbo/fns.h - 664 pietro pietro 1110543570 10794 sys/src/cmd/limbo/limbo/gen.c - 664 pietro pietro 1110461787 19626 sys/src/cmd/limbo/limbo/lex.c - 664 pietro pietro 1166546137 22175 sys/src/cmd/limbo/limbo/limbo.h - 664 pietro pietro 1201049727 14107 sys/src/cmd/limbo/limbo/limbo.y - 664 pietro pietro 1166546132 32308 sys/src/cmd/limbo/limbo/mkfile - 664 pietro pietro 1201053279 461 sys/src/cmd/limbo/limbo/nodes.c - 664 pietro pietro 1106929632 26717 sys/src/cmd/limbo/limbo/optab.c - 664 pietro pietro 1110880792 10685 sys/src/cmd/limbo/limbo/optim.c - 664 pietro pietro 1166211262 31175 sys/src/cmd/limbo/limbo/runt.h - 664 pietro pietro 1106929632 37129 sys/src/cmd/limbo/limbo/sbl.c - 664 pietro pietro 1166214527 6783 sys/src/cmd/limbo/limbo/stubs.c - 664 pietro pietro 1107271730 14163 sys/src/cmd/limbo/limbo/typecheck.c - 664 pietro pietro 1144698971 75435 sys/src/cmd/limbo/limbo/types.c - 664 pietro sys 1166215110 93952 sys/src/cmd/limbo/mkfile - 664 pietro pietro 1201052890 203 sys/src/cmd/limbo/module - 20000000775 pietro pietro 1201053337 0 sys/src/cmd/limbo/module/NOTICE - 664 pietro sys 1170424784 1299 sys/src/cmd/limbo/module/alphabet - 20000000775 pietro sys 1201053330 0 sys/src/cmd/limbo/module/alphabet.m - 664 pietro pietro 1099418952 6595 sys/src/cmd/limbo/module/alphabet/abc.m - 664 pietro sys 1099337448 1826 sys/src/cmd/limbo/module/alphabet/abcstyx.m - 664 pietro sys 1088004150 807 sys/src/cmd/limbo/module/alphabet/abctypes.m - 664 pietro sys 1099337448 837 sys/src/cmd/limbo/module/alphabet/endpoints.m - 664 pietro sys 1088004150 377 sys/src/cmd/limbo/module/alphabet/extvalues.m - 664 pietro sys 1097750796 315 sys/src/cmd/limbo/module/alphabet/fs.m - 664 pietro sys 1099337448 2027 sys/src/cmd/limbo/module/alphabet/fstypes.m - 664 pietro sys 1099337448 822 sys/src/cmd/limbo/module/alphabet/grid.m - 664 pietro sys 1099337448 1139 sys/src/cmd/limbo/module/alphabet/gridtypes.m - 664 pietro sys 1099337448 852 sys/src/cmd/limbo/module/alphabet/reports.m - 664 pietro sys 1099336405 614 sys/src/cmd/limbo/module/arg.m - 664 pietro sys 1042723313 240 sys/src/cmd/limbo/module/asn1.m - 664 pietro pietro 957453480 2463 sys/src/cmd/limbo/module/attrdb.m - 664 pietro sys 1057074737 2913 sys/src/cmd/limbo/module/auth9.m - 664 pietro pietro 1077404384 3683 sys/src/cmd/limbo/module/bench.m - 664 pietro sys 921242765 217 sys/src/cmd/limbo/module/bloomfilter.m - 664 pietro sys 1059683546 275 sys/src/cmd/limbo/module/brutus.m - 664 pietro sys 910822294 648 sys/src/cmd/limbo/module/brutusext.m - 664 pietro sys 1051722175 629 sys/src/cmd/limbo/module/bufio.m - 664 pietro sys 1064496256 1894 sys/src/cmd/limbo/module/bundle.m - 664 pietro sys 1069345885 320 sys/src/cmd/limbo/module/cci.m - 664 pietro sys 910822294 208 sys/src/cmd/limbo/module/cfg.m - 664 pietro sys 1049216330 552 sys/src/cmd/limbo/module/cfgfile.m - 664 pietro sys 910822294 596 sys/src/cmd/limbo/module/complete.m - 664 pietro sys 1168248522 451 sys/src/cmd/limbo/module/convcs.m - 664 pietro sys 992425277 769 sys/src/cmd/limbo/module/crc.m - 664 pietro sys 1064496157 699 sys/src/cmd/limbo/module/css.m - 664 pietro pietro 1117213818 1745 sys/src/cmd/limbo/module/csv.m - 664 pietro sys 1150187233 153 sys/src/cmd/limbo/module/cvsimages.m - 664 pietro sys 975347867 319 sys/src/cmd/limbo/module/daytime.m - 664 pietro pietro 994341011 1328 sys/src/cmd/limbo/module/db.m - 664 pietro sys 910822295 1797 sys/src/cmd/limbo/module/dbm.m - 775 pietro sys 1091200823 885 sys/src/cmd/limbo/module/debug.m - 664 pietro sys 1087318260 3053 sys/src/cmd/limbo/module/devpointer.m - 664 pietro pietro 1051722210 730 sys/src/cmd/limbo/module/dhcp.m - 664 pietro sys 1138623878 2154 sys/src/cmd/limbo/module/dialog.m - 664 pietro sys 1026867763 296 sys/src/cmd/limbo/module/dict.m - 664 pietro sys 910822295 311 sys/src/cmd/limbo/module/dis.m - 664 pietro pietro 1078831002 3845 sys/src/cmd/limbo/module/diskblocks.m - 664 pietro sys 1081597968 660 sys/src/cmd/limbo/module/disks.m - 664 pietro sys 1184408006 1424 sys/src/cmd/limbo/module/dividers.m - 664 pietro sys 1085214671 593 sys/src/cmd/limbo/module/draw.m - 664 pietro pietro 1052925661 11840 sys/src/cmd/limbo/module/ecmascript.m - 664 pietro pietro 1060459282 9016 sys/src/cmd/limbo/module/emio.m - 664 pietro pietro 910822295 4273 sys/src/cmd/limbo/module/encoding.m - 664 pietro sys 1080147237 338 sys/src/cmd/limbo/module/env.m - 664 pietro sys 954618021 380 sys/src/cmd/limbo/module/ether.m - 664 pietro sys 1051268702 242 sys/src/cmd/limbo/module/exception.m - 664 pietro sys 1039429723 537 sys/src/cmd/limbo/module/factotum.m - 664 pietro sys 1103292423 1023 sys/src/cmd/limbo/module/ffts.m - 664 pietro sys 910822295 1423 sys/src/cmd/limbo/module/filepat.m - 664 pietro sys 910822295 281 sys/src/cmd/limbo/module/filter.m - 664 pietro sys 1091771528 404 sys/src/cmd/limbo/module/format.m - 664 pietro sys 1127678090 864 sys/src/cmd/limbo/module/freetype.m - 664 pietro sys 1055175090 974 sys/src/cmd/limbo/module/fslib.m - 664 pietro pietro 1080160601 2144 sys/src/cmd/limbo/module/fsproto.m - 664 pietro sys 1060459392 361 sys/src/cmd/limbo/module/gamer.m - 664 pietro sys 910822295 251 sys/src/cmd/limbo/module/gr.m - 664 pietro sys 910822295 1072 sys/src/cmd/limbo/module/grid - 20000000775 pietro sys 1201053333 0 sys/src/cmd/limbo/module/grid/announce.m - 664 pietro sys 1055339413 208 sys/src/cmd/limbo/module/grid/browse.m - 664 pietro sys 1057055564 1805 sys/src/cmd/limbo/module/grid/browser.m - 664 pietro sys 1075136458 2909 sys/src/cmd/limbo/module/grid/demo - 20000000775 pietro sys 1201053333 0 sys/src/cmd/limbo/module/grid/demo/block.m - 664 pietro sys 1055417108 412 sys/src/cmd/limbo/module/grid/demo/exproc.m - 664 pietro sys 1055414347 232 sys/src/cmd/limbo/module/grid/fbrowse.m - 664 pietro sys 1057763704 284 sys/src/cmd/limbo/module/grid/pathreader.m - 664 pietro sys 1057763744 90 sys/src/cmd/limbo/module/grid/readjpg.m - 664 pietro sys 1060255480 2069 sys/src/cmd/limbo/module/grid/regpoll.m - 664 pietro sys 1059744042 158 sys/src/cmd/limbo/module/grid/srvbrowse.m - 664 pietro sys 1057828112 718 sys/src/cmd/limbo/module/hash.m - 664 pietro pietro 910822295 531 sys/src/cmd/limbo/module/html.m - 664 pietro sys 910822295 1263 sys/src/cmd/limbo/module/ida.m - 664 pietro sys 1141482113 588 sys/src/cmd/limbo/module/imagefile.m - 664 pietro sys 1027007899 1242 sys/src/cmd/limbo/module/inflate.m - 664 pietro sys 953133854 529 sys/src/cmd/limbo/module/ip.m - 664 pietro pietro 1137925402 2674 sys/src/cmd/limbo/module/ipattr.m - 664 pietro sys 1053085798 631 sys/src/cmd/limbo/module/ir.m - 664 pietro sys 958995511 662 sys/src/cmd/limbo/module/itslib.m - 664 pietro sys 1038930808 409 sys/src/cmd/limbo/module/json.m - 664 pietro pietro 1169492830 1487 sys/src/cmd/limbo/module/keyboard.m - 664 pietro sys 947163856 1140 sys/src/cmd/limbo/module/keyring.m - 664 pietro sys 1141921370 7200 sys/src/cmd/limbo/module/keyset.m - 664 pietro sys 1055418421 233 sys/src/cmd/limbo/module/libc.m - 664 pietro sys 1030030522 672 sys/src/cmd/limbo/module/libc0.m - 664 pietro sys 1025538199 1275 sys/src/cmd/limbo/module/linalg.m - 664 pietro sys 910822295 1009 sys/src/cmd/limbo/module/lists.m - 664 pietro sys 1186411050 922 sys/src/cmd/limbo/module/loader.m - 664 pietro pietro 910822295 758 sys/src/cmd/limbo/module/lock.m - 664 pietro sys 1053070456 213 sys/src/cmd/limbo/module/man.m - 664 pietro sys 1168969158 837 sys/src/cmd/limbo/module/math - 20000000775 pietro sys 1201053334 0 sys/src/cmd/limbo/module/math.m - 664 pietro pietro 1007638903 2875 sys/src/cmd/limbo/module/math/geodesy.m - 664 pietro sys 1108045893 1820 sys/src/cmd/limbo/module/math/polyfill.m - 664 pietro sys 1034610312 406 sys/src/cmd/limbo/module/math/polyhedra.m - 664 pietro sys 1050054061 653 sys/src/cmd/limbo/module/memfs.m - 664 pietro sys 951751177 118 sys/src/cmd/limbo/module/mpeg.m - 664 pietro sys 959359776 334 sys/src/cmd/limbo/module/multistyx.m - 664 pietro sys 984152511 276 sys/src/cmd/limbo/module/muxclient.m - 664 pietro sys 1026867795 871 sys/src/cmd/limbo/module/names.m - 664 pietro sys 1092643061 411 sys/src/cmd/limbo/module/newns.m - 664 pietro sys 910822295 157 sys/src/cmd/limbo/module/palm.m - 664 pietro pietro 1044276841 6269 sys/src/cmd/limbo/module/palmfile.m - 664 pietro pietro 1040311959 4009 sys/src/cmd/limbo/module/pkcs.m - 664 pietro sys 935511090 4427 sys/src/cmd/limbo/module/plumbmsg.m - 664 pietro pietro 910822295 831 sys/src/cmd/limbo/module/pop3.m - 664 pietro sys 1060459320 1275 sys/src/cmd/limbo/module/popup.m - 664 pietro sys 1051722258 551 sys/src/cmd/limbo/module/powerman.m - 664 pietro sys 1005323150 176 sys/src/cmd/limbo/module/prefab.m - 664 pietro pietro 910822295 3886 sys/src/cmd/limbo/module/print.m - 664 pietro sys 1013176441 1811 sys/src/cmd/limbo/module/profile.m - 664 pietro sys 1039166191 1553 sys/src/cmd/limbo/module/pslib.m - 664 pietro sys 954856304 154 sys/src/cmd/limbo/module/quicktime.m - 664 pietro sys 910822295 1296 sys/src/cmd/limbo/module/rand.m - 664 pietro sys 953054382 144 sys/src/cmd/limbo/module/readdir.m - 664 pietro sys 1054747648 583 sys/src/cmd/limbo/module/regex.m - 664 pietro sys 960208278 1107 sys/src/cmd/limbo/module/regexutils.m - 664 pietro sys 935511090 471 sys/src/cmd/limbo/module/registries.m - 664 pietro sys 1055508050 1252 sys/src/cmd/limbo/module/rfc822.m - 664 pietro sys 1149796148 1893 sys/src/cmd/limbo/module/riff.m - 664 pietro sys 910822295 1967 sys/src/cmd/limbo/module/runt.m - 664 pietro sys 1107271823 197 sys/src/cmd/limbo/module/scoretable.m - 664 pietro sys 958497357 341 sys/src/cmd/limbo/module/scsiio.m - 664 pietro sys 1126169332 617 sys/src/cmd/limbo/module/secstore.m - 664 pietro sys 1140785871 1193 sys/src/cmd/limbo/module/security.m - 664 pietro sys 1080211526 1261 sys/src/cmd/limbo/module/selectfile.m - 664 pietro sys 1109874080 354 sys/src/cmd/limbo/module/sets.m - 664 pietro sys 1059599782 831 sys/src/cmd/limbo/module/sets32.m - 664 pietro sys 1059598249 806 sys/src/cmd/limbo/module/sexprs.m - 664 pietro sys 1108741954 1028 sys/src/cmd/limbo/module/sh.m - 664 pietro sys 1085416110 3514 sys/src/cmd/limbo/module/smtp.m - 664 pietro sys 947090671 705 sys/src/cmd/limbo/module/sort.m - 664 pietro sys 1076634949 142 sys/src/cmd/limbo/module/spki.m - 664 pietro pietro 1189425941 5929 sys/src/cmd/limbo/module/srv.m - 664 pietro sys 1053348822 342 sys/src/cmd/limbo/module/srvrunt.b - 664 pietro sys 910822296 37 sys/src/cmd/limbo/module/ssl3.m - 664 pietro sys 1030698655 4851 sys/src/cmd/limbo/module/sslsession.m - 664 pietro sys 935511090 675 sys/src/cmd/limbo/module/string.m - 664 pietro sys 1189092935 1407 sys/src/cmd/limbo/module/strinttab.m - 664 pietro pietro 910822296 400 sys/src/cmd/limbo/module/strokes.m - 664 pietro sys 999763347 3431 sys/src/cmd/limbo/module/styx.m - 664 pietro sys 1082042945 3845 sys/src/cmd/limbo/module/styxconv.m - 664 pietro sys 1057236947 190 sys/src/cmd/limbo/module/styxlib.m - 664 pietro sys 1032972281 2825 sys/src/cmd/limbo/module/styxpersist.m - 664 pietro sys 1081189814 167 sys/src/cmd/limbo/module/styxservers.m - 664 pietro sys 1077634750 4836 sys/src/cmd/limbo/module/sys.m - 664 pietro sys 1184405820 3968 sys/src/cmd/limbo/module/tables.m - 664 pietro sys 1097751141 620 sys/src/cmd/limbo/module/tabs.m - 664 pietro sys 1026867755 304 sys/src/cmd/limbo/module/tcllib.m - 664 pietro sys 910822296 137 sys/src/cmd/limbo/module/tftp.m - 664 pietro sys 1053420427 147 sys/src/cmd/limbo/module/timers.m - 664 pietro sys 1060089008 237 sys/src/cmd/limbo/module/titlebar.m - 664 pietro sys 1054828051 423 sys/src/cmd/limbo/module/tk.m - 664 pietro sys 1051722274 851 sys/src/cmd/limbo/module/tkclient.m - 664 pietro sys 1051722328 702 sys/src/cmd/limbo/module/translate.m - 664 pietro sys 947248335 665 sys/src/cmd/limbo/module/ubfa.m - 664 pietro pietro 1140089457 1699 sys/src/cmd/limbo/module/unbundle.m - 664 pietro sys 1069348112 311 sys/src/cmd/limbo/module/uris.m - 664 pietro pietro 1148386658 1058 sys/src/cmd/limbo/module/url.m - 664 pietro sys 965394770 823 sys/src/cmd/limbo/module/usb.m - 664 pietro pietro 1125998168 3345 sys/src/cmd/limbo/module/vac.m - 664 pietro pietro 1181828567 4785 sys/src/cmd/limbo/module/venti.m - 664 pietro sys 1061404725 3279 sys/src/cmd/limbo/module/volume.m - 664 pietro sys 910822296 738 sys/src/cmd/limbo/module/wait.m - 664 pietro sys 1053722221 235 sys/src/cmd/limbo/module/watchvars.m - 664 pietro sys 1070347733 359 sys/src/cmd/limbo/module/webget.m - 664 pietro pietro 910822296 150 sys/src/cmd/limbo/module/winplace.m - 664 pietro sys 1085214687 244 sys/src/cmd/limbo/module/wmclient.m - 664 pietro sys 1139922020 1401 sys/src/cmd/limbo/module/wmlib.m - 664 pietro sys 1057156808 918 sys/src/cmd/limbo/module/wmsrv.m - 664 pietro pietro 1139922019 1408 sys/src/cmd/limbo/module/workdir.m - 664 pietro sys 910822296 115 sys/src/cmd/limbo/module/x509.m - 664 pietro pietro 923567360 9462 sys/src/cmd/limbo/module/xml.m - 664 pietro pietro 1166101264 1639 sys/src/cmd/limbo/module/xpointers.m - 664 pietro sys 1119524508 1300 - 664 pietro sys 1049216330 552 sys/src/cmd/limbo/module/cfgfile.m - 664 pietro sys 910822294 596 sys/src/cmd/limbo/module/complete.m - 664 pietro sys 1168248522 451 sys/src/cmd/limbo/module/convcs.m - 664 pietro sys 992425277 769 sys/src/cmd/limbo/module/crc.m - 664 pietro sys 1064496157 699 sys/src/cmd/limbo/module/css.m - 664 pietro pietro 1117213818 1745 sys/src/cmd/limbo/module/csv.m - 664 pietro sys 1150187233 153 sys/src/cmd/limbo/module/cvsimages.m - 664 pietro sys 975347867old_contrib//replica/limbo/dep 664 0 0 0 10745521075 14735ustar00pietrosysold_contrib//replica/limbo/inf 664 0 0 64 10745521122 14764ustar00pietrosysthe Limbo compiler, compiled exclusively for Plan 9 old_contrib//replica/limbo/log 664 0 0 135044 10745531410 15101ustar00pietrosys1201054289 0 a 386 - 20000000775 sys sys 1199928685 0 1201054289 1 a 386/bin - 20000000775 sys sys 1201054104 0 1201054289 2 a 386/bin/limbo - 775 pietro sys 1201054104 444649 1201054289 3 a sys - 20000000775 sys sys 1199654703 0 1201054289 4 a sys/src - 20000000775 sys sys 1200954977 0 1201054289 5 a sys/src/cmd - 20000000775 sys sys 1201053197 0 1201054289 6 a sys/src/cmd/limbo - 20000000775 pietro sys 1201053330 0 1201054289 7 a sys/src/cmd/limbo/README - 664 pietro pietro 1201053080 835 1201054289 8 a sys/src/cmd/limbo/include - 20000000775 pietro pietro 1201053316 0 1201054289 9 a sys/src/cmd/limbo/include/NOTICE - 664 pietro sys 1170424782 1299 1201054289 10 a sys/src/cmd/limbo/include/a.out.h - 664 pietro sys 1065515760 36 1201054289 11 a sys/src/cmd/limbo/include/cursor.h - 664 pietro sys 1063895796 302 1201054289 12 a sys/src/cmd/limbo/include/draw.h - 664 pietro pietro 1168609276 16752 1201054289 13 a sys/src/cmd/limbo/include/drawif.h - 664 pietro sys 1063895796 527 1201054289 14 a sys/src/cmd/limbo/include/dynld.h - 664 pietro sys 1083578135 1222 1201054289 15 a sys/src/cmd/limbo/include/fcall.h - 664 pietro pietro 1172591480 3215 1201054289 16 a sys/src/cmd/limbo/include/flate.h - 664 pietro sys 1136840410 1187 1201054289 17 a sys/src/cmd/limbo/include/freetype - 20000000775 pietro sys 1201053315 0 1201054289 18 a sys/src/cmd/limbo/include/freetype/cache - 20000000775 pietro sys 1201053311 0 1201054289 19 a sys/src/cmd/limbo/include/freetype/cache/ftccache.h - 664 pietro sys 1042133334 11687 1201054289 20 a sys/src/cmd/limbo/include/freetype/cache/ftccmap.h - 664 pietro sys 1042133334 12278 1201054289 21 a sys/src/cmd/limbo/include/freetype/cache/ftcglyph.h - 664 pietro sys 1042133334 8287 1201054289 22 a sys/src/cmd/limbo/include/freetype/cache/ftcimage.h - 664 pietro sys 1042133334 17151 1201054289 23 a sys/src/cmd/limbo/include/freetype/cache/ftcmanag.h - 664 pietro sys 1042133334 12407 1201054289 24 a sys/src/cmd/limbo/include/freetype/cache/ftcsbits.h - 664 pietro sys 1042133334 16799 1201054289 25 a sys/src/cmd/limbo/include/freetype/cache/ftlru.h - 664 pietro sys 1042133334 8210 1201054289 26 a sys/src/cmd/limbo/include/freetype/config - 20000000775 pietro sys 1201053311 0 1201054289 27 a sys/src/cmd/limbo/include/freetype/config/ftconfig.h - 664 pietro sys 1063812631 12158 1201054289 28 a sys/src/cmd/limbo/include/freetype/config/ftconfig.h.orig - 664 pietro sys 1063812619 12134 1201054289 29 a sys/src/cmd/limbo/include/freetype/config/ftheader.h - 664 pietro sys 1042133335 32235 1201054289 30 a sys/src/cmd/limbo/include/freetype/config/ftmodule.h - 664 pietro sys 1042133335 655 1201054289 31 a sys/src/cmd/limbo/include/freetype/config/ftmodule.h.orig - 664 pietro sys 1042133335 639 1201054289 32 a sys/src/cmd/limbo/include/freetype/config/ftoption.h - 664 pietro sys 1042133335 30106 1201054289 33 a sys/src/cmd/limbo/include/freetype/config/ftstdlib.h - 664 pietro sys 1044439696 6507 1201054289 34 a sys/src/cmd/limbo/include/freetype/config/ftstdlib.h.orig - 664 pietro sys 1042133335 6318 1201054289 35 a sys/src/cmd/limbo/include/freetype/freetype.h - 664 pietro sys 1091610813 185816 1201054289 36 a sys/src/cmd/limbo/include/freetype/ft2build.h - 664 pietro sys 1091610863 2230 1201054289 37 a sys/src/cmd/limbo/include/freetype/ftbbox.h - 664 pietro sys 1042133335 4350 1201054289 38 a sys/src/cmd/limbo/include/freetype/ftbdf.h - 664 pietro sys 1042133335 3435 1201054289 39 a sys/src/cmd/limbo/include/freetype/ftcache.h - 664 pietro sys 1042133335 26385 1201054289 40 a sys/src/cmd/limbo/include/freetype/ftchapters.h - 664 pietro sys 1042133335 4920 1201054289 41 a sys/src/cmd/limbo/include/freetype/fterrdef.h - 664 pietro sys 1042133335 11259 1201054289 42 a sys/src/cmd/limbo/include/freetype/fterrors.h - 664 pietro sys 1042133335 9753 1201054289 43 a sys/src/cmd/limbo/include/freetype/ftglyph.h - 664 pietro sys 1042133335 32947 1201054289 44 a sys/src/cmd/limbo/include/freetype/ftgzip.h - 664 pietro sys 1042133335 3984 1201054289 45 a sys/src/cmd/limbo/include/freetype/ftimage.h - 664 pietro sys 1042133336 77792 1201054289 46 a sys/src/cmd/limbo/include/freetype/ftincrem.h - 664 pietro sys 1042133336 9313 1201054289 47 a sys/src/cmd/limbo/include/freetype/ftlist.h - 664 pietro sys 1042133336 16331 1201054289 48 a sys/src/cmd/limbo/include/freetype/ftmac.h - 664 pietro sys 1042133336 7561 1201054289 49 a sys/src/cmd/limbo/include/freetype/ftmm.h - 664 pietro sys 1042133336 11368 1201054289 50 a sys/src/cmd/limbo/include/freetype/ftmoderr.h - 664 pietro sys 1042133336 7094 1201054289 51 a sys/src/cmd/limbo/include/freetype/ftmodule.h - 664 pietro sys 1042133336 17767 1201054289 52 a sys/src/cmd/limbo/include/freetype/ftoutln.h - 664 pietro sys 1042133336 25817 1201054289 53 a sys/src/cmd/limbo/include/freetype/ftpfr.h - 664 pietro sys 1042133336 5898 1201054289 54 a sys/src/cmd/limbo/include/freetype/ftrender.h - 664 pietro sys 1042133336 10957 1201054289 55 a sys/src/cmd/limbo/include/freetype/ftsizes.h - 664 pietro sys 1042133336 9206 1201054289 56 a sys/src/cmd/limbo/include/freetype/ftsnames.h - 664 pietro sys 1042133336 9584 1201054289 57 a sys/src/cmd/limbo/include/freetype/ftstroker.h - 664 pietro sys 1042133336 3599 1201054289 58 a sys/src/cmd/limbo/include/freetype/ftsynth.h - 664 pietro sys 1042133336 2998 1201054289 59 a sys/src/cmd/limbo/include/freetype/ftsysio.h - 664 pietro sys 1042133336 5606 1201054289 60 a sys/src/cmd/limbo/include/freetype/ftsysmem.h - 664 pietro sys 1042133336 6320 1201054289 61 a sys/src/cmd/limbo/include/freetype/ftsystem.h - 664 pietro sys 1042133336 18152 1201054289 62 a sys/src/cmd/limbo/include/freetype/fttrigon.h - 664 pietro sys 1042133336 19810 1201054289 63 a sys/src/cmd/limbo/include/freetype/fttypes.h - 664 pietro sys 1042133337 33056 1201054289 64 a sys/src/cmd/limbo/include/freetype/ftxf86.h - 664 pietro sys 1042133337 2885 1201054289 65 a sys/src/cmd/limbo/include/freetype/internal - 20000000775 pietro sys 1201053315 0 1201054289 66 a sys/src/cmd/limbo/include/freetype/internal/autohint.h - 664 pietro sys 1042133337 12604 1201054289 67 a sys/src/cmd/limbo/include/freetype/internal/bdftypes.h - 664 pietro sys 1042133337 1487 1201054289 68 a sys/src/cmd/limbo/include/freetype/internal/cfftypes.h - 664 pietro sys 1042133337 7947 1201054289 69 a sys/src/cmd/limbo/include/freetype/internal/fnttypes.h - 664 pietro sys 1042133337 3858 1201054289 70 a sys/src/cmd/limbo/include/freetype/internal/ftcalc.h - 664 pietro sys 1042133337 3548 1201054289 71 a sys/src/cmd/limbo/include/freetype/internal/ftcore.h - 664 pietro sys 1042133337 5806 1201054289 72 a sys/src/cmd/limbo/include/freetype/internal/ftdebug.h - 664 pietro sys 1042133337 7843 1201054289 73 a sys/src/cmd/limbo/include/freetype/internal/ftdriver.h - 664 pietro sys 1042133337 9452 1201054289 74 a sys/src/cmd/limbo/include/freetype/internal/ftexcept.h - 664 pietro sys 1042133337 2045 1201054289 75 a sys/src/cmd/limbo/include/freetype/internal/ftgloadr.h - 664 pietro sys 1042133337 5422 1201054289 76 a sys/src/cmd/limbo/include/freetype/internal/fthash.h - 664 pietro sys 1042133337 14456 1201054289 77 a sys/src/cmd/limbo/include/freetype/internal/ftmemory.h - 664 pietro sys 1042133337 15011 1201054289 78 a sys/src/cmd/limbo/include/freetype/internal/ftobject.h - 664 pietro sys 1042133337 13765 1201054289 79 a sys/src/cmd/limbo/include/freetype/internal/ftobjs.h - 664 pietro sys 1042133337 40390 1201054289 80 a sys/src/cmd/limbo/include/freetype/internal/ftstream.h - 664 pietro sys 1042133337 21445 1201054289 81 a sys/src/cmd/limbo/include/freetype/internal/fttrace.h - 664 pietro sys 1042133338 4107 1201054289 82 a sys/src/cmd/limbo/include/freetype/internal/internal.h - 664 pietro sys 1042133338 3536 1201054289 83 a sys/src/cmd/limbo/include/freetype/internal/pcftypes.h - 664 pietro sys 1042133338 1555 1201054289 84 a sys/src/cmd/limbo/include/freetype/internal/pfr.h - 664 pietro sys 1042133338 1211 1201054289 85 a sys/src/cmd/limbo/include/freetype/internal/psaux.h - 664 pietro sys 1042133338 29895 1201054289 86 a sys/src/cmd/limbo/include/freetype/internal/pshints.h - 664 pietro sys 1042133338 39422 1201054289 87 a sys/src/cmd/limbo/include/freetype/internal/psnames.h - 664 pietro sys 1042133338 13789 1201054289 88 a sys/src/cmd/limbo/include/freetype/internal/sfnt.h - 664 pietro sys 1042133338 33048 1201054289 89 a sys/src/cmd/limbo/include/freetype/internal/t1types.h - 664 pietro sys 1042133338 8026 1201054289 90 a sys/src/cmd/limbo/include/freetype/internal/t42types.h - 664 pietro sys 1042133338 1867 1201054289 91 a sys/src/cmd/limbo/include/freetype/internal/tttypes.h - 664 pietro sys 1042133338 92331 1201054289 92 a sys/src/cmd/limbo/include/freetype/t1tables.h - 664 pietro sys 1042133338 14553 1201054289 93 a sys/src/cmd/limbo/include/freetype/ttnameid.h - 664 pietro sys 1042133338 48454 1201054289 94 a sys/src/cmd/limbo/include/freetype/tttables.h - 664 pietro sys 1042133338 33210 1201054289 95 a sys/src/cmd/limbo/include/freetype/tttags.h - 664 pietro sys 1042133338 3372 1201054289 96 a sys/src/cmd/limbo/include/freetype.h - 664 pietro sys 1063895796 1048 1201054289 97 a sys/src/cmd/limbo/include/interp.h - 664 pietro pietro 1146731078 12898 1201054289 98 a sys/src/cmd/limbo/include/isa.h - 664 pietro sys 1098190249 2773 1201054289 99 a sys/src/cmd/limbo/include/kern.h - 664 pietro sys 1139493676 17146 1201054289 100 a sys/src/cmd/limbo/include/kernel.h - 664 pietro sys 1063895796 1730 1201054289 101 a sys/src/cmd/limbo/include/keyboard.h - 664 pietro sys 1063895796 1176 1201054289 102 a sys/src/cmd/limbo/include/libsec.h - 664 pietro sys 1124283620 9776 1201054289 103 a sys/src/cmd/limbo/include/logfs.h - 775 pietro pietro 1063895796 7129 1201054289 104 a sys/src/cmd/limbo/include/mathi.h - 664 pietro sys 1066647172 2472 1201054289 105 a sys/src/cmd/limbo/include/memdraw.h - 664 pietro pietro 1065098530 5681 1201054289 106 a sys/src/cmd/limbo/include/memlayer.h - 664 pietro sys 1063895796 1827 1201054289 107 a sys/src/cmd/limbo/include/mp.h - 664 pietro pietro 1114713922 4848 1201054289 108 a sys/src/cmd/limbo/include/nandecc.h - 664 pietro sys 1063895796 292 1201054289 109 a sys/src/cmd/limbo/include/nandfs.h - 664 pietro sys 1063895796 3606 1201054289 110 a sys/src/cmd/limbo/include/pool.h - 664 pietro sys 1065098543 1763 1201054289 111 a sys/src/cmd/limbo/include/pooldefs.h - 664 pietro sys 1063895796 120 1201054289 112 a sys/src/cmd/limbo/include/prefab.h - 664 pietro sys 1063895796 2962 1201054289 113 a sys/src/cmd/limbo/include/raise.h - 664 pietro sys 1063895796 1181 1201054289 114 a sys/src/cmd/limbo/include/rdbg.h - 664 pietro sys 1084212911 385 1201054289 115 a sys/src/cmd/limbo/include/styx.h - 664 pietro pietro 1063895796 3204 1201054289 116 a sys/src/cmd/limbo/include/tk.h - 664 pietro pietro 1139921300 21019 1201054289 117 a sys/src/cmd/limbo/include/trace.h - 664 pietro sys 1096541381 642 1201054289 118 a sys/src/cmd/limbo/include/version.h - 664 pietro sys 1191369578 44 1201054289 119 a sys/src/cmd/limbo/include/vm.h - 664 pietro sys 1104761616 210 1201054289 120 a sys/src/cmd/limbo/libmath - 20000000775 pietro pietro 1201054145 0 1201054289 121 a sys/src/cmd/limbo/libmath/FPcontrol-Inferno.c - 664 pietro pietro 1201046814 1622 1201054289 122 a sys/src/cmd/limbo/libmath/FPcontrol-Plan9.c - 664 pietro pietro 1109006081 31 1201054289 123 a sys/src/cmd/limbo/libmath/NOTICE - 664 pietro sys 1170424782 1658 1201054289 124 a sys/src/cmd/limbo/libmath/bin - 20000000775 pietro sys 1201053317 0 1201054289 125 a sys/src/cmd/limbo/libmath/bin/fdlibm-stubs - 664 pietro sys 910822291 1782 1201054289 126 a sys/src/cmd/limbo/libmath/bin/unif_dtoa - 664 pietro sys 910822291 1221 1201054289 127 a sys/src/cmd/limbo/libmath/bin/unif_fdlibm - 664 pietro sys 910822291 476 1201054289 128 a sys/src/cmd/limbo/libmath/blas.c - 664 pietro pietro 1109006081 656 1201054289 129 a sys/src/cmd/limbo/libmath/dtoa.c - 664 pietro pietro 1109006081 34820 1201054289 130 a sys/src/cmd/limbo/libmath/fdim.c - 664 pietro sys 1109006082 268 1201054289 131 a sys/src/cmd/limbo/libmath/fdlibm - 20000000775 pietro sys 1201053319 0 1201054289 132 a sys/src/cmd/limbo/libmath/fdlibm/e_acos.c - 664 pietro sys 910822291 3243 1201054289 133 a sys/src/cmd/limbo/libmath/fdlibm/e_acosh.c - 664 pietro sys 910822291 1527 1201054289 134 a sys/src/cmd/limbo/libmath/fdlibm/e_asin.c - 664 pietro sys 910822291 3454 1201054289 135 a sys/src/cmd/limbo/libmath/fdlibm/e_atan2.c - 664 pietro sys 910822291 3654 1201054289 136 a sys/src/cmd/limbo/libmath/fdlibm/e_atanh.c - 664 pietro sys 910822291 1592 1201054289 137 a sys/src/cmd/limbo/libmath/fdlibm/e_cosh.c - 664 pietro sys 910822291 2297 1201054289 138 a sys/src/cmd/limbo/libmath/fdlibm/e_exp.c - 664 pietro sys 910822291 4950 1201054289 139 a sys/src/cmd/limbo/libmath/fdlibm/e_fmod.c - 664 pietro sys 910822291 3378 1201054289 140 a sys/src/cmd/limbo/libmath/fdlibm/e_hypot.c - 664 pietro sys 910822291 2977 1201054289 141 a sys/src/cmd/limbo/libmath/fdlibm/e_j0.c - 664 pietro sys 910822291 14409 1201054289 142 a sys/src/cmd/limbo/libmath/fdlibm/e_j1.c - 664 pietro sys 910822291 14184 1201054289 143 a sys/src/cmd/limbo/libmath/fdlibm/e_jn.c - 664 pietro sys 910822291 6967 1201054289 144 a sys/src/cmd/limbo/libmath/fdlibm/e_lgamma_r.c - 664 pietro sys 1007982020 10868 1201054289 145 a sys/src/cmd/limbo/libmath/fdlibm/e_log.c - 664 pietro sys 910822292 4377 1201054289 146 a sys/src/cmd/limbo/libmath/fdlibm/e_log10.c - 664 pietro sys 910822292 2663 1201054289 147 a sys/src/cmd/limbo/libmath/fdlibm/e_pow.c - 664 pietro sys 910822292 9544 1201054289 148 a sys/src/cmd/limbo/libmath/fdlibm/e_rem_pio2.c - 664 pietro sys 910822292 5139 1201054289 149 a sys/src/cmd/limbo/libmath/fdlibm/e_remainder.c - 664 pietro sys 910822292 1685 1201054289 150 a sys/src/cmd/limbo/libmath/fdlibm/e_sinh.c - 664 pietro sys 910822292 2093 1201054289 151 a sys/src/cmd/limbo/libmath/fdlibm/e_sqrt.c - 664 pietro sys 910822292 14380 1201054289 152 a sys/src/cmd/limbo/libmath/fdlibm/fdlibm.h - 664 pietro sys 910822292 4744 1201054289 153 a sys/src/cmd/limbo/libmath/fdlibm/k_cos.c - 664 pietro sys 910822292 2925 1201054289 154 a sys/src/cmd/limbo/libmath/fdlibm/k_rem_pio2.c - 664 pietro sys 910822292 8207 1201054289 155 a sys/src/cmd/limbo/libmath/fdlibm/k_sin.c - 664 pietro sys 910822292 2276 1201054289 156 a sys/src/cmd/limbo/libmath/fdlibm/k_tan.c - 664 pietro sys 910822292 3934 1201054289 157 a sys/src/cmd/limbo/libmath/fdlibm/readme - 664 pietro sys 910822292 8729 1201054289 158 a sys/src/cmd/limbo/libmath/fdlibm/s_asinh.c - 664 pietro sys 910822292 1539 1201054289 159 a sys/src/cmd/limbo/libmath/fdlibm/s_atan.c - 664 pietro sys 910822292 3976 1201054289 160 a sys/src/cmd/limbo/libmath/fdlibm/s_cbrt.c - 664 pietro sys 910822292 1986 1201054289 161 a sys/src/cmd/limbo/libmath/fdlibm/s_ceil.c - 664 pietro sys 910822292 1661 1201054289 162 a sys/src/cmd/limbo/libmath/fdlibm/s_copysign.c - 664 pietro sys 910822292 716 1201054289 163 a sys/src/cmd/limbo/libmath/fdlibm/s_cos.c - 664 pietro sys 910822292 1955 1201054289 164 a sys/src/cmd/limbo/libmath/fdlibm/s_erf.c - 664 pietro sys 974126383 11029 1201054289 165 a sys/src/cmd/limbo/libmath/fdlibm/s_expm1.c - 664 pietro sys 910822292 7234 1201054289 166 a sys/src/cmd/limbo/libmath/fdlibm/s_fabs.c - 664 pietro sys 910822292 592 1201054289 167 a sys/src/cmd/limbo/libmath/fdlibm/s_finite.c - 664 pietro sys 910822292 649 1201054289 168 a sys/src/cmd/limbo/libmath/fdlibm/s_floor.c - 664 pietro sys 910822292 1670 1201054289 169 a sys/src/cmd/limbo/libmath/fdlibm/s_ilogb.c - 664 pietro sys 910822292 1067 1201054289 170 a sys/src/cmd/limbo/libmath/fdlibm/s_isnan.c - 664 pietro sys 910822292 707 1201054289 171 a sys/src/cmd/limbo/libmath/fdlibm/s_log1p.c - 664 pietro sys 910822293 5232 1201054289 172 a sys/src/cmd/limbo/libmath/fdlibm/s_modf.c - 664 pietro sys 910822293 1733 1201054289 173 a sys/src/cmd/limbo/libmath/fdlibm/s_nextafter.c - 664 pietro sys 910822293 1962 1201054289 174 a sys/src/cmd/limbo/libmath/fdlibm/s_rint.c - 664 pietro sys 1008605338 2093 1201054289 175 a sys/src/cmd/limbo/libmath/fdlibm/s_scalbn.c - 664 pietro sys 910822293 1774 1201054289 176 a sys/src/cmd/limbo/libmath/fdlibm/s_sin.c - 664 pietro sys 910822293 1946 1201054289 177 a sys/src/cmd/limbo/libmath/fdlibm/s_tan.c - 664 pietro sys 910822293 1795 1201054289 178 a sys/src/cmd/limbo/libmath/fdlibm/s_tanh.c - 664 pietro sys 910822293 1887 1201054289 179 a sys/src/cmd/limbo/libmath/g_fmt.c - 664 pietro sys 1109006082 2323 1201054289 180 a sys/src/cmd/limbo/libmath/gemm.c - 664 pietro sys 1109006082 3034 1201054289 181 a sys/src/cmd/limbo/libmath/gfltconv.c - 664 pietro pietro 1109006082 2835 1201054289 182 a sys/src/cmd/limbo/libmath/lib9.h - 664 pietro pietro 1201046735 33 1201054289 183 a sys/src/cmd/limbo/libmath/libmath.a - 664 pietro sys 1201054080 225320 1201054289 184 a sys/src/cmd/limbo/libmath/mkfile - 664 pietro sys 1201050465 947 1201054289 185 a sys/src/cmd/limbo/libmath/pow10.c - 664 pietro sys 1109006082 83 1201054289 186 a sys/src/cmd/limbo/libmp - 20000000775 pietro pietro 1201053323 0 1201054289 187 a sys/src/cmd/limbo/libmp/NOTICE - 664 pietro sys 1170424782 237 1201054289 188 a sys/src/cmd/limbo/libmp/Plan9-386 - 20000000775 pietro sys 1201054148 0 1201054289 189 a sys/src/cmd/limbo/libmp/Plan9-386/mkfile - 664 pietro sys 1201051383 267 1201054289 190 a sys/src/cmd/limbo/libmp/Plan9-386/mpdigdiv.s - 664 pietro sys 1112775196 352 1201054289 191 a sys/src/cmd/limbo/libmp/Plan9-386/mpvecadd.s - 664 pietro sys 1112775196 906 1201054289 192 a sys/src/cmd/limbo/libmp/Plan9-386/mpvecdigmuladd.s - 664 pietro sys 1112775196 1063 1201054289 193 a sys/src/cmd/limbo/libmp/Plan9-386/mpvecdigmulsub.s - 664 pietro sys 1112775196 971 1201054289 194 a sys/src/cmd/limbo/libmp/Plan9-386/mpvecsub.s - 664 pietro sys 1112775196 767 1201054289 195 a sys/src/cmd/limbo/libmp/Plan9-amd64 - 20000000775 pietro sys 1201053321 0 1201054289 196 a sys/src/cmd/limbo/libmp/Plan9-amd64/mkfile - 664 pietro sys 1201052623 267 1201054289 197 a sys/src/cmd/limbo/libmp/Plan9-amd64/mpdigdiv.s - 664 pietro sys 1112775197 362 1201054289 198 a sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecadd.s - 664 pietro sys 1112775197 927 1201054289 199 a sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecdigmuladd.s - 664 pietro sys 1112775197 1083 1201054289 200 a sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecdigmulsub.s - 664 pietro sys 1112775197 991 1201054289 201 a sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecsub.s - 664 pietro sys 1112775197 788 1201054289 202 a sys/src/cmd/limbo/libmp/Plan9-mips - 20000000775 pietro sys 1201053321 0 1201054289 203 a sys/src/cmd/limbo/libmp/Plan9-mips/mkfile - 664 pietro sys 1201052638 267 1201054289 204 a sys/src/cmd/limbo/libmp/Plan9-mips/mpdigdiv.s - 664 pietro sys 1112775197 609 1201054289 205 a sys/src/cmd/limbo/libmp/Plan9-mips/mpvecadd.s - 664 pietro sys 1112775197 1211 1201054289 206 a sys/src/cmd/limbo/libmp/Plan9-mips/mpvecdigmuladd.s - 664 pietro sys 1112775197 1098 1201054289 207 a sys/src/cmd/limbo/libmp/Plan9-mips/mpvecdigmulsub.s - 664 pietro sys 1112775197 1226 1201054289 208 a sys/src/cmd/limbo/libmp/Plan9-mips/mpvecsub.s - 664 pietro sys 1112775197 1209 1201054289 209 a sys/src/cmd/limbo/libmp/Plan9-power - 20000000775 pietro sys 1201053321 0 1201054289 210 a sys/src/cmd/limbo/libmp/Plan9-power/mkfile - 664 pietro sys 1201052653 267 1201054289 211 a sys/src/cmd/limbo/libmp/Plan9-power/mpvecadd.s - 664 pietro sys 1112775199 1233 1201054289 212 a sys/src/cmd/limbo/libmp/Plan9-power/mpvecdigmuladd.s - 664 pietro sys 1112775199 1105 1201054289 213 a sys/src/cmd/limbo/libmp/Plan9-power/mpvecdigmulsub.s - 664 pietro sys 1112775199 1300 1201054289 214 a sys/src/cmd/limbo/libmp/Plan9-power/mpvecsub.s - 664 pietro sys 1112775199 1118 1201054289 215 a sys/src/cmd/limbo/libmp/bigtest.c - 664 pietro pietro 1112778748 2049 1201054289 216 a sys/src/cmd/limbo/libmp/libmp.a - 664 pietro pietro 1201054000 83636 1201054289 217 a sys/src/cmd/limbo/libmp/mkfile - 664 pietro sys 1201051172 803 1201054289 218 a sys/src/cmd/limbo/libmp/mtest.c - 664 pietro sys 1112775197 845 1201054289 219 a sys/src/cmd/limbo/libmp/port - 20000000775 pietro sys 1201054148 0 1201054289 220 a sys/src/cmd/limbo/libmp/port/betomp.c - 664 pietro sys 1112775198 577 1201054289 221 a sys/src/cmd/limbo/libmp/port/crt.c - 664 pietro sys 1112775198 2050 1201054289 222 a sys/src/cmd/limbo/libmp/port/crttest.c - 664 pietro sys 1112775198 813 1201054289 223 a sys/src/cmd/limbo/libmp/port/dat.h - 664 pietro sys 1116435894 367 1201054289 224 a sys/src/cmd/limbo/libmp/port/letomp.c - 664 pietro sys 1112775198 432 1201054289 225 a sys/src/cmd/limbo/libmp/port/lib9.h - 664 pietro sys 1201051192 33 1201054289 226 a sys/src/cmd/limbo/libmp/port/mkfile - 664 pietro sys 1201051370 607 1201054289 227 a sys/src/cmd/limbo/libmp/port/mpadd.c - 664 pietro sys 1112775198 783 1201054289 228 a sys/src/cmd/limbo/libmp/port/mpaux.c - 664 pietro sys 1112775198 2650 1201054289 229 a sys/src/cmd/limbo/libmp/port/mpcmp.c - 664 pietro sys 1112775198 465 1201054289 230 a sys/src/cmd/limbo/libmp/port/mpdigdiv.c - 664 pietro sys 1112775198 732 1201054289 231 a sys/src/cmd/limbo/libmp/port/mpdiv.c - 664 pietro sys 1112775198 2423 1201054289 232 a sys/src/cmd/limbo/libmp/port/mpeuclid.c - 664 pietro sys 1112775198 1293 1201054289 233 a sys/src/cmd/limbo/libmp/port/mpexp.c - 664 pietro sys 1112775198 1269 1201054289 234 a sys/src/cmd/limbo/libmp/port/mpextendedgcd.c - 664 pietro sys 1112775198 1739 1201054289 235 a sys/src/cmd/limbo/libmp/port/mpfactorial.c - 664 pietro sys 1112775199 1367 1201054289 236 a sys/src/cmd/limbo/libmp/port/mpfmt.c - 664 pietro sys 1112775199 2729 1201054289 237 a sys/src/cmd/limbo/libmp/port/mpinvert.c - 664 pietro sys 1112775199 394 1201054289 238 a sys/src/cmd/limbo/libmp/port/mpleft.c - 664 pietro sys 1112775199 906 1201054289 239 a sys/src/cmd/limbo/libmp/port/mpmod.c - 664 pietro sys 1112775199 247 1201054289 240 a sys/src/cmd/limbo/libmp/port/mpmul.c - 664 pietro sys 1112775199 3110 1201054289 241 a sys/src/cmd/limbo/libmp/port/mprand.c - 664 pietro sys 1112775199 584 1201054289 242 a sys/src/cmd/limbo/libmp/port/mpright.c - 664 pietro sys 1112775199 872 1201054289 243 a sys/src/cmd/limbo/libmp/port/mpsub.c - 664 pietro sys 1112775199 792 1201054289 244 a sys/src/cmd/limbo/libmp/port/mptobe.c - 664 pietro sys 1112775199 879 1201054289 245 a sys/src/cmd/limbo/libmp/port/mptoi.c - 664 pietro sys 1112775199 580 1201054289 246 a sys/src/cmd/limbo/libmp/port/mptole.c - 664 pietro sys 1112775199 786 1201054289 247 a sys/src/cmd/limbo/libmp/port/mptoui.c - 664 pietro sys 1112775199 413 1201054289 248 a sys/src/cmd/limbo/libmp/port/mptouv.c - 664 pietro sys 1141647793 718 1201054289 249 a sys/src/cmd/limbo/libmp/port/mptov.c - 664 pietro sys 1116435938 978 1201054289 250 a sys/src/cmd/limbo/libmp/port/mpvecadd.c - 664 pietro sys 1112775199 519 1201054289 251 a sys/src/cmd/limbo/libmp/port/mpveccmp.c - 664 pietro sys 1112775199 378 1201054289 252 a sys/src/cmd/limbo/libmp/port/mpvecdigmuladd.c - 664 pietro sys 1112775199 1582 1201054289 253 a sys/src/cmd/limbo/libmp/port/mpvecsub.c - 664 pietro sys 1112775199 523 1201054289 254 a sys/src/cmd/limbo/libmp/port/os.h - 664 pietro sys 1114159391 72 1201054289 255 a sys/src/cmd/limbo/libmp/port/reduce-nt - 664 pietro sys 1116437577 87 1201054289 256 a sys/src/cmd/limbo/libmp/port/reduce-rc - 664 pietro sys 1112787028 306 1201054289 257 a sys/src/cmd/limbo/libmp/port/reduce-sh - 664 pietro sys 1140986970 184 1201054289 258 a sys/src/cmd/limbo/libmp/port/strtomp.c - 664 pietro sys 1112775199 3003 1201054289 259 a sys/src/cmd/limbo/libmp/test.c - 664 pietro pietro 1112778739 12243 1201054289 260 a sys/src/cmd/limbo/libsec - 20000000775 pietro pietro 1201053326 0 1201054289 261 a sys/src/cmd/limbo/libsec/NOTICE - 664 pietro pietro 1170424782 237 1201054289 262 a sys/src/cmd/limbo/libsec/Plan9-386 - 20000000775 pietro sys 1201054150 0 1201054289 263 a sys/src/cmd/limbo/libsec/Plan9-386/md5block.s - 664 pietro sys 985124884 5369 1201054289 264 a sys/src/cmd/limbo/libsec/Plan9-386/mkfile - 664 pietro sys 1201051882 186 1201054289 265 a sys/src/cmd/limbo/libsec/Plan9-386/sha1block.s - 664 pietro sys 985124884 3682 1201054289 266 a sys/src/cmd/limbo/libsec/Plan9-mips - 20000000775 pietro sys 1201053324 0 1201054289 267 a sys/src/cmd/limbo/libsec/Plan9-mips/md5block.s - 664 pietro sys 985124884 7204 1201054289 268 a sys/src/cmd/limbo/libsec/Plan9-mips/mkfile - 664 pietro sys 1201052681 186 1201054289 269 a sys/src/cmd/limbo/libsec/Plan9-mips/sha1block.s - 664 pietro sys 985124884 4143 1201054289 270 a sys/src/cmd/limbo/libsec/libsec.a - 664 pietro sys 1201054035 490748 1201054289 271 a sys/src/cmd/limbo/libsec/mkfile - 664 pietro sys 1201050984 260 1201054289 272 a sys/src/cmd/limbo/libsec/port - 20000000775 pietro sys 1201054150 0 1201054289 273 a sys/src/cmd/limbo/libsec/port/aes.c - 664 pietro sys 1114008934 64087 1201054289 274 a sys/src/cmd/limbo/libsec/port/blowfish.c - 664 pietro sys 1016466467 19676 1201054289 275 a sys/src/cmd/limbo/libsec/port/decodepem.c - 664 pietro sys 1084318869 1831 1201054289 276 a sys/src/cmd/limbo/libsec/port/des.c - 664 pietro sys 1015013579 17496 1201054289 277 a sys/src/cmd/limbo/libsec/port/des3CBC.c - 664 pietro sys 988225292 1135 1201054289 278 a sys/src/cmd/limbo/libsec/port/des3ECB.c - 664 pietro sys 988225292 917 1201054289 279 a sys/src/cmd/limbo/libsec/port/desCBC.c - 664 pietro sys 984710519 1079 1201054289 280 a sys/src/cmd/limbo/libsec/port/desECB.c - 664 pietro sys 984710519 861 1201054289 281 a sys/src/cmd/limbo/libsec/port/desmodes.c - 664 pietro sys 1015013579 647 1201054289 282 a sys/src/cmd/limbo/libsec/port/dsaalloc.c - 664 pietro sys 1063853600 900 1201054289 283 a sys/src/cmd/limbo/libsec/port/dsagen.c - 664 pietro sys 1063853599 1139 1201054289 284 a sys/src/cmd/limbo/libsec/port/dsaprimes.c - 664 pietro sys 984710520 1881 1201054289 285 a sys/src/cmd/limbo/libsec/port/dsaprivtopub.c - 664 pietro sys 1027629126 279 1201054289 286 a sys/src/cmd/limbo/libsec/port/dsasign.c - 664 pietro sys 1063853600 969 1201054289 287 a sys/src/cmd/limbo/libsec/port/dsaverify.c - 664 pietro sys 1063853601 925 1201054289 288 a sys/src/cmd/limbo/libsec/port/egalloc.c - 664 pietro sys 1063853598 811 1201054289 289 a sys/src/cmd/limbo/libsec/port/egdecrypt.c - 664 pietro sys 984710520 564 1201054289 290 a sys/src/cmd/limbo/libsec/port/egencrypt.c - 664 pietro sys 1015013579 806 1201054289 291 a sys/src/cmd/limbo/libsec/port/eggen.c - 664 pietro sys 1027629125 413 1201054289 292 a sys/src/cmd/limbo/libsec/port/egprivtopub.c - 664 pietro sys 984710520 273 1201054289 293 a sys/src/cmd/limbo/libsec/port/egsign.c - 664 pietro sys 1027629125 807 1201054289 294 a sys/src/cmd/limbo/libsec/port/egtest.c - 664 pietro sys 984710521 655 1201054289 295 a sys/src/cmd/limbo/libsec/port/egverify.c - 664 pietro sys 984710521 519 1201054289 296 a sys/src/cmd/limbo/libsec/port/fastrand.c - 664 pietro sys 1114008943 241 1201054289 297 a sys/src/cmd/limbo/libsec/port/genprime.c - 664 pietro sys 984710521 535 1201054289 298 a sys/src/cmd/limbo/libsec/port/genrandom.c - 664 pietro sys 1128755708 1167 1201054289 299 a sys/src/cmd/limbo/libsec/port/gensafeprime.c - 664 pietro sys 1027629124 741 1201054289 300 a sys/src/cmd/limbo/libsec/port/genstrongprime.c - 664 pietro sys 984710522 1039 1201054289 301 a sys/src/cmd/limbo/libsec/port/hmac.c - 664 pietro sys 1140531661 1183 1201054289 302 a sys/src/cmd/limbo/libsec/port/hmactest.c - 664 pietro sys 984710522 344 1201054289 303 a sys/src/cmd/limbo/libsec/port/idea.c - 664 pietro sys 1131537142 3077 1201054289 304 a sys/src/cmd/limbo/libsec/port/libsec.a - 664 pietro sys 1201050298 68 1201054289 305 a sys/src/cmd/limbo/libsec/port/md4.c - 664 pietro sys 1015013579 4260 1201054289 306 a sys/src/cmd/limbo/libsec/port/md4test.c - 664 pietro sys 984710522 537 1201054289 307 a sys/src/cmd/limbo/libsec/port/md5.c - 664 pietro sys 1084318868 3254 1201054289 308 a sys/src/cmd/limbo/libsec/port/md5block.c - 664 pietro sys 1112950686 5014 1201054289 309 a sys/src/cmd/limbo/libsec/port/md5pickle.c - 664 pietro sys 1104105067 716 1201054289 310 a sys/src/cmd/limbo/libsec/port/mkfile - 664 pietro sys 1201051893 877 1201054289 311 a sys/src/cmd/limbo/libsec/port/nfastrand.c - 664 pietro sys 1114008915 337 1201054289 312 a sys/src/cmd/limbo/libsec/port/primetest.c - 664 pietro sys 984710523 2486 1201054289 313 a sys/src/cmd/limbo/libsec/port/prng.c - 664 pietro sys 984710523 187 1201054289 314 a sys/src/cmd/limbo/libsec/port/probably_prime.c - 664 pietro sys 984710523 1567 1201054289 315 a sys/src/cmd/limbo/libsec/port/rc4.c - 664 pietro sys 1015013580 1415 1201054289 316 a sys/src/cmd/limbo/libsec/port/reduce-nt - 664 pietro sys 1116437459 87 1201054289 317 a sys/src/cmd/limbo/libsec/port/reduce-rc - 664 pietro sys 1112916404 306 1201054289 318 a sys/src/cmd/limbo/libsec/port/reduce-sh - 664 pietro sys 1140986952 184 1201054289 319 a sys/src/cmd/limbo/libsec/port/rsaalloc.c - 664 pietro sys 984710524 657 1201054289 320 a sys/src/cmd/limbo/libsec/port/rsadecrypt.c - 664 pietro sys 984710524 749 1201054289 321 a sys/src/cmd/limbo/libsec/port/rsaencrypt.c - 664 pietro sys 984710524 192 1201054289 322 a sys/src/cmd/limbo/libsec/port/rsafill.c - 664 pietro sys 1045502171 1104 1201054289 323 a sys/src/cmd/limbo/libsec/port/rsagen.c - 664 pietro sys 1084318869 1462 1201054289 324 a sys/src/cmd/limbo/libsec/port/rsaprivtopub.c - 664 pietro sys 984710525 237 1201054289 325 a sys/src/cmd/limbo/libsec/port/rsatest.c - 664 pietro sys 1114158854 1094 1201054289 326 a sys/src/cmd/limbo/libsec/port/sha1.c - 664 pietro sys 985124885 2279 1201054289 327 a sys/src/cmd/limbo/libsec/port/sha1block.c - 664 pietro sys 1015013580 4673 1201054289 328 a sys/src/cmd/limbo/libsec/port/sha1pickle.c - 664 pietro sys 988225292 717 1201054289 329 a sys/src/cmd/limbo/libsec/port/smallprimes.c - 664 pietro sys 984710525 6851 1201054289 330 a sys/src/cmd/limbo/libsec/port/smallprimetest.c - 664 pietro sys 984710525 70640 1201054289 331 a sys/src/cmd/limbo/limbo - 20000000775 pietro pietro 1201054151 0 1201054289 332 a sys/src/cmd/limbo/limbo/NOTICE - 664 pietro sys 1170424782 1276 1201054289 333 a sys/src/cmd/limbo/limbo/asm.c - 664 pietro pietro 1110378956 6546 1201054289 334 a sys/src/cmd/limbo/limbo/com.c - 664 pietro pietro 1143812201 28500 1201054289 335 a sys/src/cmd/limbo/limbo/decls.c - 664 pietro pietro 1166211285 24802 1201054289 336 a sys/src/cmd/limbo/limbo/dis.c - 664 pietro pietro 1108744737 11759 1201054289 337 a sys/src/cmd/limbo/limbo/dtocanon.c - 664 pietro sys 1106929631 431 1201054289 338 a sys/src/cmd/limbo/limbo/ecom.c - 664 pietro pietro 1143812452 52762 1201054289 339 a sys/src/cmd/limbo/limbo/fns.h - 664 pietro pietro 1110543570 10794 1201054289 340 a sys/src/cmd/limbo/limbo/gen.c - 664 pietro pietro 1110461787 19626 1201054289 341 a sys/src/cmd/limbo/limbo/lex.c - 664 pietro pietro 1166546137 22175 1201054289 342 a sys/src/cmd/limbo/limbo/limbo.h - 664 pietro pietro 1201049727 14107 1201054289 343 a sys/src/cmd/limbo/limbo/limbo.y - 664 pietro pietro 1166546132 32308 1201054289 344 a sys/src/cmd/limbo/limbo/mkfile - 664 pietro pietro 1201053279 461 1201054289 345 a sys/src/cmd/limbo/limbo/nodes.c - 664 pietro pietro 1106929632 26717 1201054289 346 a sys/src/cmd/limbo/limbo/optab.c - 664 pietro pietro 1110880792 10685 1201054289 347 a sys/src/cmd/limbo/limbo/optim.c - 664 pietro pietro 1166211262 31175 1201054289 348 a sys/src/cmd/limbo/limbo/runt.h - 664 pietro pietro 1106929632 37129 1201054289 349 a sys/src/cmd/limbo/limbo/sbl.c - 664 pietro pietro 1166214527 6783 1201054289 350 a sys/src/cmd/limbo/limbo/stubs.c - 664 pietro pietro 1107271730 14163 1201054289 351 a sys/src/cmd/limbo/limbo/typecheck.c - 664 pietro pietro 1144698971 75435 1201054289 352 a sys/src/cmd/limbo/limbo/types.c - 664 pietro sys 1166215110 93952 1201054289 353 a sys/src/cmd/limbo/limbo.proto - 664 pietro pietro 1201053146 47 1201054289 354 a sys/src/cmd/limbo/mkfile - 664 pietro pietro 1201052890 203 1201054289 355 a sys/src/cmd/limbo/module - 20000000775 pietro pietro 1201053337 0 1201054289 356 a sys/src/cmd/limbo/module/NOTICE - 664 pietro sys 1170424784 1299 1201054289 357 a sys/src/cmd/limbo/module/alphabet - 20000000775 pietro sys 1201053330 0 1201054289 358 a sys/src/cmd/limbo/module/alphabet/abc.m - 664 pietro sys 1099337448 1826 1201054289 359 a sys/src/cmd/limbo/module/alphabet/abcstyx.m - 664 pietro sys 1088004150 807 1201054289 360 a sys/src/cmd/limbo/module/alphabet/abctypes.m - 664 pietro sys 1099337448 837 1201054289 361 a sys/src/cmd/limbo/module/alphabet/endpoints.m - 664 pietro sys 1088004150 377 1201054289 362 a sys/src/cmd/limbo/module/alphabet/extvalues.m - 664 pietro sys 1097750796 315 1201054289 363 a sys/src/cmd/limbo/module/alphabet/fs.m - 664 pietro sys 1099337448 2027 1201054289 364 a sys/src/cmd/limbo/module/alphabet/fstypes.m - 664 pietro sys 1099337448 822 1201054289 365 a sys/src/cmd/limbo/module/alphabet/grid.m - 664 pietro sys 1099337448 1139 1201054289 366 a sys/src/cmd/limbo/module/alphabet/gridtypes.m - 664 pietro sys 1099337448 852 1201054289 367 a sys/src/cmd/limbo/module/alphabet/reports.m - 664 pietro sys 1099336405 614 1201054289 368 a sys/src/cmd/limbo/module/alphabet.m - 664 pietro pietro 1099418952 6595 1201054289 369 a sys/src/cmd/limbo/module/arg.m - 664 pietro sys 1042723313 240 1201054289 370 a sys/src/cmd/limbo/module/asn1.m - 664 pietro pietro 957453480 2463 1201054289 371 a sys/src/cmd/limbo/module/attrdb.m - 664 pietro sys 1057074737 2913 1201054289 372 a sys/src/cmd/limbo/module/auth9.m - 664 pietro pietro 1077404384 3683 1201054289 373 a sys/src/cmd/limbo/module/bench.m - 664 pietro sys 921242765 217 1201054289 374 a sys/src/cmd/limbo/module/bloomfilter.m - 664 pietro sys 1059683546 275 1201054289 375 a sys/src/cmd/limbo/module/brutus.m - 664 pietro sys 910822294 648 1201054289 376 a sys/src/cmd/limbo/module/brutusext.m - 664 pietro sys 1051722175 629 1201054289 377 a sys/src/cmd/limbo/module/bufio.m - 664 pietro sys 1064496256 1894 1201054289 378 a sys/src/cmd/limbo/module/bundle.m - 664 pietro sys 1069345885 320 1201054289 379 a sys/src/cmd/limbo/module/cci.m - 664 pietro sys 910822294 208 1201054289 380 a sys/src/cmd/limbo/module/cfg.m - 664 pietro sys 1049216330 552 1201054289 381 a sys/src/cmd/limbo/module/cfgfile.m - 664 pietro sys 910822294 596 1201054289 382 a sys/src/cmd/limbo/module/complete.m - 664 pietro sys 1168248522 451 1201054289 383 a sys/src/cmd/limbo/module/convcs.m - 664 pietro sys 992425277 769 1201054289 384 a sys/src/cmd/limbo/module/crc.m - 664 pietro sys 1064496157 699 1201054289 385 a sys/src/cmd/limbo/module/css.m - 664 pietro pietro 1117213818 1745 1201054289 386 a sys/src/cmd/limbo/module/csv.m - 664 pietro sys 1150187233 153 1201054289 387 a sys/src/cmd/limbo/module/cvsimages.m - 664 pietro sys 975347867 319 1201054289 388 a sys/src/cmd/limbo/module/daytime.m - 664 pietro pietro 994341011 1328 1201054289 389 a sys/src/cmd/limbo/module/db.m - 664 pietro sys 910822295 1797 1201054289 390 a sys/src/cmd/limbo/module/dbm.m - 775 pietro sys 1091200823 885 1201054289 391 a sys/src/cmd/limbo/module/debug.m - 664 pietro sys 1087318260 3053 1201054289 392 a sys/src/cmd/limbo/module/devpointer.m - 664 pietro pietro 1051722210 730 1201054289 393 a sys/src/cmd/limbo/module/dhcp.m - 664 pietro sys 1138623878 2154 1201054289 394 a sys/src/cmd/limbo/module/dialog.m - 664 pietro sys 1026867763 296 1201054289 395 a sys/src/cmd/limbo/module/dict.m - 664 pietro sys 910822295 311 1201054289 396 a sys/src/cmd/limbo/module/dis.m - 664 pietro pietro 1078831002 3845 1201054289 397 a sys/src/cmd/limbo/module/diskblocks.m - 664 pietro sys 1081597968 660 1201054289 398 a sys/src/cmd/limbo/module/disks.m - 664 pietro sys 1184408006 1424 1201054289 399 a sys/src/cmd/limbo/module/dividers.m - 664 pietro sys 1085214671 593 1201054289 400 a sys/src/cmd/limbo/module/draw.m - 664 pietro pietro 1052925661 11840 1201054289 401 a sys/src/cmd/limbo/module/ecmascript.m - 664 pietro pietro 1060459282 9016 1201054289 402 a sys/src/cmd/limbo/module/emio.m - 664 pietro pietro 910822295 4273 1201054289 403 a sys/src/cmd/limbo/module/encoding.m - 664 pietro sys 1080147237 338 1201054289 404 a sys/src/cmd/limbo/module/env.m - 664 pietro sys 954618021 380 1201054289 405 a sys/src/cmd/limbo/module/ether.m - 664 pietro sys 1051268702 242 1201054289 406 a sys/src/cmd/limbo/module/exception.m - 664 pietro sys 1039429723 537 1201054289 407 a sys/src/cmd/limbo/module/factotum.m - 664 pietro sys 1103292423 1023 1201054289 408 a sys/src/cmd/limbo/module/ffts.m - 664 pietro sys 910822295 1423 1201054289 409 a sys/src/cmd/limbo/module/filepat.m - 664 pietro sys 910822295 281 1201054289 410 a sys/src/cmd/limbo/module/filter.m - 664 pietro sys 1091771528 404 1201054289 411 a sys/src/cmd/limbo/module/format.m - 664 pietro sys 1127678090 864 1201054289 412 a sys/src/cmd/limbo/module/freetype.m - 664 pietro sys 1055175090 974 1201054289 413 a sys/src/cmd/limbo/module/fslib.m - 664 pietro pietro 1080160601 2144 1201054289 414 a sys/src/cmd/limbo/module/fsproto.m - 664 pietro sys 1060459392 361 1201054289 415 a sys/src/cmd/limbo/module/gamer.m - 664 pietro sys 910822295 251 1201054289 416 a sys/src/cmd/limbo/module/gr.m - 664 pietro sys 910822295 1072 1201054289 417 a sys/src/cmd/limbo/module/grid - 20000000775 pietro sys 1201053333 0 1201054289 418 a sys/src/cmd/limbo/module/grid/announce.m - 664 pietro sys 1055339413 208 1201054289 419 a sys/src/cmd/limbo/module/grid/browse.m - 664 pietro sys 1057055564 1805 1201054289 420 a sys/src/cmd/limbo/module/grid/browser.m - 664 pietro sys 1075136458 2909 1201054289 421 a sys/src/cmd/limbo/module/grid/demo - 20000000775 pietro sys 1201053333 0 1201054289 422 a sys/src/cmd/limbo/module/grid/demo/block.m - 664 pietro sys 1055417108 412 1201054289 423 a sys/src/cmd/limbo/module/grid/demo/exproc.m - 664 pietro sys 1055414347 232 1201054289 424 a sys/src/cmd/limbo/module/grid/fbrowse.m - 664 pietro sys 1057763704 284 1201054289 425 a sys/src/cmd/limbo/module/grid/pathreader.m - 664 pietro sys 1057763744 90 1201054289 426 a sys/src/cmd/limbo/module/grid/readjpg.m - 664 pietro sys 1060255480 2069 1201054289 427 a sys/src/cmd/limbo/module/grid/regpoll.m - 664 pietro sys 1059744042 158 1201054289 428 a sys/src/cmd/limbo/module/grid/srvbrowse.m - 664 pietro sys 1057828112 718 1201054289 429 a sys/src/cmd/limbo/module/hash.m - 664 pietro pietro 910822295 531 1201054289 430 a sys/src/cmd/limbo/module/html.m - 664 pietro sys 910822295 1263 1201054289 431 a sys/src/cmd/limbo/module/ida.m - 664 pietro sys 1141482113 588 1201054289 432 a sys/src/cmd/limbo/module/imagefile.m - 664 pietro sys 1027007899 1242 1201054289 433 a sys/src/cmd/limbo/module/inflate.m - 664 pietro sys 953133854 529 1201054289 434 a sys/src/cmd/limbo/module/ip.m - 664 pietro pietro 1137925402 2674 1201054289 435 a sys/src/cmd/limbo/module/ipattr.m - 664 pietro sys 1053085798 631 1201054289 436 a sys/src/cmd/limbo/module/ir.m - 664 pietro sys 958995511 662 1201054289 437 a sys/src/cmd/limbo/module/itslib.m - 664 pietro sys 1038930808 409 1201054289 438 a sys/src/cmd/limbo/module/json.m - 664 pietro pietro 1169492830 1487 1201054289 439 a sys/src/cmd/limbo/module/keyboard.m - 664 pietro sys 947163856 1140 1201054289 440 a sys/src/cmd/limbo/module/keyring.m - 664 pietro sys 1141921370 7200 1201054289 441 a sys/src/cmd/limbo/module/keyset.m - 664 pietro sys 1055418421 233 1201054289 442 a sys/src/cmd/limbo/module/libc.m - 664 pietro sys 1030030522 672 1201054289 443 a sys/src/cmd/limbo/module/libc0.m - 664 pietro sys 1025538199 1275 1201054289 444 a sys/src/cmd/limbo/module/linalg.m - 664 pietro sys 910822295 1009 1201054289 445 a sys/src/cmd/limbo/module/lists.m - 664 pietro sys 1186411050 922 1201054289 446 a sys/src/cmd/limbo/module/loader.m - 664 pietro pietro 910822295 758 1201054289 447 a sys/src/cmd/limbo/module/lock.m - 664 pietro sys 1053070456 213 1201054289 448 a sys/src/cmd/limbo/module/man.m - 664 pietro sys 1168969158 837 1201054289 449 a sys/src/cmd/limbo/module/math - 20000000775 pietro sys 1201053334 0 1201054289 450 a sys/src/cmd/limbo/module/math/geodesy.m - 664 pietro sys 1108045893 1820 1201054289 451 a sys/src/cmd/limbo/module/math/polyfill.m - 664 pietro sys 1034610312 406 1201054289 452 a sys/src/cmd/limbo/module/math/polyhedra.m - 664 pietro sys 1050054061 653 1201054289 453 a sys/src/cmd/limbo/module/math.m - 664 pietro pietro 1007638903 2875 1201054289 454 a sys/src/cmd/limbo/module/memfs.m - 664 pietro sys 951751177 118 1201054289 455 a sys/src/cmd/limbo/module/mpeg.m - 664 pietro sys 959359776 334 1201054289 456 a sys/src/cmd/limbo/module/multistyx.m - 664 pietro sys 984152511 276 1201054289 457 a sys/src/cmd/limbo/module/muxclient.m - 664 pietro sys 1026867795 871 1201054289 458 a sys/src/cmd/limbo/module/names.m - 664 pietro sys 1092643061 411 1201054289 459 a sys/src/cmd/limbo/module/newns.m - 664 pietro sys 910822295 157 1201054289 460 a sys/src/cmd/limbo/module/palm.m - 664 pietro pietro 1044276841 6269 1201054289 461 a sys/src/cmd/limbo/module/palmfile.m - 664 pietro pietro 1040311959 4009 1201054289 462 a sys/src/cmd/limbo/module/pkcs.m - 664 pietro sys 935511090 4427 1201054289 463 a sys/src/cmd/limbo/module/plumbmsg.m - 664 pietro pietro 910822295 831 1201054289 464 a sys/src/cmd/limbo/module/pop3.m - 664 pietro sys 1060459320 1275 1201054289 465 a sys/src/cmd/limbo/module/popup.m - 664 pietro sys 1051722258 551 1201054289 466 a sys/src/cmd/limbo/module/powerman.m - 664 pietro sys 1005323150 176 1201054289 467 a sys/src/cmd/limbo/module/prefab.m - 664 pietro pietro 910822295 3886 1201054289 468 a sys/src/cmd/limbo/module/print.m - 664 pietro sys 1013176441 1811 1201054289 469 a sys/src/cmd/limbo/module/profile.m - 664 pietro sys 1039166191 1553 1201054289 470 a sys/src/cmd/limbo/module/pslib.m - 664 pietro sys 954856304 154 1201054289 471 a sys/src/cmd/limbo/module/quicktime.m - 664 pietro sys 910822295 1296 1201054289 472 a sys/src/cmd/limbo/module/rand.m - 664 pietro sys 953054382 144 1201054289 473 a sys/src/cmd/limbo/module/readdir.m - 664 pietro sys 1054747648 583 1201054289 474 a sys/src/cmd/limbo/module/regex.m - 664 pietro sys 960208278 1107 1201054289 475 a sys/src/cmd/limbo/module/regexutils.m - 664 pietro sys 935511090 471 1201054289 476 a sys/src/cmd/limbo/module/registries.m - 664 pietro sys 1055508050 1252 1201054289 477 a sys/src/cmd/limbo/module/rfc822.m - 664 pietro sys 1149796148 1893 1201054289 478 a sys/src/cmd/limbo/module/riff.m - 664 pietro sys 910822295 1967 1201054289 479 a sys/src/cmd/limbo/module/runt.m - 664 pietro sys 1107271823 197 1201054289 480 a sys/src/cmd/limbo/module/scoretable.m - 664 pietro sys 958497357 341 1201054289 481 a sys/src/cmd/limbo/module/scsiio.m - 664 pietro sys 1126169332 617 1201054289 482 a sys/src/cmd/limbo/module/secstore.m - 664 pietro sys 1140785871 1193 1201054289 483 a sys/src/cmd/limbo/module/security.m - 664 pietro sys 1080211526 1261 1201054289 484 a sys/src/cmd/limbo/module/selectfile.m - 664 pietro sys 1109874080 354 1201054289 485 a sys/src/cmd/limbo/module/sets.m - 664 pietro sys 1059599782 831 1201054289 486 a sys/src/cmd/limbo/module/sets32.m - 664 pietro sys 1059598249 806 1201054289 487 a sys/src/cmd/limbo/module/sexprs.m - 664 pietro sys 1108741954 1028 1201054289 488 a sys/src/cmd/limbo/module/sh.m - 664 pietro sys 1085416110 3514 1201054289 489 a sys/src/cmd/limbo/module/smtp.m - 664 pietro sys 947090671 705 1201054289 490 a sys/src/cmd/limbo/module/sort.m - 664 pietro sys 1076634949 142 1201054289 491 a sys/src/cmd/limbo/module/spki.m - 664 pietro pietro 1189425941 5929 1201054289 492 a sys/src/cmd/limbo/module/srv.m - 664 pietro sys 1053348822 342 1201054289 493 a sys/src/cmd/limbo/module/srvrunt.b - 664 pietro sys 910822296 37 1201054289 494 a sys/src/cmd/limbo/module/ssl3.m - 664 pietro sys 1030698655 4851 1201054289 495 a sys/src/cmd/limbo/module/sslsession.m - 664 pietro sys 935511090 675 1201054289 496 a sys/src/cmd/limbo/module/string.m - 664 pietro sys 1189092935 1407 1201054289 497 a sys/src/cmd/limbo/module/strinttab.m - 664 pietro pietro 910822296 400 1201054289 498 a sys/src/cmd/limbo/module/strokes.m - 664 pietro sys 999763347 3431 1201054289 499 a sys/src/cmd/limbo/module/styx.m - 664 pietro sys 1082042945 3845 1201054289 500 a sys/src/cmd/limbo/module/styxconv.m - 664 pietro sys 1057236947 190 1201054289 501 a sys/src/cmd/limbo/module/styxlib.m - 664 pietro sys 1032972281 2825 1201054289 502 a sys/src/cmd/limbo/module/styxpersist.m - 664 pietro sys 1081189814 167 1201054289 503 a sys/src/cmd/limbo/module/styxservers.m - 664 pietro sys 1077634750 4836 1201054289 504 a sys/src/cmd/limbo/module/sys.m - 664 pietro sys 1184405820 3968 1201054289 505 a sys/src/cmd/limbo/module/tables.m - 664 pietro sys 1097751141 620 1201054289 506 a sys/src/cmd/limbo/module/tabs.m - 664 pietro sys 1026867755 304 1201054289 507 a sys/src/cmd/limbo/module/tcllib.m - 664 pietro sys 910822296 137 1201054289 508 a sys/src/cmd/limbo/module/tftp.m - 664 pietro sys 1053420427 147 1201054289 509 a sys/src/cmd/limbo/module/timers.m - 664 pietro sys 1060089008 237 1201054289 510 a sys/src/cmd/limbo/module/titlebar.m - 664 pietro sys 1054828051 423 1201054289 511 a sys/src/cmd/limbo/module/tk.m - 664 pietro sys 1051722274 851 1201054289 512 a sys/src/cmd/limbo/module/tkclient.m - 664 pietro sys 1051722328 702 1201054289 513 a sys/src/cmd/limbo/module/translate.m - 664 pietro sys 947248335 665 1201054289 514 a sys/src/cmd/limbo/module/ubfa.m - 664 pietro pietro 1140089457 1699 1201054289 515 a sys/src/cmd/limbo/module/unbundle.m - 664 pietro sys 1069348112 311 1201054289 516 a sys/src/cmd/limbo/module/uris.m - 664 pietro pietro 1148386658 1058 1201054289 517 a sys/src/cmd/limbo/module/url.m - 664 pietro sys 965394770 823 1201054289 518 a sys/src/cmd/limbo/module/usb.m - 664 pietro pietro 1125998168 3345 1201054289 519 a sys/src/cmd/limbo/module/vac.m - 664 pietro pietro 1181828567 4785 1201054289 520 a sys/src/cmd/limbo/module/venti.m - 664 pietro sys 1061404725 3279 1201054289 521 a sys/src/cmd/limbo/module/volume.m - 664 pietro sys 910822296 738 1201054289 522 a sys/src/cmd/limbo/module/wait.m - 664 pietro sys 1053722221 235 1201054289 523 a sys/src/cmd/limbo/module/watchvars.m - 664 pietro sys 1070347733 359 1201054289 524 a sys/src/cmd/limbo/module/webget.m - 664 pietro pietro 910822296 150 1201054289 525 a sys/src/cmd/limbo/module/winplace.m - 664 pietro sys 1085214687 244 1201054289 526 a sys/src/cmd/limbo/module/wmclient.m - 664 pietro sys 1139922020 1401 1201054289 527 a sys/src/cmd/limbo/module/wmlib.m - 664 pietro sys 1057156808 918 1201054289 528 a sys/src/cmd/limbo/module/wmsrv.m - 664 pietro pietro 1139922019 1408 1201054289 529 a sys/src/cmd/limbo/module/workdir.m - 664 pietro sys 910822296 115 1201054289 530 a sys/src/cmd/limbo/module/x509.m - 664 pietro pietro 923567360 9462 1201054289 531 a sys/src/cmd/limbo/module/xml.m - 664 pietro pietro 1166101264 1639 1201054289 532 a sys/src/cmd/limbo/module/xpointers.m - 664 pietro sys 1119524508 1300 1201058311 0 a sys/man - 20000000775 sys sys 1200170274 0 1201058311 1 a sys/man/1 - 20000000775 sys sys 1201058290 0 1201058311 2 a sys/man/1/limbo - 664 pietro sys 1201058290 3937 1201058311 3 a sys/src/cmd/limbo/limbo.1 - 664 pietro sys 1201058279 3937 1201058311 4 c sys/src/cmd/limbo/limbo.proto - 664 pietro pietro 1201058306 65 1201058564 0 c sys/man/1/limbo - 664 pietro sys 1201058542 3907 1201058564 1 c sys/src/cmd/limbo/limbo.1 - 664 pietro sys 1201058533 3907 ys/src/cmd/limbo/module/grid - 20000000775 pietro sys 1201053333 0 1201054289 418 a sys/src/cmd/limbo/module/grid/announce.m - 664 pietro sys 1055339413 208 1201054289 419 a sys/src/cmd/limbo/module/grid/browse.m - 664 pietro sys 1057055564 1805 1201054289 420 a sys/src/cmd/limbo/module/grid/browser.m - 664 pietro sys 1075136458 2909 1201054289 421 a sys/src/cmd/limbo/module/grid/demo - 20000000775 pietro sys 1201053333 0 1201054289 422 a sys/src/cmd/limbo/module/grid/demold_contrib//root/ 775 0 0 0 11411737727 126025ustar00pietrosysold_contrib//root/386/ 775 0 0 0 11411737724 131175ustar00pietrosysold_contrib//root/386/bin/ 775 0 0 0 11411737727 136725ustar00pietrosysold_contrib//root/386/bin/limbo 775 0 0 1544351 10745520630 15007ustar00pietrosysNP\,&$wL$uË`$D$A\@D$A`D$ FÃ`$D$F`$D$D$ @@D$FD$ @@(P,tBtFt R0uÉT$ $D$`$D$D$D$PFT$ 뿉T$ $qL$ D$`$D$A`D$A\@D$ D$D$FL$ A@@u(`$ D$A@@D$EL$ `$D$A@D$ET$ L$ $L$'E`$D$L$gEà L$$`$$D$D$L$$A D$ (ET$$BJȉD$J;L$s-`$5D$L$D$DL$A;L$rӋ`$:D$DD$$Hk Ã`$=D$D$D$DL$tAuADu I0uËA$$L$ADD$jL$؃`$KD$D$D$1DL$tAuADu I0uËA$$L$ADD$L$؃X `l$\\$`C@kP8/tQt$D$\$}MXÉ $D$l$C$D$ C(D$C$D$C(D$SCɉ $aD$l$C@(@$@`D$ S$ RL$CD$`@t`$yD$D$\D$BD$`@@x8D$PGt G@D$P1D$`@@(@ D$019t$$|$L_ ڋR$ R|$Pt<9͉L$8}4l$4D$0$D$PD$s|$LL$8t$$l$4E9͉L$8|͍̉_ ڋR $ RL$8O ȋ@D$T;l$8.l$4D$0$D$TD$ |$Lt$$l$4E;l$8~F90|$Pt?T$`R$ RL$8;l$8}&l$4D$0$D$PD$l$4E;l$8|ڋ`$D$}ACH,SL$DA$ $T$`BD$Yl$\D$DH0D$`Pʼn $[D$l$ڃ$R%D$ AtM t W,$C @D$IU $nD$l$ڃ$ RL$ @-C,$D$T$LL$$A9|`$D$JtB@D$>!3 $D$l$ڃ$ RL$ d>T$\D$`@ @H,L$D$L$fD$\L$D $UD$`$D$D$\D$D$D$ =L$DD$,A@@D$(A@@u6A@@@D$,`$D$A@@D$=L$D`$D$A@D$z=T$\D$,D$(‹D$DH0 C@8D$L $BD$l$>=`$PD$D$`@@ HD$=T$L1ɋ9}?`$UD$L$$J ȋ@@D$<T$LL$$A9|Bt!`$ZD$B@D$<`$_D$<CP8 $ D$l$T$LD$ Z<\$\T$L1ɋ9L$$J ȉ\$\$D$H@@ @D$~T$HD$\B J9tD$\$B @ @D$RT$HD$\`$D$D$\D$B@D$ ;\$\T$LL$$A9\`$0D$\$JtB@D$ r;P1ҋL$Tt BIu`$D$T$4;T$T\@uB@5BD$4B @$D$HBIBD$@T$8 $) D$(L$8I $ D$$`$D$D$(D$D$$D$ D$HD$D$@D$D$4D$D$8@D$u:`T$41ɋ9}fL$LJ ȉ‹@H B@@uADH $ D$A@D$B@D$ :`T$4L$LA9|Bu.$D$D$9T$8RPÉ$+D$B@D$9T$8D$@ `$:D$D$$D$w9T$(BD$JT$ D$D$;D$s:L$ uI`$LD$D$u7D$D$;D$rƋ`$XD$9 Ãu"`$OD$D$'7밃"u"`$RD$D$7뉃\u%`$UD$D$6_`$L$58HL$tA=u IDuËAD$ |$ u&`$[D$L$AD$8L$`$`D$L$L$7L$딃=4`@| $C4`4`FL$  4`Ë4`u1ËFÃ4`J|T$ F;L$uËA$D$V9T$J̃ T$L$u Ã,A&Ut@t t ËIt&L$A@$T$T$D$Huڃ ËA$T$z Ãt#uL$A$T$YD$@$D$D$B ÉL$A@$T$(D$@@$D$D$ ÃID+t42cTt4VL$A$T$T$D$H ÉL$A$T$D$@$D$D$7 à $CT$$ËL$(L$,HJI8HJI H L$0H@ `H`1h1ҋE9}#M ȋ@@@uFBE9|݉s ËT$L$t9uËI0u1Ã4`C1l$1t$,\$(KtXL$$Q J0JTT$ $l$t$,l$T$ uj0ՉT$B$JI 9vƉD$,D$$Hu4$L$D$L$(I $L$L$L$L$\$(CT$tj0JTJ0BTuC[4à T$1ۃtjZӉu؃ Ã\$L$u AAu5Q 9u1BuJDI $\$øËQ$\$tT$R$T$T$~u1ø T$JDI $T$SL$A Ã\=at\Ã=au = btJD$D$$0J\Ã=`ua<` |1;`}40`@u\$(0`$I\$(C;`|D$,D$(D$(;`L$(0`=~t*$C@D$C D$\$L\$ \$LC ~=Cu\$L$X\$L1D$,D$,0`$'D$(D$(;`gD$,`=at ($=p`@Dp`=at\#ID$X$/7=at\ËL$X $DD$XH1ۉ\$TD$PƒtS=vt*D$B@D$T$LB D$\$TT$LB t B$R0u$L$XL$L$wQ a $D$ϑD$X$:z贐D$HL$X $L$HL$RD$X$D$L$LD$4L$H $MD$0T$PtI=vt&U$B@D$T$LB D$T$LB t L$TI$J$R0u=otf$D$X$PD$@L$Xt D$@I0u a $L$4L$L$XL$1D$< p` $D$DK  aAttL$ $D$ Hu Xa $yh`ÉD$8 <` ɉ <`tщ<`={t-p$D$DD$D$@D$D$T$@B`L$$JTL$@A$;<`~ A$<`=`tA\$L$lL$@|$ tD$ @0<ËA@,BX,=I0D$,$D$0D$D$L$ 2/B@ u(J $T$(JL$L$],T$(uT$(B$3L$(Q*JgAVtYȋJHDpT$tT$tB' g| tCL$t $'rD$t$袃L$t $D$L$OpD$t$aD$l +T$tRJpa;P`|8$3a aX`D$t@ b\$t aaaCtZ tAtFIt7 aD$ aa$D$D$]pÉ$ 뿉$ 뵉$뫃t2D$t$`D$N T$tpaD$h;P`|#$2a a `D$t@ ыb aaaD$t@$ aD$ a`$D$D$L$tI $o@Et T$$BB;aT$$BEt\у$IuMuHD$lD$l$D$hD$fD$ aa$D$D$pL$$ $ L$D$D$ D$D$luL$$ $蓀D$L$ $D$D$=D$lh4? Tt }D$t$D$D$D$ D$pÃ#'&6J $cn‹L$tAD$$@uB;aD$hD$$$L$$ $L$D$XD$lOa;P`|$/a a `D$t@ ыbO aaaD$t@@$ aZD$ a`$D$D$D$t@@tD$t@@$}a@H$D a $ L$D$D$ D$tD$D$$D$hD$W D$D$l$D$D$5D$ aa$D$D$ pÉу$Iu upBE `JB L$tI $L$D$D$ D$D$hD$dD$t@$tD$`L$tI $ L$D$D$ D$SD$\L$tI $L$D$D$ D$T$tD$l$D$JIL$<L$lA$C@Pt$B@dRu[؃u‹$ $ 󥃄$DŽ$|DŽ$$  $T$0T$T$GD$L$ $NiD$$ $D$aD$D$D$ $D$b1$|$$  $T$4+T$0T$T$~GD$L$ $hD$$ $D$aD$D$D$ $D$1$|$$@t$  $T$$L$D$ $L$>$I H,D$D$D$dD$D$aaD$ L$D $D$$ D$ $L$L$D$ D$6VD$$  $L$L$L$L$D$ &‹@$H8$  $$T$'E$BDƄ$DŽ$DŽ$Ƅ$A$B${D$l$ $D$$D$D$ $D$D$l@4$$$$D$@D$<D$0D$8D$pD$h$ H]D$x$A@H$t$dl$@Ë$@@dzD$h$@t: a $ L$D$D$ D$L$xH@D$x$H$nD$D$x$D$D$=it$$@@D$ҵ$@$] a $ L$D$D$ D$FL$pH@D$p$H{D$D$p$D$D$$$$L$hH$@$]k$$D$?#Ë$@XD$\$DT$(D$$L$T$,D$$H0ԋJtL$A$D$0D$NT$,D$H׋B ;ax$D$T$4D$D$$D$0D$T$,?T$uD$BVuRJQuJt1ø818à `|.KltBtBJ4HB4R0ދat.@H,tA@A4I0uRua`lXD à =x $D$"D$1 $L$L$ aL$D$ `1 $D$D$5 `AD`p\D1 $L$ `L$MaBx $D$raB$T$1 $L$ daL$D$Fx $D$T$B$T$`t`D Ã(\$,CPB u(Ë$CD$GxD$\$ T$D$BD$(Ã(T$,tBBtJ Bt4twtBtB R0u(Ã=btߋB u׋BtϋB@tċB@.t$BD$xD$T$,T$ T$,뎋BDuB<tD=bqB e$BD$xD$T$,T$ T$,:$BD$xD$T$,T$ T$,딋r t$B@u&BX,tK J C[0uB@ u^Bh,tPE ƋEPt EPM H Eu)EX,tC ƋCPt CPK H [0um0ur =bbYB<M$BD$xD$T$,T$ T$,"CDuCXtl=b$C B< $BD$xD$T$,B@D$ \$$C@D$3t$\$$T$,B<u$BD$xD$T$,B@D$ \$$C@D$t$\$$T$,EotM@=b3B '$BD$yD$T$,T$ T$,=btB t,B;daBDBD@ J H Bt̋$BD$xD$T$,T$ T$,뤃V $D$D$.D$b $L$L$D$.L$ H L$$Hà T$$=`uB@u B@uD$ @V $D$D$I-D$ $L$L$D$(-L$,H L$ H(ÃD$ H $L$L$mt$ T$nӃt jӋR0uFX ÃV $D$D$,D$, $L$L$L$ L$,L$$H ÃD$H $L$L$ -aT$Ӄt jӋR0uD$@X ÃT $D$L$L$,L$ƒt ׉ιЃÃ' $L$L$L$L$L,L$Hà D$$XCAu%C @PBS B \$Cu$D$9 D$$@@4t.$D$ $D$$@@4D$ $D$ $D$$@@,D$ . T$$JA,B@HtB$T$$B@4t L$$IA4D$@u É$\$K IL$L$$IL$D$ $L$L$ \$T$8\$L$0I $L$$L$D$ы\$$T$0D$<$yD$T$\$ BD$D$BD$D$$@tD$<$BzD$D$0D$D$$L$0IILHLD$0L$$HL$$I, $ L$L$r \$L$$A$T$BD$t$>t$,\$(T$tRD$$Hu‰؃ øz$\$et$,l$$\$(뒋E @Dt4,$zzD$l$M IDD$ AD$it$,l$$\$(tE XD؃ 1 ËK $KL$t$t$,l$$ÃD$(1 ËL$A u1ËA<t1ABuT$$vT$R0M` `l ËA$@@9uA$J@H@1d-`T$@|{$-`T$ElXDtc-`-4ctaB,9t@T$BtJI $-`T$u]{$-`T$Zt Bu R0uËCt C@,9s KJ4S֋KI4J4B,uu몋T$tBt BuR0uËBJ4HB4-`1ۋT$ tGB,B uL$JZt Ct\$ C@,9sEKJ4SӋR0u|$ tXDuD$ lXDËL$ H0T$$-`\$ T$KI4J4뜃 \$`|' ltA9uȃ ËI0uJ}1 ÃL$ $ L$L$$L$L$(H0L$ HÃd $]‰Ǎ5׋t$L$JL$JBЃÃd $‰Njt$B0ЃÃ1ۉ\$ \$T$ t-T$$\$ƒuӉT$T$ D$P0uӉ؃ËD$ P0\$T$ u؃ÉыA0t I0A0uY0Ѓà T$1ۃtj0Z0Ӊu؃ Ãl$$T$ D$BT$,B@,D$ |$ t D$ @0uI|$ t6D$ L$$H0JI, $ L$L$yL$,A$(ËBL$$H,ɋD$ @0D$ 뗃$\$(=]t|$C@D$轅\$(C@u$ËC`D$ CH,t D$ I0uCP4t BH,t l$ I0uR0u$El$(\$ ƒtBH,t I0uR0uuE@,$ËEH,K~ I0KA0MI, $ L$L$BL$(A$$ËD$HtAu A@ tIu1ËD$HtAu A@ t Iu1ÉÃL$Au1AH L$ u|$iL$ It At1ËA@uA@4ËD$@u1Ë@@4Ã\$ 1D$C7C *C u<[(Cuu\$ K, $L$L$*L$ ‹A$t A$@@u6uL$ $SƒtB8D$|$$t D$$L$ЃËA$@@@8D$Cu\$ K, $L$L$\*L$ ‹A$t A$@@uXA$@Xu\$ K, $L$L$*\$ ‹C$KC$@@$D$D$D$aa x`ȋL$D`Ã$D$D$D$D$ x`a $D$D$D$D$JIL$ a D`Ã$D$D$D$7D$-x`aCʈCʈCʈCaD`Ã$D$D$D$-x`aT$$ΉCʈCʈCʈCD$ CʈCʈCʈCaD`à $D$$D$D$ D$($D$D${-x`aD$CʈCʈCʈCD$CʈCʈCʈCaD` Ã$D$D$H$D$@D$D$$L$`$AD$AD$Ãl$ax` aD$9uV;- auND$ a|$|D$;`}É$`D$ aÉx`뾃tu$-aD$a1ɉ aD`넉$D`D$1a$`$x`D$aD$l$x`뎃$L$ $ `L$趽L$T$L$  $\$(`1t\$(C=[Du-`~`$`D$l$p`$F``={tQD$ $`D$\$ 1ɋT$ )ڋD$ȉT$D$M$D$D$D$D$\$ 1h$Á|(`$`D$-`l$к\$(1E `KKrK rK dE-``ʈC tC$؃(D$c-`\$(C tC$؃D$;-`\$(C C$؃4D$-`\$(`T$1ɋD$Lt99t.t-t$t $fË$XD$H ݋J؃t߃u )tŃtuB@P@$)멋B@PH$랃 t u뱃 5`-`\$| ?| }ptcn$\$r5`-`\$ EʈEʈEʈE-` Ã~u뭉%? EʈE-` ÉE-`ȉف à T$\$|$tD$\$L$ L$J D$\$L$ L$J L$\$|$tD$AD$D$ ËD$AD$-`a1҃<|B<}1҃$(t&4$D$ED$l$ $(D$-m$( DŽ$DŽ$DŽ$D$dU]$ED$0D$081tP  st$t$l$趩$( B0u%4$$(D$l$0$( C B r.$$L$$(L$w*$,$‰,$D$0D$\$D$ $T$g$($t&$$$D$AD$L$ T$k$$4c$$%c+$BK8sr$$L$$(L$)$,$É$B ($$L$D$t)$,$$$L$$(L$A)$$ $$L$D$)$,$$( $$T$p$,$(l$0$$tdB r$$$L$t$($(l$0‹$$$l$T$D$ t$e$$a<- Ht54$T$@p$,$(l$0$$BK8s<- Hp$CC$B r,$$L$t$'$($$4$$\$o$$$$(T$0t? $T$l$D$ \$d$$`$$`< Ht*$l$'o$$$$(T$0u! $T$l$$D$ \$zd눋$,@;dat͉ $ HD$$D$D$ \$;dF$BK8$ $KL$t$r\$D$$L$L$T$($($É$B $$L$D$!&$($$P$$L$t$%$$ $$IL$D$[$D$$L$L$T$m$(G;da- HD$0ӋWkG;daBC r$$$L$t$C%$(l$0Ë$$$- HD$\$D$ t$b$$8^> $B r,$$L$$(L$$$,$MI( $$($$$D$tufȉ$=atQD$L$D$D$ \$`$t$($L$6$$Q]W뭉똉,$L$D$BD$8$$ $D$D$D$L$ $D$$$$D$aD$D$D$ $(D$e$$ $ L$D$D$ D$_D$4^D$D$8$D$D$f$$ $D$D$D$L$ $OD$$$$D$aD$D$D$ $(D$cdp^D$D$4$D$D$eC;`uMKBAuB @;`B0u(4$$(D$l$'D$x$[BWu(4$$(D$l$$D$x$Z[`B^$$T$HN$$1$$,$ƒtqMHE$$T$\$m$(t4$$$D$$,@D$$D$ L$bD$x$Z$$$tq$,IH$$\$&<$(t4$$$D$$,@D$$D$ L$sbD$x$ Z$(u B^Bs BA$$$,@D$D$iV$,@$$D$$D$$$$$$,@D$0;$(t4$$$D$$,@D$$D$ L$}a$$YD$x$Y $\$KnC@$\$<D$x$XC^$$\$K$$u&$$,$$FBA$\$J$,$$B r.$$L$$(L$$,$‰,$$T$\$f$(t-$$$D$AD$$D$ L$_$$W$$WD$x$wW}$ $KL$D$ T$D$$L$L$T$$,$É$MHÉ$$(u7L$x $KL$D$S$$$,$$($(DŽ$(d |Ot B s54$T$E@(D$$(D$ K]$$EVK$$L$$(L$$$$,B r.$$L$$(L$$$$,‰$ZCt]E@tQ4$K $^MID$T$D$ $(D$X$$nUtK $^MI=D$0u4$D$T$$(D$ q몉$ML$q\$$$ $D$\$D$L$ $$$$D$0D$$D$L$ $(D$W8B.u9t $(u&$D$0D$l$$(D$ M؃t $(u&$D$0D$l$$(D$ %I؋B$$D$T$$ $$(D$L$$$S)tB0u4$$(D$l$$B r9$$L$D$B$$$,$‰$$(t;4$D$BD$T$ $(D$[$,$$C r&:$l$蔘$,$$,$D$0D$\$D$ T$W$$R$B r)$$L$D$Q$$$$(L$&a$($L$x $$,IL$T$N$D$ $D$D$L$$$$$D$AD$L$ D$xD$DZL$x $$(L$`$(u*$$$D$AD$D$xD$ L$Y$$QD$x$~Q$$$D$AD$L$ T$Y뷃-s(&!")*+$L$D$5$D$8A$$(D$AD$F$BtyD$8D$4J $ L$D$D$ D$SD$8RD$D$4$D$D$iZ$A$$(D$AD$RD$D$8$D$D$(ZB r'$$L$$(L$$$‰4$D$$(@D$T$ $(D$X$$O5n.,0}1@C x$B r5$$L$$(L$$$$‰$$(@rdL$x $$(IL$D$KD$$$ $L$L$$(L$V$$$$$((B@(@ ti4$L$T$$(D$ \$Q$t/$$N$$BND$x$6N<$$"NϹB@(;`uszrptf$BK8sy$$L$$(L$$$$É$B x$$L$D$C$$$‰$A$$L$$(L$ $$ $$L$D$$$$É$CszB r+$$L$D$$,$‰,$D$0D$T$\$ $(D$P$$L$$L$BK8$ $KL$D$H$D$$L$L$T$$,$É$B B$$L$D$$,$$$L$D$~$$ $$IL$D$EH$D$$L$L$T$$,$,$$L$$(L$$$$D$AD$L$ $(D$kS$$JB r.$$L$$(L$$$$,D$0$J; dau$(t&4$D$ED$l$ $(D$$Q$( ø$l$:B r'$$L$$(L$?$,‰,$D$0D$T$D$ $(D$L$$$$q>w$BK8sr$$L$$(L$$,$É$B $$L$D$$,$$$L$$(L$$$ $$L$D$d$,$k$[$$B r2$$L$D$$$‰$EEuY5 $T$D$0‰Nj$$ aJ$$$$$EC r)$$L$D$f$$D$0o$(@;dauD$0q$$(L$K$u $$(D$L$$$$D$0D$$D$$D$ $(D$?$$;$$;D$D$;CM8L$D $ML$D$a8$D$$L$L$T$$$$C $$L$D$$$$$L$D$$L$D $$IL$D$7$D$$L$L$T$d$$1ai[]th^k,$$($,ƒt1KH$$$D$CD$T$ l$B\,$\$KB r'$$L$$(L$$$‰4$D$BD$T$ $(D$GB$$9$(t*$$T$$(D$;$D$x$$BD$D$66$ $D$xD$L$D$x$X9^e f ' t$(l$,T$$Bu[B@D$B$D$BD$L$$I $L$(L$L$,L$D$$D$$8D$$ À=m=MZB.tG4$JL$l$G5L$$D$ $D$D$L$T$(׋t$$Ѓ CuC@CuZ4$\$C@D$l$4L$A$D$(D$AD$\$$D$(NjKH‰޹Ѓ É4$\$CD$l$4L$ $D$(D$L$=\$$L$(KC؃ ËC@uX\$KI $t$l$:L$IAD$$$rL$$A rh$L$|L$$ȃ É4$\$C@D$l$3L$A$D$(D$AD$l$(\$$T$BM H B@jBC2]$T$&t$(l$,T$$$DŽ$DŽ$D$pD$<$@P$@@h$@$$EG$B r'$$L$\$$‰$$@ $$pD$$D$l$ T$8$t4$$D$$@D$$D$ L$=$$x5D$P$l5$$]5D$$Q5$Ë$@ =$ $L$PL$D$$$$$BM8$ $ML$\$|1$D$$L$L$T$2$ʼn$B $$L$D$2$‰$S$$L$D$$$ $$IL$D$0$D$$L$L$T$$ʼn$$DŽ$DŽ$D$pD$<$@h$@@$$P$$@$E r',$$L$\$$ʼn$$@9  $$QD$$T$$D$ l$5$$2D$P$2$$2D$$2$t;$$D$$@D$$D$ L$:$ȁB ;$L$PL$D$$B r$L$PL$D$$L$ $ aL$D$p.$@$0D$$D$$D$ $L$5$ $AD$$D$D$ $D$5$$IB r $vL$ $ aL$D$-$@$0D$$D$$D$ $L$ 5$$t4$$D$BD$$D$ L$8$DŽ$$BD$$D$D$ $D$4$$D&"-)S&=@G[f$E$I8$ $$IL$\$D,$D$$L$L$T$$$$E ,$$L$D$$ʼn$,$$L$D$$$ $$IL$D$+$D$$L$L$T$B$$$n$A$Q$B;AD$$$s$B t B [B@(;`t$L$$ $QtD$$$D$$@@tw$II $迂$B JI, $ L$L$k$D$JI $L$L$JI,L$$I A`$P$aD$D$)$@$$@$1D$X$$@ $@ r&$ $L$lL$D$$$@At$@.$@ t$@ @$$J $wtt$D$D$UD$4$$@@D$D$($A$D$4D$AD$~T$4$PJ$Pb$@ u$@@$@$$D$$@D$D$ $PD$q.$5XE 󥍼$5XE 󥍼$5XE Ƅ$Ƅ$a$Ƅ$,Ƅ$-$P$0$$4a$8Ƅ$.Ƅ$$$$@X,D$ $K$L$ $ $\$(C@<B@$B$$D$$BD$$D$(X0\$(A@tA$)$\$(Q`D$ ;<`~ D$ <`$tpDŽ$ DŽ$$@@($$ $'L$$L$D$ $L$y,$II H,$@ uv $Yu $$L$$PD$$D$ $D$,D$l$(D$8$($P$(ĄË$@uJ$Yu$$L$$PD$D$ $@D$+됺$Yu$ $T$$PL$D$ D$G+$I H<@8C$$ $L$D$D$ $PL$*@$I H$h$$ D$$D$$D$ $PD$**$@D$8$$@D$D$$$ $D$8D$L$D$8$L$l $JI(L$D$#D$$$D$D$$D$nD$l$&Ąø$Ul$B D$$jB@ D$$[B@ D$$B H =It#$$D$$D$ 1ۋ$Ѓt,BHtA@duZIuRЃuԃt$$CD$$5XE 󥍼$5XE D$p$aD$D$n"$Ƅ$1Ƅ$ $DŽ$a$Ƅ$.Ƅ$D$p$A@($$t'BHtA@du#IuRuٍD$p$% ÉT$8BPT$,L$0At!$1L$T$jL$0D$,D$$D$ D$\A@N%D$<$aD$D$I!T$0r|$<B$D$DL$A HH $D$7L$u0aËL$tA uËA @HtA @Hà L$tA u ËA @HtA @Huo$A @@D$CL$A HH ÃaPDu(L $E‰Ǎ5HaPDaT$ aJH=a}o$-CT$ ЃÃa@DtùL $D‰Ǎ5HaPDЃÃT$D$@;`u1É׍5XE B.B $T$tIL$nT$BL$IJЃÃNjL$fHËt$C u C o$\$\$0B\$|$ t/؉\$$D$ D$: \$T$ R K|$$tA؉\$($D$$D$ l$$\$U KCtECt<|$(t/؉\$4$D$(D$\$T$(R K؃øo$l$aA\$C "$l$,\$8)KI2ƒD$u4p$jD$D$0D$D$4D$ \$@\$8T$4T$0NjL$fHËt$(t+؉\$ $T$\$ T$0R K|$4tA؉\$ ($D$4D$l$4\$ U KCtECt<|$8t/؉\$ 4$D$8D$=\$ T$8R K؃$øAp$l$?\$ 뭋L$( $T$L$0L$L$4L$ \$d$Ã$|$0t$4l$,_;`u^)K2D$u hp$jD$|$t$ R?T$0NjL$fHËt$(t+؉\$$T$E\$T$0R K|$4tA؉\$($D$4D$l$4\$U KCtCt؃$øp$l$>\$,T$8D$ D$ D$D$J D$up$BD$K>T$8BT$4NjL$fHËt$0߃t$L$Kt+؉\$(($T$\$(T$4R K|$<t/؉\$(4$D$l$D\$0T$HR KE ufC؃4ËB utN$z@t$D$ $5D$D$@@$D$(D$D$@@ D$$14Ã\$L$ t Q@Y@уuÃp`L$ Au9uAB=uBD9tIDtAtL$ tAuƸq$:L$ 볃D$$1\$SDtBuJDKDRDuaÉ T$$t Bt BB@t5B@@ u)B@9t"B@J@I@9tJ@I@J@B@@ tB=4t@ t, t#B@tT$$B@$eT$$RD` ÉT$$B<@@8@$=D$$@<@@8@ D$D$$@<@@8D$ 1;T$ }'T$ T$ @$T$B;T$ |ًD$$@=u D$$f@ ËJ@A4t ttB@$ ËZD؉׉ιZD=t=u׃ ====T$$B@$(T$$fBL$$D$D$D$u|$ t$At4t^t3t%q$L$\8|$ t$ËA D$A t A D$ҍD$$AD$I뽋A t A D$묍D$$AD$#뗃t-tsʃ$RD$qA D$eA@$D$VD$$AD$>et tF t D$$AD$L$$AQ$RD$D$$AD$cttA D$D$$AD$,L$$AQ$RD$}(T$,BL$0I8t1(ÍD$$T$D$$D$0D$L$ ;L$u L$;L$t1(ËL$$;L$u$L$( $L$,L$L$0L$-b@1ۉtBu]tSJKRun1ۉ\$5btC\$ Rut:q$5\$؃$Ëj뮉몃$D$(@X,tC[0uD$(@@(P,tmBu\B\u JPI\J\B`u JPI`J`=~t1uq$B@D$T$BPD$ T$ B\D$T$ R0uT$(RR(R$RD$R$ËCPK\H\CPK`H`=~>Sq$C@D$\$CPD$ \$ C\D$\$ C@\$ CP,BuPBPJ\H\BPJ`H`=~t5dq$B@D$T$BPD$ T$B\D$ \$ T$R0뙃T$11t,B0D$B0B@u#uՉ׋T$uԋD$ (؃ÉW0uӉۉV0@D$$T$Dt4BB B=uuL$$JRDűT$Dt?Z$t BtAZ<t Bt%B@t BJ@IJ8RDuD$$@ËK\IJ8ЋK\IJ 봋Z$tBiC`tK` J ZJ BBZ0tBC`tK` J,1ɉL$(BtkjaPq$T$8T$c2L$(T$8}|uZ<tBu\K\IJ8Z4J8BtBtL$$JD$$|srq$T$8T$1T$8ŋK$J4BtE(t@-B<t,$\$L$L$$D$$L$ =$BD$qD$T$ B(D$T$8B(D$D$-D$8$-D$D$uT$8J,J(tt  v̋B0@PH$K$J(s q$T$8T$0T$8K$Jq$T$8T$D$$D$y0T$8 T$$փ(|$BD$ BL$,J(B0L $1T$$Éljֹ׍5H׉޹ZDЋL$(fJ׃t$L$ JBL$,J4L$0JBKHJH؃ ÃL $<1l$\$‰Ǎ5HKDJD؉SD׉޹L$fJBЉj׃4ރ(KJBKHJHCk(C0ЃÁ4$8EEX1CrC=TurD$0$0Cu,$rL$4ÍL$0 $$0L$rL$T$ /$0½rC t2$$0L$KL$كL$ $0½rC tY$$0L$rL$l$ /$0$$0L$KL$ك(L$ l$0½!rC tT$$0L$#rL$l$ */$0$$0L$KL$ك4L$ $0ƒ=at C$=atC<uS=at,$$0L$0rL$ލ|$ .‹$8 $L$0L$X4Cu$$0L$+rL$Ku #k-É$FÃ;{6)t3tۃ1tփ2˃4tƃ5뻃7t8t9t:l:u Ã=u :Ã^&>u +=6=u Ã-u Ãu!=u >Ã[/]4!=u ^Ã{|t}~==u Ã|u \|ÃR‹$aBaBЉ`=5BЃà T$$(&'tA9u Ãu(tA9u Ãu|lml øk$T$tT$$Ӹl$D$^D$ D$ AD$ݧl øl$D$cD$\$ 諧l Ë@ Á)t*l$D$fD$@D$ Ul Ã,|$4L$01\$09s61‰ 1Љȉ1C9rʋD$0D$l$p tB;D$uB9t{Ruu $D$h,ù $D$($D$D$;l$D$(L$0HL$4H p Hp ,ÉT$(J $L$0L$|$΃|$4T$(YD$0$D$(,Ãl$ \$$UC9~SM $KL$T${uD$ @L$$I)ȃÃÃD$ @L$$IȉD$A $T$ D$$BD$BD$t\$$L$ IT$ $CD$CD$L\$T$$\$Ã,\$0D$1ƒt71‰ 1Љȉ1Cƒuɉ)D$l$ 2t8B;D$u$T$(J $t$试t$0T$(Ruȹ $wD$($D$D$.D$(L$ H L$A $BT$(BB$D$0D$D$@D$"l$ T$4\$(u(f 2KL$K2؃,ÉЃ,ÃHD$T@D$$D$Tx ~ D$*C"19}3L$$Ń thtct^tY tTC݈F9|͋D$T@9tC.C.C.C"L$L $L$PL$L$*L$HÉC\C -B렃 t t"t܃\uՁ =auw=atn$0D$ $$ D$$,D$L$L$ [$D$$$D$$(D$ D$ D$ Á Á =auu=atl$,D$ $$ D$$(D$L$L$ Π$D$$$D$AD$ D$ D$m Á Á a aBa9|!9u$D$( Í$0D$ $$ D$$,D$L$L$ $D$$$D$$(D$ D$ D$躡 Á a aBa9|!9u$ɀD$| Í$,D$ $$ D$$(D$L$L$ q$D$$$D$AD$ D$ D$ Á0a aBa9|!9u$D$Ҡ0Í$8D$0$$0D$$4D$L$,L$ Ǟ=`t[D$ $ ` $^D$$D$D$ D$D$$D$ D$D$D$0D$;0ÍD$ $$D$D$ D$D$$D$ D$0D$뽁=atX=auO=`tl`$=`t`a$=atD$$-Í$$D$$$D$$ D$L$L$ 荝$%D$D$D$@[@T$DBB@\$8D$$D$8\$eD$ ]=L$D $L$L$(@Ãt$l$T$ 9u BЃEÃtB9u BЃEEÃuЃÃl$$T$ 9uЃÍD$,$l$L$(L$D$D$ 蛜ÃL$ $OD$ uE$IL$ ȃà \$T$u*$L$uS$L$ȃ É$T$衕Ѓ(t$81} ؖD$D$ t'\$0l$4D$T$ ՃD$T$ uFt,D$$D$D$D$D$ D$ D$ҀL$,D$D$ A(Ë\$0l$4D$0T$4 ՃuD$0T$4ZӉՉӉՉ\L$1҃} ىȺ\$ȃt D$L$\$ȃut t$\$D$D$L$\$뼃D$ $-|$\$\$v&D$\$D$$D$\$PzD$؃$D$,$D$0D$?{\$D$8$\$D$4$t$L$\$\$v&D$\$D$($D$\$y$D$؃D$ $W\$ D$$D$D$zL$ Ã\$ CtUAt^t1øËS B<tR<Ju!KIt KIu 11ÃT$JZQ,tBL$I9u!\$u$\$CË[R0ăLD$P@D$\$P‰؉SD=~t!$\$T$HT$s\$PT$Hu LÍ|$5XE D$$A؉\$4ލ|$CD$0L$ $T$D$Là l$,\$$T$(B@tCqt t$eD$\$&1 B^uGRt6$T$(JL$l$tl$,\$$u1 ËD$(Puʸ B uR뮉$yD$\$T$ 1 B u؃|$D$\$l$ |1 El$,JI( $̂D$D$$荅L$(\$$A@t$JD$\$*1 ËQt9$T$JIL$L$,L$z\$$u1 ËD$PuǸ Ãt B à t m d [ȃ>ttt=8 Ãt ! Ãtكtԃtσă<|$Dt$@D$Ńtut uD$ <É}OI$I^[$[9u9w uvm밉}(t$0l$,(ÉHÉ19}IB9|AD$$A,$L$D$L$$ $L$0L${D$ L$ $L$ L$(Ã\$1҉كt,A@@duA@@$@(BIuԉ$T$à |$t$9u  Ã[RFO8<FO9.FF@ `t4t/t*t1 F,G,PXu  1$ R$]m9u 9u  1 tFu$ R$]m9u9uV$WT$9u1 øF @O I9u  1N W 9uV$WT$u1 ËT$R$T$RT$t۸1 1 Ã\$T$u1BAuB 9u 1É$JL$D$ L$ $L$IL$D$ à L$ $L$ \$t؃ C:ltZ(Itt;t6t؃ C$C(CC1ɉKC ؃ ËC Ã)t6uC$C(HtփCtFuʃZteuC$C([,댃 T$u1 À=Nt$T$臓T$$*=Nt$L$L$[L$ȃ Ã(\$,u1(ËST$ kl$C5<  $L$,AL$ $\$,Ck\$,su؃(ÃuSEuDE;at E;`u $(ËE;`tE;`u $-(É؃(Eu(C8HREu FQFuEK8FunC!uE;`F;at F;`u!Eu $(É$(ËE;`tԋF;`u Et',$t$T$,t $(ÉЃ(É$(Eu $(É؃(ËE@+Ct C?u1C;da MKu,$\$,ƉCkCFtCetCtC< HC;daS  HKsksol$ $IB9t$4$L$t$l$ \$,(ËE;atE;`$Iucu^t$4$D$D$JD$C $L$L$L$L$\$‹KH@KH$m(E$E((ËE;`ZfE;at E;`ux$Iu u(Ét$4$D$D$D$C $L$L$L$L$Q\$‹KH@KH$(ËE;`tC$\$,‰CCJ9t/C@u)K $T$ JL$vT$ \$,tЃ(B$T$9(É$&D$ L$ $T$ \$,ʼnSCC;damE`Bu7J I $M IL$)D$L$, $L$L$ BB;daB@JI I $M IL$D$L$, $L$L$}\$ Cm l$$EtWtRtM$T$,BB@^uJ $L$$L$JfL$ $\$,CNCAk CC$(Ã+tR0$D$ L$,AL$ $\$,C@D$ @$XD$ L$,AL$ $Al$ \$,‰CE$Iu uB(ËB(É$\$,ʼnC@;da[ENU RR$2y‰D$T$L$, $L$L$L$L$= ;OAWtR\C t-CCCC P(S$S($F(É$:\$,CE@Eu&M $D$D$T$ L$A$L$,AL$ $\$,CKk E<tm<Et+E'C aKU(S$S( C@ twtZt4t$CD$\$,CED@,[,CMD$I%1ɉC$K(CUDB$C$B(C(wߋuD $-)[CUDB$C$B(C(C tMt6t L΋C@u$\$,CߋuD CMDI K \$T$tVB<T]tuIBt B.u7T$J $\$\$t  ËD$Pu1 ø ÃT$ t;B t8BYt/T$ J $t ËD$ Pu1øÃL$ u1A tA<]u1Q$uT$ R$u1øAEtƸà T$u1 ËJ $D$L$I $D$@ Ã4l$8\$$D$D$D$D$3JD$HuG$JT$$JtL$ $aT$$L$B 9uJI$I ËID뾸Fo1T$$B;D$ t{$D$ʩT$$D$1ɃD$B9t$T$$D$葩T$$BtB@9TBtB@9BtB@ @DJ9BtB @DJI9Bu B @DusB @@tB@J I@9u9ыR8D$;D$(t$D$D$D$(D$Ĩø$T$$D$詨T$$몸$T$$D$茨T$$m$T$$D$lT$$:$T$$D$LT$$$T$$D$,T$$$T$$D$ T$$D$@D$Pt*T$ Au $D$ D$T$Ru֋D$T$ ÃL$ D$$D$L$ $D$D$1ۉ\$T$t^T$ BuC$b\$T$ C\$BJHBtIBJHB@ JIHDBRutT$t )RuD$$)؃ËB@ @DL$AQt"T$ Au $T$ RuރÃT$L$D$@Bu $L$tAtAIuÃ\$ \$tYStI\$ $T$ L$\$ tD$$\$D$D$e\$ D$Pu[uÃ|$ u D$@ø$ץÃ|$ uD$@@`@ ø$覥à L$T$tt Ë Bt@$ȃ à T$BltQ)t tt $: ËB, ÃtuJ $у(L$ J $у(L$$ Ã't$tƒ%uԃ*t+uȃ1 $L$ aL$ϳL$H$à $b $ bA0 $ bI0A0Ã\$ S0t B$K$9ЃÉӋR0|$ \$1T$$tB$9|B$JI 9|+FR0uD$,$ $ýB$JI ȉ9~ER0D$((Ã|$}L$D$|5L$D$\$ ˋ$AD$D$ D$L$D$}˃ÃTT$XBD$@D$,JD$0D$R%tD$X@ ]|$8D$X@7D$< ƒuL$X $‹L$8 $T$,T$L$\L$L$DL$ L$XL$T$@D$Rt(D$`$L$LL$D$DD$T$ lT$@L$LD$Rt-D$X@rD$d$L$D$DD$T$ *|$4D$X@0D$<ƒuL$X $8‹L$4 $T$L$\L$L$DL$ L$XL$FT$@D$Rt(D$`$L$LL$D$DD$T$ T$@L$LD$Rt-D$X@oD$d$L$D$DD$T$ R|$0D$X@-T$<uL$X $e‹L$0 $T$L$\L$L$DL$ L$XL$sT$@D$Rt(D$`$L$LL$D$DD$T$ T$@L$LD$R t-D$X@qD$d$L$D$DD$T$ D$R@tP $L$L$\L$L$DL$ L$XL$D$`$L$D$DD$D$@D$ "D$R%tP $L$L$\L$L$DL$ L$XL$dD$`$L$D$DD$D$@D$ D$X@'uj|$8|cL$8 $L$,L$L$\L$L$DL$ L$XL$\$XT$@CuC(t D$`$L$D$DD$T$ LTËD$d$L$D$DD$T$ ,ދD$`$L$D$DD$T$ D$`$L$D$DD$T$ D$`$L$D$DD$T$ fL$RL$ t0L$ $D$$D$D$(D$D$,D$ D$HDuЃÃ%$D$,D$=1;L$$L$t$ ΋ $JL$/L$u]L$( $[D$)$D$D$D$(@$D$f=T$\$ Ӌ$AD$4$==L$D$(@0D$(A;L$$hÃ1;L$ }3L$\$ ˋ$AD$D$$D$$D$L$A;L$ |̓Ã4D$<D$ $L$,L$D$L$8ȉL$8($D$,D$D$D$8 $D$,D$D$D$80$D$,D$D$fD$88$D$,D$D$GD$0D$0;D$@P$D$D$ D$D$$D$ D$ D$D$$D$L$8D$ $D$$D$A@D$A @D$ P$D$T$0\$< ӋD$AD$ D$ D$D$$D$FL$ $L$$L$bƒ+L$8A($A,D$T$P$D$D$ D$D$$D$ D$ D$D$$D$L$8D$ $D$$D$A@D$A @D$ P$ D$D$ D$D$$D$ D$ D$D$$D$tP$D$T$0\$< ӋD$AD$ D$ D$D$$D$5P$D$D$ D$D$$D$ L$8A D$A$D$D$0D$0;D$@D$8H_D$ $D$$D$w4Ã8D$T$J $ D$`$vD$D$D$}D$Puƒ Ã4D$8D$ D$,$D$@D$hD$,D$(D$0D$D$,$D$@@D$h\$(T$ D$,D$$D$0D$C9Dat"$L$F_ * t L$, $T$L$K(L$ ef(Ã4D$$$$$D$$8@$D$_D$ 1ҋ$8H0tD$D$$D$$$A@D$BT$D$ DT$$$H0u$D$$D$$D$$8H,A$(AL$ $$0HL$D$D$ $(@$9L$t $cΚ$$0D$$(@@D$h$($0@ D$I0Sך$:$8H0$$1D$D$$ \$$$@H,A$(A$$0HL$D$D$ $(@$9L$t $b$$0D$$(@@D$i\$$($0@ ËI0U$$@@,u $' $$$@@D$ $$H0$$)$0$$8H,t'Au$( $l$(I0uً$8H,t2A@uD$$$$(L$$(I0u΋$8H0A@(@D$ A@(@$$A@($$$B@(@JI( $$$$,B@(L$ H4$D$$D$B@D$B@ D$ L$D$$D$$$@@D$$,D$ $$H0,4ËL$t A IXuÃT$ 1D$D$BDD$=au Bs1ËBTu$=T$uB@(@t҉$xwd}ŋD$PBVu BB+OQVt1ËZT$RC+u C@t1ËC@@QuBVuBuڋB@QuΉ\$KIII $T$JIIL$T$tL$ $T$T$9jL$ $vl$\$T$uyCVuEJHUD$ @D@@C+u?B@@BCJIJJIJQ $\$葋L$ IDIA1ÉT$RBt B@Qt1ËB@QuJII $T$JIIL$T$뽋R>T$J u J(It1øT$ B!tt t1ËJ $Ãtu\$T$L$t.u$D$CD$[1ËI0Ru҃t$D$CD$[1øÃl$ l$]UtBu]JMRuù/ $\$T$ JL$'l$T$ ̃(L$0T$,u$T$\L$0T$,11BA͋Y8tC@ \$tF$;X\$T$,t$D$T$\$ Z(Ãt B$_(ÃtEt߉l$MI $y\$T$,u$dD$T$D$@@D$ rZ(É$D$T$YZ(B;uZBiBHA uI(Au A$@HI$tAXu tA@u BXA@X8IX΃$$D$D$T$(Éljֹ BPZBB $уL$ L$KL$ D$%D$L$ $L$(A$ÃL$AD$$L$D$$OT$BXt RXBXuT$$@8tL$ $yvuËD$$D$D$@@D$X׃4=at14Ëa$Na$ `  $[ a $0`D$D$;`t $ ZP`1;`}<\$ 0` t Pat $ \$ PaC;`|ă=at14D$0|$8=tau$pX14Ëtat:at@K98@[0uƋ atHL$B T$J $T$BBB@ D$Hu a $ taL$9XaM $D$SD$$D$0 aL$D$D$@P,tiT$,J $sT$,BB B;D$$uB@BBBu B@tYR0uD$@@,$QD$H\=at14Ëa$QaD$04ËBX,t\$(K $训T$(BB$uL$(T$,A Y0ʋB$ZT$,B|$0T$0$BD$9D$T$ T14ø$C@D$V14ËR L$u AVA,t~[tEtJ t;tR$AD$V ÉL$ $PUD$@$`߉ $`Չ $谗˃t'u $2W뷉 $U뭉L$ $gVD$@$H`됃`,t>t Ef뚉 $l $詖_bt,cE JL$A$D$@@H L$A$D$@@,$`D$@@$XL$II, $a $L$aL$A @$WL$A^A$NbEc'7L$A$D$H(T$,uD$4(BVTB,S7\tC t5t$BD$SD$4(É$D$D$ $T$,T$D$D$ D$-T$,|$ t|$$t $^‹B$BD$D$$D$BX뀋B@4tT$,B@4$K_T$,T$,B@,$5_L$,I $D$D$t $:RL$,II, $_t $RD$,@@4D$,@@4$_$'D$ $BD$D$D$ T$,T$T$,|$ t B@Lu)1ۃ|$ t $SËD$4D$4T$0HB$GT$,ƋB @@L%B @$!$D$$D$``2t >VEJB$JbcT$,B$D$D$ $D$,@D$D$D$ D$T$,|$ F|$$tJ $o\T$,BB@$B@D$D$$D$U$D$T$,J $L$0L$L$4L$lD$4D$,Pc T$$B;`uIBAuЃ B uJ $ ø$D$BD$T$ OT$$B uB@@IB uJI $ T$$B<]tB uB@@uЃ ËJAu7$D$T$>MT$$a $T${HIH Au#A0t$(D$L$LT$$AtB^u$JtL$A$T$$D$H߉$HD$T$nKT$$bB@@(@(;`ta $T$z‹HIHЃ ËB@@(;`a $T$zHIH ÃD$ @DD$=|ti$D$D$`L$I $iD$D$@@u $UZD$ @@4tD$ @@4$4ZD$ @@,$"Za P` $N`L$I $L$ II(L$D$L$A=at }$L`$hL$ II, $ZD$ L$ $ `L$\T$ BTB@4tB@4$aZT$ D$@@uD$$AZT$ `B@,$*FD$ @@4$FD$ @T$ FD$$ŁL$ $L$ AÃ@=`\$D\$0D$4@ST$l$<\$,D$$ 0D$,D$$<D$`D$7L$4taPAtAPT$(tJ $N@D$,=Pat PaII $,@D$,L$ $D$ L$4II $T$,D$ ‰$'D$$$?D$L$(t(D$$$AD$8D$$$@D$#=Pat1D$$$Pa@@D$D$$$BD$D$$$D$D$պD$$$DD$D$$$D$4@@D$覺D$$0Ã(L$,I $D$$L$,I L$L$0L$D$ 蘔L$,D$ A@ D$Q D$@09tdL$ JT$$ D$$$詹D$ L$$ $L$ L$/6D$L$, $L$L$slT$BDR0D$@09u(Ã8D$$D$<@D$D$D$@D$ D$L$<|$u8ËAD$4D$4@@ D$4@AA@ D$,Q D$,@09thL$4II, $T$0JL$\$0uF$CD$\D$C@D$ D$4D$j:T$0B R0D$,@09u8HKD$(H $D$Il$(T$0E]ZBuC$uMDJDj$ $\$L$lL$L$hL$ T$L$(L$>$BBt BuBtL$l $\$T$p댉$L$tI,L$L$hL$7$nD$Da1h|$X3D$X@#L$XII $Pt$dl$T\$l$D$\$D$X@@D$ p1$D$D$D$\$G1$D$D,$t$dl$T\$l$^D$\$1$D$Dr?$\$2t$dl$T\$lA@p8IXgC;uwC@ucC@@ D$TK $L$hL$O7l$T\$lD$h$L$hHC@HL$pA uA(D$pst$dCh CAuk l$XD$Xp8t$d|$,$%D$\$/$D$DiUBu$\$l‹K $T$tT$L$`t$h$\$lT$tu8,$D$\$t$ }/1D$DD$@L$|D$@D$DAx;`uSUSBB0C@uF@usC@u0,$D$.1D$DD$@L$|D$@D$DAxÉ$S,$M1D$DD$@L$|D$@D$DAxÉ,$D$T$.$\$lhB[>D$L$DD$L}1D$DD$@L$|D$@D$DAxËL$hII $1$u0$^D$.1D$DD$@L$|D$@D$DAxÉ$уL$L$L$hIIL$ D$lm$BJ $_\$l$BCEu&J $T$LT$T$F]$ÉBC@ $zD$\$<-1D$DD$@L$|D$@D$DAxËJ $ӄ‹$PD$l@T$t$D$pD$D$蕾|$l5` dal$p\$t$t_<EuJE(9u9$$D$BD$|$ ,1D$DD$@L$|D$@D$DAxCuC(9u9uM $^K늃JtIcBs$D$T$+1D$DD$@L$|D$@D$DAxËE@ tE;`WMJE;`uH$уL$ L$KL$ D$kD$L$ $$BMI( $KL$D$ۼ$L$hII( $L$lIL$GD$t$L$lIL$D$菼$u@$BD$D$lD$D$hD$ *1D$DD$@L$|D$@D$DAxÉ$уL$ L$L$tL$ D$ jD$L$ $$B$2D$l$3*1D$DD$@L$|D$@D$DAxËKJB$T$l$B@tmtAt< $lD$AD$T$ )1D$DD$@L$|D$@D$DAxABt AuL$|D$@D$DAxABuL$|D$@D$DAxà t qҋL$|D$@D$DAxËJ $\$l$BC@ $D$\$(1D$DD$@L$|D$@D$DAxÍD$0$l$D$$D$ T$T$h|$0u `J$uL$l $3T$hJ $e+T$hL$l $JL$M,T$hB@ueJ $$AL$lAD$0!D$4~4tL$lI $uL$|D$0D$4AxËD$l$4݋$BAL$lA$@$裁돋$$D$D$lD$T$ }'D$l$,T$hD$0&D$0tKJC@tKtFtA t<$D$BD$\$ &1D$DD$@L$|D$@D$DAxÉ$M$$G1D$DD$@L$|D$@D$DAxËSB uR(Bnt>t9t4$lD$\$f&1D$DD$@L$|D$@D$DAxÉT$tJ, $M IL$nƒuAL$tI0 $L$hI IL$nƒD$XtL$l $/#T$XuAL$tI4 $L$hI IL$nƒD$XtL$l $"T$X uD$t@D$tX0t+\$\KI, $L$hI IL$nƒztP$$:D$D$h@ @@D$D$lD$ %1D$DD$@L$|D$@D$DAxÃuG$$D$D$hD$D$lD$ $1D$DD$@L$|D$@D$DAxËB;auB$$D$$D$r$1D$DD$@L$|D$@D$DAxÉT$X$b$\$X$D$hX KJCtZCtQCt'E;|E oE'b$\$$JL$l $L$;L$l$\$X${ $D$L$E"$\$X$OT$XBuL$l $ T$Xu4J $L$tI$L$zT$XBJ $zT$XB#$$ZD$D$lD$"1D$DD$@L$|D$@D$DAxËD$\X0JL$tI$III, $L$hI IL$hk $$)D$D$lD$w"1D$DD$@L$|D$@D$DAxË$$D$D$lD$8"1D$DD$@L$|D$@D$DAxÃ.l(r!t "-KJB9t B;`uE9t4$D$l$!1D$DD$@L$|D$@D$DAxB"$$1D$DD$@L$|D$@D$DAxËB;`r$D$\$ !1D$DD$@L$|D$@D$DAxËC@ /td tYtTtOtJ$D$\$l$ $@$z1D$DD$@L$|D$@D$DAxËK $ML$D$ =`l$h\$l$u8M $KL$D$ر=`l$h\$l$Js9uu9u5aC9usE9uu aJL$|D$@D$DAxÃE 7&, #   MJ$L$ $u1D$DD$@L$|D$@D$DAxË aJ)t*t-jC@ u-C@(t"B*uKI(JSKJH$YD$BD$\$ 1D$DD$@L$|D$@D$DAxËkE uaE(@t E(@u=M(JE(X0\$\KI( $u\$\$KA([0ϋE(@t$D$\$1D$DD$@L$|D$@D$DAxÃ7/tq5t6-akrE1E $;-da$@D$\$~D$DL$|D$@D$DAxÉ$$$L$haD$0$L$D$T$ \$%a|$4u1D$DD$@L$|D$@D$DAxË$ $$ƒu8 $D$D$hD$1D$DD$@L$|D$@D$DAxÃ$u8 $D$D$lD$k1D$DD$@L$|D$@D$DAxÉϋq $s$BD$l@D$tD$0$L$D$T$ \$|$lt$h-a da\$t$Ct9u_9uSB0j|$4u D$D7F9,$D$|$t$ $D$DK(J묉$D$|$]1D$DD$@L$|D$@D$DAxËJ $r$BD$0$D$lD$D$$D$ T$L$l$B@ t7$D$BD$1D$DD$@L$|D$@D$DAxÃ|$4u D$D!A;dat)$D$L$|$D$DB@(@$@ t B@(@$@ B@$@ B@($q$8t[9t:~$tL$l $r$l1D$DD$@L$|D$@D$DAxÉ$>$51D$DD$@L$|D$@D$DAxË{|$tG t4$D$\$l1D$DD$@L$|D$@D$DAx1t$XEADO, $M IL$al$h\$l$ƃu8$D$l$\$ 1D$DD$@L$|D$@D$DAxÉt$XFt Ff$L$}0\$l$T$Xt $-D$\$L$T$X$u BB;au4 $gD$L$A1D$DD$@L$|D$@D$DAxB D$hP J $o$\$X$CBCuC${$\$X$CGtE 5E'($\$F$ $MD$L$v1D$DD$@L$|D$@D$DAxF$~$T$X $D$D$lD$1D$DD$@L$|D$@D$DAxED$0$l$D$$D$ T$t$Xl$h\$l$D$0D$@D$4!D$D|$@uD$DL$|D$@D$DAxËEHA uI(E@EA8A$@L$tI$9#Ep O<1E]IA t)<=?@H$B+C;dat C@ukC uC@@C@,C@$ D$C1D$DD$@L$|D$@D$DAxÉ$D$T$\$ 1D$DD$@L$|D$@D$DAxËkEum(Et4$D$\$1D$DD$@L$|D$@D$DAxËC@$D$M(L$D$  D$$ $D$ aL$L$L$ $D$ $L$L$D$ L$L$ND$L$ $f$BwM(Jl[:W=iPt RSVkEt E=au EtkEul$tM( $"fl$t$E($уL$ L$l$ D$MD$L$ $e$Bl$tE0t$6 l$t$m$(D$D$lD$ 1D$DD$@L$|D$@D$DAxEE $D$\$ 1D$DD$@L$|D$@D$DAxËKJAt; dauuE@9tLE@Et@$#D$\$ED$ ED$ D$DL$|D$@D$DAxËE@9jE@EuY$D$\$ED$ ED$ 1D$DD$@L$|D$@D$DAxÃXYtZ)C u-C@@tRKI $ï\$l$u4$fD$\$+ 1D$DD$@L$|D$@D$DAxËC;`$vD$\$ 1D$DD$@L$|D$@D$DAxËC@t4$D$\$ 1D$DD$@L$|D$@D$DAxËKI( $ML$D$l$lL$h$u8$D$l$L$ ? 1D$DD$@L$|D$@D$DAxËY;`uEX(Z_p\tl]^J$ $D$ $L$L$D$ L$L$_JD$L$ $Wb$B rKA uI(1C;AtEuj t Et`AuA0t B At$D$\$ D$@D$DL$|D$@D$DAxAuA0u뉋k ]C@MC@h ?Ch 4$u4$4D$T$i 1D$DD$@L$|D$@D$DAxËJ $a$BdteEfrB;B B/D$8$l$D$$D$ $T$5al$h\$l$D$8!D$@D$L$LD$ $L$L$D$ L$ L$El$4L$^Rt$T$J $ft ËD$Puܸ ËB@@EuB;dat  1 ËJ IHt/X 19VDNbu BB5+ctdte6 r#(gtǃotq stuOxc T$$D$D$D$t?J $L$T$$JIL$‹D$Ѓ0D$D$$PuD$ ÃPD$,$1L$L$TIL$=‹@;au!$N@uʃ$ RL$,D$T@D$@D$(D$$D$@@@D$4D$LD$ D$T$@L$4 $T$$كL$T$D$ D$"‹D$PPL$0J8L; dauB4$D$T$D$ t&T$<$D$D$CD$ T$J|$ u<ù $L$L$XL$(H$9L$@A<@XuD$D$낃|$(t*T$0$D$L$(D$AD$ T$0T$(H$D$T$D$ &T$u1BXt0BOt'J $tËL$I $ÉЃÃ,L$0At,ËILL$(ItQD$$L$$AD$D$D$ D$L$$|$tA@@u Iu,ËD$($D$AD$L$$҃l$\$t*1t  9uSuk݉Ӄu։ËRσ1҉T$ D$ @Xt.\$KAdu1ÉL$A@t[u҉Ѓù $c\$‹L$I L$ HD$ Ƀ l$D$XtuB@uÉT$JI, $T$JA,P$B@,D$D$M뾉T$B$~D$Py $u\$L$L$H HËT$L$t9uAËIuà $'\$‹L$@uЃÉًAt IAuQ؃à  $D$`\\\td $tdL$L$D$ D$@ @`@td $tdL$L$D$ D$@ @`@td $tdL$ L$D$ D$l@ @a@td $tdL$L$D$ D$(@ @`@td $tdL$ L$D$ D$@ @da@td $tdL$L$D$ D$@ @la@td $tdL$L$D$ D$\@ @`@td $tdL$D$D$ D$@ @`@td $tdL$L$D$ D$@ @ `@td $tdL$L$D$ D$@ @a@td $tdL$L$D$ D$M`1 $D$ `L$D$  `A,@D$@$ $D$X|$G511 $D$ aL$D$ `I,A0@D$@$ $D$|$G51td $tdL$ L$ laL$ D$=@ @`@ à `b`t``A$t A$@`H$D$D$)@ $D$D$1 $L$L$D$D$ xD$D$$aD$1 $D$軽D$1 $L$L$D$D$ D$D$$`D$ $D$cD$1 $L$L$D$D$ D$D$$`D$ $D$ D$1 $L$L$D$D$ pD$D$$daD$) $D$購D$1 $L$L$D$D$ D$D$$`D$Ë IÃP $ÉǍ5\T$BCT$CBC L$KL$ K(L$$K,؃Ã@td $tdL$L$D$ D$t1 $D$D$ $L$L$D$L$(D$ $L$ L$D$ D$.T$ L$(J L$,JBЃ$ÁD$HH $$@L$D$($@-tatjC$8M9uQD$($<$@ $I5a$8$<‰@am0u$HIK[0r$D$聾$H@$о$@KA,CP,t ZR0uCX$=ut$C@D$R$@D$,$$,D$D$C@D$ L$, $D$D$$@ $L$L$ `L$D$ SD$$D$D$I|$(tM$@@P,t;$<ZCtC@,;`s!KJ4S `J,R0uŁDËCh$,C@ tu!$F$,$<KI4J4;$@t֋M $$<t$$,IL$D$$<tcAt IAuQ<d $$@$4$8 $L$L$D$ D$D$$@ $L$L$L$$4$,$0$@@X,t'Ck[0uE0$8I0 $$@$0‰$8C0t_$,@0K0 $$0JA,BP$ $D$k$@$0Bj$8J0,$L$L$D$ T$$ D$ $$ D$D$$@@@D$ L$ $D$۩$ PS$$(ZE $D$D$$ $(BDBDXBDP ؁<É$($z$4$($,A0$0KP$,XPU$($:$($4A0ʼnCP$4XP!C@$(CP,Bu6$$$׽$($$$4A0ʼnBP$4PPR0볃 D$(h,l$l$t ED$$@(X,t7CtetJ$\$\$t$l$\$[0uɃt $­D$$L$(H( ËCP,t̋BPpPR0CPhPm0l$벋m0l$h,T$4$tuD$4@$13T$0 a\$4u_AtAʃt:@@( XaII(9tT$$\$\$4T$RuƋXa$\$b,ËBH(D$ D$L$(I,t+9AP9L$ A(uL$I0uՉ$|$0t$4ŋFu}~nPuP=~t$t$l$l$Ll$|$ uGD$(h,E(|$uL$(I, $L$(A,,ËL$I0 $L$A0D$ h0뷃,Ã,à ƃt}t$Fh(Eu91ۋU,tB uduWJ0M,R0ul$,$Q1t$l$1ۋU,tCJ$R0uM$IDډY$Q(vu ËJ0K0막룃;ƒtB@(H,t At RuËA tT$BH,tAuL$ A$0T$L$ I0փ D$$@@,$D$D$d $;D$D$D$$@P,t.BuT$$T$L$A0D$R0u҉ȋL$(H0D$@0 ÃL$uȃÉ $L$ $L$L$D$D$$% D$$D$à T$uЃ É$D$D$$]D$ ÃD$ $5L$ A $*D$ @Ã\$ T$BB0$CD$D$C@D$ T$\$ T$|$$u Bt^|$(u'Bt Bu$\$ T$uЃË$CD$YD$C@D$ vT$Ћ$CD$6D$C@D$ LT$uBX#T$BucB0t[L$$AD$D$T$ T$Bu&L$$AD$D$T$ ȥT$ЃBu뚃T$|$ u#Bt Bu$ԅT$uЃËL$$AD$D$T$ ZT$҃L$tA =uø$L$AD$肧T$uBuÀJBtCt)t$t0tt $BD$ ËB(${B4t/$D$*$D$@4D$ƴT$BHt $׻T$B4tTD$H4tL$A$D$H0jeCSB4t/$D$莱$D$@4D$*T$J,tL$A$T$D$H0uB($tL$AHt $L$A4~D$H4L$A$,D$H0߃ &   ^n et BJ,KL$A$D$H0߃Q(& Zt B$@Xu$J$IL$T$ËC@Z$~ulNB($D$HLHL$$D$Htl$xu1tEutÀMEt*$l$l$xED$<E Nt5t0^t*4$ED$艣l$x|$<tMtËM( $L$|L$D$D$L$x $L$L$D$L$x $L$L$L$|L$l$xE(듋U,J $T$lJL$D$D$L$ $L$lL$D$L$ ,T$ll$xBBu-E$ED$D$B@D$ %T$ll$xR0lE$@@$D$D$l$x,$wl$xD$dU,BT$lJ $L$|L$D$D$L$ $L$lL$D$L$ $$l$x\$lCCOt9ЉƒrE$ED$HD$ l$x\$l\$dS0P]4td|$|t'D$|@P4tBK9uJKR0uC\$lK $L$|L$D$T$ll$xBZ0uM( $L$|L$D$D$L$x $L$L$"D$L$x $L$L$L$|L$T$dl$xE(Et/t B;datE$ED$D$l$xEE4E$ED$D$輝l$xE,9t'$CD$~D$蒝l$x\$lCJ9uC@ uC@(J9X$CD$D$B@D$ B@D$,l$x\$lD$| A   U,T$lJ $D$D$l$xT$lBBu B@t@Bt BuR0롋B$T$D$D$ 9l$xT$lB뺋M( $L$|L$D$lD$L$x $L$L$L$|L$ml$xE(E(E(@ `@É$L$HL$D$HD$4@$L$D$LD$q\$DD$8HD$4P0C(@$@@P4wD$$D$ D$D$C(D$ 谎 `@Ã|$ D$ @xD$ HD$ @tNt"t$D$ @D$膐ËD$ H,tL$A$ZD$H0uD$ H0tL$A$3D$H0uD$ H4tL$A$ D$H0uD$ @t$D$ D$L$ IHt9D$ @ JI 9u L$ $T$JL$C'T$uNRuǹ $\$ CDCDCDXCDS HHCDKHËD$ PDD$ @ uD$ $D$ @D@@(D$ÃËD$ @($=bÃt׃t҃J˃ tvt t *뫋D$ H,tL$A$D$H0uD$ H4tL$A$xD$H0uD$ @($]ËL$ I$ $L$ A(D$ H,3L$A$$D$H0߃ t {D$ @($ÃH&a2&xjaSÃl$\a t```EPME$tE$@ *EtBt3(ttt$ED$ՌEtEuME$@;`t?9|$ $ \aL$Vl$ t`ÉA t``M$M,t(AtL$A$l$L$I0u؋M0tL$A$l$D$H0uM4tL$A$l$D$H0uEE$@@$gE$t?9|$ $ \aL$nl$ t`ÉA t``M$E($u댃 tzt o QeM,tL$A$l$D$H0uM4tL$A$l$D$H0uE($n=`M,AuL$A$8L$I0փ  H&l|sUe&ZQH*:1#E$@ ÃL$ MAdd=I@Ata^ : t5t$AD$pÀaA$@@$n $~D$ $ D$ H,tL$A$=D$H0uD$ P0tB@ddu0R0uD$ H4wL$A$D$H0ߋBHdT$BH,tL$A$T$D$H0߀I $  $D$ $D$ @($tƒtà t t 량 $TD$ $D$ H,tL$A$D$H0uD$ H4tL$A$D$H0uD$ @($P$D$ @,D$ D$z # $D$ $D$ H,tL$A${D$H0uP$D$ @,D$D$  ~Hs&hVeH?N1&&# Ã$T$(u$B_t"Ltt t$ËB($B($D$(H,t؉L$ A$D$ H0 t u븃tt3uB($eD$(HLtL$$KD$HBt4$BD$@D$T$ 9|$(5 `$ÀJB$@$D$(`Bt4$BD$ D$T$ ڂ|$(5 `$ËJ(JL$ $T$BuB$PJ, $L$(I$IL$t @$TD$(`s\$C uÀK KC t8t-t(t+tt`$CD$m\$cËK,t $L$L$\$D$H0uS0tȋB@ uR0BH T$BH,t$L$L$\$T$D$H0ڃtkb @T/Q H 7 . ($T$,BT$(ÉB$B@ É\$,R0u\$D$D$L$$D$D$A Ã\$L$ u$_z\$L$ ștAȃÃL$ Au a $<Ã|$ D$ @%=D$ @t$D$ D$yD$ HD$ @ a"-t2tt$D$ @D$zyËD$ H,t$AtL$A$1L$I0u܋D$ P0t=BHT$BH,tL$A$T$D$H0uR0uËD$ H4tL$A$D$H0uD$ @($HD$ @$@@$.tD$ @($et  t t D$ @(@D$ @$@ D$ P,Bt$t tR0߉T$B$T$B@uډT$BH,tAuL$A$T$L$I0փÃ=Lt$D$D$L$ $TtD$$D$L$ $L$$L$D$ L$ $à D$$D$$pxD$$D$D$D$(L$( $L$L$D$0\$|I@9~$T$T$\$vvT$L$ $L$$L$T$ 1뿃4D$8$\$8=Lt$\$\$8C$u:$D$\$(L$8A$ $D$Lp\$8K$AC$@`t C$@`4ËC D$($?wD$,$D$D$(D$L$8 $L$,L$D$.l$8\$(@9~-$l$T$$T$\$ ED$1ul$8T$$L$, $M L$T$\$8‹C$T$0P`=rt|L$\$L$0b$D$A D$T$0BJȉD$J;L$s#s$L$ D$iL$ A;L$rݸx$QT$0Ѓ41 l$(\$,D$btB 9B 9u^B9~W $u\$@L$$HL$(H L$,Hu bJbЃ ËKHCB 9uB9t T$RuT$J $L$$L$\$l$(\$,T$uD$$$ D$ ÃF멋D$@Ã(=Lt{$D$4D$'D$ T$,tBuB@ uR0uD$ (BtBtBuBXu͋J $L$0L$T$$J$L$4L$T$$=LtABtK$B@D$BD$B$D$4D$ L$L$dL$T$$RL$ I$BD$B$D$4D$L$L$ #L$T$$뽃(t$0l$,\$4u (ÿEu~E8@ D$$E8D$1;l$}Z T$$ @t8ؙЃ)й)ى߃E;l$|(EE8D$1;l$}ؙЃ)й)ىؙЃ)й)ى߃E;l$|(E< t<ؙЃ)й)ى؃(Eum(l$,Et Eus=Lt$\$Dt$0l$,\$4Et$l$Npt$0l$,\$4EM, $t$\$D$,@ȃ(Et(Ã$\$(T$,9u $ÃBu Ca$T$,T$L$0L$D$ vD$ L$, $D$L$( $oaD$9t%$D$(D$D$,D$L$ T$JoD$ $É$oD\$(f1$Ãl$\$9u ÃaXEBC5Cu E =t!T$l$\$\$}l$\$MKE zt l$$\$ ha9t$L$T$Gl$$\$ haL|$X-hat$T\$PT$\uЃLÃ,Ѓ9CDtCD;CDt ECD-ha(K,BT$\u!e$\$kF|$Xt$T\$PT$\CCt:tw$\$FLËK( $t$|$T$ LËK, $L$t$|$ T$'}LËL$PI$II $L$TL$L$XL$D$ LËCDK$II $L$ t$Xl$TT$\t!$D$PD$BEt$Xl$TT$\JD$PX,tH\$H$L$l$t$ T$xt$Xl$Tƒ|9}B;D$HX0uЃLøLËC4t-K4 $D$t$|$ T$|$Xt$T\$P‹K, $L$t$|$ T$l$P|$Xt$TÃE0@,m0E@D$؃9| LÉ\$\3$l$DE@D$ݿL$TT$\D$‰B=B>L$DI $\$L$XL$T$ |$XT$Dt$TÃ|?9};B0t C,j0Q9| LÉC)؃LøLÉ؃LÉЃLÃtY6Ct B*C4t-K4 $D$t$|$ T$v|$Xt$T\$P‹K, $D$t$|$ T$I\$P‹CLt%KL $L$TL$L$XL$T$ \$P‹K( $L$TL$L$XL$T$ Là `  p t H]C(@u$CB|$Xt$T\$PT$\9| LÉBT$\{C(X,tC(t%[0u9| LÉB}ЃLÉ\$HKI $L$gt$\l$X\$TT$Hu;J $\$l$t$ |$Xt$T\$HƒD$\yLÉ$L$\$l$ t$|$Xt$T\$Hƒ|9}BT$\;+LÃtD$$$D$DD$D$CH@,\$ ;BL$$ $菼\$\D$H;D$X| LËL$T $D$$D$vL$\D$ȃLËK, $D$t$|$ T$LËCDCD9BT$\@D$$$D$DD$bD$CDD$ |AL$$ $л\$\ȉL$;D$X~ LËL$T $D$$D$贻L$\D$ȃLøP$\$CDD$l$ ?t$T\$PT$\MLà t$0l$,\$$T$49| ÉBT$4(D$tJCu+$\$$C@D$>?t$0l$,\$$T$4CL$U4‹D$ X0u$L$,L$AL$.4$l$ L$S L$ KHL$L4KtV$l$L$K$IIL$ 3At\N$l$L$K(L$ K$IIL$3Ntt $l$L$K(L$ K$IIL$N3n$l$K(L$$L$,L$L$2‹D$0XLtO$L$,L$\$ L$‹D$@t$L$,L$L$a2‹D$Xu$L$,L$ L$:2l$T$\$ uЃCtItD t?t$l$\$É$l$L$K$IIL$ 2É$l$S L$1$L$L$L$1$L$L$L$ L$|Ã\$$T$ 9u ÃBu CBu CBK8t1B tDjtFt8t$T$\$/1É$\$D$衿øËJ$II $K$IIL$ÃtuɋJ( $K(L$Ãttt h뙃r i t s7j,S,tuut1øl$M $T$JL$_u1ËD$h0D$P0몃B$@PcC$@X?1Ã8t$&/tЃ0ËK $L$4ƒD$,tL$1l$ YtLCVuc\$4K $xƒu10É$L$ L$JXL$4T$,ʼnD$ AVtL$ $T$l$ggY돉\$4$랋K $ ƒt#J0 $L$4II IL$gu!1҃L$4I $P܋SK $AtWPt _ыK $\$4ƒ$كL$ L$T$ D$]K wAjQbD$T$ t#T$JI $K@D$D$P0u݋L$ $!D$$bD$1L$ tGD$$L$A@D$oD$@0tD$$cD$ND$H0uD$ÁL$PAu LÉ$,DŽ$$$T $D$$$$$D$eD$L$ L$ L$$ $D$D$$P $L$L$ `L$D$ O-D$$D$D$E,$P $-$HL$ $D$|$HAAH $L$ L$D$ D$[$HA$H@$HH$DŽ$4$P$P$D$D@@(P,t B1ɋ$P;$,t$$$D@P,t"JAtA@,;`sLR0uދ$P@$P$P^$HI $r$HBЁLËA9‰$<uH$8,$<Ë$H@@,u$H@X,$4j$4X0AX$0A@ tu$$$<$0IIDJD;$DtӋK $9$<t$$0IL$L$9$<t$0II J ;$$$D$AD$kD$$D@@D$ $,@@D$5<$D$@P,t:BH9t(B0D$ jPBÉ׉ιL$ J0jPZR0uƃà aAuÃtL$ $D$ HuXa$nà h $ƒt&D$t-u Brt-Bu湈h $t $ 1 ;T$t B u\T$$ L$htL$ $ T$~A $0D$$D$D$D$ B tZ84Z$D$[$kTYD$uD$ºI$3D$謺K$tD$薺k$!uD$耺L$FD$jM$D$Tn$D$>O$D$(g$cD$Q$D$R$(D$P$(D$йT$'D$躹t$<(D$褹U$jHD$莹v$&D$xV$&D$b PST$@aaaD$0D$,=T`u T`uL$<t-T$@D$($蘓D$ h $臓D$ @D$L$ $詭D$ $D$(D$vD$ $hD$“D$ $D$($|$<u+c=`t h$$ٴ8Ã|$0tN|$<t*L$0 $hL$hL$6D$D$@$D$0D$D$D$녃|$,uhD$,=at hD$,1;L$<WL$$\$@ $/L$+l$@\$$ƒT$4|$<~h$D$@T$4$hL$L$,L$rD$0$L$,L$hL$UD$L$$T$@$D$0D$D$D$L$$A6BT$4nh$no@T$@C-u CfD$t'L$ $\$ \$y\$ T$@É\$ u L$<hD$c%I)DtAAt&Ct4\$ T$@{$`l` bVݻhMt)9-AۋJtL$<T$@1뾃FtGga8ahL$  t+؉D$4u _L$4 $\$ T$@JtL$<T$@1뼃Tt,OtSaW`Hݻh\$ Mt#a#\$ T$@JtL$<T$@1ăXta[ bݻhMt TaJtL$<T$@1|`oftudtea[ݻh\$ Mt)au \$ T$@`JtL$<T$@1agtiYaxaݻhMt D$0JtL$<T$@1܃wst[tݻh\$ Mt#`P\$ T$@>JtL$<T$@1ĉݻh\$ Mt&$|\$ T$@h`JtL$<T$@1abaxtzaݻhMt D$,{JtL$<T$@1L$< $hD$/i$r à L$$ $艌D$L$( $yL$9|"\$$ )D$ $L$(L$?t`L$, $CD$@D$ L$ $eD$$D$$D$D$D$L$T$ $D$,D$D$ ËD$)D$떃T$ `D$$l`D$(`aa$D$C=Cu($5iD$D$ D$辯`Ã= bu =`D$L$$ $L$U`u6$HiD$D$$D$N`C$Ã=xat>L$( $L$`u$[iD$D$(D$D$ $nJ\|$ $<$0``b=`t`$!=`t`$ a`=at =`u$=at =`uËD$($ D$$$1M=aa1_ÃD$L$ $蟉~ D$@:tDT$t0\u/|$tT$  $T$ BuЋD$ËD$@/D$D$릁 $$ $@D$ L$ $D$$$$$D$$ $'‰$/L$ $L$CD$ L$ $$$蔈D$$ $聈D$D$ L$ $衢$$$$D$h$$$niD$豈$$$$D$藈$$٣$$ $j É$@D$ L$ $$$$$D$އ릃( ` $D$D$|$pi $莇D$$A $趡D$$ziD$肇i $]9D$$|D$V $L$L$D$#+D$J $D$L$L$+T$|FJ $JL$L$D$ D$>$$KL$D$D$  F $ F$KL$D$KȉL$ F$KL$D$KȉL$ F@tuAt&B $D$2Fcك $كL$L$D$ D$@9FFL$|IHHفt $كL$L$D$ D$8T$|FV $JL$JL$' FAH $D$ 2FD$|HG~toDtNEt#Fo$KL$?FU $KL$1FD$|H/ $KȉL$1FFHt6IKȉ $كL$KȉL$KL$ ?FFt $كL$tL$KL$ M?T$|Ft $ FL$JL$P@Fbm0[SN.KLtrMC@0uC@FK $ T$|D$уȉ $уL$L$D$ L$L$6Fكȉ $ L$L$ L$ D$6Fnك $ L$ L$ L$ D$M6F6كȉ $ L$L$ L$ D$6FOtWPt#R$KL$=FKڋCCACKȉH4C HLCFكȉ $ L$ L$ L$ D$5Fjك $KL$F'WTUt4V $D$ L$D$ Ft $كL$tL$KL$ $T$|JA܁C@VKȉ $T$|JIAJ $уL$L$D$ D$D$L$|I $L$L$D$V $L$|IL$L$L$FqKȉ $$T$|JAoK $كL$L$D$ D$6D$L$|I $L$L$IFmD$lȻ|$` D$`iX`$9$$IMXƒ|=r | $ED$lL$lMdoӸi$]`z|$`} fT$hD$`D$`ƒݹr ѹUEd;D$`D$`=F5BT$l=X`ݸ X`Ҹ \$L$  ø) ÃHD$LD$,D$P$D$D$ L$8L$L$0L$L$$L$_"\$Lljƒ|$0tC-|$8'u CBu<$"D$,HÃ|$8D$$)Ѓ9D$8|$80C.|$8}C0D$8|$8|CBu뛉BtCL$8D$8ut݉C.Ճ|$8~C0L$8|$8PCB tC.BtCCL$XL$8D$8}sC-D$8؉D$8 k ;D$8Fʼnk ;D$8~D$8‰Cу0N)D$8D$8D$8ljC+땃 $=à D$=T$ tȃtȃtȃtȃtЃ ÃD$L$\$‹D$!щT$ ! Љt ȃtȃtȃtȃt$<D$ #D$à D$<L$% tq=tc=tU= tGЃ tЃtЃtЃtЃtȃ ù벹뫹1렃D$[L$\$‹D$!щT$ ! Љt ȃtȃtȃtȃt%tA=t2=t#=t$;D$ #D$Á ܁ԃσT$DtDC1ɉK ؃ÉѸD$ $?SÃu1ËL$HL$H봋\$tS D KDÃ0|$0J9u9u$0BT$$  ܌$ݜ$ٛF1D$DD$@L$0ܜ$|$d:1݄$\$8$$$$;$Ű\$0$ŃtPܼ$ݜ$Ft$tF0L$0\$0AuD$0ܼ$ݜ$$tܜ$ct$D$܌$,l\$(l$(@u|1D$DD$@ܬ$ݜ$݄$\$(rd$(ܜ$q|$$D$8ݜ$$$$$ݨL$(\$(݄$|$fD$l$\$l$L$L$D$ܬ$ݜ$B̓09uID$(ܜ$d$(ܜ$:J0tBT$$F ܌$ݜ$U$$$ ܌$ݜ$F^$ؕ+Ű܌$ݜ$ŃtF0܌$ݜ$AD$|$$$ $$DŽ$D$|@$H$x1G)$ȉ$؉$D$l؉$D$p݄$ͰsIDŽ$In$$2 ~T@)ً$ك$ ЉD$D$}@\$8l$83D$\ )ً$M$uI $#u 1É$$D$D$9 $ƃu#C#EgC CܺCvT2ƃ@)ŋ$9s$ $$D$l$l$ T$$)$$@uC؃$D$؃D$$Jǃ$tG$$L$L$؃D$ll$$J)$$$uJ$t7؃$$D$$D$$$؁Ë]ރ1ɉ+J$2ƒ88)鉬$T$$D$L$L$*$D$D$$ S$ S$$$ $$D$D$$$$D$$D$$$1ɉJ$$؃D$D$r$u $]"1ùx)鉬$D$$$D$$D$1$$D$s l$\$T$9s.CCCC9r҃ ÃD$D$ $l$t$^NV 1!1׍8xjE؉1!1ύ:VU ‰1!1ߍ9p $Mщ1!1Ǎ;ν] ˉ1!1׍8|E؉1!1ύ:*ƇGU ‰1!1ߍ9F0Mщ1!1Ǎ;F]ˉ1!1׍8ؘiE ؉1!1ύ:DU$ ‰1!1ߍ9[M(щ1!1Ǎ;\],ˉ1!1׍8"kE0؉1!1ύ:qU4 ‰1!1ߍ9CyM8щ1!1Ǎ;!I]<ˉ1!1ύ8b%E؉1!1ߍ:@@U ‰1!1Ǎ9QZ^&M,щ1!1׍;Ƕ]ˉ1!1ύ8]/E؉1!1ߍ:SDU( ‰1!1Ǎ9M<щ1!1׍;]ˉ1!1ύ8!E$؉1!1ߍ:7U8 ‰1!1Ǎ9 M щ1!1׍;ZE] ˉ1!1ύ8E4؉1!1ߍ:U ‰1!1Ǎ9ogMщ1!1׍;L*]0ˉ11׍8B9E؉11ύ:qU ‰11ߍ9"amM,щ11Ǎ; 8]8ˉ11׍8D꾤E؉11ύ:KU ‰11ߍ9`KMщ11Ǎ;p](ˉ11׍8~(E4؉11ύ:'U ‰11ߍ90M щ11Ǎ;]ˉ11׍89E$؉11ύ:U0 ‰11ߍ9|M<щ11Ǎ;eV]ˉ׃ 1ύ8D")E؉σ 1ߍ:*CU ‰߃ 1Ǎ9#M8щǃ 1׍;9]ˉ׃ 1ύ8Y[eE0؉σ 1ߍ: U ‰߃ 1Ǎ9}M(щǃ 1׍;]]ˉ׃ 1ύ8O~oE ؉σ 1ߍ:,U< ‰߃ 1Ǎ9CMщǃ 1׍;N]4ˉ׃ 1ύ8~SE؉σ 1ߍ:5:U, ‰߃ 1Ǎ9*Mщǃ 1׍;ӆ]$˃@|$_OW <$9$1|$+D$1|$+\$|$t$D$Ë|$D$tt 8u1ù1|$+\$|$t$D$|$D$\$ vĉ ȉD$Ë|$t$\$ t"19 t9tt܋|$t$\$ }19vD$ރD$Ë\$ t|$t$uu1vøù))H`D$baD$H$D$LD$8h$D$?f$,$f$Ãf$<$f$?ÛÛÃ(D$0\$ t$$|$ D$$%3)11҃|v }Vu2D$$%t tؕҋD$,PD$,((ى )ى Љʼnى볃 u몃@}ك똉ڃ "щʼnщ )щ ЉmD$0|\$l$T$ND$$D$\$ÃD$%t\|$ tID$ ؉D$ D$ЉD$D$D$D$ @D$ D$D$}@-wËD$؉D$뿋D$D$D$ @D$ D$D$}@à D$$D$D$M Ã$t$,T$(\$4l$0u D$ D$9r 9u!;l$ s ȉD$9r9tD$1|$|GD$ ȉD$9w9u9r)9vN)ރ ȉL$|$}|$8tD$88D$8L$H|$<t D$<D$ɉ $Mft$>l$DL$(;L$$=sZCΈD$8D$8;D$4rM)U]D$  ,$L$+L$LL$)@fD$\$($L$L$6l$D\$(놉,$\$D$rft$>l$DÃt E D$$H@ø@ËE(D$LT$BB@D$B($L$L$L$L$ YÃT$BB@fD$$L$L$L$Ã,t$0\$4u'4$4L$L$L$ ,ËF,t_11ҋF(9‰T$$}<u4$\$T$l$ ,ÍL$" $ډl$( L$'t$0T$$\$4l$(B륉$D$L$4 $D$L$0 $L$4L$L$L$L$L$ A,Ã\$CC@$D$Ã$|$(l$,u'<$:L$L$L$ $ËG,t+w(19} Zu<$l$\$$Cډft fu)ȃ\$CC@$D$UÃT$B fD$B($L$L$L$ Á$D$<G,D$,1D$HD$LD$DG pGG@D$DG xL$,@D$PG dxeXFbt ĠD$8D$,%uDD$Lu D$HD$HL$L؃D$HL$LD$<$ʼnD$T1t$06D$HcD$LVu M0O(9} D$]9'|$<D$,0D$,t|$8D$,@tD$,D$,t|$8uMO |$8t^|$8tW|$<t(M-g,<$AL$t$t$ QĠËD$, tM+ʋD$,tM 붉M0롋O$9}D$]9w G$]M0F߃|$8-E0u d$,FFM0FL$ $L$HL$L$LL$T$8T$ T$2L$T$L$4P$D$HD$D$D$ L$8L$L$$t$0l$TD$,%tЃ)ЃtMl$TT$P\$4 Ft$0M,F؃|$DD$D1t$8ыD$D1t$8D$DD$,%tЃ)ЃtMT$P F뫉M,FG|$D} 1ĠÍL$ $$D$D$D$ L$-L$T$$A $$$ $fD$$$D$D$P$$D$D$D$ D$X-$ $$L$$L$$$|"+H‰9su A9r$$$ĠÃ=uËL$D$d$ӋD$d$ËD$ d$ÉYËL$D$d$ӋD$ d$ÉYËL$D$T$t$ ËL$D$\$ D$\$YËL$D$\$ +D$\$Yø \$ËD$@Ã\$$T$ 9rЃÉ$L$(L$D$)щL$ ,T$ u!L$$9vI%=tȃIL$}Vىȁ} 4 Éȁ‰)ЉT$$\$D$$L$=Á}  Éȁ‰)ЉT$$l\$D$$\L$ÃD$P;T$tjT$ BL$I9uoBtB@9tb$ T$ BtB@9tb$T$ =^u R;T$uøb$T$ ฤb$T$ {L$=^A9D$s A;D$r#c$pL$AtA@9t>c$ML$AtA@9t_c$*L$ $L$AtA$D$D$AD$UL$A tA $AD$D$D$/øc$L$)T$L$ tYuȃÉL$ =^u&@9uȃË@9s ŋ 뾸c$YT$L$ øc$BT$L$ 됃 L$ $L$L$i Ã|$ tLL$ $L$ IL$B\$ ‹uCC D$Ë*MKM K 渥c$륃|$$L$ $L$$IL$\$$ʼnD$9umCuK MC ʹʉKD$ ËC uKMىك @t @uȋJ KJK J U롸c$l$\$$yc$@T$L$ 1ۃu؃ËA9uȃËA9sˋIڋI Ջ\$T$u RRËKJZBPBPËl$\$C9uCʹʉK1ËCKHCKH9ukCʹʉKÃ$L$,D$(@4ut^L$( $T$JL$FD$D$$L$L$4‹D$9tL$ $T$L$D$(L$IH D$$Éȃ$D$AD$>"L$,c L$$ $L$(IL$D$T$$L$(L$t$l$\$(ur $l$n\$(L$C ʹʉKD$$K)H D$$@4u  ʉ؃ É؃$D$CD$x!\$(9t $D$\$(L$눸c$T$9T$L$B9sJ s BHJI!Ë\$T$ B9sZBȋJI!Ãl$ \$K 9=^uD$$\$l$ \$E=^uD$$l$`l$ \$K @@@@MKK KH@@EE ʉ؃øc$xl$ \$M\$=^t#L$KK KH@؃øc$+\$ʃ\$ K @J ȋK)ȃÃL$ $L$(L$X\$(t$$N9r~F)=s[NŋF)%EN)فMÃ9v݃9sڃ H` C9rø#d$a\$(t$$뎸d$J\$(t$$h L$$ $L$,L$\$(S)‰T$C+D$,=s?9r s&  D$$$\$D$,D$D$( ËD$$@9rω$L$S\$(K D$$@4u7 ʉL$ $D$D$D$$$D$D$?\$(qL$ $D$D$D$L$릃T$l$BHЋ\$ !ÁsE9r sËB9r+D$$E)؉\$ D$D$ ʋD$$D$ D$iL$ ʋD$$L$D$Ã\$ L$KK ^@Ã,\$4T$0B4B؋J9vV$P L$0uA4uld$U!,É $LdD$AD$D$4D$ AD$AHƉ$B(Љƒu,ËD$0L$4HT$($D$jD$($D$4D$D$0$D$(D$\$(K  ʉ$C)ȉL$D$D$0$D$D$?D$0$D$D$#D$0$D$D$|$0l$(1_$9v ދ[ 9w] tE hutHEh Et<$l$ED$I|$0l$(E t<$E D$l$&,Éo$빉$=dD$\$BHЋ\$4T$06T$$=^L$ $T$D$ $L$L$>D$$D$(D$D$ $D$D$\$K ‹=^uL$ $\$T$ËD$ $\$\$D$ $D$D$ÉT$$D$D$$D$(D$^D$ $D$D$D$D$p뺃 D$$$D$(D$fD$$$D$,D$R\$(T$,C9u9wd$`\$(T$,D$$@,$T$D$$@,Ћt$$l$,\$(ECCX K Ë@)ÃM D$4$\$\$D$$$D$D$\$(L$,$A)؉D$L$D$$$L$D$)ȉD$D$$$D$D$ND$( É^$^1 Ã@\$HT$D$dD$D$\$ D$CD$CD$C D$CD$ CD$$CD$(BHЋT$H\$DJ $dD$AD$AD$ AD$AD$AD$AD$D$ AD$$CHЋT$H=  $wl$H\$D‹E9r@Éщ D$4$eD$CHЋT$DL$4$*eD$AD$AD$ AD$AD$AD$AD$AD$ AD$$BHЋT$DL$4$[eD$D$AD$ AD$AD$AD$AD$AD$ AD$$BHЃ@ÃL$ $eD$D$D$AHЋD$$D$D$ÃL$ $eD$D$D$AHЋD$$D$D$L$ $eD$ALЃÃ4l$8\$<=ޭ=^t/== t,$\$eD$gl$8\$size == t->sizeq->next==nil || q->next->prev==qq->prev==nil || q->prev->next==qq->magic==FREE_MAGICt->magic==FREE_MAGICa < t->size && t->size < bt->next==nil || t->next->prev==tt->prev==nil || t->prev->next==tt != nil (*t)->magic == FREE_MAGICnode != nil node != nil *loc == nodeolst != nil B2NB(a) == bb->magic != FREE_MAGIC b->size >= dsize2bsize(p, dsize)b->size - dsize < 0x10000newarena %lud pool too big: %lud+%lud > %lud memory pool too largebot->aup == top && top > botpool %s block %p hdr %.8lux %.8lux %.8lux %.8lux %.8lux %.8lux tail %.8lux %.8lux %.8lux %.8lux %.8lux %.8lux | %.8lux %.8lux user data %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux | %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %s %s pool panicbad magiccorrupt tail magiccorrupt tail ptrcorrupt tail magiccorrupt tail ptrdangling pointer writebad arena sizebad arena tail sizemem user overflow (magic0)corrupt tail magic0corrupt tail magic1corrupt tail ptrtoo much block datamem user overflowmem user overflowdon't call me when pool->move is nil B2D called on unworthy blockD2B called on non-block %p (double-free?)invalid allocation sizea->size >= nbsizecannot satisfy dsize %lud span %lud with align %lud+%ldD2B(p, c) == bpoolalloc %p %lud = %p poolalignspanalloc %p %lud %lud %lud %ld = %p poolcompact %p poolrealloc %p %p %ld = %p poolfree %p %p dsize >= getdsize(b)poolmsize %p %p = %ld found wrong tailpool %p %s (%p %.8lux %lud) 5?EMUROOT/module/module../module.dis.sbl.s.dis%s: .b.sblerrorsusage: limbo [-CGSacgwe] [-I incdir] [-o outfile] [-{T|t|d} module] [-D debug] file ... usagecan't open %s: %r can't open %s: %r can't open %s: %r /../module../module/module/module/module/module<%d><%d> yacc stack overflowsyntax errorillegal declarationillegal declarationjunkillegal argument declaraionjunkillegal argument declaraionillegal declarationillegal declarationonly one identifier allowed in a label (*-19=?BEKMSX]bgiksv|!#&(+358=?BDLNQTYbehntw{@.!@!@!##!#""""##@!%%%% '@'@!!!!##! @!#@#@!!! !!! !!!!!! !#!##!#!##!#!##!#!##!##!#!##!##!##!##!#'##!!!$$$$$$!!!!!!''! ! #!#!#!#!#!#!#!#!##!!!!!!! ! ! !! !!% "!#!! !!##!# #cc#!#### .rettemporary %s has %d referencestemporary %s has %d references.b%d.t%ddouble free of temporary %sdouble free of temporary %sbad free of temporary %sdouble release of temporary %smkinst no blockbogus mkinst in genrawop: %I illegal addressing mode in register %ncan't deal with op %s on %n %n %n in genopillegal addressing mode in register %ncan't deal with op %s on %n %n in genbraillegal addressing mode in register %ncan't deal with op %d in genchancan't deal with op %d on %n %n in genmovebad instruction in getpccan't deal with %n in genaddrbad global descriptor idR1: %s %p %p %p R2: %s %p %p %p R3: %s %p %p %p unreachable pc: %I %ldbig offset in %I can't deal with %I's m mode possible bug: temp m too big in %I: %ld %ld %d big offset in %I ?? nop %s ,%s,%s #%D #%D #%U$%ld$%ld-$%ld%ld(fp)%ld(%ld(fp))%ld(mp)%ld(%ld(mp))$%ld%ld(%ld(?%d?))interrupt #*159>CGLRX^djqv{ "(.38=BGLQV[`ejoty~ !&+05:AIPUZ_dinsx} "',16<BHMRX^dkqw~naaABbCfFiLmRsttiP??N???????????limbo .sbl 2.1 %s %d %s %d:%d.%d,%d:%d.%d %ld no file specified for %I%s%d %d %d %ld:%s.%s %ld:%s %d %ld:%s:%s @%d bad type %T in sbltype%c%c%c%c%d.%s->%s %s%d %d %s:%s%d %c%s %stypefunctionglobalargumentlocalconfieldpick tagimportunboundundefinedundefineda a a an a a a aan iotanilredeclaration of %K, previously declared as %k on line %Lfunction %s.%s not definedfunction %s.%s not referenced%K not referenced%K not referenced%K not referenced%K not defined%K not referenced%K not referencedTexception in vardecleddecl() fnchk nilredeclaration of function %D, previously declared as %k on line %Ladt polymorphic type mismatchdeclare function %D ty %T newty %T function polymorphic type mismatchtype mismatch: %D defined as %T declared as %T on line %Lraises mismatch: %Dcannot define functions with a '*' argument, such as %Dduplicate assignment to %V, previously assigned on line %Lcan't deal with %n in tuple case of globalascan't deal with %n in globalasredeclaration of %K, previously declared as %k on line %Lillegal declaration expression %V%s is not declaredOvardecl/Oname/Otuple has right field scope too deeppopscope %s : %s %d scope too deeprepushids scope mismatch%s %s%s%s.->%D%s%s%ld: %K %T ref %d %K is not a type%K is not a polymorphic type%K redefinedonly function types expectedadjnptrs %s addptrs addfnptrs %s %d rmfnptrs %s decl() outeradt nild==dd in sharelocؗҜ<3#I9=D2[%Cod(#c/pidadtaltarraybigbreakbytecasechanconcontinuecyclicdodynamicelseexceptionexitfixedfnforhdifimplementimportincludeintlenlistloadmoduleniloforpickraiseraisesrealrefreturnselfspawnstringtagoftltotypewhile&=|=^=<<=>>=+=-=*=/=%=**=:=||&&::==!=<=>=<<>><-++--->=>**EOFeofout of include path space%L: include file depth too great%s%s%s/%scan't include %s: %rline line %s:%d [ %s:%d ]: %Lnopos%s:%d.%d,digit '%c' not radix %ddigit '%c' not radix %dend of file in numeric constantmalformed numerical constant '%s'radix '%s' must be between 2 and 36radix '%s' must be between 2 and 36malformed \u escape sequenceunrecognized escape \%Cend of file in string constantnewline in string constantend of file in character constantmissing closing 'unknown character %c%lld%f"%s"bad token %d in toksp()%L: warning: %s %L: warning: %s too many errors, stopping %L: %s too many errors, stopping %L: %s too many errors, stopping %L: near ` %s ` : %s %L: %s fatal limbo compiler error: %s out of memoryout of memory@@@@@@}8}A }9})}@})!}B&};+}4/}D8}7?}=B}JJ}O}!Y}F^}Id} g}?k}.n}q}1{}2}3})}-}:}}6},}}%}C}H}"})}}E}<}G})}0}/}$}5}>'X2>6Xc>;G21;)G)[)3HUVWYZ[x2>c>yHUVWYZ[5G6Gn5H6HpHUVWYZ[HUVWYZ[5G6Go5H6HqGcHUVWYZ[2~c~G;/G/;)G)[)HUVWYZ[ HUVWYZ[&GHUVWYZ[.8;>;>4HUVWYZ[9GHUVWYZ[=HPGHUVWYZ[VGHUVWYZ[ZHUVWYZ[]2>8>c>7yACnF?O8M20HwZ/O?$@Y@@@@j@.AcAחAeA _BvH7BmB@0BļB4&k C7yAC؅W4vCNgmC=`XC@xDPKDMDJ-DyCxD(,* E52TEqىE/'E!1Eꌠ9Y>)F$_FnFF"F|FMraB3G yhGiWCG*GJH\)c=H7]rHaxHyֲHL}YI\CkFI3T|I\'Isȡ1I:~^Jd~QJvaJ0}GJ>nllJ$KAjZK=P1PKMZ>dKW`M}Kmn/LDcL^LpuLafirM?O8MrbnMG9Mz)M:Ft NdȋBN=ֺ.wN 9iNCNuOILLO֯OO[пOE!P/'%UP_QP6PbDP{U[*QmUx`Q*4VQz5߼QlX R.4R9mr"iRY) kRعeR$N(Sa򮌮>S }W-sSO\]ScbuSp] T%L9hGT.B}T}Ô%IT\nTsqUFQU`RUxӫU?+dpU5=%VN=@[Vҟ&VG0JV=:YVf$0W&sdWW)>W]3sMXk5!a9XBioX)8ӣX*4X5AHxY(-\CYr%4xYv/AYiY?ZOMZ20HwZ~$|7Z-[bZXC}"[;/V[ ;C-[SJ[= \[M"4+\0IΕ2a\|AH\[R\ysKp]WPM4]mH=j]Į]-f]u8W]am ^|M$D@^`-Ut^x^WUH^P.5_[ypH_r]~_':__ k_EW`RVR`'.N`(:W"`Yv5`sbrkmem/env/MALLOCFDcanlock(&pv->lk)==0panic: panic: @$'(" c!6#2H)*FGA %&+,-./01345789:;<=>?BCDEIJKLMNOPQRSTUVWXYZ[\]^_`ab#pragma hjdicks x4 #pragma pack x4 #pragma pack off #pragma hjdicks off #include "%s.h" #include #include #include #include "%smod.h" Type* T_%s; uchar %s_map[] = %s_%s_map; %s_%s* %salloc%s(void) { Heap *h; h = heap(T_%s); return H2D(%s_%s*, h); } void %sfree%s(Heap *h, int swept) { %s_%s *d; d = H2D(%s_%s*, h); freeheap(h, swept); } void %sinit(void) { void %smodinit(void) { builtinmod("$%s", %smodtab); T_%s = dtype(%sfree%s, %s_%s_size, %s_map, sizeof(%s_map)); T_%s = dtype(freeheap, sizeof(%s), %smap, sizeof(%smap)); } void %send(void) { freetype(T_%s); } void %s_%s(void *fp) { F_%s_%s *f = fp; destroy(*f->ret); *f->ret = H; } #include "%smod.h" typedef struct{char *name; long sig; void (*fn)(void*); int size; int np; uchar map[16];} Runtab; Runtab %smodtab[]={ "%s.%s",0x%lux,%s_%s,0,0,{0},%ld,%ld,%M, 0 }; #define %smodlen %d %s_%s_%s%s_%svoid %s(void*); typedef struct F_%s F_%s; struct F_%s { WORD regs[NREG-1]; %R* ret; WORD noret; uchar temps[%d]; arg%dmodule stub must not contain data objects %R %s; WORD vargs; }; typedef %R %s_%s; #define %s_%s_size %ld #define %s_%s_map %M typedef struct %s %s; typedef %T %s; struct %s { adtstub bad offset %R %s; char dummy[1]; adtstub: bad size}; adtstub: bad desc size#define %s_size %ld #define %s_map %M uchar _pad%ld[%ld]; uchar _pad%ld[%ld]; compiler stub misalign%s_%s#define %s %d #define %s %ld #define %s %ld #define %s %g #define %s "%s" {0x%x,0}%svoidstruct?adtpick?Array*LONGBYTEChannel*REAL?fn?WORDList*Modlink*?ref?String*?tuple??exceptionWORDvoid*?ainit??alt?void*?arrow??case??casel?casec??dot??error??goto??id??iface??except??inst?void%R*%sstruct{ ctypeconv tuple bad offset%R %s; ctypeconv tuple bad t=%T size=%ld offset=%ld}no C equivalent for type %dno C equivalent for type %s#define %s_%s %ld struct %s { int pick; pickadtstub bad offset %R %s; union{ struct{ pickadtstub bad offset %R %s; char dummy[1]; } %s; } u; }; #define %s_%s_size %ld #define %s_%s_map %M aCoc?overflow in constant 0x%lux .mpDfn: %s %d %p %s.%sunknown kind %K in dismod%ld linkage bytes start %ld %ld type descriptor bytes start %ld %ld data bytes start %ld disldt: not Tiface%s%scan't dis global %n%s%ld instruction bytes start %ld overflow in constant 16r%luxNaN+Inf-Infe%de%de%dwKh|3m7c' Se1R= *0MNOm#3giZz]"uG.oh S(U+tEG  \YYY q v##,v1  12^]+ /54,O8?)% KJEDI67><=@ &6C.ABCo@{2;@V(LT9Ye[Q+Q qP`?OWXUM:X,b-kLXyb a*`Vr!sTYrs[QA0`B-X}WWXU.TQLfVH:TQYH9'N[QMF KJ-I WXU wMgV'LZTZY!4$%$[QLFi<?WXUV   "TY LZHZ[QZLI$(Z&WXUJ,/9EL6VW=5;79[UC)DZ=FG ~D!-P'R=VYZ[_ad0ZlxZZZVZ8BTAYJIZZ[Q/_ #"2N)WXU458`ol;Hjp9:L?ZKJEIn67><=@Z%&ZCLZZZZZZz{|}~SZVZTZYbZZj[QZZ2_a^cdWXU458R;vL9:?nZZKJxDI67><=@kj ZABC2pZqrustL458;v9:?nKJxDI67><=@kj ABC2pqrustL458;v9:?nKJxDI67><=@kj ABC2pqrustL458;v9:?nKJxDI67><=@kf\ ABC2pqrustL45^;v9:?nKJ]DI67><=@k< ABC2pqrustL45;v9:?nKJxDI67><=@kj ABC2pqrustL458;v9:?nKJxDI67><=@kABC2pqrustL45V;HT9:Y?[QKJEDI67><=@2WXU>ABC458L;HL9:?KJEDI67><=@2ABC458;HL9:?KJEDI67><=@458;HABC9:?LKJEDI67><=@VABCTYbL[QV_Ta^YbWXU[QLdWXUz{|}~Lz{|}~3z{|}~*z{|}~z{|}~z{|}~\z{|}~Tz{|}~-z{|}~+z{|}~z{|}~z{|}~VVTVYTYY[Q[[QyWXUWXUWXULLLz{|}~z{|}~>z{|}~z{|}~Pz{|}~Kz{|}~z{|}~z{|}~`(?=> u_]ayFGHXQRXXbcijk?  KVr{tz^Z[Y   ITLMNOuBw{/defghlm AWPSC$+v|}{s`\FD!'*,-{x0@JUE% 6:;{"#23457{(.1<&89{{IK;?';HHH2c=26');cH !@A"+,&CDB.EQRS<;'=:9a<.S'QR1;HMJL3NP4;W2";?(c;H &%"#$ !;'65)+,)---)'HHHH56---)HH'FF'F((c22c*;<QRO*<F(c;;(cOHHHFWGF"T;?(*2c--*-*c(H))c*H(GFGF/X\]_`^';(G>(.<-FGc-OH2HG[2HGFc2H'WVUZY[;HG**F"(**MLW2FGG'''F;HHHHH(2>Gc78>HFLO;FG3H(V2FGHHHG>8;(H('G>GHH;;GFH0G>F>>H(>;"G>H>G>8(;">>55?!."  F#]C &) ~}|{yxvur onm lfeR{PD?assert failed: %s napABbCrfiLmRstexPLKK&&'''''''''''%%%%%%%BB03332222211II555444>>==<:::;;; JJJJ  (CCC)))66+++MM**********************,--.//?@@$$$$$7889999HHGGFFFFAA !!""##EDD  /env/%stuplemem cannot cope ! variable '%D' val %V %Vs initializer has arrays nested more than %d deep%Vs size is not a constantcan't initialize %Q%Vs initializer, %V, is not a constant expressionfold %n folded %n non-const exception type in efoldunknown const type %T in efold%g%g%llddivide by 0 in constant expressionmod by 0 in constant expression0 to negative power in constant expressionshift amount %d out of rangeshift amount %d out of rangedivide by 0 in fixed point typeop %d%V%V of type %T( %s, %s%s%ld%lld%g%ld(%g)%T %s(, )chan [] of %Tchan of %Tarray [] of {, }%T or => to spawn raise (, )[][:]load %T ) name name %sconst %s%O (%ld)%O %T %d %d "#"%+","-"CEGSX b cd efgh"l"n~"o p r-su"x  ((((( H %V: too many function arguments%V: too few function argumentscan't find function: %ncannot use %V as a function referencecannot use %V as a function reference because %V is a module interfacecannot use %V without importing %s from a variablecannot have a polymorphic adt function reference %swrong number of functions found in gcheckno implementation moduleno definition for implementation module %scannot implement %Kinitcan't deal with %O in gdeclcan't deal with %O in gbindgcheck fn decls nested in modules or adtsgcheck installs new ids in a module or adtcan't deal with %O in gcheckline %L checkused %nfunction %V not calledexpressions cannot have type %Tresult of expression %V not usedtypecheck tree: %n unbalanced label stack in fncheckscheck funcOscope has left fieldif conditional must be an int, not %Qfor conditional must be an int, not %Qlabel %s never referenceddo conditional must be an int, not %Qlabel %s never referencedlabel %s never referencedreturn of nothing from a fn of %Treturn %Q from a fn with no return typereturn %Q from a fn of %Tno appropriate target for %Vlabel %s duplicated on line %Lcannot have a %T constant%d...cannot import from %Q%s is not a member of %Vbad op in Ocall rewcallcannot declare %V from %Qcannot make a %T from %Qchannel size %Q is not an intcannot load a %T, cannot load a module from %Qcannot make a ref from %Qinstances of ref %V must be qualified with a pick tagtype for array not specificarray size %Q is not an intrange %Q to %Q is not an int or string rangename with no declaration%s is not declared%s's value cannot be determined%K is not a variableecheck: unknown symbol storage%K's type is not fully definedcannot use %V because %V is a module interfaceno type in %Vtype clash in %Q = %Qexpressions cannot have type %Tcannot assign to an exceptioncannot send on %Qtype clash in %Q <-= %Qcannot receive on %Qcannot :: to %Qtype clash in %Q :: %Qcannot %O %Qcannot spawn %Vcannot spawn functions which return values, such as %Q%V: empty raise not in exception handler%V: raise argument %Q is not a string or exceptiontoo few exception arguments%V is not a function namecan't find called function: %n%V is not a function or function referencecannot call %Vcannot call %V because %V is a module interfacecannot call %V without importing %s from a variablefunction call type mismatch%V is not a type%V is not a typecannot yet index field %s of %Q%V is not a value%Q cannot be qualified with .%V is not a member of %Qillegal forward reference to %Vresult of expression %Q ignored%Q cannot be qualified with ->%V is not a member of %Q%V is not a valueresult of expression %Q ignored%V is a type, not a valueillegal forward reference to %Vcannot get the tag value for %Qcannot * %Q%V is not a type list%Q is not a variablecannot index %Qcannot index %Q with %Qcannot slice %Q with '%v:%v'cannot slice %Q with '%v:%v'len requires an array, string or list in %Qcannot apply %O to %Qcannot apply %O to %Qexponend %Q is not int, big or realexponent %Q is not int%O's left operand is not an int: %Q%O's right operand is not an int: %Qcannot compare %Q to %Q%Q is not a variableunknown op in typecheck: %O%V is not a function or type namecannot make a %V from '(%v)'cannot make a %V from '(%v)'cannot assign to %Vassignment to %Q ignoredcannot assign to %V because field '%s' of %V could complete a cycle to %Vcannot assign to %V because field '%s' of %V could complete a cycle to %Vtype clash in %Q %O %Qcannot %O %Q and %Qshift %Q is not an intcannot %Q %O %Qunknown type %T in specificunknown op %n in declasinferunknown op %n in declaserr%V: too many function arguments%V: argument type mismatch: expected %T saw %Q%V: too few function argumentsresult of expression %V ignored%V is a type and cannot be a self argumentpolys: %s map: %T -> %T cannot determine the instantiated type of %Tfnlookup: %p cannot use %s without importing %s from a variablefp: %s %s %s nil%V's type is illegal%V: argument type mismatch: expected %T saw %Q%V: too few function arguments%V: format argument %Q is not a string constant%V: invalid character %C in format '%.*s'%V: invalid format '%.*s'%V: invalid format '%.*s'%V: too few arguments for format '%.*s'%V: format '%.*s' incompatible with argument %Q%V: invalid format '%.*s'%V: duplicate flag %c in format '%.*s'too many flags in format '%.*s'%V: incomplete format '%.*s'%V: too few arguments for format '%.*s'%V: format '%.*s' incompatible with argument %Q%V: more arguments than formatsinconsistent types %T and %T and in array initializerarray index %Q is not an intarray index * duplicated on line %Lrange %V is not constantarray index %V out of boundsarray index %V out of boundsarray index %V is not constantarray indexcase argument %Q is not an int or big or stringno body for case qualifier %Vcase qualifier * duplicated on line %Lcase qualifier %Q clashes with %Qcase range %V is not constantcase qualifier %Q clashes with %Qcase qualifier %V is not constantcase qualifierpick argument %Q is not a ref adt with pick tagspick qualifier * duplicated on line %Lpick qualifier %V is not a member of %Qpick qualifier %V duplicated on line %Lpickcheck can't handle %ntype clash in pick qualifiers %Q and %Qno body for pick qualifier %Vpickcheck: installing more than one idpick qualifier.ex%dexception qualifier * duplicated on line %Lexception qualifier %V is illegalexception qualifier %Q is not a string or exceptionexception qualifier %V is not constantno body for exception qualifier %Vexception qualifierbogus index in checklabelsbad label count: %d then %dunmatchable %s %V or or %s '%s' overlaps with '%s' on line %Lfindlab out of rangeno body for alt guard %Valt guard * duplicated on line %Lalt guard %V is illegalalt guard %V has no communication%V: illegal raises expressionexception %n not a namefunction %V does not raise %s but declaredfunction %V raises %s but not declared@x!x$x'x+x.x1x4x6x:x;x=BCyDBCyD]W]ci]\bhnb[agma9:w;:R(UTZ`fl`MNMNY_ek_FEzFEz?@{A?@{Au^X^dj^IJ}IJ}OPOPoq<=x>=<=x>=KL~KL~ [@="Gf9S-LK MYXO ./0157<P@$@}}}~~ ~ ~~ ~ ~ ~ ~ ~"~%~(~+~.~1~4~7~:~=~@~C~#F~+I~L~P~yPD?unknown++=adradtdeclalt&&&&=array=breakcallcasecastchan,~condecl::constcontinue:=--//=do.elem==exceptexdeclexit****=exstatfielddeclfnptrforfn(){}>=>hdifimport++*indexindsindxinvjmplabellen<=load<<<<=<->%%=moddecl**=name-!=!nothing||=||pickpickdecl--++raiserange<-refreturn>>>>=scopeselfseqslice<-=spawn--=tagoftltupletypetypedeclusedvardeclvardecli*^^=unknownnopaltnbaltgotocallframespawnruntloadmcallmspawnmframeretjmpcaseexitnewnewanewcbnewcwnewcfnewcpnewcmnewcmpsendrecvconsbconswconspconsfconsmconsmpheadbheadwheadpheadfheadmheadmptailleaindxmovpmovmmovmpmovbmovwmovfcvtbwcvtwbcvtfwcvtwfcvtcacvtaccvtwccvtcwcvtfccvtcfaddbaddwaddfsubbsubwsubfmulbmulwmulfdivbdivwdivfmodwmodbandbandworborwxorbxorwshlbshlwshrbshrwinscindcaddclenclenalenlbeqbbnebbltbblebbgtbbgebbeqwbnewbltwblewbgtwbgewbeqfbnefbltfblefbgtfbgefbeqcbnecbltcblecbgtcbgecsliceaslicelaslicecindwindfindbnegfmovladdlsubldivlmodlmullandlorlxorlshllshrlbnelbltlblelbgtlbgelbeqlcvtlfcvtflcvtlwcvtwlcvtlccvtclheadlconslnewclcasecindlmovpctcmpmnewzcvtrfcvtfrcvtwscvtswlsrwlsrleclrnewznewazraisecaselmulxdivxcvtxxmulx0divx0cvtxx0mulx1divx1cvtxx1cvtfxcvtxfexpwexplexpfselfBoffset: unknown state %d entry %ld, %d module %s link -1,-1,0x%lux,".mp" link %d,%ld,0x%lux,"%s.%s" source "%s" desc $%d,%lud,"%.2x" var @mp,%ld ldts @ldt,%ld byte @mp+%ld,%ld word @mp+%ld,%ld long @mp+%ld,%lld # %.16llux real @mp+%ld,%g # %.8lux%.8lux word @mp+%ld,%d,%ld,%ld,%ld,%ld word @mp+%ld,%d,%lld,%lld,%ld,%ld word @mp+%ld,%d word @mp+%ld,%ld word @mp+%ld,%d word @mp+%ld,%ld,%ld,%ld array @mp+%ld,$%d,%ld indir @mp+%ld,0 apop word @ldt+%d,%d ext @ldt+%d,0x%lux,"%s.%s" can't asm global %n exceptions %d exception %d, %d, %d, %d, %d, %d exctab "%s", %d exctab *, %d exctab *, %d string @mp+%ld,"\n\z\"\\" #%d %I }no typeadtadtarraybigbytechanrealfnintlistmodulerefstringtupleexceptionfixed pointpolymorphicarray initializersalt channelspolymorphic type->case int labelscase big labelscase string labels.type errorgoto labelsidmodule interfaceexception handler tableinstantiated type.tuplet0t1intbigbytestringreal.a%dcan't deal with %O in fielddecledadt %T defd only one set of pick fields allowedpick fields must be the last data fields in an adtredeclaration of %K, previously declared as %k on line %Lempty pick field declaration in %Tdeclare module %s .m.%s.mp.m.%sunknown store %k in joinifacejoin iface not matchedaddiface %p %p cannot declare %s with type %Tcannot declare %s to be a functioncannot declare %s of a polymorphic type%T, an adt with pick fields, must be used with refdata cannot have a fn type like %Tpolymorphic type %T illegal hereused ty %t %2.2uxbindtypes: unknown type kind %dverifytypes bogus ok for %tfixed point scale/maximum not realfixed point maximum not constantnon-positive fixed point maximumfixed point scale not realfixed point scale not constantnon-positive fixed point scalecannot have a ref %Tpick fields cannot be a con like %s.tuplet%dfunction is not a member of an adt, so can't use selfonly the first argument can use selfself argument's type must be %s or ref %svariable arguments must be preceded by a stringpolymorphic functions must not have variable argumentsverifytypes: unknown type kind %didtype: unbound decl%s is not declared%s's type cannot be determined%s is not a type%t not fully definedarrowtype: unbound decl has a typearrowtype: Tid's decl unbound%s's type cannot be determined%s's type cannot be determined%T is not a module%T is not a module%s is not a member of %T%T is not a typedottype: unbound decl has a type%T is not an adt%s is not a pick tag of %T%T is not an adt%T is not a polymorphic adt%T is not a pointer typetype %T does not match %Ttoo many actual types in instantiationtoo few actual types in instantiationtmap for %T: %T -> %T teqclass: unknown type kind %deqclass type not sized: %treftype: unknown type kind %dcycsizetype: unknown type kind %dcircularity in definition of %Tcircularity in definition of %Tchecktype: unknown type kind %dillegal type cycle without a reference in field %s of %tillegal circular reference to type %T in field %s of %tspurious cyclic qualifier for field %s of %tcycarc: unknown type kind %dsizetype bogus ok for %tsizetype: unknown type kind %d%T should have a sizealign 0modrefable unused type %tunknown type kind %dgenerate desc for %D wrote off end of decl map: %ld %ldgenerate desc for %T _mktdesc_wrote off end of type map for %T: %ld %ld 0x%2.2uxgenerate desc for %T desc $%d,%lud,"%.2x" descmap offset %ld descmap %s type %T offset %ld returns %ld descmap type %T offset %ld returns %ld descmap adt offset %ld illegal cyclic type %t in tdescmaprecid t1 %t and t2 %t not balanced in tcompat: %d v %drtcompat: %t and %t unknown type %t v %t in rtcompatrtequal: %t and %t unknown type %t v %t in rtequalbogus value type %t vs %t in rtequaltype %T does not have a '%s' function%T is not a function%T and %T are not compatible wrt %srtunifya - %T %T rtunifyb - %T %T unknown type %t in toccurs%p->link = %p expandtype %d %lux %T expanding unknown type %t in expandtypenew tmap for %T->%T: %T -> %T recid not balanced in sign: %d %d%Dsign %D len %d %s signed %D type %T len %d sig %#lux sign rec %T %d %d%dno sigkind for %tbogus type %t in rtsign%g.mpno t->eq field for %tsigning a narrowed module.mplocal %s in idsignnothingnothingkind %d%T->%s%T.%s%s[, ]%s(%v)ref %s of %s.%s%s->%s%s[%s, ]%s(, )fn[%s, ](nil: %s: self , , **): )tprint: unknown type kind %did %s unknown type %t v %t in tparentmkexbasetype on non-constantmkextype on non-constantcannot fit fixed type into an intscale() on non fixed point typenon constant scalenon real scalenot 31 in fround+.m.%s%s's module data not consistent with that of %s simplify %n simplified %n cons in rewrite Onamecan't rewrite inc/dec %ncall %n cannot deal with call %n in rewritecan't deal with %n in rewrite/Ocallcan't deal with %n in rewrite/Omdot.self$selfnot Oname for addifacecannot deal with %K in Oname in %ncannot %T const in sumarkmktn t %T nil declbad tupblkecom: %n ecom to: %n can't %n in ecomcan't %n in ecomsuperfluous used %n to %ncan't len %ninc/dec amount not addressable: %neacom: %n eacom can't make node addressable: %ninc/dec amount not addablebad call op in callcomcan't gen call addressesarraycom: %n %n arraydefault: %n %n tupcom %n to %n tupcom: bad value exp %ntuplcom %n to %n tuplcom: bad value exp for %ntuplrcombcom %n %d can't bcom %nandand %n oror %n pickdupcom not Oind: %n.c%doverflowed label tab for pickdupcom.i.%.8lux.B.%.8lux.%8lux.b.%.2lux.f.%.8lux.%8luxinline1: %n bad arg match in putinline()inline2: %n wwwwwwwwwx xx$+05>CHMS\bjr}șϙԙܙ   0123456789abcdef0123456789ABCDEF [@="Gf9ES-LK MYXOnfinityanInfinityNaN0main%d boper %d %d %d%s: %s/%s: %spc2i apc2i b$%ld-$%ld$%ld-$%ld%ld(fp)%ld(%ld(fp))%ld(mp)%ld(%ld(mp))$%ld%ld(%ld(?%d?)) %ld %snoop , , pc <= 0 in findb--------------------%d blocks-------------------- ------------------------------------------------ dfn=%d pred %d%s * succ %d%s * ------------------------------------------------ A - %da - %d b - %d c - %d B - %d C - %d D - %d 0 - %d N - %d %d found unreachable code%d bad immediate valuebad descriptor valuebad op in sizemissing decl%s %s(%ld): block %d gen: kill: in: out: udc b=%d v=%d(%s/%ld) u=%d d=%d udc b=%d v=%d(%s/%ld) u=%d d= used and not setno defs in udchainset and not usedS %ld %s M %ld %s D %ld %s ************************************************ function %s ************************************************ usesdefsnb=%d npc=%d nv=%d nd=%d nu=%d ?<9BIKMOFGWXYZ[\t|'7JLWcfw  /j0Binits: unknown mode %d Bopen: unknown mode %#x scope too deepfncom: %s %d %p blocks not nested correctlynil '%s' ref %d nil '%s' ref %d globals: %ld instructions %ld data elements %ld type descriptors %ld functions exported %ld stack size no return at end of function %Dunbalanced label stackfn: %s label stack overflowlabel stack overflowlabel stack overflowOfuncno appropriate target for %Vbad case expansionfillrange fails.g%d.c%dcase %n case qualifier %n case body for %V: %n .g%dalt guard %n alt body %n fatal: bad op in zcom1 mapzcom1 : %n bad node in zcom()AA5?^etextb$movetab`blockstackb.string`infile/h|$94a03595.3fcfffffh.stringjopnamenodes.cPcleanname.cl,$0.401c0000l4.stringecom.cFstrrchr.clmain9.sޠ$0.3ff000004md5block.satimpmodsިdisoptabstubs.caxdosymsetsideeffectYsnprint.c bio.ha|yytoknamesItretnode$0.40140000f_exits.s includea_nprivatesaisfatalXsprint.casm.cansfilesdis.ccom.c0md5.cgen.cablocks $0.40240000ablockid(tokwords$509f79fb.3fd34413alastlineIsrcdiranblocks]fmt.cfns.hYcanonnan .stringaarrayz.stringisa.haasmsymvnan.c_errfmt.clex.c.string1libmpmathi.hagendis&libmathlimboYwbufshp05$39boffset.cabcscpssbl.c)fdlibm.hZisrelopadowarnaconstvalyvsnprint.cqtas.satagopt$108[escmapg9syslimbo.h%limbo.yalabdept.string!types.cUvseprint.c\ztypealenblockstackaimpdeclsNtos.hRatexit.chwrite.cadontinlineaerrorsalastinst[fprint.caatexitflaganildecl.stringGetc.frame>unGetc .frame?getrune.frame?Pungetrune .frame?xaddinclude.frames?mkfile.framesblactoffact inoffabsname?addfile.framef@Kincludef<.frame ibuffile.safeBapopincludeD.frame .safefloposCfline .frame.retflabslineClexcomP.frame,.safe actlineactfcnsbufiFicurline.frame.retlineFlineconv@.frameinl filebuffllinefGposconv,.framefleslineHjsrcconv0.framebufsrcfI lexid,.frameri pidcIstrtoi4.frame .safe.retbasecs vnegtKWdigit .framebasecccKstrtodb@.framedem0.safe$ceneg expdignegnumbasetMlexnum8.framedvbasestateibufcQescchar(.framebuf ciRlexstring(.frame rcstralloclenSlex.framecYyylex .frameYtoksp$.framet[Menterstring0.frameshc0strn\symcmp .framets\stringcat .framestrnts][enter0.frametokens hnc0name^stringprL.frameendbufsb$ssym_ywarn$.framelineargbuffmt`nwarn$.framenargbuffmt`error$.framelineargbuffmta=nerror$.framenargbuffmtayyerror4.frame.safeargbuffmtbfatal .frameargbuffmtcgfltconvD.frame(bufdfcsecpy .framepsedOseprint .frameargfmtbufenddallocmem.framepndreallocmem.framenp DE  Z[ TU Meipow,.frame.retx r nerpow.framex rnfZreal2fix.frame.retv tffix2fix(.frame.retr ft.safevg0fix2real.framev.safefg_istuple .framengtuplemem.framednhvarcomP.frame8tnnvhinitable$.framee .safenvallocdepkelemmerge@.frame4rockefkorecelemsort,.frame.saferenlelemsort.frameel\sametree.framen1n2moccurs.frame.safendnEfolds.framenofold.framenowefold,.framed.safe rightleftnyhasside.framenstrictyhascall .framenyhasasgns .framenzEnodes.frame.safenz~foldcast8.frame.safe bufrleftn~jfoldcasti,.framebuf.safeleftnfoldvc.framerightnfoldc@.frame nblvvn}foldr0.framevrvn.varinit .frame .safenderotater.frameecaselist.framenrsKetolist .frameedupn.framennnsrcresrcmkn.framerightleftopmkunary.frameleftopmkbin.framerightleftop;mkdeclname.framesrcdmknil.framesrcmkname.framenssrcmkconst.framesrcvcmkrconst.framesrcvmksconst.framessrcnopconv@.frame$buffetconv$.framebuff&expconv .framebuffeprint .frameendbufneprintlist.frame sependbufelistnodeconv .framebuffnprint(.frame indentendnbuf DE  Z[ TU M/addlist.framehdidrfreelist .framehdbitc .framextopb .framex`lowb .framexpbit.framenimxbop.frameodsbnew .frame.retbbitsnIbfree .frameb\bset.framebnybclr.framebnbmem.framebnbsets.frameb.safec1m nbclrs.frame.safec1bm nboper$.frame.retiobna'beq.frame baXbbzero.framebbitcnt.framei nmbtopbit.frameiblowbit.frameib[pbits.frameinbdecname.framedwarning,.framefsi ds sdndinspc.frameinpc2i.frameibpcpadr .frameaambr'pins.framei&blfree.framenblblNfreebits.framebsinvfreeblks.framenbb:len .framedWallocbits .framenpcidefsnvbitcount.framebsinvnmkblock.framei*mkblist.framenblbKleader(.framemanabifindb .frameabi:memb.frameblb^canfallthrough.frameipredsucc.frameb2b1Emkblocks4.framenbb firstblastbj nlabiinabUback.frameb2b1opblocks$.framei.safeblbnb ckblocks .framenbninbdfs0.framenblbKdfs .frameu b0nnbb loop0.frameblbHloop.frameb2bb1loops .frameblb0bimm .frameam*desc .frameam[fpoff.frameamsize.framei)mkdec.frameoWmkdecls .framesharedecls .framedfinddec.framei nvvarsosGsetud.frame pcbnidudX.frame defsidusesnvvars$d msszf(sspciĩusedef .frame defsusesvarsiinpusedef .frame .safedudinv sũdummydefs.framenpcdefsinvdogenkill8.framenvibnvdefsudflow<.framenvnpcbliternewinb0bepflows.frameb`set.frameḑused.framed̼udchaind.framesd@.safedsq puses npcinv0ud(dddn udefs4b0b4ckflags,.frameionoptimL.framendnu defsuses nvnpcbnb$sdind DE  Z[ TU M Esblmod.framemؘsblfile.framenamesi2filename.framesٚsblfiles$.frame.safesiEsblsrcconv8.frameendstoplstopfstartl startfsrcflsbufsblinst@.frame(.safebufbininst srcsblblocksninst݄sblty .frameitysntyssblfn(.frameffnsinfns=sblvar.framevarsYisvis.frameidsbldecl,.frame.safebufidstoreidsnsbltype0.frametglastt.safe bufforce dt DE  Z[ TU M 3Uemit.frame iddmglobalslowercase .framefmodcodeT.frameiddglobals(buf7modtab4.frame.safeidn dglobals,modstub@.frametpmoffsetbuf iddargglobalsYchanstub .framedescinidadtstub8.frame descoffsetttidbuftdmglobalsstubalign$.frame endxoffsetbufaconstub .framebufidmapconv,.framei e bufdfdotprint.frame dotbufdendBctprint,.framettid offsetbuftendpickadtstub8.framedescoktgoffsettt idoffsettgtbuf  DE  Z[ TU M ArXincrefs.frameidmfninline .framenleft rightdisfnrefty.frametisfnref .framedargncompat.framefan~rewind .framernckmod,.frame idcmodnidbaddref(.frame .safenfnref.framenidutypecheck8.frame dmsimdmcheckimpentryi gdecl.framen 4gbind.framednsgcheck,.framerokfnsnfnsncheckused$.framennn fncheck .frame.safeadtpndscheckD.frame rokretkindrightleft lasttopn pushlabel(.frameisn varcheck(.frameids lasttisglobaln!concheck<.frameiidslast tinitisglobalnrok#exname4.frame s$.safemdbufn$excheck,.frame.safenm idslasttisglobaln%Oimportcheck<.framevid lastmisglobalnrok&rewcall .framedn'Oecheck|.frametgPtp$calleemodLpurepar id(s,maxd.safetttHkidsokright left isglobaltypeok@rok.ret8oknYcallcastH.frame$.saferighttleft allok id.retoknkidsok]tagcast0.frameallok.safe right.ret okkidsoknidleft^yvalistype .framen^islval.framen_marklval$.framennna0circlval0.framennnlvalbmathchk(.framerealoktrncshiftchk(.framend;specific.framedteCdeclasinfer$.frameidsoktnfdeclaserr.framengargcompat.framefanh passimplicit .frameargstnfni$mem.framedtiImemp.frame.safeftipassfns0H.frame na argsa0.safefn$mod idfsrcttargs0idt(ptpidpolysmpassfns4.frameadttpsrc.safeleftfnargs0 argsanmkvarargs8.frames falastntargsnpfmtcheckh.frame0verbflagsvafr8ns@fmtstart,dot(n2 cuname .frame spimnCmodimpP.framesidsdlastu8.safe,un(bufim(sg0 dl0dlGpmodres.frame ndGmodresolve.framedl$%% FG  \] VW O%% L%<%%J%%M%%Q% %Y%%d%%l% %p%%%t%*%x%/%|%5%%;%%@%%F%%K%%R%%W%%\%%a%%f%%k%%q%%v%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-%%3%%9%%>%%B%%H%%M%%S% %Z%%`%%d%%j% %p%%%t%*%z%0%%6%%;%%A%%F%%L%%Q%%V%%[%%`%%f%%k%%p%%x%%}%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%!%%%%%,%%4%%:%%>%%F%%L%%T%%Z% %_%%d%%i%%%#%%(%%-%%2%%K%%R%%Y%%^%%j%%o%%t%%}%%%%%%%%% %%%%%%%%$%%+%%2%%6%%<%%B%%L%%S%%Z%%`%%f%%o%%u% %{%'%%.%%6%%<%%G%%L%%S%%X%%]%%c%%h%%n%%t%%y%%%%%%%%%%%%%%%%%%%%%%%%%%%"%%&%%.%%8%%<%%@%%D%%H%%L%%P%%T%%X%%\%%`% %d%%h%%l%%p%$%w%)%{%.%%3%%8%%=%%B%%G%%L%%Q%%V%%[%%`%%e%%j%%o%%t%%y%%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%% %%&%%,%%2% %8%%>%%D%%M%&%S%1%]%6%a%;%e%A%j%K%s%Q%x%W%}%\%%d%%i%%o%%t%%y%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%/%%3%Hgetroot$.frameesHmain<.frameir,.saferoots_args_argcargc extofileargvQusage.frameRmkfileext$.frameofile.safeext n2oldextnfileRtranslate .framedoemitdbgoutinTtrapFPE.frameTwin2inf.frametsntU|cleann$.framep buf tr.safesVsrcpath,.framenlennamel2t.safel1 rsrcpXuyytokname.frameyycXyystatname.frameyysYyylex1,.frameY}yyparseh.frameP.safeyyptyynyypyysyycharyystatew_mainL.frameinargvinargc5?setfcr.framepgetfcr.framegetfsr.framesetfsr.frame5A_d2v,.framey$.safexd_f2v.framefy_v2d .frame.safex_v2f.framexslowdodiv(.framerqquohi iquolodennumdodiv@.framern xqnumdenrpqp_divvu .frame dnq_modvu .frame dnrBvneg.frameve_divv,.framednegnneg dnq+_modv,.framenneg dnr_rshav .framear b[_rshlv .framear b_lshv .framear b:_andv.frame barT_orv.frame barn_xorv.frame bar_vpp.framerl_vmm.framerl_ppv.framerl_mmv.framerl_vasop0.frameret typervtufnlv_p2v .framepret&_sl2v .frameslret=_ul2v .frameulretU_si2v .framesiretl_ui2v .frameuiret_sh2v .frameshret_uh2v .frameulret_sc2v .frameucret_uc2v .frameulret_v2sc .framerv_v2uc.framerv_v2sh .framerv0_v2uh.framerv:_v2sl.framerv?_v2ul.framervD_v2si.framervI_v2ui.framervN_testv.framervf_eqv.framervlv_nev.framervlv_ltv.framervlv_lev.framervlv_gtv.framervlv_gev.framervlvB_lov.framervlvj_lsv.framervlv_hiv.framervlv_hsv.framervlv5/B CD "utflen .frame runens5/C D13toupper.framecJtolower.framec5/E CD mastrtoul,.frameendptrmovfl$ndignegnptrbase5/F CD zstrrchr.framercs5/G CD strncpy.frames1s2n5/H CD "strncmp.frames2s1n5/I CD [strdup.frame .safes5/J CD  strcmp.frames2s15/K CD chartorune.framerunestrrunetochar .framerunestr runelen .frame strrunec.runenlen.framernrunepfullrune .framestrn5/L CD  MEF N^sbrkalloc.framensbrkmerge.frameylxx/plock.framepvpjpunlock.framepvpcheckenv4.framebuffd0pprint .framevfmtpvpppanic,.framenv msgfmtpvpmalloc.frame .safevsizeTmallocz.frameclr .safevsizemallocalign(.frame .safev spanoffsetalignsizeyfree.framevrealloc .frame .safenvvsizeZmsize.framev}calloc.framevszelemn .safesetmalloctag .framevpcsetrealloctag .framevpcgetmalloctag.framevgetrealloctag.framemalloctopoolblock.framev5/O CD 5.lock.frameilkcanlock .framelkunlock.framelk5/P CD Kcleanname0.frame.safeerasedprefixrootedname5/Q CD Aatol.framesatoi .frames5/R CD Gatexit.framefiCatexitdont.framefexits.framesipid5/S CD _assert.frames5TU CD #vseprintD.framefmt args0fbufe5TV CD 5TWd_fmtFdFlush.framenfvfprintP.frame4nfmtargs0buffd0f5TX CD isprint$.frameargsbuffmt5TY CD snprint$.frameargslenbuffmt5TZ CD print .frameargsfmt5T[ CD fprint .frameargsfdfmt5T\ CD 5TWdfmtfdflush .framef?fmtfdinit.framefd sizefbuf5T] CD 5TWd+t_fmtinstall.framecffmtinstall.frameretfcfmtfmt.framepc_fmtdispatch .frame.saferunefmtfisrunes5T^ CD  D,-5TWxadd.framevanxsub.framenva1xdtoa|.frameDc2Lc4Hc3@c18is1,h4dh.safe$g0eXchrPucaseTsigns2f\precfmt_floatfmtx.frame`.safefUsfmt_efgfmt .framedf5T_ CD 5TWdm-errfmt.framef.safebuf5T` CD 5TWdldofmt8.framenstruner rsrt nfmtffmt_fmtflush .framelenftS_fmtpad$.framen if_rfmtpad$.framen ifE_fmtcpyH.frame*_runest r$ncrsrtn fl(wfme szmvm_fmtrcpyD.frame&_runerts men fl$wmvmf_charfmt.framexf_runefmt.framexf#fmtstrcpy0.frame.safei rjsf_strfmt.framef)fmtrunestrcpy(.framesf_runesfmt.framef_percentfmt.framexf _ifmt.frameli.safepnLpCbufhbasePconv\uXvutfldnegf"~_countfmt.framef"_flagfmt.framef#_badfmt .framexf5ab#sleep.frame5ac#remove.frame5ad#open.frame5ae#close.frame5af#_exits.frame5gh CD #write.framenbuffd5gi CD /$-brk.frameblp$dsbrk.framenbl5gj CD $rerrstr.framenbufbuftmp5gk CD % read.framenbuffd5gl CD %?getwd .framennbufbuffd5gm CD %getpid0.framefb5gn CD 0&getenv.frameans sf.safe|enamename5go CD 'abort.frame5p7'_mulv.frame bar(_mul64by32.frame bar(,_div64by32.frameba r(?_addv.frame bar(Y_subv.frame bar5q(s_tas.framel5r(getcallerpc.framev5/s CD !(utfecpy .framefromtoe5/t CD =(pow10.frame.safemn5/u* kl 67 Mm)checklist.frameqt*>checktree.framebat+)ltreewalk .frametsize+treelookup.framesizet+treeinsert.frametreenode,+treedelete .frameloctreenode,treelookupgt .frametsize-1listadd.framenodelist-_listdelete.framenodelist-pooladd(.frameolstparent nodepanode.^pooldel$.frameolst parentnodep/Udsize2bsize.frameszp/bsize2asize.framepsz/blockmerge.framepoolab0vblocksetsize.framebsizeb0getdsize .frameb0blocksetdsize .framebdsizep1trim$.frame fragextrabdsizep2freefromfront.framebbskipbp3/arenasetsize .frameasizea3Wpoolnewarena0.framebapasize5;blockgrow .framedsizensizeapb66arenamerge$.framebbotbtoptopbotp7{dumpblockD.frame cppb9.printblock.framebmsgp9fpanicblock.framebmsgp9blockcheck8.frameeqbq dsizeaq intbp=arenacompact,.framebnxtwbcompacted ebap>poolcompactl.frameacompactedpool?6B2D.frameap?fD2B .frameavp?poolallocl(.frame ab.safebsizepdsize@poolreallocl@.framenewb$nvleft,.safe rightnbsize obsizeodsizeapvndsizeD;alignptr.framevoffsetalignDkpoolallocalignl8.frameb cv .safespanasizepdsizealign offsetFpoolfreel(.frameabpvGpoolalloc$.framevnpHpoolallocalign0.framevspan offsetalignnpJ poolcompact.framervpJpoolrealloc(.framenvnvpKpoolfree.framevpLpoolmsize(.framebdsizevpNXpoolcheckarena.framebpatailaNpoolcheckl.frameapO-poolcheck .framepOXpoolblockcheck.frame.safevpOpooldumpl .frameapPpooldump .framepP+pooldumparena$.framebapPmemmark.framesigvsize5/v CD BPNaN.frameaPisNaN .frameadQDInf.framesignaQnisInf.frameadsign5/w CD uQfrexp.framexdepRldexp(.frame.safexddeltaeSgmodf$.framexdip5Ty CD "T vsnprintD.framefmt args0fbuflen5Tz CD T_fmtlock .frameT_fmtunlock .frame5a{ Tseek.framea5a|Tpwrite.frame5a}Tpread.frame5a~Tfd2path.frame5aTerrstr.frame5aTbrk_.frame5g CD Twerrstr.frameargbuffmt56USmemccpy.framep1cp2 n CD  YUBwrite.framenocerrbufccountpapbp CD  YkWBputc.framecbp CD  YeWHBprint .frameargbpfmt CD  YpWoBoffset .frame.retnbp CD  YXbatexit.frameiXIdeinstall .framebpXwinstall.framebpXBinits.framef pbpmodesizeYBinit.framemodefbpYBopen(.framebpfmodenameZBterm .framebp CD  YZBgetc.frameibp[Bungetc.framebp CD  Y\Bgetrune$.frame runeistrbp\Bungetrune.framebp CD  Yx\Bflush .framenbp CD  Y{]fmtBflush.framebpf]BvprintH.framefmtarg4fbp5/ CD )^hstrstr(.framec0s2s15a^create.frame K HCJAEABABAtsAAI ABT{qwmB[BRRVMmA8H BGAERTC IEGI KABED KAMDPVGW[!CBH CVCC BEEDAA XZC QGKOMS?Fkԃ ICJ F|fNM Eb3ZcR3 UDJ>RK-w]kő,݈AJDYCI AAF   Se'BP\NJE_F D`aLACAAA,Vc%dK dT{M E JZPLFLFL  AcBBU'ABBB [IS-AUPAAD CBA9~>ZJIpB CE rG.BP PBJ BBBTObG4KCGIHDCCDBAYAK HABG AAAB OGKF DKJADC MANBAFCCSKBEECBFC  AMH AAAEWI MES!AAAAABABAMAE EFAAAAAAAAACT KHL B CWGEV!FGFCATVG QDAGB AAQIHBAsAAI A~BSvpyG mG ^^WPvBCH NSAG VBX MB" ABKI6ASNDHSBQK PBF FGFBC[AAAAAD hB ބCE9ADkUAtACAJOAA*׌(ΞM BEQTiȄBH C_AkWiRCIT+%"$B\Aa e$i(r.q,XZAtwz}TLFJ NEAJgjmdA^aBzA=EC@JQ|ZVx8{  RBBBCAAK,׌ ڒCc :DR GVO[Bxf܊ IԄJ 1΄0A vF8BgksՄ+>xB  %gR FCXCr 8C  DA gBe͈0BBXcՄMAWCO'SKI!' HBE HC; KCWzw~Չ'BՄ=^h-LP H,j"I^C[FFe(f%AF  J M GjcL aL `DHI M BAAD6nn!DRO I L J H LC[WCSJ;C  XoH Wl3F F  BKHED)BBAPJA QNf=AAFAAFLFNBYE]EM BGBBD4sC.BtOA Gh*D TZ 3Ab"l+i)r1o/B]Ff&\BSYBH O C AOEHQF [EDHLO DVI FDAOHKDL bIBGE[LHMgEFZ"EBJ Q MBCRCH OA\PCCDCCC-CDMBE FGDAIEGGA!AQL HBS JFDBCCGPBFX.6%$a\[TP JH"_u2o-j)M FBO,G GBB[G½C=HUđ<ěGOfRI]&b:qAkFFw[.t%ctyBBCTDEAODAMAPOMEDDK DCDDC DD AA IDD ;AbBGZBh&h(An/o)o9 AMH AC FBBPBRGR BBHG BA CDJMI RdH FgVTn \f@OBKCVEqAat}~ixYdmpWDDDDBLlK8z G5rRHABUL#f&WI[IL FC J SVBG F ?VB]G %vE_ v( n)v?qRHBpK K c` ]]RTUWWB?G5NCQj \c#BCEUZuOBLm|4q'gJG-H0b$y-TTLN KV![Be'HHEYBh*QQ DECDHHr/cMKpgBeAmyvsDpYWk*BM jBBc"BxyWBMp=v5sBMk9_Bl2`hA GGBAUNKGDEĔCNAAA HAADAAAACAAABBABBABCAA HD #AHK ZQZ TWE_b"I BAHAAA JB DD!D_$)Fn3gBJU&g0_G&AQIZV!Z\AAMGBDSEEDCDDCLAH CCBAEL EAABC  J MB A b"qKKKKKIiAFAMEABMEAI& u7NIG[I VY3QCEBCBCCBdQCCAAAANO FBBJ EDACCEF?t4i"g%ZHNCt/^BtRDDRBBAABAA A A A AF EMBOCFCNCHBICIKYASMT  Rd&Bj,VNJ(ACAC3mF G BBl*NpT AOHABADDNGJ J A))DCZFXXN&X AG G OBBHAAFAMNAMBECF EJRNCCAAF DD JTOCCFSOEA*\C_HXc"CRRL OhE92Ma!Y^pE>Ef&St,BIIw>c#` Bx8B[i)ER JHASJF^EB p AICI L 1^4AGJp ALJGuc`KjEB!jvqAOEABBB AGVCDIP SAIA  WK6ת؄0Ʉ9DŽ;AFG3Iӄ!ބ]HA  KEWICyaHZSR<ja FFGC_tAFJFu B߂3Blf^LPBGJ&lLnQL L L s/BeAVTNAFqtׄ,҄&JAŠ<ǐ6BqPe,ĔKYHL! COSQ CQFݚNIkB]<ǖGwtB8&ӧHbDDŽ5ǖy;BQׂ IM DGByӂhnJEND   KOOWYSPM 5FA4NGF ZAANAC,GC\AT /$IOAEKDGCMAEOBEQ G RO OCBO^ADEADH HAL GJABF.s3gEl+IGHCSAE4AB  AITL&gkLHB HBc1DqbC.d~i*Ck&A^Md~>~>RSJ_dESdAdR@C DSJB}Bp LWYHP O0HZD$DSUG P \< BAc(o1AA\eWN" Pc(n0SeFHZXAPAOXqMJEBXB HA BIBDCAFEJPD QTVF J(DBCKLD EIDA D7q DG(nDhM_X:w;KBMAEEBG C AAAAAYFEK PGCAA JJ  A A GGFGB BG VCEVREFUI NBEDEB HQAK HFD_L@TqEI C* AKNAHABEEOO*C A\REG BCB B ACD DAOe%ADUAA YAbEA mCPXBrOBH hDI)DEquG }cCOB eB^iBGA  NEB D[ DAK[MEG78AUAAAA Ns]]AAJA d!d$d$d$dU[KAdBAAq*q1q)AANB JVGAVeAAADAV2l*l,l!AARAs3s3s3s3sUP/f&bA!f&CAK]"ANAAABL  KJ2AZABFLCDEd$B^BUJ!B mjWDAJ NDe`W/'`3#@[ISBMDQA ?AUBAF ADn.UV LDB GCAO CX L AQP FG H FC KA*WVg9B@^Du1vMDPDB^BLJPAAANA AAHCIAJ AKq*}C&DzVFB]BLKH NBAKHBAMPAAANCB RF B DF A%bUAW[O` gCDGBTBEBLCCBCG CEFFGK B+h*AcM IF]c%BWYCB+h AD^ ^T^^[PBEMCI;xA LAq1iB+gH7 AYH< q<nDCNHQneOAANL zIFDNPJ SAAAAQABDD{AIFF5yJWVB1CI J NKo1OB(C(SB]sBdzBawBCi H ]NGS SEBBSOCC,#_U NKO"d)E HDDCAB H  BBCABA CAB DAC0SOX\P*VBh%o.ACBK SIQ SGI AAOHAqXQITpA5u/oAAUf>~ c PiJWWAliiwrpxx\\Ab{plAGG)^RAFMApDffq,DBOX/DJ2EQ0CCYQL FL Q AB:'to~|e.mrwheCW]cReY@GLŗ;eo,ϗ16ٮ'eޑ! ee!߄eЗ˄0Є&ل(ׄ+Մ:ƄeKA?ADWeb\leyr|e.mrwheDW\bQeZAFLć<ei2ɇ7ӱ,e~޲"ٲ'ee eڄ!߄+Ԅeׇ„7Ʉ1΄CeNHXef_Ae zyte6ejo`e`9@ G E4e}ݢ#ч(e  e%քeڈ7Ƅ/΄DeRKeem{e.krydeJKV\Fef5Ɖ:?Ѝ/e|ێ$*e eeڄ +Մe֢Ä6ʄ0τBeNIXeb]levqe*nv{ieAZ_dUeUFKPAei2ɟ7ğ<ӟ-ex#؟(e e e%ڄeҘȄ1΄+Ԅ=„eICWe have&sz}leDW\aQe_;AGʔ6ew#ה)ϟ.e ee܄)ׄemȄ3̈́.҄=ÄeXGBRUEcIi3 LXpW.a.oA JCAjAVECGCDE CCDE I ACDAZC  JOAADG A`#KFDPILDRACB EA#Y]e@Æ6҅B!LAaeuqgd~ 7,& LWH IMEDEKGn[B2UARJHAJLUBN FDWBD`Q̈́ DAZA$AAA &0A N!   IKi)f cl-o2?,D_dMS ]REYIr݄'RF)C ZVPCm VIBDZFLLGMHuKRIEZ)M`K_haXv KhBND^ROIC ACLaM*S IEDDLLBAv3}:o,BQh%L BXaD(GAA   QPCETHQOWHQAIADLPH ^ C EFHBdT7DAFDBB fCCA_ BDbFAQ T ^ICATAPKI TADA%eEABACClGJBAHHHRMEDD6wL(w:Uh*k P BNDG&g'g'gG KG BB C$ VDDD QHGQHC|Ln J rDIz D lGC XCABBF ACACH UEDKH EHDKV+AODD BEBENAAHFEBHJCAHCKCAYHHZU RBMEpVUQPL K GEB_ IGEB\VSPYBK EJBBBB ]GMKB]sD B΂FF H H JHEKN IQEFH K DJHVG ALCPH  I DGm5BOIK:|$wBF4`FCP [ NME%AFAB  CMi(CPYS L7  ABDYPK2BBCEFEBBCEFEBCEFEBBCEFEABCEFEBBCEHCHECAAAAAAg I VV$CNGBBBB Y4PFVKNHK GCODBG LT L M]"oBhGS [F Hnv{ieAZ_dUeUFKPAei2ɟ7ğ<ӟ-ex#؟(eold_contrib//root/rc/ 775 0 0 0 11411737727 132065ustar00pietrosysold_contrib//root/rc/bin/ 775 0 0 0 11411737727 137565ustar00pietrosysold_contrib//root/rc/bin/12 775 0 0 2431 10737723700 14122ustar00pietrosys#!/bin/rc # 12: print time in 12 hour form # by pietro gagliardi - 28-29 nov 2007 # thanks to erik quanstrom for tips on making it better and faster # updated 15 dec 2007 to use getflags(8) and some cosmetic/bug fixes # updated 5 jan 2007 to fix bug where 12:00 AM would be shown as 00:00 AM and that 12:00 PM would show as 12:00 AM rfork e # process arguments flagfmt='g,u,n,h' args='[time]' if (! ifs=() eval `{ aux/getflags $* }) { aux/usage echo '-g puts time back into date' >[1=2] echo '-u and time are passed to date' >[1=2] echo '-n option of date cannot be used' >[1=2] echo '-h shows help and quits' >[1=2] exit usage } if (! ~ $#flagh 0) { aux/usage >[2=1] echo '-g puts time back into date' echo '-u and time are passed to date' echo '-n option of date cannot be used' echo '-h shows help and quits' exit } if (! ~ $#flagn 0) { echo '-n option of date cannot be used with '$0 >[1=2] exit usage } # convert time nd=`{ date $flagu $* | awk '{ print $4 }' } cd=`{ echo $nd | awk -F: ' BEGIN { OFS=":" } $1 == 0 { $1 = 12; printf "%s AM", $0; next } $1 < 12 { printf "%s AM", $0; next } $1 == 12 { printf "%s PM", $0; next } $1 > 12 { $1 -= 12; printf "%s PM", $0 } ' } cd=$"cd # show time if (~ $#flagg 1) date $flagu $* | awk '{ $4=ENVIRON["cd"]; print }' if not echo $cd DAZA$AAA &0A N! old_contrib//root/sys/ 775 0 0 0 11411737730 134125ustar00pietrosysold_contrib//root/sys/man/ 775 0 0 0 11411737730 141655ustar00pietrosysold_contrib//root/sys/man/1/ 775 0 0 0 11411737730 143255ustar00pietrosysold_contrib//root/sys/man/1/limbo 664 0 0 7503 10745531356 15364ustar00pietrosys.TH LIMBO 1E .SH NAME limbo \- Limbo compiler .SH SYNOPSIS .EX limbo [ \f2option ...\fP ] [ \f2file ...\fP ] .EE .SH DESCRIPTION .B Limbo compiles the named Limbo .I files into machine-independent object files for the Dis virtual machine. Depending on the options, the compiler may create output files or write information to its standard output. Conventional files and their extensions include the following. .TP 10 .IB file .b Limbo source file. .TP .IB file .dis Object code for the Dis virtual machine. .TP .IB file .m Limbo source file for .B module declarations. .TP .IB file .s Assembly code. .TP .IB file .sbl Symbolic debugging information. .PP With no options, .B limbo produces a .B \&.dis file for each source file. .PP The compiler options are: .TP 1i .B -a Print on standard output type definitions and call frames useful for writing C language implementations of Limbo modules. Suppresses normal output file generation. .TP .B -C Mark the Dis object file to prevent run-time compilation. .TP .B -c Mark the Dis object file to guarantee run-time compilation. .TP .BI -D " flags" Turn on debugging .IR flags . Flags include .B A for arrays, .B a for .B alt statements, .B b for booleans, .B C for .B case body statements, .B c for .B case statements, .B D for use descriptors, .B d for declarations, .B e for expressions, .B E for extended expressions, .B F for function information, .B f for constant folding, .B m for modules, .B n for .B nil references, .B P for program counter manipulations, .B r for reference types, .B S for type signatures, .B s for a code generation summary, .B T for tuples, .B t for type checking, and .B v for variable initialization. .TP .B -e Increase the number of errors the compiler will report before exiting. .TP .B -G Annotate assembly language output with debugging information. A no-op unless .B -S is set. .TP .B -g Generate debugging information for the input files and place it in a file named by stripping any trailing .B \&.b from the input file name and appending .BR .sbl . .TP .B -i Disable inlining of functions. Currently functions containing a single return statement or two return statements and an if clause are candidates for inlining. .TP .BI \-I " dir" An .B include file whose name does not begin with slash is sought first relative to the working directory, regardless of the source .I file argument. If this fails, .B limbo sequences through directories named in .B \-I options, then searches in .BR /module . An .B include file contains Limbo source code, normally holding one or more .B module declarations. .TP .BI \-o " obj" Place output in file .I obj (allowed only if there is a single input .IR file ). The output file will hold either object or assembly code, depending on .BR \-S . Default is to take the last element of the input file name, strip any trailing .BR .b , and append .B .dis for object code and .B .s for assembly code. Thus, the default output file for .B dir/mod.b would be .BR mod.dis . .TP .B \-S Create assembly language output instead of object code. .TP \f5\-T\fP\ \f2module Print on standard output C stub functions, useful for implementing Limbo modules in the C language for linkage with the interpreter. .TP \f5\-t\fP\ \f2module Print on standard output a table of runtime functions, to link C language implementations of modules with the Limbo interpreter. Suppresses normal output file generation. .TP .B \-w Print warning messages about unused variables, etc. More \f5w\fP's (e.g., \f5\-ww\fP) increase the pedantry of the checking. .PP .SH FILES .TF /sys/src/cmd/limbo/module .TP .B /sys/src/cmd/limbo/module default directory for Limbo .B include modules .SH SOURCE .TF /sys/src/cmd/limbo .TP .B /sys/src/cmd/limbo compiler source in C for host .SH "SEE ALSO" .IR dis (1) .PP ``The Limbo Programming Language'' .br ``Program Development in Inferno'' .br ``A Descent into Limbo'' .br in Volume 2. BBCEHCHECAAAAAAold_contrib//root/sys/src/ 775 0 0 0 11411737730 142015ustar00pietrosysold_contrib//root/sys/src/cmd/ 775 0 0 0 11411737730 147445ustar00pietrosysold_contrib//root/sys/src/cmd/limbo/ 775 0 0 0 11411740033 160345ustar00pietrosysold_contrib//root/sys/src/cmd/limbo/README 664 0 0 1503 10745516630 17414ustar00pietropietroThis is my quick-and-dirty hack of the Limbo compiler from Inferno 4e to Plan 9 from Bell Labs 4e. It's very messy and contains extraneous files, but works fine. To build: mk To install: mk install To clean: mk clean If you want the include files in a different place: - copy the module/ folder to that place: for example, to make $home/include/limbo your include path, execute: mkdir -p $home/include/limbo dircp modules $home/include/limbo - in limbo/mkfile, change the line CFLAGS= '-DINCPATH="../module"' -I../include $CFLAGS to read CFLAGS= '-DINCPATH=""' -I../include $CFLAGS For example, to make $home/include/limbo your include path, make that line CFLAGS= '-DINCPATH="$home/include/limbo"' -I../include $CFLAGS - rebuild Enjoy! Pietro Gagliardi All this was done on January 22, 2008 s 12:00 AM rfork e # process arguments flagfmt='g,u,n,h' args='[time]' if (! ifs=() eval `{ aux/getflags $* }) { aux/usage echo '-g puts time back into date' >[1=2] echo '-u and time aold_contrib//root/sys/src/cmd/limbo/include/ 775 0 0 0 11411737760 201605ustar00pietropietroold_contrib//root/sys/src/cmd/limbo/include/NOTICE 664 0 0 2423 10560641716 21064ustar00pietropietroThis copyright NOTICE applies to all files in this directory and subdirectories, unless another copyright notice appears in a given file or subdirectory. If you take substantial code from this software to use in other programs, you must somehow include with it an appropriate copyright notice that includes the copyright notice and the other notices below. It is fine (and often tidier) to do that in a separate file such as NOTICE, LICENCE or COPYING. Copyright © 1995-1999 Lucent Technologies Inc. Portions Copyright © 1997-2000 Vita Nuova Limited Portions Copyright © 2000-2007 Vita Nuova Holdings Limited This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (`LGPL') as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. sysold_contrib//root/sys/src/cmd/limbo/include/a.out.h 664 0 0 44 7740475360 21302ustar00pietropietro#include "../utils/libmach/a.out.h" old_contrib//root/sys/src/cmd/limbo/include/cursor.h 664 0 0 456 7732341364 21615ustar00pietropietro/* * This is a separate file because image.h cannot be * included in many of the graphics drivers due to * name conflicts */ typedef struct Drawcursor Drawcursor; struct Drawcursor { int hotx; int hoty; int minx; int miny; int maxx; int maxy; uchar* data; }; void drawcursor(Drawcursor*); old_contrib//root/sys/src/cmd/limbo/include/draw.h 664 0 0 40560 10551707774 21321ustar00pietropietro#pragma src "/usr/inferno/libdraw" #pragma varargck argpos _drawprint 2 typedef struct Cachefont Cachefont; typedef struct Cacheinfo Cacheinfo; typedef struct Cachesubf Cachesubf; typedef struct Display Display; typedef struct Font Font; typedef struct Fontchar Fontchar; typedef struct Image Image; typedef struct Mouse Mouse; typedef struct Point Point; typedef struct Rectangle Rectangle; typedef struct RGB RGB; typedef struct Refreshq Refreshq; typedef struct Screen Screen; typedef struct Subfont Subfont; #pragma varargck type "R" Rectangle #pragma varargck type "P" Point extern int Rfmt(Fmt*); extern int Pfmt(Fmt*); enum { DOpaque = 0xFFFFFFFF, DTransparent = 0x00000000, /* only useful for allocimage, memfillcolor */ DBlack = 0x000000FF, DWhite = 0xFFFFFFFF, DRed = 0xFF0000FF, DGreen = 0x00FF00FF, DBlue = 0x0000FFFF, DCyan = 0x00FFFFFF, DMagenta = 0xFF00FFFF, DYellow = 0xFFFF00FF, DPaleyellow = 0xFFFFAAFF, DDarkyellow = 0xEEEE9EFF, DDarkgreen = 0x448844FF, DPalegreen = 0xAAFFAAFF, DMedgreen = 0x88CC88FF, DDarkblue = 0x000055FF, DPalebluegreen= 0xAAFFFFFF, DPaleblue = 0x0000BBFF, DBluegreen = 0x008888FF, DGreygreen = 0x55AAAAFF, DPalegreygreen = 0x9EEEEEFF, DYellowgreen = 0x99994CFF, DMedblue = 0x000099FF, DGreyblue = 0x005DBBFF, DPalegreyblue = 0x4993DDFF, DPurpleblue = 0x8888CCFF, DNotacolor = 0xFFFFFF00, DNofill = DNotacolor, }; enum { Displaybufsize = 8000, ICOSSCALE = 1024, Borderwidth = 4, }; enum { /* refresh methods */ Refbackup = 0, Refnone = 1, Refmesg = 2 }; #define NOREFRESH ((void*)-1) enum { /* line ends */ Endsquare = 0, Enddisc = 1, Endarrow = 2, Endmask = 0x1F }; #define ARROW(a, b, c) (Endarrow|((a)<<5)|((b)<<14)|((c)<<23)) /* * image channel descriptors */ enum { CRed = 0, CGreen, CBlue, CGrey, CAlpha, CMap, CIgnore, NChan, }; #define __DC(type, nbits) ((((type)&15)<<4)|((nbits)&15)) #define CHAN1(a,b) __DC(a,b) #define CHAN2(a,b,c,d) (CHAN1((a),(b))<<8|__DC((c),(d))) #define CHAN3(a,b,c,d,e,f) (CHAN2((a),(b),(c),(d))<<8|__DC((e),(f))) #define CHAN4(a,b,c,d,e,f,g,h) (CHAN3((a),(b),(c),(d),(e),(f))<<8|__DC((g),(h))) #define NBITS(c) ((c)&15) #define TYPE(c) (((c)>>4)&15) enum { GREY1 = CHAN1(CGrey, 1), GREY2 = CHAN1(CGrey, 2), GREY4 = CHAN1(CGrey, 4), GREY8 = CHAN1(CGrey, 8), CMAP8 = CHAN1(CMap, 8), RGB15 = CHAN4(CIgnore, 1, CRed, 5, CGreen, 5, CBlue, 5), RGB16 = CHAN3(CRed, 5, CGreen, 6, CBlue, 5), RGB24 = CHAN3(CRed, 8, CGreen, 8, CBlue, 8), RGBA32 = CHAN4(CRed, 8, CGreen, 8, CBlue, 8, CAlpha, 8), ARGB32 = CHAN4(CAlpha, 8, CRed, 8, CGreen, 8, CBlue, 8), /* stupid VGAs */ XRGB32 = CHAN4(CIgnore, 8, CRed, 8, CGreen, 8, CBlue, 8), BGR24 = CHAN3(CBlue, 8, CGreen, 8, CRed, 8), ABGR32 = CHAN4(CAlpha, 8, CBlue, 8, CGreen, 8, CRed, 8), XBGR32 = CHAN4(CIgnore, 8, CBlue, 8, CGreen, 8, CRed, 8), }; /* compositing operators */ typedef enum { SinD = 1<<3, DinS = 1<<2, SoutD = 1<<1, DoutS = 1 <<0, S = SinD|SoutD, SoverD = SinD|SoutD|DoutS, SatopD = SinD|DoutS, SxorD = SoutD|DoutS, D = DinS|DoutS, DoverS = DinS|DoutS|SoutD, DatopS = DinS|SoutD, DxorS = DoutS|SoutD, Clear = 0, Ncomp = 12, } Drawop; extern char* chantostr(char*, ulong); extern ulong strtochan(char*); extern int chantodepth(ulong); struct Point { int x; int y; }; struct Rectangle { Point min; Point max; }; typedef void (*Reffn)(Image*, Rectangle, void*); struct Screen { Display *display; /* display holding data */ int id; /* id of system-held Screen */ Image *image; /* unused; for reference only */ Image *fill; /* color to paint behind windows */ }; struct Refreshq { Reffn reffn; void *refptr; Rectangle r; Refreshq *next; }; struct Display { void* qlock; int locking; /*program is using lockdisplay */ int dirno; void *datachan; void *refchan; void *ctlchan; int imageid; int local; int depth; ulong chan; void (*error)(Display*, char*); char *devdir; char *windir; char oldlabel[64]; ulong dataqid; Image *white; Image *black; Image *image; Image *opaque; Image *transparent; uchar buf[Displaybufsize+1]; /* +1 for flush message */ int bufsize; uchar *bufp; Font *defaultfont; Subfont *defaultsubfont; Image *windows; void *limbo; Refreshq *refhead; Refreshq *reftail; }; struct Image { Display *display; /* display holding data */ int id; /* id of system-held Image */ Rectangle r; /* rectangle in data area, local coords */ Rectangle clipr; /* clipping region */ int depth; /* number of bits per pixel */ ulong chan; int repl; /* flag: data replicates to tile clipr */ Screen *screen; /* 0 if not a window */ Image *next; /* next in list of windows */ Reffn reffn; void *refptr; }; struct RGB { ulong red; ulong green; ulong blue; }; /* * Subfonts * * given char c, Subfont *f, Fontchar *i, and Point p, one says * i = f->info+c; * draw(b, Rect(p.x+i->left, p.y+i->top, * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), * color, f->bits, Pt(i->x, i->top)); * p.x += i->width; * to draw characters in the specified color (itself an Image) in Image b. */ struct Fontchar { int x; /* left edge of bits */ uchar top; /* first non-zero scan-line */ uchar bottom; /* last non-zero scan-line + 1 */ char left; /* offset of baseline */ uchar width; /* width of baseline */ }; struct Subfont { char *name; short n; /* number of chars in font */ uchar height; /* height of image */ char ascent; /* top of image to baseline */ Fontchar *info; /* n+1 character descriptors */ Image *bits; /* of font */ int ref; }; enum { /* starting values */ LOG2NFCACHE = 6, NFCACHE = (1<>8)) #define BPLONG(p, v) (BPSHORT(p, (v)), BPSHORT(p+2, (v)>>16)) /* * Compressed image file parameters */ #define NMATCH 3 /* shortest match possible */ #define NRUN (NMATCH+31) /* longest match possible */ #define NMEM 1024 /* window size */ #define NDUMP 128 /* maximum length of dump */ #define NCBLOCK 6000 /* size of compressed blocks */ extern void _twiddlecompressed(uchar*, int); extern int _compblocksize(Rectangle, int); /* XXX backwards helps; should go */ extern ulong drawld2chan[]; extern void drawsetdebug(int); /* * Inferno interface */ extern Font* font_open(Display*, char*); extern void font_close(Font*); /* * Macros to convert between C and Limbo types */ #define IRECT(r) (*(Rectangle*)&(r)) #define DRECT(r) (*(Draw_Rect*)&(r)) #define IPOINT(p) (*(Point*)&(p)) #define DPOINT(p) (*(Draw_Point*)&(p)) #define P2P(p1, p2) (p1).x = (p2).x, (p1).y = (p2).y #define R2R(r1, r2) (r1).min.x = (r2).min.x, (r1).min.y = (r2).min.y,\ (r1).max.x = (r2).max.x, (r1).max.y = (r2).max.y extern Image* display_open(Display*, char*); f { ulong age; /* for replacement */ Cachefont *cf; /* font info that owns us */ Subfont *f; /* attached subfont */ }; struct Font { charold_contrib//root/sys/src/cmd/limbo/include/drawif.h 664 0 0 1017 7732341364 21566ustar00pietropietroextern Font* checkfont(Draw_Font*); extern Image* checkimage(Draw_Image*); extern Screen* checkscreen(Draw_Screen*); extern Display* checkdisplay(Draw_Display*); extern void freedrawdisplay(Heap*, int); extern void freedrawfont(Heap*, int); extern void freedrawimage(Heap*, int); extern void freedrawscreen(Heap*, int); extern Font* lookupfont(Draw_Font*); extern Image* lookupimage(Draw_Image*); extern Screen* lookupscreen(Draw_Screen*); extern Draw_Image* mkdrawimage(Image*, Draw_Screen*, Draw_Display*, void*); xtern int _freeimage1(Image*); extern int geninitdraw(char*, void(*)(Display*, char*), char*, char*, char*, int); extern int initdraw(void(*)(Display*, char*), char*, char*); extern Display* initdisplay(char*, char*, void(*)(Display*, char*)); extern int loadimage(Image*, Rectangle, uchar*, int); extern int cloadimage(Image*, Rectangle, uchar*, int); extern int getwindow(Display*, int); extern int gengetwindow(Display*, char*, Image**, Screen**, int); extern Image* readimage(Display*, int, inold_contrib//root/sys/src/cmd/limbo/include/dynld.h 664 0 0 2306 10045413427 21435ustar00pietropietro/* uncomment these lines when installed in /sys/include */ /* #pragma src "/sys/src/libdynld" #pragma lib "libdynld.a" */ typedef struct Dynobj Dynobj; typedef struct Dynsym Dynsym; struct Dynobj { ulong size; /* total size in bytes */ ulong text; /* bytes of text */ ulong data; /* bytes of data */ ulong bss; /* bytes of bss */ uchar* base; /* start of text, data, bss */ int nexport; Dynsym* export; /* export table */ int nimport; Dynsym** import; /* import table */ }; /* * this structure is known to the linkers */ struct Dynsym { ulong sig; ulong addr; char *name; }; extern Dynsym* dynfindsym(char*, Dynsym*, int); extern void dynfreeimport(Dynobj*); extern void* dynimport(Dynobj*, char*, ulong); extern int dynloadable(void*, long (*r)(void*,void*,long), vlong(*sk)(void*,vlong,int)); extern Dynobj* dynloadfd(int, Dynsym*, int, ulong); extern Dynobj* dynloadgen(void*, long (*r)(void*,void*,long), vlong (*s)(void*,vlong,int), void (*e)(char*), Dynsym*, int, ulong); extern long dynmagic(void); extern void dynobjfree(Dynobj*); extern char* dynreloc(uchar*, ulong, int, Dynsym**, int); extern int dyntabsize(Dynsym*); extern Dynsym _exporttab[]; /* created by linker -x (when desired) */ replxy(int, int, int); /* used to be drawsetxy */ extern Point drawrepl(Rectangle, Point); extern int rgb2cmap(int, int, int); extern int cmap2rgb(int); extern int cmap2rgba(int); extern void icossin(int, int*, int*); extern void icossin2(int, int, int*, int*); /* * Graphics */ extern void draw(Image*, Reold_contrib//root/sys/src/cmd/limbo/include/fcall.h 664 0 0 6217 10571051570 21412ustar00pietropietro#pragma src "/usr/inferno/lib9" #pragma lib "libc.a" #define VERSION9P "9P2000" #define MAXWELEM 16 typedef struct Fcall { uchar type; u32int fid; ushort tag; /* union { */ /* struct { */ u32int msize; /* Tversion, Rversion */ char *version; /* Tversion, Rversion */ /* }; */ /* struct { */ ushort oldtag; /* Tflush */ /* }; */ /* struct { */ char *ename; /* Rerror */ /* }; */ /* struct { */ Qid qid; /* Rattach, Ropen, Rcreate */ u32int iounit; /* Ropen, Rcreate */ /* }; */ /* struct { */ Qid aqid; /* Rauth */ /* }; */ /* struct { */ u32int afid; /* Tauth, Tattach */ char *uname; /* Tauth, Tattach */ char *aname; /* Tauth, Tattach */ /* }; */ /* struct { */ u32int perm; /* Tcreate */ char *name; /* Tcreate */ uchar mode; /* Tcreate, Topen */ /* }; */ /* struct { */ u32int newfid; /* Twalk */ ushort nwname; /* Twalk */ char *wname[MAXWELEM]; /* Twalk */ /* }; */ /* struct { */ ushort nwqid; /* Rwalk */ Qid wqid[MAXWELEM]; /* Rwalk */ /* }; */ /* struct { */ vlong offset; /* Tread, Twrite */ u32int count; /* Tread, Twrite, Rread */ char *data; /* Twrite, Rread */ /* }; */ /* struct { */ ushort nstat; /* Twstat, Rstat */ uchar *stat; /* Twstat, Rstat */ /* }; */ /* }; */ } Fcall; #define GBIT8(p) ((p)[0]) #define GBIT16(p) ((p)[0]|((p)[1]<<8)) #define GBIT32(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))) #define GBIT64(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32)) #define PBIT8(p,v) (p)[0]=(v) #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8 #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 #define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\ (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56 #define BIT8SZ 1 #define BIT16SZ 2 #define BIT32SZ 4 #define BIT64SZ 8 #define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ) /* STATFIXLEN includes leading 16-bit count */ /* The count, however, excludes itself; total size is BIT16SZ+count */ #define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */ #define NOTAG (ushort)~0U /* Dummy tag */ #define NOFID (u32int)~0U /* Dummy fid */ #define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */ enum { Tversion = 100, Rversion, Tauth = 102, Rauth, Tattach = 104, Rattach, Terror = 106, /* illegal */ Rerror, Tflush = 108, Rflush, Twalk = 110, Rwalk, Topen = 112, Ropen, Tcreate = 114, Rcreate, Tread = 116, Rread, Twrite = 118, Rwrite, Tclunk = 120, Rclunk, Tremove = 122, Rremove, Tstat = 124, Rstat, Twstat = 126, Rwstat, Tmax, }; uint convM2S(uchar*, uint, Fcall*); uint convS2M(Fcall*, uchar*, uint); uint sizeS2M(Fcall*); int statcheck(uchar *abuf, uint nbuf); uint convM2D(uchar*, uint, Dir*, char*); uint convD2M(Dir*, uchar*, uint); uint sizeD2M(Dir*); int fcallfmt(Fmt*); int dirfmt(Fmt*); int dirmodefmt(Fmt*); int read9pmsg(int, void*, uint); #pragma varargck type "F" Fcall* #pragma varargck type "M" ulong #pragma varargck type "D" Dir* har*, char*); extern void freefont(Font*); extern Font* mkfont(Subfont*, Rune); extern int cachechars(Font*, char**, Rune**, ushort*, int, int*, char**); extern void agefont(Font*); extern Subfont* allocsubfont(char*, int, int, int, Fontchar*, Image*); extern Subfont* lookupsubfont(Display*, char*); extern void installsubfont(char*, Subfont*); extern void uninstallsuold_contrib//root/sys/src/cmd/limbo/include/flate.h 664 0 0 2243 10360547332 21421ustar00pietropietro/* * errors from deflate, deflateinit, deflateblock, * inflate, inflateinit, inflateblock. * convertable to a string by flateerr */ enum { FlateOk = 0, FlateNoMem = -1, FlateInputFail = -2, FlateOutputFail = -3, FlateCorrupted = -4, FlateInternal = -5, }; int deflateinit(void); int deflate(void *wr, int (*w)(void*, void*, int), void *rr, int (*r)(void*, void*, int), int level, int debug); int inflateinit(void); int inflate(void *wr, int (*w)(void*, void*, int), void *getr, int (*get)(void*)); int inflateblock(uchar *dst, int dsize, uchar *src, int ssize); int deflateblock(uchar *dst, int dsize, uchar *src, int ssize, int level, int debug); int deflatezlib(void *wr, int (*w)(void*, void*, int), void *rr, int (*r)(void*, void*, int), int level, int debug); int inflatezlib(void *wr, int (*w)(void*, void*, int), void *getr, int (*get)(void*)); int inflatezlibblock(uchar *dst, int dsize, uchar *src, int ssize); int deflatezlibblock(uchar *dst, int dsize, uchar *src, int ssize, int level, int debug); char *flateerr(int err); ulong *mkcrctab(ulong); ulong blockcrc(ulong *tab, ulong crc, void *buf, int n); ulong adler32(ulong adler, void *buf, int n); ks */ extern void _twiddlecompressed(uchar*, int); extern int _compblocksize(Rectangle, int); /* XXX backwards helps; should go */ extern ulong drawld2chan[]; extern void drawsetdebug(int); /* * Inferno interface */ extern Font* font_open(Display*, char*); extern void font_close(Font*); /* * Macros to convert between C and Limbo types */ #old_contrib//root/sys/src/cmd/limbo/include/freetype/ 775 0 0 0 11411737754 220065ustar00pietropietroold_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ 775 0 0 0 11411737734 230475ustar00pietropietroold_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ftccache.h 664 0 0 26647 7607330526 24777ustar00pietropietro/***************************************************************************/ /* */ /* ftccache.h */ /* */ /* FreeType internal cache interface (specification). */ /* */ /* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTCCACHE_H__ #define __FTCCACHE_H__ /* define to allow cache lookup inlining */ #define FTC_CACHE_USE_INLINE FT_BEGIN_HEADER /* handle to cache object */ typedef struct FTC_CacheRec_* FTC_Cache; /* handle to cache class */ typedef const struct FTC_Cache_ClassRec_* FTC_Cache_Class; /* handle to cache node family */ typedef struct FTC_FamilyRec_* FTC_Family; /* handle to cache root query */ typedef struct FTC_QueryRec_* FTC_Query; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** CACHE NODE DEFINITIONS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* Each cache controls one or more cache nodes. Each node is part of */ /* the global_lru list of the manager. Its `data' field however is used */ /* as a reference count for now. */ /* */ /* A node can be anything, depending on the type of information held by */ /* the cache. It can be an individual glyph image, a set of bitmaps */ /* glyphs for a given size, some metrics, etc. */ /* */ /*************************************************************************/ /* structure size should be 20 bytes on 32-bits machines */ typedef struct FTC_NodeRec_ { FTC_Node mru_next; /* circular mru list pointer */ FTC_Node mru_prev; /* circular mru list pointer */ FTC_Node link; /* used for hashing */ FT_UInt32 hash; /* used for hashing too */ FT_UShort fam_index; /* index of family the node belongs to */ FT_Short ref_count; /* reference count for this node */ } FTC_NodeRec; #define FTC_NODE( x ) ( (FTC_Node)(x) ) #define FTC_NODE_P( x ) ( (FTC_Node*)(x) ) /*************************************************************************/ /* */ /* These functions are exported so that they can be called from */ /* user-provided cache classes; otherwise, they are really part of the */ /* cache sub-system internals. */ /* */ /* can be used as a FTC_Node_DoneFunc */ FT_EXPORT( void ) ftc_node_done( FTC_Node node, FTC_Cache cache ); /* reserved for manager's use */ FT_EXPORT( void ) ftc_node_destroy( FTC_Node node, FTC_Manager manager ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** CACHE QUERY DEFINITIONS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /* A structure modelling a cache node query. The following fields must */ /* all be set by the @FTC_Family_CompareFunc method of a cache's family */ /* list. */ /* */ typedef struct FTC_QueryRec_ { FTC_Family family; FT_UFast hash; } FTC_QueryRec; #define FTC_QUERY( x ) ( (FTC_Query)(x) ) #define FTC_QUERY_P( x ) ( (FTC_Query*)(x) ) /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** CACHE FAMILY DEFINITIONS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct FTC_FamilyRec_ { FT_LruNodeRec lru; FTC_Cache cache; FT_UInt num_nodes; FT_UInt fam_index; } FTC_FamilyRec; #define FTC_FAMILY( x ) ( (FTC_Family)(x) ) #define FTC_FAMILY_P( x ) ( (FTC_Family*)(x) ) /*************************************************************************/ /* */ /* These functions are exported so that they can be called from */ /* user-provided cache classes; otherwise, they are really part of the */ /* cache sub-system internals. */ /* */ /* must be called by any FTC_Node_InitFunc routine */ FT_EXPORT( FT_Error ) ftc_family_init( FTC_Family family, FTC_Query query, FTC_Cache cache ); /* can be used as a FTC_Family_DoneFunc; otherwise, must be called */ /* by any family finalizer function */ FT_EXPORT( void ) ftc_family_done( FTC_Family family ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** CACHE DEFINITIONS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /* each cache really implements a dynamic hash table to manage its nodes */ typedef struct FTC_CacheRec_ { FTC_Manager manager; FT_Memory memory; FTC_Cache_Class clazz; FT_UInt cache_index; /* in manager's table */ FT_Pointer cache_data; /* used by cache node methods */ FT_UFast p; FT_UFast mask; FT_Long slack; FTC_Node* buckets; FT_LruList_ClassRec family_class; FT_LruList families; } FTC_CacheRec; #define FTC_CACHE( x ) ( (FTC_Cache)(x) ) #define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) /* initialize a given cache */ typedef FT_Error (*FTC_Cache_InitFunc)( FTC_Cache cache ); /* clear a cache */ typedef void (*FTC_Cache_ClearFunc)( FTC_Cache cache ); /* finalize a given cache */ typedef void (*FTC_Cache_DoneFunc)( FTC_Cache cache ); typedef FT_Error (*FTC_Family_InitFunc)( FTC_Family family, FTC_Query query, FTC_Cache cache ); typedef FT_Int (*FTC_Family_CompareFunc)( FTC_Family family, FTC_Query query ); typedef void (*FTC_Family_DoneFunc)( FTC_Family family, FTC_Cache cache ); /* initialize a new cache node */ typedef FT_Error (*FTC_Node_InitFunc)( FTC_Node node, FT_Pointer type, FTC_Cache cache ); /* compute the weight of a given cache node */ typedef FT_ULong (*FTC_Node_WeightFunc)( FTC_Node node, FTC_Cache cache ); /* compare a node to a given key pair */ typedef FT_Bool (*FTC_Node_CompareFunc)( FTC_Node node, FT_Pointer key, FTC_Cache cache ); /* finalize a given cache node */ typedef void (*FTC_Node_DoneFunc)( FTC_Node node, FTC_Cache cache ); typedef struct FTC_Cache_ClassRec_ { FT_UInt cache_size; FTC_Cache_InitFunc cache_init; FTC_Cache_ClearFunc cache_clear; FTC_Cache_DoneFunc cache_done; FT_UInt family_size; FTC_Family_InitFunc family_init; FTC_Family_CompareFunc family_compare; FTC_Family_DoneFunc family_done; FT_UInt node_size; FTC_Node_InitFunc node_init; FTC_Node_WeightFunc node_weight; FTC_Node_CompareFunc node_compare; FTC_Node_DoneFunc node_done; } FTC_Cache_ClassRec; /* */ /*************************************************************************/ /* */ /* These functions are exported so that they can be called from */ /* user-provided cache classes; otherwise, they are really part of the */ /* cache sub-system internals. */ /* */ /* can be used directly as FTC_Cache_DoneFunc(), or called by custom */ /* cache finalizers */ FT_EXPORT( void ) ftc_cache_done( FTC_Cache cache ); /* can be used directly as FTC_Cache_ClearFunc(), or called by custom */ /* cache clear routines */ FT_EXPORT( void ) ftc_cache_clear( FTC_Cache cache ); /* initalize the hash table within the cache */ FT_EXPORT( FT_Error ) ftc_cache_init( FTC_Cache cache ); /* can be called when the key's hash value has been computed */ FT_EXPORT( FT_Error ) ftc_cache_lookup( FTC_Cache cache, FTC_Query query, FTC_Node *anode ); /* */ FT_END_HEADER #endif /* __FTCCACHE_H__ */ /* END */ eRec_* FTC_Cache; /* handle to cache class */ typedef const struct FTC_Cache_ClassRold_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ftccmap.h 664 0 0 27766 7607330526 24657ustar00pietropietro/***************************************************************************/ /* */ /* ftccmap.h */ /* */ /* FreeType charmap cache (specification). */ /* */ /* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTCCMAP_H__ #define __FTCCMAP_H__ #include #include FT_CACHE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /*

*/ /* cache_subsystem */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* @type: */ /* FTC_CmapCache */ /* */ /* @description: */ /* An opaque handle used to manager a charmap cache. This cache is */ /* to hold character codes -> glyph indices mappings. */ /* */ typedef struct FTC_CMapCacheRec_* FTC_CMapCache; /*************************************************************************/ /* */ /* @type: */ /* FTC_CMapDesc */ /* */ /* @description: */ /* A handle to an @FTC_CMapDescRec structure used to describe a given */ /* charmap in a charmap cache. */ /* */ /* Each @FTC_CMapDesc describes which charmap (of which @FTC_Face) we */ /* want to use in @FTC_CMapCache_Lookup. */ /* */ typedef struct FTC_CMapDescRec_* FTC_CMapDesc; /*************************************************************************/ /* */ /* @enum: */ /* FTC_CMapType */ /* */ /* @description: */ /* The list of valid @FTC_CMap types. They indicate how we want to */ /* address a charmap within an @FTC_FaceID. */ /* */ /* @values: */ /* FTC_CMAP_BY_INDEX :: */ /* Address a charmap by its index in the corresponding @FT_Face. */ /* */ /* FTC_CMAP_BY_ENCODING :: */ /* Use a @FT_Face charmap that corresponds to a given encoding. */ /* */ /* FTC_CMAP_BY_ID :: */ /* Use an @FT_Face charmap that corresponds to a given */ /* (platform,encoding) ID. See @FTC_CMapIdRec. */ /* */ typedef enum FTC_CMapType_ { FTC_CMAP_BY_INDEX = 0, FTC_CMAP_BY_ENCODING = 1, FTC_CMAP_BY_ID = 2 } FTC_CMapType; /*************************************************************************/ /* */ /* @struct: */ /* FTC_CMapIdRec */ /* */ /* @description: */ /* A short structure to identify a charmap by a (platform,encoding) */ /* pair of values. */ /* */ /* @fields: */ /* platform :: The platform ID. */ /* */ /* encoding :: The encoding ID. */ /* */ typedef struct FTC_CMapIdRec_ { FT_UInt platform; FT_UInt encoding; } FTC_CMapIdRec; /*************************************************************************/ /* */ /* @struct: */ /* FTC_CMapDescRec */ /* */ /* @description: */ /* A structure to describe a given charmap to @FTC_CMapCache. */ /* */ /* @fields: */ /* face_id :: @FTC_FaceID of the face this charmap belongs to. */ /* */ /* type :: The type of charmap, see @FTC_CMapType. */ /* */ /* u.index :: For @FTC_CMAP_BY_INDEX types, this is the charmap */ /* index (within a @FT_Face) we want to use. */ /* */ /* u.encoding :: For @FTC_CMAP_BY_ENCODING types, this is the charmap */ /* encoding we want to use. see @FT_Encoding. */ /* */ /* u.id :: For @FTC_CMAP_BY_ID types, this is the */ /* (platform,encoding) pair we want to use. see */ /* @FTC_CMapIdRec and @FT_CharMapRec. */ /* */ typedef struct FTC_CMapDescRec_ { FTC_FaceID face_id; FTC_CMapType type; union { FT_UInt index; FT_Encoding encoding; FTC_CMapIdRec id; } u; } FTC_CMapDescRec; /*************************************************************************/ /* */ /* @function: */ /* FTC_CMapCache_New */ /* */ /* @description: */ /* Creates a new charmap cache. */ /* */ /* @input: */ /* manager :: A handle to the cache manager. */ /* */ /* @output: */ /* acache :: A new cache handle. NULL in case of error. */ /* */ /* @return: */ /* FreeType error code. 0 means success. */ /* */ /* @note: */ /* Like all other caches, this one will be destroyed with the cache */ /* manager. */ /* */ FT_EXPORT( FT_Error ) FTC_CMapCache_New( FTC_Manager manager, FTC_CMapCache *acache ); /*************************************************************************/ /* */ /* @function: */ /* FTC_CMapCache_Lookup */ /* */ /* @description: */ /* Translates a character code into a glyph index, using the charmap */ /* cache. */ /* */ /* @input: */ /* cache :: A charmap cache handle. */ /* */ /* cmap_desc :: A charmap descriptor handle. */ /* */ /* char_code :: The character code (in the corresponding charmap). */ /* */ /* @return: */ /* Glyph index. 0 means "no glyph". */ /* */ /* @note: */ /* This function doesn't return @FTC_Node handles, since there is no */ /* real use for them with typical uses of charmaps. */ /* */ FT_EXPORT( FT_UInt ) FTC_CMapCache_Lookup( FTC_CMapCache cache, FTC_CMapDesc cmap_desc, FT_UInt32 char_code ); /* */ FT_END_HEADER #endif /* __FTCCMAP_H__ */ /* END */ old_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ftcglyph.h 664 0 0 20137 7607330526 25043ustar00pietropietro/***************************************************************************/ /* */ /* ftcglyph.h */ /* */ /* FreeType abstract glyph cache (specification). */ /* */ /* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* Important: The functions defined in this file are only used to */ /* implement an abstract glyph cache class. You need to */ /* provide additional logic to implement a complete cache. */ /* For example, see `ftcimage.h' and `ftcimage.c' which */ /* implement a FT_Glyph cache based on this code. */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /********* *********/ /********* WARNING, THIS IS BETA CODE. *********/ /********* *********/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #ifndef __FTCGLYPH_H__ #define __FTCGLYPH_H__ #include #include FT_CACHE_H #include FT_CACHE_MANAGER_H #include FT_BEGIN_HEADER /* each glyph set is characterized by a "glyph set type" which must be */ /* defined by sub-classes */ typedef struct FTC_GlyphFamilyRec_* FTC_GlyphFamily; /* handle to a glyph cache node */ typedef struct FTC_GlyphNodeRec_* FTC_GlyphNode; /* size should be 24 + chunk size on 32-bit machines; */ /* note that the node's hash is ((gfam->hash << 16) | glyph_index) -- */ /* this _must_ be set properly by the glyph node initializer */ /* */ typedef struct FTC_GlyphNodeRec_ { FTC_NodeRec node; FT_UShort item_count; FT_UShort item_start; } FTC_GlyphNodeRec; #define FTC_GLYPH_NODE( x ) ( (FTC_GlyphNode)(x) ) #define FTC_GLYPH_NODE_P( x ) ( (FTC_GlyphNode*)(x) ) typedef struct FTC_GlyphQueryRec_ { FTC_QueryRec query; FT_UInt gindex; } FTC_GlyphQueryRec, *FTC_GlyphQuery; #define FTC_GLYPH_QUERY( x ) ( (FTC_GlyphQuery)(x) ) /* a glyph set is used to categorize glyphs of a given type */ typedef struct FTC_GlyphFamilyRec_ { FTC_FamilyRec family; FT_UInt32 hash; FT_UInt item_total; /* total number of glyphs in family */ FT_UInt item_count; /* number of glyph items per node */ } FTC_GlyphFamilyRec; #define FTC_GLYPH_FAMILY( x ) ( (FTC_GlyphFamily)(x) ) #define FTC_GLYPH_FAMILY_P( x ) ( (FTC_GlyphFamily*)(x) ) #define FTC_GLYPH_FAMILY_MEMORY( x ) FTC_FAMILY(x)->cache->memory /* each glyph node contains a 'chunk' of glyph items; */ /* translate a glyph index into a chunk index */ #define FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) \ ( ( gindex ) / FTC_GLYPH_FAMILY( gfam )->item_count ) /* find a glyph index's chunk, and return its start index */ #define FTC_GLYPH_FAMILY_START( gfam, gindex ) \ ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) * \ FTC_GLYPH_FAMILY( gfam )->item_count ) /* compute a glyph request's hash value */ #define FTC_GLYPH_FAMILY_HASH( gfam, gindex ) \ ( (FT_UFast)( \ ( FTC_GLYPH_FAMILY( gfam )->hash << 16 ) | \ ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) & 0xFFFF ) ) ) /* must be called in an FTC_Family_CompareFunc to update the query */ /* whenever a glyph set is matched in the lookup, or when it */ /* is created */ #define FTC_GLYPH_FAMILY_FOUND( gfam, gquery ) \ do \ { \ FTC_QUERY( gquery )->family = FTC_FAMILY( gfam ); \ FTC_QUERY( gquery )->hash = \ FTC_GLYPH_FAMILY_HASH( gfam, \ FTC_GLYPH_QUERY( gquery )->gindex ); \ } while ( 0 ) /* retrieve glyph index of glyph node */ #define FTC_GLYPH_NODE_GINDEX( x ) \ ( (FT_UInt)( FTC_GLYPH_NODE( x )->node.hash & 0xFFFF ) ) /*************************************************************************/ /* */ /* These functions are exported so that they can be called from */ /* user-provided cache classes; otherwise, they are really part of the */ /* cache sub-system internals. */ /* */ /* must be called by derived FTC_Node_InitFunc routines */ FT_EXPORT( void ) ftc_glyph_node_init( FTC_GlyphNode node, FT_UInt gindex, /* glyph index for node */ FTC_GlyphFamily gfam ); /* returns TRUE iff the query's glyph index correspond to the node; */ /* this assumes that the "family" and "hash" fields of the query are */ /* already correctly set */ FT_EXPORT( FT_Bool ) ftc_glyph_node_compare( FTC_GlyphNode gnode, FTC_GlyphQuery gquery ); /* must be called by derived FTC_Node_DoneFunc routines */ FT_EXPORT( void ) ftc_glyph_node_done( FTC_GlyphNode node, FTC_Cache cache ); /* must be called by derived FTC_Family_InitFunc; */ /* calls "ftc_family_init" */ FT_EXPORT( FT_Error ) ftc_glyph_family_init( FTC_GlyphFamily gfam, FT_UInt32 hash, FT_UInt item_count, FT_UInt item_total, FTC_GlyphQuery gquery, FTC_Cache cache ); FT_EXPORT( void ) ftc_glyph_family_done( FTC_GlyphFamily gfam ); /* */ FT_END_HEADER #endif /* __FTCGLYPH_H__ */ /* END */ */ /* */ /* @input: */ /* cache :: A charmap cache handle. */ /* */ /* cmap_desc :: A charmap descriptor handle. */ /old_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ftcimage.h 664 0 0 41377 7607330526 25013ustar00pietropietro/***************************************************************************/ /* */ /* ftcimage.h */ /* */ /* FreeType Image cache (specification). */ /* */ /* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* Each image cache really manages FT_Glyph objects. */ /* */ /*************************************************************************/ #ifndef __FTCIMAGE_H__ #define __FTCIMAGE_H__ #include #include FT_CACHE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /*
*/ /* cache_subsystem */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** IMAGE CACHE OBJECT *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /************************************************************************** * * @struct: * FTC_ImageTypeRec * * @description: * A simple structure used to describe the type of glyph image to be * loaded into the cache. * * @fields: * font :: An @FTC_FontRec used to describe the glyph's face and size. * * flags :: The load flags to be applied when loading the glyph; see * the @FT_LOAD_XXX constants for details. * * @note: * This type completely replaces the @FTC_Image_Desc structure which is * now obsolete. */ typedef struct FTC_ImageTypeRec_ { FTC_FontRec font; FT_Int32 flags; } FTC_ImageTypeRec; typedef struct FTC_ImageTypeRec_* FTC_ImageType; /* */ #define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ ( FTC_FONT_COMPARE( &(d1)->font, &(d2)->font ) && \ (d1)->flags == (d2)->flags ) #define FTC_IMAGE_TYPE_HASH( d ) \ (FT_UFast)( FTC_FONT_HASH( &(d)->font ) ^ \ ( (d)->flags << 4 ) ) /*************************************************************************/ /* */ /* */ /* FTC_ImageCache */ /* */ /* */ /* A handle to an glyph image cache object. They are designed to */ /* hold many distinct glyph images while not exceeding a certain */ /* memory threshold. */ /* */ typedef struct FTC_ImageCacheRec_* FTC_ImageCache; /*************************************************************************/ /* */ /* */ /* FTC_ImageCache_New */ /* */ /* */ /* Creates a new glyph image cache. */ /* */ /* */ /* manager :: The parent manager for the image cache. */ /* */ /* */ /* acache :: A handle to the new glyph image cache object. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FTC_ImageCache_New( FTC_Manager manager, FTC_ImageCache *acache ); /*************************************************************************/ /* */ /* */ /* FTC_ImageCache_Lookup */ /* */ /* */ /* Retrieves a given glyph image from a glyph image cache. */ /* */ /* */ /* cache :: A handle to the source glyph image cache. */ /* */ /* type :: A pointer to a glyph image type descriptor. */ /* */ /* gindex :: The glyph index to retrieve. */ /* */ /* */ /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ /* failure. */ /* */ /* anode :: Used to return the address of of the corresponding cache */ /* node after incrementing its reference count (see note */ /* below). */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* */ /* The returned glyph is owned and managed by the glyph image cache. */ /* Never try to transform or discard it manually! You can however */ /* create a copy with @FT_Glyph_Copy and modify the new one. */ /* */ /* If "anode" is _not_ NULL, it receives the address of the cache */ /* node containing the glyph image, after increasing its reference */ /* count. This ensures that the node (as well as the FT_Glyph) will */ /* always be kept in the cache until you call @FTC_Node_Unref to */ /* "release" it. */ /* */ /* If "anode" is NULL, the cache node is left unchanged, which means */ /* that the FT_Glyph could be flushed out of the cache on the next */ /* call to one of the caching sub-system APIs. Don't assume that it */ /* is persistent! */ /* */ FT_EXPORT( FT_Error ) FTC_ImageCache_Lookup( FTC_ImageCache cache, FTC_ImageType type, FT_UInt gindex, FT_Glyph *aglyph, FTC_Node *anode ); /* */ #define ftc_image_format( x ) ( (x) & 7 ) #define ftc_image_format_bitmap 0x0000 #define ftc_image_format_outline 0x0001 #define ftc_image_format_mask 0x000F #define ftc_image_flag_monochrome 0x0010 #define ftc_image_flag_unhinted 0x0020 #define ftc_image_flag_autohinted 0x0040 #define ftc_image_flag_unscaled 0x0080 #define ftc_image_flag_no_sbits 0x0100 /* monochrome bitmap */ #define ftc_image_mono ftc_image_format_bitmap | \ ftc_image_flag_monochrome /* anti-aliased bitmap */ #define ftc_image_grays ftc_image_format_bitmap /* scaled outline */ #define ftc_image_outline ftc_image_format_outline /*************************************************************************/ /* */ /* */ /* FTC_Image_Desc */ /* */ /* */ /* THIS TYPE IS DEPRECATED. Use @FTC_ImageDesc instead. */ /* */ /* A simple structure used to describe a given glyph image category. */ /* */ /* */ /* size :: An @FTC_SizeRec used to describe the glyph's face */ /* and size. */ /* */ /* image_type :: The glyph image's type. */ /* */ typedef struct FTC_Image_Desc_ { FTC_FontRec font; FT_UInt image_type; } FTC_Image_Desc; /*************************************************************************/ /* */ /* */ /* FTC_Image_Cache */ /* */ /* */ /* THIS TYPE IS DEPRECATED. Use @FTC_ImageCache instead. */ /* */ typedef FTC_ImageCache FTC_Image_Cache; /*************************************************************************/ /* */ /* */ /* FTC_Image_Cache_New */ /* */ /* */ /* THIS FUNCTION IS DEPRECATED. Use @FTC_ImageCache_New instead. */ /* */ /* Creates a new glyph image cache. */ /* */ /* */ /* manager :: The parent manager for the image cache. */ /* */ /* */ /* acache :: A handle to the new glyph image cache object. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FTC_Image_Cache_New( FTC_Manager manager, FTC_Image_Cache *acache ); /*************************************************************************/ /* */ /* */ /* FTC_Image_Cache_Lookup */ /* */ /* */ /* THIS FUNCTION IS DEPRECATED. Use @FTC_ImageCache_Lookup instead. */ /* */ /* */ /* cache :: A handle to the source glyph image cache. */ /* */ /* desc :: A pointer to a glyph image descriptor. */ /* */ /* gindex :: The glyph index to retrieve. */ /* */ /* */ /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ /* failure. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* */ /* The returned glyph is owned and managed by the glyph image cache. */ /* Never try to transform or discard it manually! You can however */ /* create a copy with @FT_Glyph_Copy and modify the new one. */ /* */ /* Because the glyph image cache limits the total amount of memory */ /* taken by the glyphs it holds, the returned glyph might disappear */ /* on a later invocation of this function! It is a cache after */ /* all... */ /* */ /* Use this function to "lock" the glyph as long as it is needed. */ /* */ FT_EXPORT( FT_Error ) FTC_Image_Cache_Lookup( FTC_Image_Cache cache, FTC_Image_Desc* desc, FT_UInt gindex, FT_Glyph *aglyph ); /* */ FT_END_HEADER #endif /* __FTCIMAGE_H__ */ /* END */ */ /* */ /* cache :: A handle to the source glyph image cache. */ /* */ old_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ftcmanag.h 664 0 0 30167 7607330526 25007ustar00pietropietro/***************************************************************************/ /* */ /* ftcmanag.h */ /* */ /* FreeType Cache Manager (specification). */ /* */ /* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* A cache manager is in charge of the following: */ /* */ /* - Maintain a mapping between generic FTC_FaceIDs and live FT_Face */ /* objects. The mapping itself is performed through a user-provided */ /* callback. However, the manager maintains a small cache of FT_Face */ /* and FT_Size objects in order to speed up things considerably. */ /* */ /* - Manage one or more cache objects. Each cache is in charge of */ /* holding a varying number of `cache nodes'. Each cache node */ /* represents a minimal amount of individually accessible cached */ /* data. For example, a cache node can be an FT_Glyph image */ /* containing a vector outline, or some glyph metrics, or anything */ /* else. */ /* */ /* Each cache node has a certain size in bytes that is added to the */ /* total amount of `cache memory' within the manager. */ /* */ /* All cache nodes are located in a global LRU list, where the oldest */ /* node is at the tail of the list. */ /* */ /* Each node belongs to a single cache, and includes a reference */ /* count to avoid destroying it (due to caching). */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /********* *********/ /********* WARNING, THIS IS BETA CODE. *********/ /********* *********/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #ifndef __FTCMANAG_H__ #define __FTCMANAG_H__ #include #include FT_CACHE_H #include FT_CACHE_INTERNAL_LRU_H #include FT_CACHE_INTERNAL_CACHE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /*
*/ /* cache_subsystem */ /* */ /*************************************************************************/ #define FTC_MAX_FACES_DEFAULT 2 #define FTC_MAX_SIZES_DEFAULT 4 #define FTC_MAX_BYTES_DEFAULT 200000L /* ~200kByte by default */ /* maximum number of caches registered in a single manager */ #define FTC_MAX_CACHES 16 typedef struct FTC_FamilyEntryRec_ { FTC_Family family; FTC_Cache cache; FT_UInt index; FT_UInt link; } FTC_FamilyEntryRec, *FTC_FamilyEntry; #define FTC_FAMILY_ENTRY_NONE ( (FT_UInt)-1 ) typedef struct FTC_FamilyTableRec_ { FT_UInt count; FT_UInt size; FTC_FamilyEntry entries; FT_UInt free; } FTC_FamilyTableRec, *FTC_FamilyTable; FT_EXPORT( FT_Error ) ftc_family_table_alloc( FTC_FamilyTable table, FT_Memory memory, FTC_FamilyEntry *aentry ); FT_EXPORT( void ) ftc_family_table_free( FTC_FamilyTable table, FT_UInt idx ); /*************************************************************************/ /* */ /* */ /* FTC_ManagerRec */ /* */ /* */ /* The cache manager structure. */ /* */ /* */ /* library :: A handle to a FreeType library instance. */ /* */ /* faces_list :: The lru list of @FT_Face objects in the cache. */ /* */ /* sizes_list :: The lru list of @FT_Size objects in the cache. */ /* */ /* max_weight :: The maximum cache pool weight. */ /* */ /* cur_weight :: The current cache pool weight. */ /* */ /* num_nodes :: The current number of nodes in the manager. */ /* */ /* nodes_list :: The global lru list of all cache nodes. */ /* */ /* caches :: A table of installed/registered cache objects. */ /* */ /* request_data :: User-provided data passed to the requester. */ /* */ /* request_face :: User-provided function used to implement a mapping */ /* between abstract @FTC_FaceID values and real */ /* @FT_Face objects. */ /* */ /* families :: Global table of families. */ /* */ typedef struct FTC_ManagerRec_ { FT_Library library; FT_LruList faces_list; FT_LruList sizes_list; FT_ULong max_weight; FT_ULong cur_weight; FT_UInt num_nodes; FTC_Node nodes_list; FTC_Cache caches[FTC_MAX_CACHES]; FT_Pointer request_data; FTC_Face_Requester request_face; FTC_FamilyTableRec families; } FTC_ManagerRec; /*************************************************************************/ /* */ /* */ /* FTC_Manager_Compress */ /* */ /* */ /* This function is used to check the state of the cache manager if */ /* its `num_bytes' field is greater than its `max_bytes' field. It */ /* will flush as many old cache nodes as possible (ignoring cache */ /* nodes with a non-zero reference count). */ /* */ /* */ /* manager :: A handle to the cache manager. */ /* */ /* */ /* Client applications should not call this function directly. It is */ /* normally invoked by specific cache implementations. */ /* */ /* The reason this function is exported is to allow client-specific */ /* cache classes. */ /* */ FT_EXPORT( void ) FTC_Manager_Compress( FTC_Manager manager ); /* this must be used internally for the moment */ FT_EXPORT( FT_Error ) FTC_Manager_Register_Cache( FTC_Manager manager, FTC_Cache_Class clazz, FTC_Cache *acache ); /* can be called to increment a node's reference count */ FT_EXPORT( void ) FTC_Node_Ref( FTC_Node node, FTC_Manager manager ); /*************************************************************************/ /* */ /* */ /* FTC_Node_Unref */ /* */ /* */ /* Decrement a cache node's internal reference count. When the count */ /* reaches 0, it is not destroyed but becomes eligible for subsequent */ /* cache flushes. */ /* */ /* */ /* node :: The cache node handle. */ /* */ /* manager :: The cache manager handle. */ /* */ FT_EXPORT( void ) FTC_Node_Unref( FTC_Node node, FTC_Manager manager ); /* */ FT_END_HEADER #endif /* __FTCMANAG_H__ */ /* END */ old_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ftcsbits.h 664 0 0 40637 7607330526 25053ustar00pietropietro/***************************************************************************/ /* */ /* ftcsbits.h */ /* */ /* A small-bitmap cache (specification). */ /* */ /* Copyright 2000-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTCSBITS_H__ #define __FTCSBITS_H__ #include #include FT_CACHE_H #include FT_CACHE_IMAGE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /*
*/ /* cache_subsystem */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* */ /* FTC_SBit */ /* */ /* */ /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ /* structure for details. */ /* */ typedef struct FTC_SBitRec_* FTC_SBit; /*************************************************************************/ /* */ /* */ /* FTC_SBitRec */ /* */ /* */ /* A very compact structure used to describe a small glyph bitmap. */ /* */ /* */ /* width :: The bitmap width in pixels. */ /* */ /* height :: The bitmap height in pixels. */ /* */ /* left :: The horizontal distance from the pen position to the */ /* left bitmap border (a.k.a. `left side bearing', or */ /* `lsb'). */ /* */ /* top :: The vertical distance from the pen position (on the */ /* baseline) to the upper bitmap border (a.k.a. `top */ /* side bearing'). The distance is positive for upwards */ /* Y coordinates. */ /* */ /* format :: The format of the glyph bitmap (monochrome or gray). */ /* */ /* max_grays :: Maximum gray level value (in the range 1 to 255). */ /* */ /* pitch :: The number of bytes per bitmap line. May be positive */ /* or negative. */ /* */ /* xadvance :: The horizontal advance width in pixels. */ /* */ /* yadvance :: The vertical advance height in pixels. */ /* */ /* buffer :: A pointer to the bitmap pixels. */ /* */ typedef struct FTC_SBitRec_ { FT_Byte width; FT_Byte height; FT_Char left; FT_Char top; FT_Byte format; FT_Byte max_grays; FT_Short pitch; FT_Char xadvance; FT_Char yadvance; FT_Byte* buffer; } FTC_SBitRec; /*************************************************************************/ /* */ /* */ /* FTC_SBitCache */ /* */ /* */ /* A handle to a small bitmap cache. These are special cache objects */ /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ /* much more efficient way than the traditional glyph image cache */ /* implemented by @FTC_ImageCache. */ /* */ typedef struct FTC_SBitCacheRec_* FTC_SBitCache; /*************************************************************************/ /* */ /* */ /* FTC_SBit_Cache */ /* */ /* */ /* DEPRECATED. Use @FTC_SBitCache instead. */ /* */ typedef FTC_SBitCache FTC_SBit_Cache; /*************************************************************************/ /* */ /* */ /* FTC_SBitCache_New */ /* */ /* */ /* Creates a new cache to store small glyph bitmaps. */ /* */ /* */ /* manager :: A handle to the source cache manager. */ /* */ /* */ /* acache :: A handle to the new sbit cache. NULL in case of error. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FTC_SBitCache_New( FTC_Manager manager, FTC_SBitCache *acache ); /*************************************************************************/ /* */ /* */ /* FTC_SBitCache_Lookup */ /* */ /* */ /* Looks up a given small glyph bitmap in a given sbit cache and */ /* "lock" it to prevent its flushing from the cache until needed */ /* */ /* */ /* cache :: A handle to the source sbit cache. */ /* */ /* type :: A pointer to the glyph image type descriptor. */ /* */ /* gindex :: The glyph index. */ /* */ /* */ /* sbit :: A handle to a small bitmap descriptor. */ /* */ /* anode :: Used to return the address of of the corresponding cache */ /* node after incrementing its reference count (see note */ /* below). */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* */ /* The small bitmap descriptor and its bit buffer are owned by the */ /* cache and should never be freed by the application. They might */ /* as well disappear from memory on the next cache lookup, so don't */ /* treat them as persistent data. */ /* */ /* The descriptor's `buffer' field is set to 0 to indicate a missing */ /* glyph bitmap. */ /* */ /* If "anode" is _not_ NULL, it receives the address of the cache */ /* node containing the bitmap, after increasing its reference count. */ /* This ensures that the node (as well as the image) will always be */ /* kept in the cache until you call @FTC_Node_Unref to "release" it. */ /* */ /* If "anode" is NULL, the cache node is left unchanged, which means */ /* that the bitmap could be flushed out of the cache on the next */ /* call to one of the caching sub-system APIs. Don't assume that it */ /* is persistent! */ /* */ FT_EXPORT( FT_Error ) FTC_SBitCache_Lookup( FTC_SBitCache cache, FTC_ImageType type, FT_UInt gindex, FTC_SBit *sbit, FTC_Node *anode ); /* */ /*************************************************************************/ /* */ /* */ /* FTC_SBit_Cache_New */ /* */ /* */ /* DEPRECATED. Use @FTC_SBitCache_New instead. */ /* */ /* Creates a new cache to store small glyph bitmaps. */ /* */ /* */ /* manager :: A handle to the source cache manager. */ /* */ /* */ /* acache :: A handle to the new sbit cache. NULL in case of error. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FTC_SBit_Cache_New( FTC_Manager manager, FTC_SBit_Cache *acache ); /*************************************************************************/ /* */ /* */ /* FTC_SBit_Cache_Lookup */ /* */ /* */ /* DEPRECATED. Use @FTC_SBitCache_Lookup instead. */ /* */ /* Looks up a given small glyph bitmap in a given sbit cache. */ /* */ /* */ /* cache :: A handle to the source sbit cache. */ /* */ /* desc :: A pointer to the glyph image descriptor. */ /* */ /* gindex :: The glyph index. */ /* */ /* */ /* sbit :: A handle to a small bitmap descriptor. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* */ /* The small bitmap descriptor and its bit buffer are owned by the */ /* cache and should never be freed by the application. They might */ /* as well disappear from memory on the next cache lookup, so don't */ /* treat them as persistent data. */ /* */ /* The descriptor's `buffer' field is set to 0 to indicate a missing */ /* glyph bitmap. */ /* */ FT_EXPORT( FT_Error ) FTC_SBit_Cache_Lookup( FTC_SBit_Cache cache, FTC_Image_Desc* desc, FT_UInt gindex, FTC_SBit *sbit ); FT_END_HEADER #endif /* __FTCSBITS_H__ */ /* END */ **************************************/ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/cache/ftlru.h 664 0 0 20022 7607330526 24350ustar00pietropietro/***************************************************************************/ /* */ /* ftlru.h */ /* */ /* Simple LRU list-cache (specification). */ /* */ /* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* An LRU is a list that cannot hold more than a certain number of */ /* elements (`max_elements'). All elements in the list are sorted in */ /* least-recently-used order, i.e., the `oldest' element is at the tail */ /* of the list. */ /* */ /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */ /* the list is searched for an element with the corresponding key. If */ /* it is found, the element is moved to the head of the list and is */ /* returned. */ /* */ /* If no corresponding element is found, the lookup routine will try to */ /* obtain a new element with the relevant key. If the list is already */ /* full, the oldest element from the list is discarded and replaced by a */ /* new one; a new element is added to the list otherwise. */ /* */ /* Note that it is possible to pre-allocate the element list nodes. */ /* This is handy if `max_elements' is sufficiently small, as it saves */ /* allocations/releases during the lookup process. */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /********* *********/ /********* WARNING, THIS IS BETA CODE. *********/ /********* *********/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #ifndef __FTLRU_H__ #define __FTLRU_H__ #include #include FT_FREETYPE_H FT_BEGIN_HEADER /* generic list key type */ typedef FT_Pointer FT_LruKey; /* a list list handle */ typedef struct FT_LruListRec_* FT_LruList; /* a list class handle */ typedef const struct FT_LruList_ClassRec_* FT_LruList_Class; /* a list node handle */ typedef struct FT_LruNodeRec_* FT_LruNode; /* the list node structure */ typedef struct FT_LruNodeRec_ { FT_LruNode next; FT_LruKey key; } FT_LruNodeRec; /* the list structure */ typedef struct FT_LruListRec_ { FT_Memory memory; FT_LruList_Class clazz; FT_LruNode nodes; FT_UInt max_nodes; FT_UInt num_nodes; FT_Pointer data; } FT_LruListRec; /* initialize a list list */ typedef FT_Error (*FT_LruList_InitFunc)( FT_LruList list ); /* finalize a list list */ typedef void (*FT_LruList_DoneFunc)( FT_LruList list ); /* this method is used to initialize a new list element node */ typedef FT_Error (*FT_LruNode_InitFunc)( FT_LruNode node, FT_LruKey key, FT_Pointer data ); /* this method is used to finalize a given list element node */ typedef void (*FT_LruNode_DoneFunc)( FT_LruNode node, FT_Pointer data ); /* If defined, this method is called when the list if full */ /* during the lookup process -- it is used to change the contents */ /* of a list element node instead of calling `done_element()', */ /* then `init_element()'. Set it to 0 for default behaviour. */ typedef FT_Error (*FT_LruNode_FlushFunc)( FT_LruNode node, FT_LruKey new_key, FT_Pointer data ); /* If defined, this method is used to compare a list element node */ /* with a given key during a lookup. If set to 0, the `key' */ /* fields will be directly compared instead. */ typedef FT_Bool (*FT_LruNode_CompareFunc)( FT_LruNode node, FT_LruKey key, FT_Pointer data ); /* A selector is used to indicate whether a given list element node */ /* is part of a selection for FT_LruList_Remove_Selection(). The */ /* functrion must return true (i.e., non-null) to indicate that the */ /* node is part of it. */ typedef FT_Bool (*FT_LruNode_SelectFunc)( FT_LruNode node, FT_Pointer data, FT_Pointer list_data ); /* LRU class */ typedef struct FT_LruList_ClassRec_ { FT_UInt list_size; FT_LruList_InitFunc list_init; /* optional */ FT_LruList_DoneFunc list_done; /* optional */ FT_UInt node_size; FT_LruNode_InitFunc node_init; /* MANDATORY */ FT_LruNode_DoneFunc node_done; /* optional */ FT_LruNode_FlushFunc node_flush; /* optional */ FT_LruNode_CompareFunc node_compare; /* optional */ } FT_LruList_ClassRec; /* The following functions must be exported in the case where */ /* applications would want to write their own cache classes. */ FT_EXPORT( FT_Error ) FT_LruList_New( FT_LruList_Class clazz, FT_UInt max_elements, FT_Pointer user_data, FT_Memory memory, FT_LruList *alist ); FT_EXPORT( void ) FT_LruList_Reset( FT_LruList list ); FT_EXPORT( void ) FT_LruList_Destroy ( FT_LruList list ); FT_EXPORT( FT_Error ) FT_LruList_Lookup( FT_LruList list, FT_LruKey key, FT_LruNode *anode ); FT_EXPORT( void ) FT_LruList_Remove( FT_LruList list, FT_LruNode node ); FT_EXPORT( void ) FT_LruList_Remove_Selection( FT_LruList list, FT_LruNode_SelectFunc select_func, FT_Pointer select_data ); /* */ FT_END_HEADER #endif /* __FTLRU_H__ */ /* END */ */ /* sbit :: A handle to a small bitmap descriptor. */ /* */ /* */ /* FreeType error code. 0 means success. */ /* */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ 775 0 0 0 11411737735 232525ustar00pietropietroold_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftconfig.h 664 0 0 27576 7732077027 25245ustar00pietropietro/***************************************************************************/ /* */ /* ftconfig.h */ /* */ /* ANSI-specific configuration file (specification only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This header file contains a number of macro definitions that are used */ /* by the rest of the engine. Most of the macros here are automatically */ /* determined at compile time, and you should not need to change it to */ /* port FreeType, except to compile the library with a non-ANSI */ /* compiler. */ /* */ /* Note however that if some specific modifications are needed, we */ /* advise you to place a modified copy in your build directory. */ /* */ /* The build directory is usually `freetype/builds/', and */ /* contains system-specific files that are always included first when */ /* building the library. */ /* */ /* This ANSI version should stay in `include/freetype/config'. */ /* */ /*************************************************************************/ #ifndef __FTCONFIG_H__ #define __FTCONFIG_H__ #include #include FT_CONFIG_OPTIONS_H #include FT_CONFIG_STANDARD_LIBRARY_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ /* */ /* These macros can be toggled to suit a specific system. The current */ /* ones are defaults used to compile FreeType in an ANSI C environment */ /* (16bit compilers are also supported). Copy this file to your own */ /* `freetype/builds/' directory, and edit it to port the engine. */ /* */ /*************************************************************************/ /* The number of bytes in an `int' type. */ #if FT_UINT_MAX == 0xFFFFFFFFUL #define FT_SIZEOF_INT 4 #elif FT_UINT_MAX == 0xFFFFU #define FT_SIZEOF_INT 2 #elif FT_UINT_MAX > 0xFFFFFFFFU && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFU #define FT_SIZEOF_INT 8 #else #error "Unsupported number of bytes in `int' type!" #endif /* The number of bytes in a `long' type. */ #if FT_ULONG_MAX == 0xFFFFFFFFUL #define FT_SIZEOF_LONG 4 #elif FT_ULONG_MAX > 0xFFFFFFFFU && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFU #define FT_SIZEOF_LONG 8 #else #error "Unsupported number of bytes in `long' type!" #endif /* Preferred alignment of data */ #define FT_ALIGNMENT 8 /* FT_UNUSED is a macro used to indicate that a given parameter is not */ /* used -- this is only used to get rid of unpleasant compiler warnings */ #ifndef FT_UNUSED #define FT_UNUSED( arg ) ( (arg) = (arg) ) #endif /*************************************************************************/ /* */ /* AUTOMATIC CONFIGURATION MACROS */ /* */ /* These macros are computed from the ones defined above. Don't touch */ /* their definition, unless you know precisely what you are doing. No */ /* porter should need to mess with them. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* Mac support (not MacOS X) */ /* */ /* This is the only necessary change, so it is defined here instead */ /* providing a new configuration file. */ /* */ #if (defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )) && !defined(__MACH__) #define FT_MACINTOSH 1 #endif /*************************************************************************/ /* */ /* IntN types */ /* */ /* Used to guarantee the size of some specific integers. */ /* */ typedef signed short FT_Int16; typedef unsigned short FT_UInt16; #if FT_SIZEOF_INT == 4 typedef signed int FT_Int32; typedef unsigned int FT_UInt32; #elif FT_SIZEOF_LONG == 4 typedef signed long FT_Int32; typedef unsigned long FT_UInt32; #else #error "no 32bit type found -- please check your configuration files" #endif /* now, lookup for an integer type that is at least 32 bits */ #if FT_SIZEOF_INT >= 4 typedef int FT_Fast; typedef unsigned int FT_UFast; #elif FT_SIZEOF_LONG >= 4 typedef long FT_Fast; typedef unsigned long FT_UFast; #endif /* determine whether we have a 64-bit int type for platforms without */ /* Autoconf */ #if FT_SIZEOF_LONG == 8 /* FT_LONG64 must be defined if a 64-bit type is available */ #define FT_LONG64 #define FT_INT64 long #elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ /* this compiler provides the __int64 type */ #define FT_LONG64 #define FT_INT64 __int64 #elif defined( __BORLANDC__ ) /* Borland C++ */ /* XXXX: We should probably check the value of __BORLANDC__ in order */ /* to test the compiler version. */ /* this compiler provides the __int64 type */ #define FT_LONG64 #define FT_INT64 __int64 #elif defined( __WATCOMC__ ) /* Watcom C++ */ /* Watcom doesn't provide 64-bit data types */ #elif defined( __MWKS__ ) /* Metrowerks CodeWarrior */ /* I don't know if it provides 64-bit data types, any suggestion */ /* is welcome. */ #elif defined( __GNUC__ ) /* GCC provides the "long long" type */ #define FT_LONG64 #define FT_INT64 long long int #endif /* FT_SIZEOF_LONG == 8 */ /*************************************************************************/ /* */ /* A 64-bit data type will create compilation problems if you compile */ /* in strict ANSI mode. To avoid them, we disable their use if */ /* __STDC__ is defined. You can however ignore this rule by */ /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ /* */ #if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) #ifdef __STDC__ /* undefine the 64-bit macros in strict ANSI compilation mode */ #undef FT_LONG64 #undef FT_INT64 #endif /* __STDC__ */ #endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ #ifdef FT_MAKE_OPTION_SINGLE_OBJECT #define FT_LOCAL( x ) static x #define FT_LOCAL_DEF( x ) static x #else #ifdef __cplusplus #define FT_LOCAL( x ) extern "C" x #define FT_LOCAL_DEF( x ) extern "C" x #else #define FT_LOCAL( x ) extern x #define FT_LOCAL_DEF( x ) x #endif #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ #ifndef FT_BASE #ifdef __cplusplus #define FT_BASE( x ) extern "C" x #else #define FT_BASE( x ) extern x #endif #endif /* !FT_BASE */ #ifndef FT_BASE_DEF #ifdef __cplusplus #define FT_BASE_DEF( x ) extern "C" x #else #define FT_BASE_DEF( x ) extern x #endif #endif /* !FT_BASE_DEF */ #ifndef FT_EXPORT #ifdef __cplusplus #define FT_EXPORT( x ) extern "C" x #else #define FT_EXPORT( x ) extern x #endif #endif /* !FT_EXPORT */ #ifndef FT_EXPORT_DEF #ifdef __cplusplus #define FT_EXPORT_DEF( x ) extern "C" x #else #define FT_EXPORT_DEF( x ) extern x #endif #endif /* !FT_EXPORT_DEF */ #ifndef FT_EXPORT_VAR #ifdef __cplusplus #define FT_EXPORT_VAR( x ) extern "C" x #else #define FT_EXPORT_VAR( x ) extern x #endif #endif /* !FT_EXPORT_VAR */ /* The following macros are needed to compile the library with a */ /* C++ compiler and with 16bit compilers. */ /* */ /* This is special. Within C++, you must specify `extern "C"' for */ /* functions which are used via function pointers, and you also */ /* must do that for structures which contain function pointers to */ /* assure C linkage -- it's not possible to have (local) anonymous */ /* functions which are accessed by (global) function pointers. */ /* */ /* */ /* FT_CALLBACK_DEF is used to _define_ a callback function. */ /* */ /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ /* contains pointers to callback functions. */ /* */ /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ /* that contains pointers to callback functions. */ /* */ /* */ /* Some 16bit compilers have to redefine these macros to insert */ /* the infamous `_cdecl' or `__fastcall' declarations. */ /* */ #ifndef FT_CALLBACK_DEF #ifdef __cplusplus #define FT_CALLBACK_DEF( x ) extern "C" x #else #define FT_CALLBACK_DEF( x ) static x #endif #endif /* FT_CALLBACK_DEF */ #ifndef FT_CALLBACK_TABLE #ifdef __cplusplus #define FT_CALLBACK_TABLE extern "C" #define FT_CALLBACK_TABLE_DEF extern "C" #else #define FT_CALLBACK_TABLE extern #define FT_CALLBACK_TABLE_DEF /* nothing */ #endif #endif /* FT_CALLBACK_TABLE */ FT_END_HEADER #endif /* __FTCONFIG_H__ */ /* END */ fications are needed, we */ /* advise you to place a modified copy in your build directory. */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftconfig.h.orig 664 0 0 27546 7732077013 26174ustar00pietropietro/***************************************************************************/ /* */ /* ftconfig.h */ /* */ /* ANSI-specific configuration file (specification only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This header file contains a number of macro definitions that are used */ /* by the rest of the engine. Most of the macros here are automatically */ /* determined at compile time, and you should not need to change it to */ /* port FreeType, except to compile the library with a non-ANSI */ /* compiler. */ /* */ /* Note however that if some specific modifications are needed, we */ /* advise you to place a modified copy in your build directory. */ /* */ /* The build directory is usually `freetype/builds/', and */ /* contains system-specific files that are always included first when */ /* building the library. */ /* */ /* This ANSI version should stay in `include/freetype/config'. */ /* */ /*************************************************************************/ #ifndef __FTCONFIG_H__ #define __FTCONFIG_H__ #include #include FT_CONFIG_OPTIONS_H #include FT_CONFIG_STANDARD_LIBRARY_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ /* */ /* These macros can be toggled to suit a specific system. The current */ /* ones are defaults used to compile FreeType in an ANSI C environment */ /* (16bit compilers are also supported). Copy this file to your own */ /* `freetype/builds/' directory, and edit it to port the engine. */ /* */ /*************************************************************************/ /* The number of bytes in an `int' type. */ #if FT_UINT_MAX == 0xFFFFFFFFUL #define FT_SIZEOF_INT 4 #elif FT_UINT_MAX == 0xFFFFU #define FT_SIZEOF_INT 2 #elif FT_UINT_MAX > 0xFFFFFFFFU && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFU #define FT_SIZEOF_INT 8 #else #error "Unsupported number of bytes in `int' type!" #endif /* The number of bytes in a `long' type. */ #if FT_ULONG_MAX == 0xFFFFFFFFUL #define FT_SIZEOF_LONG 4 #elif FT_ULONG_MAX > 0xFFFFFFFFU && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFU #define FT_SIZEOF_LONG 8 #else #error "Unsupported number of bytes in `long' type!" #endif /* Preferred alignment of data */ #define FT_ALIGNMENT 8 /* FT_UNUSED is a macro used to indicate that a given parameter is not */ /* used -- this is only used to get rid of unpleasant compiler warnings */ #ifndef FT_UNUSED #define FT_UNUSED( arg ) ( (arg) = (arg) ) #endif /*************************************************************************/ /* */ /* AUTOMATIC CONFIGURATION MACROS */ /* */ /* These macros are computed from the ones defined above. Don't touch */ /* their definition, unless you know precisely what you are doing. No */ /* porter should need to mess with them. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* Mac support */ /* */ /* This is the only necessary change, so it is defined here instead */ /* providing a new configuration file. */ /* */ #if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) #define FT_MACINTOSH 1 #endif /*************************************************************************/ /* */ /* IntN types */ /* */ /* Used to guarantee the size of some specific integers. */ /* */ typedef signed short FT_Int16; typedef unsigned short FT_UInt16; #if FT_SIZEOF_INT == 4 typedef signed int FT_Int32; typedef unsigned int FT_UInt32; #elif FT_SIZEOF_LONG == 4 typedef signed long FT_Int32; typedef unsigned long FT_UInt32; #else #error "no 32bit type found -- please check your configuration files" #endif /* now, lookup for an integer type that is at least 32 bits */ #if FT_SIZEOF_INT >= 4 typedef int FT_Fast; typedef unsigned int FT_UFast; #elif FT_SIZEOF_LONG >= 4 typedef long FT_Fast; typedef unsigned long FT_UFast; #endif /* determine whether we have a 64-bit int type for platforms without */ /* Autoconf */ #if FT_SIZEOF_LONG == 8 /* FT_LONG64 must be defined if a 64-bit type is available */ #define FT_LONG64 #define FT_INT64 long #elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ /* this compiler provides the __int64 type */ #define FT_LONG64 #define FT_INT64 __int64 #elif defined( __BORLANDC__ ) /* Borland C++ */ /* XXXX: We should probably check the value of __BORLANDC__ in order */ /* to test the compiler version. */ /* this compiler provides the __int64 type */ #define FT_LONG64 #define FT_INT64 __int64 #elif defined( __WATCOMC__ ) /* Watcom C++ */ /* Watcom doesn't provide 64-bit data types */ #elif defined( __MWKS__ ) /* Metrowerks CodeWarrior */ /* I don't know if it provides 64-bit data types, any suggestion */ /* is welcome. */ #elif defined( __GNUC__ ) /* GCC provides the "long long" type */ #define FT_LONG64 #define FT_INT64 long long int #endif /* FT_SIZEOF_LONG == 8 */ /*************************************************************************/ /* */ /* A 64-bit data type will create compilation problems if you compile */ /* in strict ANSI mode. To avoid them, we disable their use if */ /* __STDC__ is defined. You can however ignore this rule by */ /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ /* */ #if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) #ifdef __STDC__ /* undefine the 64-bit macros in strict ANSI compilation mode */ #undef FT_LONG64 #undef FT_INT64 #endif /* __STDC__ */ #endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ #ifdef FT_MAKE_OPTION_SINGLE_OBJECT #define FT_LOCAL( x ) static x #define FT_LOCAL_DEF( x ) static x #else #ifdef __cplusplus #define FT_LOCAL( x ) extern "C" x #define FT_LOCAL_DEF( x ) extern "C" x #else #define FT_LOCAL( x ) extern x #define FT_LOCAL_DEF( x ) x #endif #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ #ifndef FT_BASE #ifdef __cplusplus #define FT_BASE( x ) extern "C" x #else #define FT_BASE( x ) extern x #endif #endif /* !FT_BASE */ #ifndef FT_BASE_DEF #ifdef __cplusplus #define FT_BASE_DEF( x ) extern "C" x #else #define FT_BASE_DEF( x ) extern x #endif #endif /* !FT_BASE_DEF */ #ifndef FT_EXPORT #ifdef __cplusplus #define FT_EXPORT( x ) extern "C" x #else #define FT_EXPORT( x ) extern x #endif #endif /* !FT_EXPORT */ #ifndef FT_EXPORT_DEF #ifdef __cplusplus #define FT_EXPORT_DEF( x ) extern "C" x #else #define FT_EXPORT_DEF( x ) extern x #endif #endif /* !FT_EXPORT_DEF */ #ifndef FT_EXPORT_VAR #ifdef __cplusplus #define FT_EXPORT_VAR( x ) extern "C" x #else #define FT_EXPORT_VAR( x ) extern x #endif #endif /* !FT_EXPORT_VAR */ /* The following macros are needed to compile the library with a */ /* C++ compiler and with 16bit compilers. */ /* */ /* This is special. Within C++, you must specify `extern "C"' for */ /* functions which are used via function pointers, and you also */ /* must do that for structures which contain function pointers to */ /* assure C linkage -- it's not possible to have (local) anonymous */ /* functions which are accessed by (global) function pointers. */ /* */ /* */ /* FT_CALLBACK_DEF is used to _define_ a callback function. */ /* */ /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ /* contains pointers to callback functions. */ /* */ /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ /* that contains pointers to callback functions. */ /* */ /* */ /* Some 16bit compilers have to redefine these macros to insert */ /* the infamous `_cdecl' or `__fastcall' declarations. */ /* */ #ifndef FT_CALLBACK_DEF #ifdef __cplusplus #define FT_CALLBACK_DEF( x ) extern "C" x #else #define FT_CALLBACK_DEF( x ) static x #endif #endif /* FT_CALLBACK_DEF */ #ifndef FT_CALLBACK_TABLE #ifdef __cplusplus #define FT_CALLBACK_TABLE extern "C" #define FT_CALLBACK_TABLE_DEF extern "C" #else #define FT_CALLBACK_TABLE extern #define FT_CALLBACK_TABLE_DEF /* nothing */ #endif #endif /* FT_CALLBACK_TABLE */ FT_END_HEADER #endif /* __FTCONFIG_H__ */ /* END */ at if some specific modifications are needed, we */ /* advise you to place a modified copy in your build directory. */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftheader.h 664 0 0 76753 7607330527 25227ustar00pietropietro/***************************************************************************/ /* */ /* ftheader.h */ /* */ /* Build macros of the FreeType 2 library. */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FT_HEADER_H__ #define __FT_HEADER_H__ /*@***********************************************************************/ /* */ /* */ /* FT_BEGIN_HEADER */ /* */ /* */ /* This macro is used in association with @FT_END_HEADER in header */ /* files to ensure that the declarations within are properly */ /* encapsulated in an `extern "C" { .. }' block when included from a */ /* C++ compiler. */ /* */ #ifdef __cplusplus #define FT_BEGIN_HEADER extern "C" { #else #define FT_BEGIN_HEADER /* nothing */ #endif /*@***********************************************************************/ /* */ /* */ /* FT_END_HEADER */ /* */ /* */ /* This macro is used in association with @FT_BEGIN_HEADER in header */ /* files to ensure that the declarations within are properly */ /* encapsulated in an `extern "C" { .. }' block when included from a */ /* C++ compiler. */ /* */ #ifdef __cplusplus #define FT_END_HEADER } #else #define FT_END_HEADER /* nothing */ #endif /*************************************************************************/ /* */ /* Aliases for the FreeType 2 public and configuration files. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /*
*/ /* header_file_macros */ /* */ /* */ /* Header File Macros */ /* */ /* <Abstract> */ /* Macro definitions used to #include specific header files. */ /* */ /* <Description> */ /* The following macros are defined to the name of specific */ /* FreeType 2 header files. They can be used directly in #include */ /* statements as in: */ /* */ /* { */ /* #include FT_FREETYPE_H */ /* #include FT_MULTIPLE_MASTERS_H */ /* #include FT_GLYPH_H */ /* } */ /* */ /* There are several reasons why we are now using macros to name */ /* public header files. The first one is that such macros are not */ /* limited to the infamous 8.3 naming rule required by DOS (and */ /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ /* */ /* The second reason is that is allows for more flexibility in the */ /* way FreeType 2 is installed on a given system. */ /* */ /*************************************************************************/ /* configuration files */ /*************************************************************************/ /* */ /* @macro: */ /* FT_CONFIG_CONFIG_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* FreeType 2 configuration data. */ /* */ #ifndef FT_CONFIG_CONFIG_H #define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> #endif /*************************************************************************/ /* */ /* @macro: */ /* FT_CONFIG_STANDARD_LIBRARY_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* FreeType 2 configuration data. */ /* */ #ifndef FT_CONFIG_STANDARD_LIBRARY_H #define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> #endif /*************************************************************************/ /* */ /* @macro: */ /* FT_CONFIG_OPTIONS_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* FreeType 2 project-specific configuration options. */ /* */ #ifndef FT_CONFIG_OPTIONS_H #define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> #endif /*************************************************************************/ /* */ /* @macro: */ /* FT_CONFIG_MODULES_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the list of FreeType 2 modules that are statically linked to new */ /* library instances in @FT_Init_FreeType. */ /* */ #ifndef FT_CONFIG_MODULES_H #define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> #endif /* public headers */ /*************************************************************************/ /* */ /* @macro: */ /* FT_FREETYPE_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the base FreeType 2 API. */ /* */ #define FT_FREETYPE_H <freetype/freetype.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_ERRORS_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the list of FreeType 2 error codes (and messages). */ /* */ /* It is included by @FT_FREETYPE_H. */ /* */ #define FT_ERRORS_H <freetype/fterrors.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_MODULE_ERRORS_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the list of FreeType 2 module error offsets (and messages). */ /* */ #define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_SYSTEM_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the FreeType 2 interface to low-level operations (i.e. memory */ /* management and stream i/o). */ /* */ /* It is included by @FT_FREETYPE_H. */ /* */ #define FT_SYSTEM_H <freetype/ftsystem.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_IMAGE_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* types definitions related to glyph images (i.e. bitmaps, outlines, */ /* scan-converter parameters). */ /* */ /* It is included by @FT_FREETYPE_H. */ /* */ #define FT_IMAGE_H <freetype/ftimage.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_TYPES_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the basic data types defined by FreeType 2. */ /* */ /* It is included by @FT_FREETYPE_H. */ /* */ #define FT_TYPES_H <freetype/fttypes.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_LIST_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the list management API of FreeType 2. */ /* */ /* (Most applications will never need to include this file.) */ /* */ #define FT_LIST_H <freetype/ftlist.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_OUTLINE_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the scalable outline management API of FreeType 2. */ /* */ #define FT_OUTLINE_H <freetype/ftoutln.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_SIZES_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the API used to manage multiple @FT_Size objects per face. */ /* */ #define FT_SIZES_H <freetype/ftsizes.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_MODULE_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the module management API of FreeType 2. */ /* */ #define FT_MODULE_H <freetype/ftmodule.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_RENDER_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the renderer module management API of FreeType 2. */ /* */ #define FT_RENDER_H <freetype/ftrender.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_TYPE1_TABLES_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the types and API specific to the Type 1 format. */ /* */ #define FT_TYPE1_TABLES_H <freetype/t1tables.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_TRUETYPE_IDS_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the enumeration values used to identify name strings, languages, */ /* encodings, etc. This file really contains a _large_ set of */ /* constant macro definitions, taken from the TrueType and OpenType */ /* specifications. */ /* */ #define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_TRUETYPE_TABLES_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the types and API specific to the TrueType (as well as OpenType) */ /* format. */ /* */ #define FT_TRUETYPE_TABLES_H <freetype/tttables.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_TRUETYPE_TAGS_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the definitions of TrueType 4-byte `tags' used to identify blocks */ /* in SFNT-based font formats (i.e. TrueType and OpenType). */ /* */ #define FT_TRUETYPE_TAGS_H <freetype/tttags.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_BDF_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the definitions of an API to access BDF-specific strings from a */ /* face. */ /* */ #define FT_BDF_H <freetype/ftbdf.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_GZIP_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the definitions of an API to support for gzip-compressed files. */ /* */ #define FT_GZIP_H <freetype/ftgzip.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_GLYPH_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the API of the optional glyph management component. */ /* */ #define FT_GLYPH_H <freetype/ftglyph.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_BBOX_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the API of the optional exact bounding box computation routines. */ /* */ #define FT_BBOX_H <freetype/ftbbox.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_CACHE_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the API of the optional FreeType 2 cache sub-system. */ /* */ #define FT_CACHE_H <freetype/ftcache.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_CACHE_IMAGE_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the `glyph image' API of the FreeType 2 cache sub-system. */ /* */ /* It is used to define a cache for @FT_Glyph elements. You can also */ /* see the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need */ /* to store small glyph bitmaps, as it will use less memory. */ /* */ #define FT_CACHE_IMAGE_H <freetype/cache/ftcimage.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_CACHE_SMALL_BITMAPS_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the `small bitmaps' API of the FreeType 2 cache sub-system. */ /* */ /* It is used to define a cache for small glyph bitmaps in a */ /* relatively memory-efficient way. You can also use the API defined */ /* in @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, */ /* including scalable outlines. */ /* */ #define FT_CACHE_SMALL_BITMAPS_H <freetype/cache/ftcsbits.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_CACHE_CHARMAP_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the `charmap' API of the FreeType 2 cache sub-system. */ /* */ #define FT_CACHE_CHARMAP_H <freetype/cache/ftccmap.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_MAC_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the Macintosh-specific FreeType 2 API. The latter is used to */ /* access fonts embedded in resource forks. */ /* */ /* This header file must be explicitly included by client */ /* applications compiled on the Mac (note that the base API still */ /* works though). */ /* */ #define FT_MAC_H <freetype/ftmac.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_MULTIPLE_MASTERS_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the optional multiple-masters management API of FreeType 2. */ /* */ #define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> /*************************************************************************/ /* */ /* @macro: */ /* FT_SFNT_NAMES_H */ /* */ /* @description: */ /* A macro used in #include statements to name the file containing */ /* the optional FreeType 2 API used to access embedded `name' strings */ /* in SFNT-based font formats (i.e. TrueType and OpenType). */ /* */ #define FT_SFNT_NAMES_H <freetype/ftsnames.h> /* */ #define FT_TRIGONOMETRY_H <freetype/fttrigon.h> #define FT_STROKER_H <freetype/ftstroker.h> #define FT_SYNTHESIS_H <freetype/ftsynth.h> #define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> #define FT_CACHE_MANAGER_H <freetype/cache/ftcmanag.h> #define FT_CACHE_INTERNAL_LRU_H <freetype/cache/ftlru.h> #define FT_CACHE_INTERNAL_GLYPH_H <freetype/cache/ftcglyph.h> #define FT_CACHE_INTERNAL_CACHE_H <freetype/cache/ftccache.h> #define FT_XFREE86_H <freetype/ftxf86.h> #define FT_INCREMENTAL_H <freetype/ftincrem.h> /* now include internal headers definitions from <freetype/internal/...> */ #define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> #include FT_INTERNAL_INTERNAL_H #endif /* __FT2_BUILD_H__ */ /* END */ **/ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftmodule.h������������������������������ 664 � 0 � 0 � 1217 7607330527 25223�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������FT_USE_MODULE(autohint_module_class) FT_USE_MODULE(cff_driver_class) /*FT_USE_MODULE(t1cid_driver_class)*/ /*FT_USE_MODULE(pcf_driver_class)*/ /*FT_USE_MODULE(bdf_driver_class)*/ FT_USE_MODULE(psaux_module_class) FT_USE_MODULE(psnames_module_class) FT_USE_MODULE(pshinter_module_class) FT_USE_MODULE(ft_raster1_renderer_class) FT_USE_MODULE(sfnt_module_class) FT_USE_MODULE(ft_smooth_renderer_class) FT_USE_MODULE(ft_smooth_lcd_renderer_class) FT_USE_MODULE(ft_smooth_lcdv_renderer_class) FT_USE_MODULE(tt_driver_class) FT_USE_MODULE(t1_driver_class) FT_USE_MODULE(t42_driver_class) FT_USE_MODULE(pfr_driver_class) /*FT_USE_MODULE(winfnt_driver_class)*/ */ /* A macro used in #include statements to name the file containing */ /* the definitions of an API to support for gzip-compressed files. */ /* */ #define FT_GZIP_H <freetype/ftgzip.h> /*******************************************************************old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftmodule.h.orig������������������������� 664 � 0 � 0 � 1177 7607330527 26167�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������FT_USE_MODULE(autohint_module_class) FT_USE_MODULE(cff_driver_class) FT_USE_MODULE(t1cid_driver_class) FT_USE_MODULE(pcf_driver_class) FT_USE_MODULE(bdf_driver_class) FT_USE_MODULE(psaux_module_class) FT_USE_MODULE(psnames_module_class) FT_USE_MODULE(pshinter_module_class) FT_USE_MODULE(ft_raster1_renderer_class) FT_USE_MODULE(sfnt_module_class) FT_USE_MODULE(ft_smooth_renderer_class) FT_USE_MODULE(ft_smooth_lcd_renderer_class) FT_USE_MODULE(ft_smooth_lcdv_renderer_class) FT_USE_MODULE(tt_driver_class) FT_USE_MODULE(t1_driver_class) FT_USE_MODULE(t42_driver_class) FT_USE_MODULE(pfr_driver_class) FT_USE_MODULE(winfnt_driver_class) A macro used in #include statements to name the file containing */ /* the API of the optional exact bounding box computation routines. */ /* */ #define FT_BBOX_H <freetype/ftbbox.h> /*************************************************************************/ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftoption.h������������������������������ 664 � 0 � 0 � 72632 7607330527 25277�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftoption.h */ /* */ /* User-selectable configuration macros (specification only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTOPTION_H__ #define __FTOPTION_H__ #include <ft2build.h> FT_BEGIN_HEADER /*************************************************************************/ /* */ /* USER-SELECTABLE CONFIGURATION MACROS */ /* */ /* This file contains the default configuration macro definitions for */ /* a standard build of the FreeType library. There are three ways to */ /* use this file to build project-specific versions of the library: */ /* */ /* - You can modify this file by hand, but this is not recommended in */ /* cases where you would like to build several versions of the */ /* library from a single source directory. */ /* */ /* - You can put a copy of this file in your build directory, more */ /* precisely in "$BUILD/freetype/config/ftoption.h", where "$BUILD" */ /* is the name of a directory that is included _before_ the FreeType */ /* include path during compilation. */ /* */ /* The default FreeType Makefiles and Jamfiles use the build */ /* directory "builds/<system>" by default, but you can easily change */ /* that for your own projects. */ /* */ /* - Copy the file <ft2build.h> to "$BUILD/ft2build.h" and modify it */ /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ /* locate this file during the build. For example, */ /* */ /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ /* #include <freetype/config/ftheader.h> */ /* */ /* will use "$BUILD/myftoptions.h" instead of this file for macro */ /* definitions. */ /* */ /* Note also that you can similarly pre-define the macro */ /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ /* that are statically linked to the library at compile time. By */ /* default, this file is <freetype/config/ftmodule.h>. */ /* */ /* We highly recommend using the third method whenever possible. */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* Many compilers provide a non-ANSI 64-bit data type that can be used */ /* by FreeType to speed up some computations. However, this will create */ /* some problems when compiling the library in strict ANSI mode. */ /* */ /* For this reason, the use of 64-bit ints is normally disabled when */ /* the __STDC__ macro is defined. You can however disable this by */ /* defining here the macro FT_CONFIG_OPTION_FORCE_INT64. */ /* */ /* For most compilers, this will only create compilation warnings */ /* when building the library. */ /* */ /* ObNote: The compiler-specific 64-bit integers are detected in the */ /* file "ftconfig.h" either statically, or through Autoconf */ /* on platforms that support it. */ /* */ #undef FT_CONFIG_OPTION_FORCE_INT64 /*************************************************************************/ /* */ /* Gzip-compressed file support. */ /* */ /* FreeType now handles font files that have been compressed with the */ /* 'gzip' program. This is mostly used to parse many of the PCF files */ /* that come with XFree86. The implementation uses 'zlib' to */ /* partially uncompress the file on the fly (see src/base/ftgzip.c). */ /* */ /* Define this macro if you want to enable this "feature". Note that */ /* this will however force you to link the zlib to any program that */ /* also uses FreeType. */ /* */ #define FT_CONFIG_OPTION_USE_ZLIB /*************************************************************************/ /* */ /* ZLib library selection */ /* */ /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ /* It allows FreeType's "ftgzip" component to link to the system's */ /* installation of the ZLib library. This is useful on systems like */ /* Unix or VMS where it generally is already available. */ /* */ /* If you let it undefined, the component will use its own copy */ /* of the zlib sources instead. These have been modified to be */ /* included directly within the component and *not* export external */ /* function names. This allows you to link any program with FreeType */ /* _and_ ZLib without linking conflicts. */ /* */ /* do not #undef this macro here, since the build system might */ /* define for certain configurations */ /* */ /* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ /*************************************************************************/ /* */ /* DLL export compilation */ /* */ /* When compiling FreeType as a DLL, some systems/compilers need a */ /* special keyword in front OR after the return type of function */ /* declarations. */ /* */ /* Two macros are used within the FreeType source code to define */ /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ /* */ /* FT_EXPORT( return_type ) */ /* */ /* is used in a function declaration, as in */ /* */ /* FT_EXPORT( FT_Error ) */ /* FT_Init_FreeType( FT_Library* alibrary ); */ /* */ /* */ /* FT_EXPORT_DEF( return_type ) */ /* */ /* is used in a function definition, as in */ /* */ /* FT_EXPORT_DEF( FT_Error ) */ /* FT_Init_FreeType( FT_Library* alibrary ) */ /* { */ /* ... some code ... */ /* return FT_Err_Ok; */ /* } */ /* */ /* You can provide your own implementation of FT_EXPORT and */ /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ /* will be later automatically defined as `extern return_type' to */ /* allow normal compilation. */ /* */ /* #define FT_EXPORT(x) extern x */ /* #define FT_EXPORT_DEF(x) x */ /*************************************************************************/ /* */ /* Glyph Postscript Names handling */ /* */ /* By default, FreeType 2 is compiled with the `PSNames' module. This */ /* module is in charge of converting a glyph name string into a */ /* Unicode value, or return a Macintosh standard glyph name for the */ /* use with the TrueType `post' table. */ /* */ /* Undefine this macro if you do not want `PSNames' compiled in your */ /* build of FreeType. This has the following effects: */ /* */ /* - The TrueType driver will provide its own set of glyph names, */ /* if you build it to support postscript names in the TrueType */ /* `post' table. */ /* */ /* - The Type 1 driver will not be able to synthetize a Unicode */ /* charmap out of the glyphs found in the fonts. */ /* */ /* You would normally undefine this configuration macro when building */ /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ /* */ #define FT_CONFIG_OPTION_POSTSCRIPT_NAMES /*************************************************************************/ /* */ /* Postscript Names to Unicode Values support */ /* */ /* By default, FreeType 2 is built with the `PSNames' module compiled */ /* in. Among other things, the module is used to convert a glyph name */ /* into a Unicode value. This is especially useful in order to */ /* synthetize on the fly a Unicode charmap from the CFF/Type 1 driver */ /* through a big table named the `Adobe Glyph List' (AGL). */ /* */ /* Undefine this macro if you do not want the Adobe Glyph List */ /* compiled in your `PSNames' module. The Type 1 driver will not be */ /* able to synthetize a Unicode charmap out of the glyphs found in the */ /* fonts. */ /* */ #define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST /*************************************************************************/ /* */ /* Allow the use of FT_Incremental_Interface to load typefaces that */ /* contain no glyph data, but supply it via a callback function. */ /* This allows FreeType to be used with the PostScript language, using */ /* the GhostScript interpreter. */ /* */ /* #define FT_CONFIG_OPTION_INCREMENTAL */ /*************************************************************************/ /* */ /* The size in bytes of the render pool used by the scan-line converter */ /* to do all of its work. */ /* */ /* This must be greater than 4kByte. */ /* */ #define FT_RENDER_POOL_SIZE 16384L /*************************************************************************/ /* */ /* FT_MAX_MODULES */ /* */ /* The maximum number of modules that can be registered in a single */ /* FreeType library object. 32 is the default. */ /* */ #define FT_MAX_MODULES 32 /*************************************************************************/ /* */ /* Debug level */ /* */ /* FreeType can be compiled in debug or trace mode. In debug mode, */ /* errors are reported through the `ftdebug' component. In trace */ /* mode, additional messages are sent to the standard output during */ /* execution. */ /* */ /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ /* */ /* Don't define any of these macros to compile in `release' mode! */ /* */ /* #define FT_DEBUG_LEVEL_ERROR */ /* #define FT_DEBUG_LEVEL_TRACE */ /*************************************************************************/ /* */ /* Memory Debugging */ /* */ /* FreeType now comes with an integrated memory debugger that is */ /* capable of detecting simple errors like memory leaks or double */ /* deletes. To compile it within your build of the library, you */ /* should define FT_DEBUG_MEMORY here. */ /* */ /* Note that the memory debugger is only activated at runtime when */ /* when the _environment_ variable "FT_DEBUG_MEMORY" is also defined! */ /* */ /* #define FT_DEBUG_MEMORY */ /*************************************************************************/ /* */ /* Module errors */ /* */ /* If this macro is set (which is _not_ the default), the higher byte */ /* of an error code gives the module in which the error has occurred, */ /* while the lower byte is the real error code. */ /* */ /* Setting this macro makes sense for debugging purposes only, since */ /* it would break source compatibility of certain programs that use */ /* FreeType 2. */ /* */ /* More details can be found in the files ftmoderr.h and fterrors.h. */ /* */ #undef FT_CONFIG_OPTION_USE_MODULE_ERRORS /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ /* embedded bitmaps in all formats using the SFNT module (namely */ /* TrueType & OpenType). */ /* */ #define TT_CONFIG_OPTION_EMBEDDED_BITMAPS /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ /* load and enumerate the glyph Postscript names in a TrueType or */ /* OpenType file. */ /* */ /* Note that when you do not compile the `PSNames' module by undefining */ /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ /* contain additional code used to read the PS Names table from a font. */ /* */ /* (By default, the module uses `PSNames' to extract glyph names.) */ /* */ #define TT_CONFIG_OPTION_POSTSCRIPT_NAMES /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ /* access the internal name table in a SFNT-based format like TrueType */ /* or OpenType. The name table contains various strings used to */ /* describe the font, like family name, copyright, version, etc. It */ /* does not contain any glyph name though. */ /* */ /* Accessing SFNT names is done through the functions declared in */ /* `freetype/ftnames.h'. */ /* */ #define TT_CONFIG_OPTION_SFNT_NAMES /*************************************************************************/ /* */ /* TrueType CMap support */ /* */ /* Here you can fine-tune which TrueType CMap table format shall be */ /* supported. */ #define TT_CONFIG_CMAP_FORMAT_0 #define TT_CONFIG_CMAP_FORMAT_2 #define TT_CONFIG_CMAP_FORMAT_4 #define TT_CONFIG_CMAP_FORMAT_6 #define TT_CONFIG_CMAP_FORMAT_8 #define TT_CONFIG_CMAP_FORMAT_10 #define TT_CONFIG_CMAP_FORMAT_12 /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ /* a bytecode interpreter in the TrueType driver. Note that there are */ /* important patent issues related to the use of the interpreter. */ /* */ /* By undefining this, you will only compile the code necessary to load */ /* TrueType glyphs without hinting. */ /* */ /* do not #undef this macro here, since the build system might */ /* define for certain configurations */ /* */ /*#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER*/ /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ /* bytecode interpreter with a huge switch statement, rather than a call */ /* table. This results in smaller and faster code for a number of */ /* architectures. */ /* */ /* Note however that on some compiler/processor combinations, undefining */ /* this macro will generate faster, though larger, code. */ /* */ #define TT_CONFIG_OPTION_INTERPRETER_SWITCH /*************************************************************************/ /* */ /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ /* TrueType glyph loader to use Apple's definition of how to handle */ /* component offsets in composite glyphs. */ /* */ /* Apple and MS disagree on the default behavior of component offsets */ /* in composites. Apple says that they should be scaled by the scale */ /* factors in the transformation matrix (roughly, it's more complex) */ /* while MS says they should not. OpenType defines two bits in the */ /* composite flags array which can be used to disambiguate, but old */ /* fonts will not have them. */ /* */ /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ /* */ #undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ /* required. */ /* */ #define T1_MAX_DICT_DEPTH 5 /*************************************************************************/ /* */ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ /* calls during glyph loading. */ /* */ #define T1_MAX_SUBRS_CALLS 16 /*************************************************************************/ /* */ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ /* minimum of 16 is required. */ /* */ /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ /* */ #define T1_MAX_CHARSTRINGS_OPERANDS 256 /*************************************************************************/ /* */ /* Define this configuration macro if you want to prevent the */ /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ /* files into an existing face. Note that if set, the T1 driver will be */ /* unable to produce kerning distances. */ /* */ #undef T1_CONFIG_OPTION_NO_AFM /*************************************************************************/ /* */ /* Define this configuration macro if you want to prevent the */ /* compilation of the Multiple Masters font support in the Type 1 */ /* driver. */ /* */ #undef T1_CONFIG_OPTION_NO_MM_SUPPORT /* */ FT_END_HEADER #endif /* __FTOPTION_H__ */ /* END */ R I V E R C O N F I G U R A T I O N ****/ /**** old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftstdlib.h������������������������������ 664 � 0 � 0 � 14553 7620161220 25231�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftstdlib.h */ /* */ /* ANSI-specific library and header configuration file (specification */ /* only). */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file is used to group all #includes to the ANSI C library that */ /* FreeType normally requires. It also defines macros to rename the */ /* standard functions within the FreeType source code. */ /* */ /* Load a file which defines __FTSTDLIB_H__ before this one to override */ /* it. */ /* */ /*************************************************************************/ #ifndef __FTSTDLIB_H__ #define __FTSTDLIB_H__ /**********************************************************************/ /* */ /* integer limits */ /* */ /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ /* of `int' and `long' in bytes at compile-time. So far, this works */ /* for all platforms the library has been tested on. */ /* */ /* Note that on the extremely rare platforms that do not provide */ /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ /* old Crays where `int' is 36 bits), we do not make any guarantee */ /* about the correct behaviour of FT2 with all fonts. */ /* */ /* In these case, "ftconfig.h" will refuse to compile anyway with a */ /* message like "couldn't find 32-bit type" or something similar. */ /* */ /* IMPORTANT NOTE: We do not define aliases for heap management and */ /* i/o routines (i.e. malloc/free/fopen/fread/...) */ /* since these functions should all be encapsulated */ /* by platform-specific implementations of */ /* "ftsystem.c". */ /* */ /**********************************************************************/ #include <lib9.h> #define UINT_MAX 0xffffffffU #define ULONG_MAX 0xffffffffUL /*#include <limits.h>*/ #define FT_UINT_MAX UINT_MAX #define FT_ULONG_MAX ULONG_MAX /**********************************************************************/ /* */ /* character and string processing */ /* */ /**********************************************************************/ #include <ctype.h> #define ft_isalnum isalnum #define ft_isupper isupper #define ft_islower islower #define ft_xdigit isxdigit /*#include <string.h>*/ #define ft_strlen strlen #define ft_strcmp strcmp #define ft_strncmp strncmp #define ft_memcpy memcpy #define ft_strcpy strcpy #define ft_strncpy strncpy #define ft_memset memset #define ft_memmove memmove #define ft_memcmp memcmp #include <stdio.h> #define ft_sprintf sprintf /**********************************************************************/ /* */ /* sorting */ /* */ /**********************************************************************/ /*#include <stdlib.h>*/ #define ft_qsort qsort /*#define ft_exit exit /* only used to exit from unhandled exceptions */ #define ft_exit(a) exits("") /* only used to exit from unhandled exceptions */ #define ft_atoi atoi /**********************************************************************/ /* */ /* execution control */ /* */ /**********************************************************************/ /*#include <setjmp.h>*/ #define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ /* jmp_buf is defined as a macro */ /* on certain platforms */ #define ft_setjmp setjmp /* same thing here */ #define ft_longjmp longjmp /* " */ /* the following is only used for debugging purposes, i.e. when */ /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ /* */ /* #include <stdarg.h> */ #endif /* __FTSTDLIB_H__ */ /* END */ ****************************************************************/ /**** ****/ /**old_contrib//root/sys/src/cmd/limbo/include/freetype/config/ftstdlib.h.orig������������������������� 664 � 0 � 0 � 14256 7607330527 26205�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftstdlib.h */ /* */ /* ANSI-specific library and header configuration file (specification */ /* only). */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file is used to group all #includes to the ANSI C library that */ /* FreeType normally requires. It also defines macros to rename the */ /* standard functions within the FreeType source code. */ /* */ /* Load a file which defines __FTSTDLIB_H__ before this one to override */ /* it. */ /* */ /*************************************************************************/ #ifndef __FTSTDLIB_H__ #define __FTSTDLIB_H__ /**********************************************************************/ /* */ /* integer limits */ /* */ /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ /* of `int' and `long' in bytes at compile-time. So far, this works */ /* for all platforms the library has been tested on. */ /* */ /* Note that on the extremely rare platforms that do not provide */ /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ /* old Crays where `int' is 36 bits), we do not make any guarantee */ /* about the correct behaviour of FT2 with all fonts. */ /* */ /* In these case, "ftconfig.h" will refuse to compile anyway with a */ /* message like "couldn't find 32-bit type" or something similar. */ /* */ /* IMPORTANT NOTE: We do not define aliases for heap management and */ /* i/o routines (i.e. malloc/free/fopen/fread/...) */ /* since these functions should all be encapsulated */ /* by platform-specific implementations of */ /* "ftsystem.c". */ /* */ /**********************************************************************/ #include <limits.h> #define FT_UINT_MAX UINT_MAX #define FT_ULONG_MAX ULONG_MAX /**********************************************************************/ /* */ /* character and string processing */ /* */ /**********************************************************************/ #include <ctype.h> #define ft_isalnum isalnum #define ft_isupper isupper #define ft_islower islower #define ft_xdigit isxdigit #include <string.h> #define ft_strlen strlen #define ft_strcmp strcmp #define ft_strncmp strncmp #define ft_memcpy memcpy #define ft_strcpy strcpy #define ft_strncpy strncpy #define ft_memset memset #define ft_memmove memmove #define ft_memcmp memcmp #include <stdio.h> #define ft_sprintf sprintf /**********************************************************************/ /* */ /* sorting */ /* */ /**********************************************************************/ #include <stdlib.h> #define ft_qsort qsort #define ft_exit exit /* only used to exit from unhandled exceptions */ #define ft_atoi atoi /**********************************************************************/ /* */ /* execution control */ /* */ /**********************************************************************/ #include <setjmp.h> #define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ /* jmp_buf is defined as a macro */ /* on certain platforms */ #define ft_setjmp setjmp /* same thing here */ #define ft_longjmp longjmp /* " */ /* the following is only used for debugging purposes, i.e. when */ /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ /* */ #include <stdarg.h> #endif /* __FTSTDLIB_H__ */ /* END */ t type" or something similar. */ /* */ /* IMPORTANT NOTE: We do not define aliases for heap management and */ /* i/o routines (i.e. malloc/free/fopen/fread/...) */ /* since these functions should all be encapsulated */ old_contrib//root/sys/src/cmd/limbo/include/freetype/freetype.h������������������������������������� 664 � 0 � 0 � 552730 10104124275 24040�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* freetype.h */ /* */ /* FreeType high-level API and common types (specification only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FREETYPE_H__ #define __FREETYPE_H__ #pragma incomplete _off_ /* it's too hard */ /*************************************************************************/ /* */ /* The `raster' component duplicates some of the declarations in */ /* freetype.h for stand-alone use if _FREETYPE_ isn't defined. */ /* */ /*************************************************************************/ /* */ /* The FREETYPE_MAJOR and FREETYPE_MINOR macros are used to version the */ /* new FreeType design, which is able to host several kinds of font */ /* drivers. It starts at 2.0. */ /* */ #define FREETYPE_MAJOR 2 #define FREETYPE_MINOR 1 #define FREETYPE_PATCH 3 #include <ft2build.h> #include FT_CONFIG_CONFIG_H #include FT_ERRORS_H #include FT_TYPES_H FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /* */ /* B A S I C T Y P E S */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Section> */ /* base_interface */ /* */ /* <Title> */ /* Base Interface */ /* */ /* <Abstract> */ /* The FreeType 2 base font interface. */ /* */ /* <Description> */ /* This section describes the public high-level API of FreeType 2. */ /* */ /* <Order> */ /* FT_Library */ /* FT_Face */ /* FT_Size */ /* FT_GlyphSlot */ /* FT_CharMap */ /* FT_Encoding */ /* */ /* FT_FaceRec */ /* */ /* FT_FACE_FLAG_SCALABLE */ /* FT_FACE_FLAG_FIXED_SIZES */ /* FT_FACE_FLAG_FIXED_WIDTH */ /* FT_FACE_FLAG_HORIZONTAL */ /* FT_FACE_FLAG_VERTICAL */ /* FT_FACE_FLAG_SFNT */ /* FT_FACE_FLAG_KERNING */ /* FT_FACE_FLAG_MULTIPLE_MASTERS */ /* FT_FACE_FLAG_GLYPH_NAMES */ /* FT_FACE_FLAG_EXTERNAL_STREAM */ /* FT_FACE_FLAG_FAST_GLYPHS */ /* */ /* FT_STYLE_FLAG_BOLD */ /* FT_STYLE_FLAG_ITALIC */ /* */ /* FT_SizeRec */ /* FT_Size_Metrics */ /* */ /* FT_GlyphSlotRec */ /* FT_Glyph_Metrics */ /* FT_SubGlyph */ /* */ /* FT_Bitmap_Size */ /* */ /* FT_Init_FreeType */ /* FT_Done_FreeType */ /* FT_Library_Version */ /* */ /* FT_New_Face */ /* FT_Done_Face */ /* FT_New_Memory_Face */ /* FT_Open_Face */ /* FT_Open_Args */ /* FT_Open_Flags */ /* FT_Parameter */ /* FT_Attach_File */ /* FT_Attach_Stream */ /* */ /* FT_Set_Char_Size */ /* FT_Set_Pixel_Sizes */ /* FT_Set_Transform */ /* FT_Load_Glyph */ /* FT_Get_Char_Index */ /* FT_Get_Name_Index */ /* FT_Load_Char */ /* */ /* FT_LOAD_DEFAULT */ /* FT_LOAD_RENDER */ /* FT_LOAD_MONOCHROME */ /* FT_LOAD_LINEAR_DESIGN */ /* FT_LOAD_NO_SCALE */ /* FT_LOAD_NO_HINTING */ /* FT_LOAD_NO_BITMAP */ /* FT_LOAD_CROP_BITMAP */ /* */ /* FT_LOAD_VERTICAL_LAYOUT */ /* FT_LOAD_IGNORE_TRANSFORM */ /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ /* FT_LOAD_FORCE_AUTOHINT */ /* FT_LOAD_NO_RECURSE */ /* FT_LOAD_PEDANTIC */ /* */ /* FT_Render_Glyph */ /* FT_Render_Mode */ /* FT_Get_Kerning */ /* FT_Kerning_Mode */ /* FT_Get_Glyph_Name */ /* FT_Get_Postscript_Name */ /* */ /* FT_CharMapRec */ /* FT_Select_Charmap */ /* FT_Set_Charmap */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* FT_Glyph_Metrics */ /* */ /* <Description> */ /* A structure used to model the metrics of a single glyph. Note */ /* that values are expressed in 26.6 fractional pixel format or in */ /* font units, depending on context. */ /* */ /* <Fields> */ /* width :: The glyph's width. */ /* */ /* height :: The glyph's height. */ /* */ /* horiBearingX :: Horizontal left side bearing. */ /* */ /* horiBearingY :: Horizontal top side bearing. */ /* */ /* horiAdvance :: Horizontal advance width. */ /* */ /* vertBearingX :: Vertical left side bearing. */ /* */ /* vertBearingY :: Vertical top side bearing. */ /* */ /* vertAdvance :: Vertical advance height. */ /* */ typedef struct FT_Glyph_Metrics_ { FT_Pos width; /* glyph width */ FT_Pos height; /* glyph height */ FT_Pos horiBearingX; /* left side bearing in horizontal layouts */ FT_Pos horiBearingY; /* top side bearing in horizontal layouts */ FT_Pos horiAdvance; /* advance width for horizontal layout */ FT_Pos vertBearingX; /* left side bearing in vertical layouts */ FT_Pos vertBearingY; /* top side bearing in vertical layouts */ FT_Pos vertAdvance; /* advance height for vertical layout */ } FT_Glyph_Metrics; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Bitmap_Size */ /* */ /* <Description> */ /* An extremely simple structure used to model the size of a bitmap */ /* strike (i.e., a bitmap instance of the font for a given */ /* resolution) in a fixed-size font face. This is used for the */ /* `available_sizes' field of the FT_Face_Properties structure. */ /* */ /* <Fields> */ /* height :: The character height in pixels. */ /* */ /* width :: The character width in pixels. */ /* */ typedef struct FT_Bitmap_Size_ { FT_Short height; FT_Short width; } FT_Bitmap_Size; /*************************************************************************/ /*************************************************************************/ /* */ /* O B J E C T C L A S S E S */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FT_Library */ /* */ /* <Description> */ /* A handle to a FreeType library instance. Each `library' is */ /* completely independent from the others; it is the `root' of a set */ /* of objects like fonts, faces, sizes, etc. */ /* */ /* It also embeds a memory manager (see @FT_Memory), as well as a */ /* scan-line converter object (see @FT_Raster). */ /* */ /* <Note> */ /* Library objects are normally created by @FT_Init_FreeType, and */ /* destroyed with @FT_Done_FreeType. */ /* */ typedef struct FT_LibraryRec_ *FT_Library; /*************************************************************************/ /* */ /* <Type> */ /* FT_Module */ /* */ /* <Description> */ /* A handle to a given FreeType module object. Each module can be a */ /* font driver, a renderer, or anything else that provides services */ /* to the formers. */ /* */ typedef struct FT_ModuleRec_* FT_Module; /*************************************************************************/ /* */ /* <Type> */ /* FT_Driver */ /* */ /* <Description> */ /* A handle to a given FreeType font driver object. Each font driver */ /* is a special module capable of creating faces from font files. */ /* */ typedef struct FT_DriverRec_* FT_Driver; /*************************************************************************/ /* */ /* <Type> */ /* FT_Renderer */ /* */ /* <Description> */ /* A handle to a given FreeType renderer. A renderer is a special */ /* module in charge of converting a glyph image to a bitmap, when */ /* necessary. Each renderer supports a given glyph image format, and */ /* one or more target surface depths. */ /* */ typedef struct FT_RendererRec_* FT_Renderer; /*************************************************************************/ /* */ /* <Type> */ /* FT_Face */ /* */ /* <Description> */ /* A handle to a given typographic face object. A face object models */ /* a given typeface, in a given style. */ /* */ /* <Note> */ /* Each face object also owns a single @FT_GlyphSlot object, as well */ /* as one or more @FT_Size objects. */ /* */ /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ /* a given filepathname or a custom input stream. */ /* */ /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ /* */ /* <Also> */ /* The @FT_FaceRec details the publicly accessible fields of a given */ /* face object. */ /* */ typedef struct FT_FaceRec_* FT_Face; /*************************************************************************/ /* */ /* <Type> */ /* FT_Size */ /* */ /* <Description> */ /* A handle to a given size object. Such an object models the data */ /* that depends on the current _resolution_ and _character size_ in a */ /* given @FT_Face. */ /* */ /* <Note> */ /* Each face object owns one or more sizes. There is however a */ /* single _active_ size for the face at any time that will be used by */ /* functions like @FT_Load_Glyph, @FT_Get_Kerning, etc. */ /* */ /* You can use the @FT_Activate_Size API to change the current */ /* active size of any given face. */ /* */ /* <Also> */ /* The @FT_SizeRec structure details the publicly accessible fields */ /* of a given face object. */ /* */ typedef struct FT_SizeRec_* FT_Size; /*************************************************************************/ /* */ /* <Type> */ /* FT_GlyphSlot */ /* */ /* <Description> */ /* A handle to a given `glyph slot'. A slot is a container where it */ /* is possible to load any one of the glyphs contained in its parent */ /* face. */ /* */ /* In other words, each time you call @FT_Load_Glyph or */ /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ /* i.e. the glyph's metrics, its image (bitmap or outline), and */ /* other control information. */ /* */ /* <Also> */ /* @FT_GlyphSlotRec details the publicly accessible glyph fields. */ /* */ typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; /*************************************************************************/ /* */ /* <Type> */ /* FT_CharMap */ /* */ /* <Description> */ /* A handle to a given character map. A charmap is used to translate */ /* character codes in a given encoding into glyph indexes for its */ /* parent's face. Some font formats may provide several charmaps per */ /* font. */ /* */ /* Each face object owns zero or more charmaps, but only one of them */ /* can be "active" and used by @FT_Get_Char_Index or @FT_Load_Char. */ /* */ /* The list of available charmaps in a face is available through the */ /* "face->num_charmaps" and "face->charmaps" fields of @FT_FaceRec. */ /* */ /* The currently active charmap is available as "face->charmap". */ /* You should call @FT_Set_Charmap to change it. */ /* */ /* <Note> */ /* When a new face is created (either through @FT_New_Face or */ /* @FT_Open_Face), the library looks for a Unicode charmap within */ /* the list and automatically activates it. */ /* */ typedef struct FT_CharMapRec_* FT_CharMap; /*************************************************************************/ /* */ /* <Macro> */ /* FT_ENC_TAG */ /* */ /* <Description> */ /* This macro converts four letter tags into an unsigned long. It is */ /* used to define "encoding" identifiers (see @FT_Encoding). */ /* */ /* <Note> */ /* Since many 16bit compilers don't like 32bit enumerations, you */ /* should redefine this macro in case of problems to something like */ /* this: */ /* */ /* #define FT_ENC_TAG( value, a, b, c, d ) (value) */ /* */ /* to get a simple enumeration without assigning special numbers. */ /* */ #ifndef FT_ENC_TAG #define FT_ENC_TAG( value, a, b, c, d ) \ value = ( ( (FT_UInt32)(a) << 24 ) | \ ( (FT_UInt32)(b) << 16 ) | \ ( (FT_UInt32)(c) << 8 ) | \ (FT_UInt32)(d) ) #endif /* FT_ENC_TAG */ /*************************************************************************/ /* */ /* <Enum> */ /* FT_Encoding */ /* */ /* <Description> */ /* An enumeration used to specify encodings supported by charmaps. */ /* Used in the @FT_Select_Charmap API function. */ /* */ /* <Note> */ /* Because of 32-bit charcodes defined in Unicode (i.e., surrogates), */ /* all character codes must be expressed as FT_Longs. */ /* */ /* The values of this type correspond to specific character */ /* repertories (i.e. charsets), and not to text encoding methods */ /* (like UTF-8, UTF-16, GB2312_EUC, etc.). */ /* */ /* Other encodings might be defined in the future. */ /* */ /* <Values> */ /* FT_ENCODING_NONE :: */ /* The encoding value 0 is reserved. */ /* */ /* FT_ENCODING_UNICODE :: */ /* Corresponds to the Unicode character set. This value covers */ /* all versions of the Unicode repertoire, including ASCII and */ /* Latin-1. Most fonts include a Unicode charmap, but not all */ /* of them. */ /* */ /* FT_ENCODING_MS_SYMBOL :: */ /* Corresponds to the Microsoft Symbol encoding, used to encode */ /* mathematical symbols in the 32..255 character code range. For */ /* more information, see `http://www.ceviz.net/symbol.htm'. */ /* */ /* FT_ENCODING_MS_SJIS :: */ /* Corresponds to Microsoft's Japanese SJIS encoding. More info */ /* at `http://langsupport.japanreference.com/encoding.shtml'. */ /* See note on multi-byte encodings below. */ /* */ /* FT_ENCODING_MS_GB2312 :: */ /* Corresponds to the encoding system for Simplified Chinese, as */ /* used in China. Only found in some TrueType fonts. */ /* */ /* FT_ENCODING_MS_BIG5 :: */ /* Corresponds to the encoding system for Traditional Chinese, as */ /* used in Taiwan and Hong Kong. Only found in some TrueType fonts. */ /* */ /* FT_ENCODING_MS_WANSUNG :: */ /* Corresponds to the Korean encoding system known as Wansung. */ /* This is a Microsoft encoding that is only found in some TrueType */ /* fonts. For more information, see */ /* `http://www.microsoft.com/typography/unicode/949.txt'. */ /* */ /* FT_ENCODING_MS_JOHAB :: */ /* The Korean standard character set (KS C-5601-1992), which */ /* corresponds to Windows code page 1361. This character set */ /* includes all possible Hangeul character combinations. */ /* Only found on some rare TrueType fonts. */ /* */ /* FT_ENCODING_ADOBE_LATIN_1 :: */ /* Corresponds to a Latin-1 encoding as defined in a Type 1 */ /* Postscript font. It is limited to 256 character codes. */ /* */ /* FT_ENCODING_ADOBE_STANDARD :: */ /* Corresponds to the Adobe Standard encoding, as found in Type 1, */ /* CFF, and OpenType/CFF fonts. It is limited to 256character */ /* codes. */ /* */ /* FT_ENCODING_ADOBE_EXPERT :: */ /* Corresponds to the Adobe Expert encoding, as found in Type 1, */ /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ /* codes. */ /* */ /* FT_ENCODING_ADOBE_CUSTOM :: */ /* Corresponds to a custom encoding, as found in Type 1, CFF, and */ /* OpenType/CFF fonts. It is limited to 256 character codes. */ /* */ /* FT_ENCODING_APPLE_ROMAN :: */ /* Corresponds to the 8-bit Apple roman encoding. Many TrueType and */ /* OpenType fonts contain a charmap for this encoding, since older */ /* versions of Mac OS are able to use it. */ /* */ /* FT_ENCODING_OLD_LATIN_2 :: */ /* This value is deprecated and was never used nor reported by */ /* FreeType. Don't use or test for it. */ /* */ /* <Note> */ /* By default, FreeType automatically synthetizes a Unicode charmap */ /* for Postscript fonts, using their glyph names dictionaries. */ /* However, it will also report the encodings defined explicitly in */ /* the font file, for the cases when they are needed, with the Adobe */ /* values as well. */ /* */ typedef enum FT_Encoding_ { FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), FT_ENC_TAG( FT_ENCODING_MS_SJIS, 's', 'j', 'i', 's' ), FT_ENC_TAG( FT_ENCODING_MS_GB2312, 'g', 'b', ' ', ' ' ), FT_ENC_TAG( FT_ENCODING_MS_BIG5, 'b', 'i', 'g', '5' ), FT_ENC_TAG( FT_ENCODING_MS_WANSUNG, 'w', 'a', 'n', 's' ), FT_ENC_TAG( FT_ENCODING_MS_JOHAB, 'j', 'o', 'h', 'a' ), FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) } FT_Encoding; /*************************************************************************/ /* */ /* <Enum> */ /* ft_encoding_xxx */ /* */ /* <Description> */ /* These constants are deprecated; use the corresponding @FT_Encoding */ /* values instead. */ /* */ /* <Values> */ /* ft_encoding_none :: see @FT_ENCODING_NONE */ /* ft_encoding_unicode :: see @FT_ENCODING_UNICODE */ /* ft_encoding_latin_2 :: see @FT_ENCODING_OLD_LATIN_2 */ /* ft_encoding_symbol :: see @FT_ENCODING_MS_SYMBOL */ /* ft_encoding_sjis :: see @FT_ENCODING_MS_SJIS */ /* ft_encoding_gb2312 :: see @FT_ENCODING_MS_GB2312 */ /* ft_encoding_big5 :: see @FT_ENCODING_MS_BIG5 */ /* ft_encoding_wansung :: see @FT_ENCODING_MS_WANSUNG */ /* ft_encoding_johab :: see @FT_ENCODING_MS_JOHAB */ /* */ /* ft_encoding_adobe_standard :: see @FT_ENCODING_ADOBE_STANDARD */ /* ft_encoding_adobe_expert :: see @FT_ENCODING_ADOBE_EXPERT */ /* ft_encoding_adobe_custom :: see @FT_ENCODING_ADOBE_CUSTOM */ /* ft_encoding_latin_1 :: see @FT_ENCODING_ADOBE_LATIN_1 */ /* */ /* ft_encoding_apple_roman :: see @FT_ENCODING_APPLE_ROMAN */ /* */ #define ft_encoding_none FT_ENCODING_NONE #define ft_encoding_unicode FT_ENCODING_UNICODE #define ft_encoding_symbol FT_ENCODING_MS_SYMBOL #define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 #define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 #define ft_encoding_sjis FT_ENCODING_MS_SJIS #define ft_encoding_gb2312 FT_ENCODING_MS_GB2312 #define ft_encoding_big5 FT_ENCODING_MS_BIG5 #define ft_encoding_wansung FT_ENCODING_MS_WANSUNG #define ft_encoding_johab FT_ENCODING_MS_JOHAB #define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD #define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT #define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM #define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN /*************************************************************************/ /* */ /* <Struct> */ /* FT_CharMapRec */ /* */ /* <Description> */ /* The base charmap structure. */ /* */ /* <Fields> */ /* face :: A handle to the parent face object. */ /* */ /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ /* this with @FT_Select_Charmap. */ /* */ /* platform_id :: An ID number describing the platform for the */ /* following encoding ID. This comes directly from */ /* the TrueType specification and should be emulated */ /* for other formats. */ /* */ /* encoding_id :: A platform specific encoding number. This also */ /* comes from the TrueType specification and should be */ /* emulated similarly. */ /* */ typedef struct FT_CharMapRec_ { FT_Face face; FT_Encoding encoding; FT_UShort platform_id; FT_UShort encoding_id; } FT_CharMapRec; /*************************************************************************/ /*************************************************************************/ /* */ /* B A S E O B J E C T C L A S S E S */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FT_Face_Internal */ /* */ /* <Description> */ /* An opaque handle to an FT_Face_InternalRec structure, used to */ /* model private data of a given @FT_Face object. */ /* */ /* This structure might change between releases of FreeType 2 and is */ /* not generally available to client applications. */ /* */ typedef struct FT_Face_InternalRec_* FT_Face_Internal; /*************************************************************************/ /* */ /* <Struct> */ /* FT_FaceRec */ /* */ /* <Description> */ /* FreeType root face class structure. A face object models the */ /* resolution and point-size independent data found in a font file. */ /* */ /* <Fields> */ /* num_faces :: In the case where the face is located in a */ /* collection (i.e., a file which embeds */ /* several faces), this is the total number of */ /* faces found in the resource. 1 by default. */ /* */ /* face_index :: The index of the face in its font file. */ /* Usually, this is 0 for all normal font */ /* formats. It can be more in the case of */ /* collections (which embed several fonts in a */ /* single resource/file). */ /* */ /* face_flags :: A set of bit flags that give important */ /* information about the face; see the */ /* @FT_FACE_FLAG_XXX constants for details. */ /* */ /* style_flags :: A set of bit flags indicating the style of */ /* the face (i.e., italic, bold, underline, */ /* etc). See the @FT_STYLE_FLAG_XXX */ /* constants. */ /* */ /* num_glyphs :: The total number of glyphs in the face. */ /* */ /* family_name :: The face's family name. This is an ASCII */ /* string, usually in English, which describes */ /* the typeface's family (like `Times New */ /* Roman', `Bodoni', `Garamond', etc). This */ /* is a least common denominator used to list */ /* fonts. Some formats (TrueType & OpenType) */ /* provide localized and Unicode versions of */ /* this string. Applications should use the */ /* format specific interface to access them. */ /* */ /* style_name :: The face's style name. This is an ASCII */ /* string, usually in English, which describes */ /* the typeface's style (like `Italic', */ /* `Bold', `Condensed', etc). Not all font */ /* formats provide a style name, so this field */ /* is optional, and can be set to NULL. As */ /* for `family_name', some formats provide */ /* localized/Unicode versions of this string. */ /* Applications should use the format specific */ /* interface to access them. */ /* */ /* num_fixed_sizes :: The number of fixed sizes available in this */ /* face. This should be set to 0 for scalable */ /* fonts, unless its face includes a complete */ /* set of glyphs (called a `strike') for the */ /* specified sizes. */ /* */ /* available_sizes :: An array of sizes specifying the available */ /* bitmap/graymap sizes that are contained in */ /* in the font face. Should be set to NULL if */ /* the field `num_fixed_sizes' is set to 0. */ /* */ /* num_charmaps :: The total number of character maps in the */ /* face. */ /* */ /* charmaps :: A table of pointers to the face's charmaps. */ /* Used to scan the list of available charmaps */ /* -- this table might change after a call to */ /* @FT_Attach_File or @FT_Attach_Stream (e.g. */ /* if used to hook an additional encoding or */ /* CMap to the face object). */ /* */ /* generic :: A field reserved for client uses. See the */ /* @FT_Generic type description. */ /* */ /* bbox :: The font bounding box. Coordinates are */ /* expressed in font units (see units_per_EM). */ /* The box is large enough to contain any */ /* glyph from the font. Thus, bbox.yMax can */ /* be seen as the `maximal ascender', */ /* bbox.yMin as the `minimal descender', and */ /* the maximal glyph width is given by */ /* `bbox.xMax-bbox.xMin' (not to be confused */ /* with the maximal _advance_width_). Only */ /* relevant for scalable formats. */ /* */ /* units_per_EM :: The number of font units per EM square for */ /* this face. This is typically 2048 for */ /* TrueType fonts, 1000 for Type1 fonts, and */ /* should be set to the (unrealistic) value 1 */ /* for fixed-sizes fonts. Only relevant for */ /* scalable formats. */ /* */ /* ascender :: The face's ascender is the vertical */ /* distance from the baseline to the topmost */ /* point of any glyph in the face. This */ /* field's value is positive, expressed in */ /* font units. Some font designs use a value */ /* different from `bbox.yMax'. Only relevant */ /* for scalable formats. */ /* */ /* descender :: The face's descender is the vertical */ /* distance from the baseline to the */ /* bottommost point of any glyph in the face. */ /* This field's value is *negative*, expressed */ /* in font units. Some font designs use a */ /* value different from `bbox.yMin'. Only */ /* relevant for scalable formats. */ /* */ /* height :: The face's height is the vertical distance */ /* from one baseline to the next when writing */ /* several lines of text. Its value is always */ /* positive, expressed in font units. The */ /* value can be computed as */ /* `ascender+descender+line_gap' where the */ /* value of `line_gap' is also called */ /* `external leading'. Only relevant for */ /* scalable formats. */ /* */ /* max_advance_width :: The maximal advance width, in font units, */ /* for all glyphs in this face. This can be */ /* used to make word wrapping computations */ /* faster. Only relevant for scalable */ /* formats. */ /* */ /* max_advance_height :: The maximal advance height, in font units, */ /* for all glyphs in this face. This is only */ /* relevant for vertical layouts, and should */ /* be set to the `height' for fonts that do */ /* not provide vertical metrics. Only */ /* relevant for scalable formats. */ /* */ /* underline_position :: The position, in font units, of the */ /* underline line for this face. It's the */ /* center of the underlining stem. Only */ /* relevant for scalable formats. */ /* */ /* underline_thickness :: The thickness, in font units, of the */ /* underline for this face. Only relevant for */ /* scalable formats. */ /* */ /* glyph :: The face's associated glyph slot(s). This */ /* object is created automatically with a new */ /* face object. However, certain kinds of */ /* applications (mainly tools like converters) */ /* can need more than one slot to ease their */ /* task. */ /* */ /* size :: The current active size for this face. */ /* */ /* charmap :: The current active charmap for this face. */ /* */ typedef struct FT_FaceRec_ { FT_Long num_faces; FT_Long face_index; FT_Long face_flags; FT_Long style_flags; FT_Long num_glyphs; FT_String* family_name; FT_String* style_name; FT_Int num_fixed_sizes; FT_Bitmap_Size* available_sizes; FT_Int num_charmaps; FT_CharMap* charmaps; FT_Generic generic; /*# the following are only relevant to scalable outlines */ FT_BBox bbox; FT_UShort units_per_EM; FT_Short ascender; FT_Short descender; FT_Short height; FT_Short max_advance_width; FT_Short max_advance_height; FT_Short underline_position; FT_Short underline_thickness; FT_GlyphSlot glyph; FT_Size size; FT_CharMap charmap; /*@private begin */ FT_Driver driver; FT_Memory memory; FT_Stream stream; FT_ListRec sizes_list; FT_Generic autohint; void* extensions; FT_Face_Internal internal; /*@private end */ } FT_FaceRec; /*************************************************************************/ /* */ /* <Enum> */ /* FT_FACE_FLAG_XXX */ /* */ /* <Description> */ /* A list of bit flags used in the 'face_flags' field of the */ /* @FT_FaceRec structure. They inform client applications of */ /* properties of the corresponding face. */ /* */ /* <Values> */ /* FT_FACE_FLAG_SCALABLE :: */ /* Indicates that the face provides vectorial outlines. This */ /* doesn't prevent embedded bitmaps, i.e., a face can have both */ /* this bit and @FT_FACE_FLAG_FIXED_SIZES set */ /* */ /* FT_FACE_FLAG_FIXED_SIZES :: */ /* Indicates that the face contains `fixed sizes', i.e., bitmap */ /* strikes for some given pixel sizes. See the `num_fixed_sizes' */ /* and `available_sizes' fields of @FT_FaceRec. */ /* */ /* FT_FACE_FLAG_FIXED_WIDTH :: */ /* Indicates that the face contains fixed-width characters (like */ /* Courier, Lucido, MonoType, etc.). */ /* */ /* FT_FACE_FLAG_SFNT :: */ /* Indicates that the face uses the `sfnt' storage scheme. For */ /* now, this means TrueType and OpenType. */ /* */ /* FT_FACE_FLAG_HORIZONTAL :: */ /* Indicates that the face contains horizontal glyph metrics. This */ /* should be set for all common formats. */ /* */ /* FT_FACE_FLAG_VERTICAL :: */ /* Indicates that the face contains vertical glyph metrics. This */ /* is only available in some formats, not all of them. */ /* */ /* FT_FACE_FLAG_KERNING :: */ /* Indicates that the face contains kerning information. If set, */ /* the kerning distance can be retrieved through the function */ /* @FT_Get_Kerning. Note that if unset, this function will always */ /* return the vector (0,0). */ /* */ /* FT_FACE_FLAG_FAST_GLYPHS :: */ /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ /* */ /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ /* Indicates that the font contains multiple masters and is capable */ /* of interpolating between them. See the multiple-masters */ /* specific API for details. */ /* */ /* FT_FACE_FLAG_GLYPH_NAMES :: */ /* Indicates that the font contains glyph names that can be */ /* retrieved through @FT_Get_Glyph_Names. Note that some TrueType */ /* fonts contain broken glyph name tables. Use the function */ /* @FT_Has_PS_Glyph_Name when needed. */ /* */ /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ /* Used internally by FreeType to indicate that a face's stream was */ /* provided by the client application and should not be destroyed */ /* when @FT_Done_Face is called. Don't read or test this flag. */ /* */ #define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) #define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) #define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) #define FT_FACE_FLAG_SFNT ( 1L << 3 ) #define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) #define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) #define FT_FACE_FLAG_KERNING ( 1L << 6 ) #define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) #define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) #define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) #define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) /* */ /*************************************************************************/ /* */ /* @macro: */ /* FT_HAS_HORIZONTAL( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains */ /* horizontal metrics (this is true for all font formats though). */ /* */ /* @also: */ /* @FT_HAS_VERTICAL can be used to check for vertical metrics. */ /* */ #define FT_HAS_HORIZONTAL( face ) \ ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) /*************************************************************************/ /* */ /* @macro: */ /* FT_HAS_VERTICAL( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains vertical */ /* metrics. */ /* */ #define FT_HAS_VERTICAL( face ) \ ( face->face_flags & FT_FACE_FLAG_VERTICAL ) /*************************************************************************/ /* */ /* @macro: */ /* FT_HAS_KERNING( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains kerning */ /* data that can be accessed with @FT_Get_Kerning. */ /* */ #define FT_HAS_KERNING( face ) \ ( face->face_flags & FT_FACE_FLAG_KERNING ) /*************************************************************************/ /* */ /* @macro: */ /* FT_IS_SCALABLE( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains a */ /* scalable font face (true for TrueType, Type 1, CID, and */ /* OpenType/CFF font formats. */ /* */ #define FT_IS_SCALABLE( face ) \ ( face->face_flags & FT_FACE_FLAG_SCALABLE ) /*************************************************************************/ /* */ /* @macro: */ /* FT_IS_SFNT( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains a font */ /* whose format is based on the SFNT storage scheme. This usually */ /* means: TrueType fonts, OpenType fonts, as well as SFNT-based */ /* embedded bitmap fonts. */ /* */ /* If this macro is true, all functions defined in @FT_SFNT_NAMES_H */ /* and @FT_TRUETYPE_TABLES_H are available. */ /* */ #define FT_IS_SFNT( face ) \ ( face->face_flags & FT_FACE_FLAG_SFNT ) /*************************************************************************/ /* */ /* @macro: */ /* FT_IS_FIXED_WIDTH( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains a font */ /* face that contains fixed-width (or "monospace", "fixed-pitch", */ /* etc.) glyphs. */ /* */ #define FT_IS_FIXED_WIDTH( face ) \ ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) /*************************************************************************/ /* */ /* @macro: */ /* FT_IS_FIXED_SIZES( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains some */ /* embedded bitmaps. See the `fixed_sizes' field of the @FT_FaceRec */ /* structure. */ /* */ #define FT_HAS_FIXED_SIZES( face ) \ ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) /* */ /*************************************************************************/ /* */ /* @macro: */ /* FT_HAS_FAST_GLYPHS( face ) */ /* */ /* @description: */ /* Deprecated; indicates that the face contains so-called "fast" */ /* glyph bitmaps. */ /* */ #define FT_HAS_FAST_GLYPHS( face ) \ ( face->face_flags & FT_FACE_FLAG_FAST_GLYPHS ) /*************************************************************************/ /* */ /* @macro: */ /* FT_HAS_GLYPH_NAMES( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains some */ /* glyph names that can be accessed through @FT_Get_Glyph_Names. */ /* */ #define FT_HAS_GLYPH_NAMES( face ) \ ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) /*************************************************************************/ /* */ /* @macro: */ /* FT_HAS_MULTIPLE_MASTERS( face ) */ /* */ /* @description: */ /* A macro that returns true whenever a face object contains some */ /* multiple masters. The functions provided by */ /* @FT_MULTIPLE_MASTERS_H are then available to choose the exact */ /* design you want. */ /* */ #define FT_HAS_MULTIPLE_MASTERS( face ) \ ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) /*************************************************************************/ /* */ /* <Constant> */ /* FT_STYLE_FLAG_XXX */ /* */ /* <Description> */ /* A list of bit-flags used to indicate the style of a given face. */ /* These are used in the `style_flags' field of @FT_FaceRec. */ /* */ /* <Values> */ /* FT_STYLE_FLAG_ITALIC :: */ /* Indicates that a given face is italicized. */ /* */ /* FT_STYLE_FLAG_BOLD :: */ /* Indicates that a given face is bold. */ /* */ #define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) #define FT_STYLE_FLAG_BOLD ( 1 << 1 ) /*************************************************************************/ /* */ /* <Type> */ /* FT_Size_Internal */ /* */ /* <Description> */ /* An opaque handle to an FT_Size_InternalRec structure, used to */ /* model private data of a given FT_Size object. */ /* */ typedef struct FT_Size_InternalRec_* FT_Size_Internal; /*************************************************************************/ /* */ /* FreeType base size metrics */ /* */ /* <Struct> */ /* FT_Size_Metrics */ /* */ /* <Description> */ /* The size metrics structure returned scaled important distances for */ /* a given size object. */ /* */ /* <Fields> */ /* x_ppem :: The character width, expressed in integer pixels. */ /* This is the width of the EM square expressed in */ /* pixels, hence the term `ppem' (pixels per EM). */ /* */ /* y_ppem :: The character height, expressed in integer pixels. */ /* This is the height of the EM square expressed in */ /* pixels, hence the term `ppem' (pixels per EM). */ /* */ /* x_scale :: A simple 16.16 fixed point format coefficient used */ /* to scale horizontal distances expressed in font */ /* units to fractional (26.6) pixel coordinates. */ /* */ /* y_scale :: A simple 16.16 fixed point format coefficient used */ /* to scale vertical distances expressed in font */ /* units to fractional (26.6) pixel coordinates. */ /* */ /* ascender :: The ascender, expressed in 26.6 fixed point */ /* pixels. Always positive. */ /* */ /* descender :: The descender, expressed in 26.6 fixed point */ /* pixels. Always positive. */ /* */ /* height :: The text height, expressed in 26.6 fixed point */ /* pixels. Always positive. */ /* */ /* max_advance :: Maximum horizontal advance, expressed in 26.6 */ /* fixed point pixels. Always positive. */ /* */ /* <Note> */ /* The values of `ascender', `descender', and `height' are only the */ /* scaled versions of `face->ascender', `face->descender', and */ /* `face->height'. */ /* */ /* Unfortunately, due to glyph hinting, these values might not be */ /* exact for certain fonts, they thus must be treated as unreliable */ /* with an error margin of at least one pixel! */ /* */ /* Indeed, the only way to get the exact pixel ascender and descender */ /* is to render _all_ glyphs. As this would be a definite */ /* performance hit, it is up to client applications to perform such */ /* computations. */ /* */ typedef struct FT_Size_Metrics_ { FT_UShort x_ppem; /* horizontal pixels per EM */ FT_UShort y_ppem; /* vertical pixels per EM */ FT_Fixed x_scale; /* two scales used to convert font units */ FT_Fixed y_scale; /* to 26.6 frac. pixel coordinates.. */ FT_Pos ascender; /* ascender in 26.6 frac. pixels */ FT_Pos descender; /* descender in 26.6 frac. pixels */ FT_Pos height; /* text height in 26.6 frac. pixels */ FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ } FT_Size_Metrics; /*************************************************************************/ /* */ /* <Struct> */ /* FT_SizeRec */ /* */ /* <Description> */ /* FreeType root size class structure. A size object models the */ /* resolution and pointsize dependent data of a given face. */ /* */ /* <Fields> */ /* face :: Handle to the parent face object. */ /* */ /* generic :: A typeless pointer, which is unused by the FreeType */ /* library or any of its drivers. It can be used by */ /* client applications to link their own data to each size */ /* object. */ /* */ /* metrics :: Metrics for this size object. This field is read-only. */ /* */ typedef struct FT_SizeRec_ { FT_Face face; /* parent face object */ FT_Generic generic; /* generic pointer for client uses */ FT_Size_Metrics metrics; /* size metrics */ FT_Size_Internal internal; } FT_SizeRec; /*************************************************************************/ /* */ /* <Struct> */ /* FT_SubGlyph */ /* */ /* <Description> */ /* The subglyph structure is an internal object used to describe */ /* subglyphs (for example, in the case of composites). */ /* */ /* <Note> */ /* The subglyph implementation is not part of the high-level API, */ /* hence the forward structure declaration. */ /* */ typedef struct FT_SubGlyphRec_* FT_SubGlyph; /*************************************************************************/ /* */ /* <Type> */ /* FT_Slot_Internal */ /* */ /* <Description> */ /* An opaque handle to an FT_Slot_InternalRec structure, used to */ /* model private data of a given FT_GlyphSlot object. */ /* */ typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; /*************************************************************************/ /* */ /* <Struct> */ /* FT_GlyphSlotRec */ /* */ /* <Description> */ /* FreeType root glyph slot class structure. A glyph slot is a */ /* container where individual glyphs can be loaded, be they */ /* vectorial or bitmap/graymaps. */ /* */ /* <Fields> */ /* library :: A handle to the FreeType library instance */ /* this slot belongs to. */ /* */ /* face :: A handle to the parent face object. */ /* */ /* next :: In some cases (like some font tools), several */ /* glyph slots per face object can be a good */ /* thing. As this is rare, the glyph slots are */ /* listed through a direct, single-linked list */ /* using its `next' field. */ /* */ /* generic :: A typeless pointer which is unused by the */ /* FreeType library or any of its drivers. It */ /* can be used by client applications to link */ /* their own data to each glyph slot object. */ /* */ /* metrics :: The metrics of the last loaded glyph in the */ /* slot. The returned values depend on the last */ /* load flags (see the @FT_Load_Glyph API */ /* function) and can be expressed either in 26.6 */ /* fractional pixels or font units. */ /* */ /* Note that even when the glyph image is */ /* transformed, the metrics are not. */ /* */ /* linearHoriAdvance :: For scalable formats only, this field holds */ /* the linearly scaled horizontal advance width */ /* for the glyph (i.e. the scaled and unhinted */ /* value of the hori advance). This can be */ /* important to perform correct WYSIWYG layout. */ /* */ /* Note that this value is expressed by default */ /* in 16.16 pixels. However, when the glyph is */ /* loaded with the FT_LOAD_LINEAR_DESIGN flag, */ /* this field contains simply the value of the */ /* advance in original font units. */ /* */ /* linearVertAdvance :: For scalable formats only, this field holds */ /* the linearly scaled vertical advance height */ /* for the glyph. See linearHoriAdvance for */ /* comments. */ /* */ /* advance :: This is the transformed advance width for the */ /* glyph. */ /* */ /* format :: This field indicates the format of the image */ /* contained in the glyph slot. Typically */ /* FT_GLYPH_FORMAT_BITMAP, */ /* FT_GLYPH_FORMAT_OUTLINE, and */ /* FT_GLYPH_FORMAT_COMPOSITE, but others are */ /* possible. */ /* */ /* bitmap :: This field is used as a bitmap descriptor */ /* when the slot format is */ /* FT_GLYPH_FORMAT_BITMAP. Note that the */ /* address and content of the bitmap buffer can */ /* change between calls of @FT_Load_Glyph and a */ /* few other functions. */ /* */ /* bitmap_left :: This is the bitmap's left bearing expressed */ /* in integer pixels. Of course, this is only */ /* valid if the format is */ /* FT_GLYPH_FORMAT_BITMAP. */ /* */ /* bitmap_top :: This is the bitmap's top bearing expressed in */ /* integer pixels. Remember that this is the */ /* distance from the baseline to the top-most */ /* glyph scanline, upwards y-coordinates being */ /* *positive*. */ /* */ /* outline :: The outline descriptor for the current glyph */ /* image if its format is */ /* ft_glyph_bitmap_outline. */ /* */ /* num_subglyphs :: The number of subglyphs in a composite glyph. */ /* This format is only valid for the composite */ /* glyph format, that should normally only be */ /* loaded with the FT_LOAD_NO_RECURSE flag. */ /* */ /* subglyphs :: An array of subglyph descriptors for */ /* composite glyphs. There are `num_subglyphs' */ /* elements in there. */ /* */ /* control_data :: Certain font drivers can also return the */ /* control data for a given glyph image (e.g. */ /* TrueType bytecode, Type 1 charstrings, etc.). */ /* This field is a pointer to such data. */ /* */ /* control_len :: This is the length in bytes of the control */ /* data. */ /* */ /* other :: Really wicked formats can use this pointer to */ /* present their own glyph image to client apps. */ /* Note that the app will need to know about the */ /* image format. */ /* */ /* <Note> */ /* If @FT_Load_Glyph is called with default flags (see */ /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ /* its native format (e.g. a vectorial outline for TrueType and */ /* Type 1 formats). */ /* */ /* This image can later be converted into a bitmap by calling */ /* @FT_Render_Glyph. This function finds the current renderer for */ /* the native image's format then invokes it. */ /* */ /* The renderer is in charge of transforming the native image through */ /* the slot's face transformation fields, then convert it into a */ /* bitmap that is returned in `slot->bitmap'. */ /* */ /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ /* to specify the position of the bitmap relative to the current pen */ /* position (e.g. coordinates [0,0] on the baseline). Of course, */ /* `slot->format' is also changed to `FT_GLYPH_FORMAT_BITMAP' . */ /* */ typedef struct FT_GlyphSlotRec_ { FT_Library library; FT_Face face; FT_GlyphSlot next; FT_UInt flags; FT_Generic generic; FT_Glyph_Metrics metrics; FT_Fixed linearHoriAdvance; FT_Fixed linearVertAdvance; FT_Vector advance; FT_Glyph_Format format; FT_Bitmap bitmap; FT_Int bitmap_left; FT_Int bitmap_top; FT_Outline outline; FT_UInt num_subglyphs; FT_SubGlyph subglyphs; void* control_data; long control_len; void* other; FT_Slot_Internal internal; } FT_GlyphSlotRec; /*************************************************************************/ /*************************************************************************/ /* */ /* F U N C T I O N S */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_Init_FreeType */ /* */ /* <Description> */ /* Initializes a new FreeType library object. The set of modules */ /* that are registered by this function is determined at build time. */ /* */ /* <Output> */ /* alibrary :: A handle to a new library object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Init_FreeType( FT_Library *alibrary ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Library_Version */ /* */ /* <Description> */ /* Return the version of the FreeType library being used. This is */ /* useful when dynamically linking to the library, since one cannot */ /* use the macros FT_FREETYPE_MAJOR, FT_FREETYPE_MINOR, and */ /* FT_FREETYPE_PATCH. */ /* */ /* <Input> */ /* library :: A source library handle. */ /* */ /* <Output> */ /* amajor :: The major version number. */ /* */ /* aminor :: The minor version number. */ /* */ /* apatch :: The patch version number. */ /* */ /* <Note> */ /* The reason why this function takes a 'library' argument is because */ /* certain programs implement library initialization in a custom way */ /* that doesn't use `FT_Init_FreeType'. */ /* */ /* In such cases, the library version might not be available before */ /* the library object has been created. */ /* */ FT_EXPORT( void ) FT_Library_Version( FT_Library library, FT_Int *amajor, FT_Int *aminor, FT_Int *apatch ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Done_FreeType */ /* */ /* <Description> */ /* Destroys a given FreeType library object and all of its childs, */ /* including resources, drivers, faces, sizes, etc. */ /* */ /* <Input> */ /* library :: A handle to the target library object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Done_FreeType( FT_Library library ); /*************************************************************************/ /* */ /* <Enum> */ /* FT_Open_Flags */ /* */ /* <Description> */ /* An enumeration used to list the bit flags used within the */ /* `flags' field of the @FT_Open_Args structure. */ /* */ /* <Fields> */ /* FT_OPEN_MEMORY :: This is a memory-based stream. */ /* */ /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ /* */ /* FT_OPEN_PATHNAME :: Create a new input stream from a C */ /* path name. */ /* */ /* FT_OPEN_DRIVER :: Use the `driver' field. */ /* */ /* FT_OPEN_PARAMS :: Use the `num_params' & `params' field. */ /* */ /* <Note> */ /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ /* flags are mutually exclusive. */ /* */ typedef enum { FT_OPEN_MEMORY = 1, FT_OPEN_STREAM = 2, FT_OPEN_PATHNAME = 4, FT_OPEN_DRIVER = 8, FT_OPEN_PARAMS = 16 } FT_Open_Flags; #define FT_OPEN_MEMORY FT_OPEN_MEMORY #define FT_OPEN_STREAM FT_OPEN_STREAM #define FT_OPEN_PATHNAME FT_OPEN_PATHNAME #define FT_OPEN_DRIVER FT_OPEN_DRIVER #define FT_OPEN_PARAMS FT_OPEN_PARAMS /*************************************************************************/ /* */ /* <Struct> */ /* FT_Parameter */ /* */ /* <Description> */ /* A simple structure used to pass more or less generic parameters */ /* to @FT_Open_Face. */ /* */ /* <Fields> */ /* tag :: A 4-byte identification tag. */ /* */ /* data :: A pointer to the parameter data. */ /* */ /* <Note> */ /* The id and function of parameters are driver-specific. */ /* */ typedef struct FT_Parameter_ { FT_ULong tag; FT_Pointer data; } FT_Parameter; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Open_Args */ /* */ /* <Description> */ /* A structure used to indicate how to open a new font file/stream. */ /* A pointer to such a structure can be used as a parameter for the */ /* functions @FT_Open_Face and @FT_Attach_Stream. */ /* */ /* <Fields> */ /* flags :: A set of bit flags indicating how to use the */ /* structure. */ /* */ /* memory_base :: The first byte of the file in memory. */ /* */ /* memory_size :: The size in bytes of the file in memory. */ /* */ /* pathname :: A pointer to an 8-bit file pathname. */ /* */ /* stream :: A handle to a source stream object. */ /* */ /* driver :: This field is exclusively used by @FT_Open_Face; */ /* it simply specifies the font driver to use to open */ /* the face. If set to 0, FreeType will try to load */ /* the face with each one of the drivers in its list. */ /* */ /* num_params :: The number of extra parameters. */ /* */ /* params :: Extra parameters passed to the font driver when */ /* opening a new face. */ /* */ /* <Note> */ /* The stream type is determined by the contents of `flags' which */ /* are tested in the following order by @FT_Open_Face: */ /* */ /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */ /* memory file of `memory_size' bytes,located at `memory_address'. */ /* */ /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */ /* custom input stream `stream' is used. */ /* */ /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ /* is a normal file and use `pathname' to open it. */ /* */ /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face will only try to */ /* open the file with the driver whose handler is in `driver'. */ /* */ /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ /* `num_params' and `params' will be used. They are ignored */ /* otherwise. */ /* */ typedef struct FT_Open_Args_ { FT_Open_Flags flags; const FT_Byte* memory_base; FT_Long memory_size; FT_String* pathname; FT_Stream stream; FT_Module driver; FT_Int num_params; FT_Parameter* params; } FT_Open_Args; /*************************************************************************/ /* */ /* <Function> */ /* FT_New_Face */ /* */ /* <Description> */ /* Creates a new face object from a given resource and typeface index */ /* using a pathname to the font file. */ /* */ /* <InOut> */ /* library :: A handle to the library resource. */ /* */ /* <Input> */ /* pathname :: A path to the font file. */ /* */ /* face_index :: The index of the face within the resource. The */ /* first face has index 0. */ /* <Output> */ /* aface :: A handle to a new face object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* Unlike FreeType 1.x, this function automatically creates a glyph */ /* slot for the face object which can be accessed directly through */ /* `face->glyph'. */ /* */ /* @FT_New_Face can be used to determine and/or check the font format */ /* of a given font resource. If the `face_index' field is negative, */ /* the function will _not_ return any face handle in `aface'. Its */ /* return value should be 0 if the font format is recognized, or */ /* non-zero otherwise. */ /* */ /* Each new face object created with this function also owns a */ /* default @FT_Size object, accessible as `face->size'. */ /* */ FT_EXPORT( FT_Error ) FT_New_Face( FT_Library library, const char* filepathname, FT_Long face_index, FT_Face *aface ); /*************************************************************************/ /* */ /* <Function> */ /* FT_New_Memory_Face */ /* */ /* <Description> */ /* Creates a new face object from a given resource and typeface index */ /* using a font file already loaded into memory. */ /* */ /* <InOut> */ /* library :: A handle to the library resource. */ /* */ /* <Input> */ /* file_base :: A pointer to the beginning of the font data. */ /* */ /* file_size :: The size of the memory chunk used by the font data. */ /* */ /* face_index :: The index of the face within the resource. The */ /* first face has index 0. */ /* <Output> */ /* aface :: A handle to a new face object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The font data bytes are used _directly_ by the @FT_Face object. */ /* This means that they are not copied, and that the client is */ /* responsible for releasing/destroying them _after_ the */ /* corresponding call to @FT_Done_Face . */ /* */ /* Unlike FreeType 1.x, this function automatically creates a glyph */ /* slot for the face object which can be accessed directly through */ /* `face->glyph'. */ /* */ /* @FT_New_Memory_Face can be used to determine and/or check the font */ /* format of a given font resource. If the `face_index' field is */ /* negative, the function will _not_ return any face handle in */ /* `aface'. Its return value should be 0 if the font format is */ /* recognized, or non-zero otherwise. */ /* */ FT_EXPORT( FT_Error ) FT_New_Memory_Face( FT_Library library, const FT_Byte* file_base, FT_Long file_size, FT_Long face_index, FT_Face *aface ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Open_Face */ /* */ /* <Description> */ /* Opens a face object from a given resource and typeface index using */ /* an `FT_Open_Args' structure. If the face object doesn't exist, it */ /* will be created. */ /* */ /* <InOut> */ /* library :: A handle to the library resource. */ /* */ /* <Input> */ /* args :: A pointer to an `FT_Open_Args' structure which must */ /* be filled by the caller. */ /* */ /* face_index :: The index of the face within the resource. The */ /* first face has index 0. */ /* <Output> */ /* aface :: A handle to a new face object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* Unlike FreeType 1.x, this function automatically creates a glyph */ /* slot for the face object which can be accessed directly through */ /* `face->glyph'. */ /* */ /* @FT_Open_Face can be used to determine and/or check the font */ /* format of a given font resource. If the `face_index' field is */ /* negative, the function will _not_ return any face handle in */ /* `*face'. Its return value should be 0 if the font format is */ /* recognized, or non-zero otherwise. */ /* */ FT_EXPORT( FT_Error ) FT_Open_Face( FT_Library library, const FT_Open_Args* args, FT_Long face_index, FT_Face *aface ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Attach_File */ /* */ /* <Description> */ /* `Attaches' a given font file to an existing face. This is usually */ /* to read additional information for a single face object. For */ /* example, it is used to read the AFM files that come with Type 1 */ /* fonts in order to add kerning data and other metrics. */ /* */ /* <InOut> */ /* face :: The target face object. */ /* */ /* <Input> */ /* filepathname :: An 8-bit pathname naming the `metrics' file. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* If your font file is in memory, or if you want to provide your */ /* own input stream object, use @FT_Attach_Stream. */ /* */ /* The meaning of the `attach' action (i.e., what really happens when */ /* the new file is read) is not fixed by FreeType itself. It really */ /* depends on the font format (and thus the font driver). */ /* */ /* Client applications are expected to know what they are doing */ /* when invoking this function. Most drivers simply do not implement */ /* file attachments. */ /* */ FT_EXPORT( FT_Error ) FT_Attach_File( FT_Face face, const char* filepathname ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Attach_Stream */ /* */ /* <Description> */ /* This function is similar to @FT_Attach_File with the exception */ /* that it reads the attachment from an arbitrary stream. */ /* */ /* <InOut> */ /* face :: The target face object. */ /* */ /* <Input> */ /* parameters :: A pointer to an FT_Open_Args structure used to */ /* describe the input stream to FreeType. */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The meaning of the `attach' (i.e. what really happens when the */ /* new file is read) is not fixed by FreeType itself. It really */ /* depends on the font format (and thus the font driver). */ /* */ /* Client applications are expected to know what they are doing */ /* when invoking this function. Most drivers simply do not implement */ /* file attachments. */ /* */ FT_EXPORT( FT_Error ) FT_Attach_Stream( FT_Face face, FT_Open_Args* parameters ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Done_Face */ /* */ /* <Description> */ /* Discards a given face object, as well as all of its child slots */ /* and sizes. */ /* */ /* <Input> */ /* face :: A handle to a target face object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Done_Face( FT_Face face ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_Char_Size */ /* */ /* <Description> */ /* Sets the character dimensions of a given face object. The */ /* `char_width' and `char_height' values are used for the width and */ /* height, respectively, expressed in 26.6 fractional points. */ /* */ /* If the horizontal or vertical resolution values are zero, a */ /* default value of 72dpi is used. Similarly, if one of the */ /* character dimensions is zero, its value is set equal to the other. */ /* */ /* <InOut> */ /* size :: A handle to a target size object. */ /* */ /* <Input> */ /* char_width :: The character width, in 26.6 fractional points. */ /* */ /* char_height :: The character height, in 26.6 fractional */ /* points. */ /* */ /* horz_resolution :: The horizontal resolution. */ /* */ /* vert_resolution :: The vertical resolution. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* When dealing with fixed-size faces (i.e., non-scalable formats), */ /* use the function @FT_Set_Pixel_Sizes. */ /* */ FT_EXPORT( FT_Error ) FT_Set_Char_Size( FT_Face face, FT_F26Dot6 char_width, FT_F26Dot6 char_height, FT_UInt horz_resolution, FT_UInt vert_resolution ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_Pixel_Sizes */ /* */ /* <Description> */ /* Sets the character dimensions of a given face object. The width */ /* and height are expressed in integer pixels. */ /* */ /* If one of the character dimensions is zero, its value is set equal */ /* to the other. */ /* */ /* <InOut> */ /* face :: A handle to the target face object. */ /* */ /* <Input> */ /* pixel_width :: The character width, in integer pixels. */ /* */ /* pixel_height :: The character height, in integer pixels. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* */ /* <Note> */ /* The values of `pixel_width' and `pixel_height' correspond to the */ /* pixel values of the _typographic_ character size, which are NOT */ /* necessarily the same as the dimensions of the glyph `bitmap */ /* cells'. */ /* */ /* The `character size' is really the size of an abstract square */ /* called the `EM', used to design the font. However, depending */ /* on the font design, glyphs will be smaller or greater than the */ /* EM. */ /* */ /* This means that setting the pixel size to, say, 8x8 doesn't */ /* guarantee in any way that you will get glyph bitmaps that all fit */ /* within an 8x8 cell (sometimes even far from it). */ /* */ FT_EXPORT( FT_Error ) FT_Set_Pixel_Sizes( FT_Face face, FT_UInt pixel_width, FT_UInt pixel_height ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Load_Glyph */ /* */ /* <Description> */ /* A function used to load a single glyph within a given glyph slot, */ /* for a given size. */ /* */ /* <InOut> */ /* face :: A handle to the target face object where the glyph */ /* will be loaded. */ /* */ /* <Input> */ /* glyph_index :: The index of the glyph in the font file. */ /* */ /* load_flags :: A flag indicating what to load for this glyph. The */ /* @FT_LOAD_XXX constants can be used to control the */ /* glyph loading process (e.g., whether the outline */ /* should be scaled, whether to load bitmaps or not, */ /* whether to hint the outline, etc). */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* If the glyph image is not a bitmap, and if the bit flag */ /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be */ /* transformed with the information passed to a previous call to */ /* @FT_Set_Transform. */ /* */ /* Note that this also transforms the `face.glyph.advance' field, but */ /* *not* the values in `face.glyph.metrics'. */ /* */ FT_EXPORT( FT_Error ) FT_Load_Glyph( FT_Face face, FT_UInt glyph_index, FT_Int32 load_flags ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Load_Char */ /* */ /* <Description> */ /* A function used to load a single glyph within a given glyph slot, */ /* for a given size, according to its character code. */ /* */ /* <InOut> */ /* face :: A handle to a target face object where the glyph */ /* will be loaded. */ /* */ /* <Input> */ /* char_code :: The glyph's character code, according to the */ /* current charmap used in the face. */ /* */ /* load_flags :: A flag indicating what to load for this glyph. The */ /* @FT_LOAD_XXX constants can be used to control the */ /* glyph loading process (e.g., whether the outline */ /* should be scaled, whether to load bitmaps or not, */ /* whether to hint the outline, etc). */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* If the face has no current charmap, or if the character code */ /* is not defined in the charmap, this function will return an */ /* error. */ /* */ /* If the glyph image is not a bitmap, and if the bit flag */ /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be */ /* transformed with the information passed to a previous call to */ /* @FT_Set_Transform. */ /* */ /* Note that this also transforms the `face.glyph.advance' field, but */ /* *not* the values in `face.glyph.metrics'. */ /* */ FT_EXPORT( FT_Error ) FT_Load_Char( FT_Face face, FT_ULong char_code, FT_Int32 load_flags ); /**************************************************************************** * * @enum: * FT_LOAD_XXX * * @description: * A list of bit-field constants, used with @FT_Load_Glyph to indicate * what kind of operations to perform during glyph loading. * * @values: * FT_LOAD_DEFAULT :: * Corresponding to 0, this value is used a default glyph load. In this * case, the following will happen: * * 1. FreeType looks for a bitmap for the glyph corresponding to the * face's current size. If one is found, the function returns. The * bitmap data can be accessed from the glyph slot (see note below). * * 2. If no embedded bitmap is searched or found, FreeType looks for a * scalable outline. If one is found, it is loaded from the font * file, scaled to device pixels, then "hinted" to the pixel grid in * order to optimize it. The outline data can be accessed from the * glyph slot (see note below). * * Note that by default, the glyph loader doesn't render outlines into * bitmaps. The following flags are used to modify this default * behaviour to more specific and useful cases. * * FT_LOAD_NO_SCALE :: * Don't scale the vector outline being loaded to 26.6 fractional * pixels, but kept in font units. Note that this also disables * hinting and the loading of embedded bitmaps. You should only use it * when you want to retrieve the original glyph outlines in font units. * * FT_LOAD_NO_HINTING :: * Don't hint glyph outlines after their scaling to device pixels. * This generally generates "blurrier" glyphs in anti-aliased modes. * * This flag is ignored if @FT_LOAD_NO_SCALE is set. * * FT_LOAD_RENDER :: * Render the glyph outline immediately into a bitmap before the glyph * loader returns. By default, the glyph is rendered for the * @FT_RENDER_MODE_NORMAL mode, which corresponds to 8-bit anti-aliased * bitmaps using 256 opacity levels. You can use either * @FT_LOAD_TARGET_MONO or @FT_LOAD_MONOCHROME to render 1-bit * monochrome bitmaps. * * This flag is ignored if @FT_LOAD_NO_SCALE is set. * * FT_LOAD_NO_BITMAP :: * Don't look for bitmaps when loading the glyph. Only scalable * outlines will be loaded when available, and scaled, hinted, or * rendered depending on other bit flags. * * This does not prevent you from rendering outlines to bitmaps * with @FT_LOAD_RENDER, however. * * FT_LOAD_VERTICAL_LAYOUT :: * Prepare the glyph image for vertical text layout. This basically * means that `face.glyph.advance' will correspond to the vertical * advance height (instead of the default horizontal advance width), * and that the glyph image will be translated to match the vertical * bearings positions. * * FT_LOAD_FORCE_AUTOHINT :: * Force the use of the FreeType auto-hinter when a glyph outline is * loaded. You shouldn't need this in a typical application, since it * is mostly used to experiment with its algorithm. * * FT_LOAD_CROP_BITMAP :: * Indicates that the glyph loader should try to crop the bitmap (i.e., * remove all space around its black bits) when loading it. This is * only useful when loading embedded bitmaps in certain fonts, since * bitmaps rendered with @FT_LOAD_RENDER are always cropped by default. * * FT_LOAD_PEDANTIC :: * Indicates that the glyph loader should perform pedantic * verifications during glyph loading, rejecting invalid fonts. This * is mostly used to detect broken glyphs in fonts. By default, * FreeType tries to handle broken fonts also. * * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: * Indicates that the glyph loader should ignore the global advance * width defined in the font. As far as we know, this is only used by * the X-TrueType font server, in order to deal correctly with the * incorrect metrics contained in DynaLab's TrueType CJK fonts. * * FT_LOAD_NO_RECURSE :: * This flag is only used internally. It merely indicates that the * glyph loader should not load composite glyphs recursively. Instead, * it should set the `num_subglyph' and `subglyphs' values of the glyph * slot accordingly, and set "glyph->format" to * @FT_GLYPH_FORMAT_COMPOSITE. * * The description of sub-glyphs is not available to client * applications for now. * * FT_LOAD_IGNORE_TRANSFORM :: * Indicates that the glyph loader should not try to transform the * loaded glyph image. This doesn't prevent scaling, hinting, or * rendering. * * FT_LOAD_MONOCHROME :: * This flag is used with @FT_LOAD_RENDER to indicate that you want * to render a 1-bit monochrome glyph bitmap from a vectorial outline. * * Note that this has no effect on the hinting algorithm used by the * glyph loader. You should better use @FT_LOAD_TARGET_MONO if you * want to render monochrome-optimized glyph images instead. * * FT_LOAD_LINEAR_DESIGN :: * Return the linearly scaled metrics expressed in original font units * instead of the default 16.16 pixel values. * * FT_LOAD_NO_AUTOHINT :: * Indicates that the auto-hinter should never be used to hint glyph * outlines. This doesn't prevent native format-specific hinters from * being used. This can be important for certain fonts where unhinted * output is better than auto-hinted one. */ #define FT_LOAD_NO_SCALE 0x1 #define FT_LOAD_NO_HINTING 0x2 #define FT_LOAD_RENDER 0x4 #define FT_LOAD_NO_BITMAP 0x8 #define FT_LOAD_VERTICAL_LAYOUT 0x10 #define FT_LOAD_FORCE_AUTOHINT 0x20 #define FT_LOAD_CROP_BITMAP 0x40 #define FT_LOAD_PEDANTIC 0x80 #define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 #define FT_LOAD_NO_RECURSE 0x400 #define FT_LOAD_IGNORE_TRANSFORM 0x800 #define FT_LOAD_MONOCHROME 0x1000 #define FT_LOAD_LINEAR_DESIGN 0x2000 /* temporary hack! */ #define FT_LOAD_SBITS_ONLY 0x4000 #define FT_LOAD_NO_AUTOHINT 0x8000U /* */ #define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) #define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) #define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) #define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) #define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) #define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) #define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) #define FT_LOAD_DEFAULT 0x0 /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_Transform */ /* */ /* <Description> */ /* A function used to set the transformation that is applied to glyph */ /* images just before they are converted to bitmaps in a glyph slot */ /* when @FT_Render_Glyph is called. */ /* */ /* <InOut> */ /* face :: A handle to the source face object. */ /* */ /* <Input> */ /* matrix :: A pointer to the transformation's 2x2 matrix. Use 0 for */ /* the identity matrix. */ /* delta :: A pointer to the translation vector. Use 0 for the null */ /* vector. */ /* */ /* <Note> */ /* The transformation is only applied to scalable image formats after */ /* the glyph has been loaded. It means that hinting is unaltered by */ /* the transformation and is performed on the character size given in */ /* the last call to @FT_Set_Char_Sizes or @FT_Set_Pixel_Sizes. */ /* */ FT_EXPORT( void ) FT_Set_Transform( FT_Face face, FT_Matrix* matrix, FT_Vector* delta ); /*************************************************************************/ /* */ /* <Enum> */ /* FT_Render_Mode */ /* */ /* <Description> */ /* An enumeration type that lists the render modes supported by */ /* FreeType 2. Each mode corresponds to a specific type of scanline */ /* conversion performed on the outline, as well as specific */ /* hinting optimizations. */ /* */ /* <Values> */ /* FT_RENDER_MODE_NORMAL :: */ /* This is the default render mode; it corresponds to 8-bit */ /* anti-aliased bitmaps, using 256 levels of opacity. */ /* */ /* FT_RENDER_MODE_LIGHT :: */ /* This is similar to @FT_RENDER_MODE_NORMAL, except that this */ /* changes the hinting to prevent stem width quantization. This */ /* results in glyph shapes that are more similar to the original, */ /* while being a bit more fuzzy ("better shapes", instead of */ /* "better contrast" if you want :-) THIS IS STILL EXPERIMENTAL, */ /* FOR NOW, THIS WILL PRODUCE RESULTS SIMILAR TO NORMAL MODE !! */ /* */ /* FT_RENDER_MODE_MONO :: */ /* This mode corresponds to 1-bit bitmaps. */ /* */ /* FT_RENDER_MODE_LCD :: */ /* This mode corresponds to horizontal RGB/BGR sub-pixel displays, */ /* like LCD-screens. It produces 8-bit bitmaps that are 3 times */ /* the width of the original glyph outline in pixels, and which use */ /* the @FT_PIXEL_MODE_LCD mode. THIS IS STILL EXPERIMENTAL, DO NOT */ /* USE FOR NOW !! */ /* */ /* FT_RENDER_MODE_LCD_V :: */ /* This mode corresponds to vertical RGB/BGR sub-pixel displays */ /* (like PDA screens, rotated LCD displays, etc.). It produces */ /* 8-bit bitmaps that are 3 times the height of the original */ /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ /* */ /* <Note> */ /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph are */ /* _not filtered_ to reduce color-fringes. It is up to the caller to */ /* perform this pass. THIS IS STILL EXPERIMENTAL, DO NOT USE FOR NOW */ /* !! */ /* */ typedef enum FT_Render_Mode_ { FT_RENDER_MODE_NORMAL = 0, FT_RENDER_MODE_LIGHT, FT_RENDER_MODE_MONO, FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V, FT_RENDER_MODE_MAX } FT_Render_Mode; /*************************************************************************/ /* */ /* <Enum> */ /* ft_render_mode_xxx */ /* */ /* <Description> */ /* These constats are deprecated. Use the corresponding */ /* @FT_Render_Mode values instead. */ /* */ /* <Values> */ /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */ /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */ /* */ #define ft_render_mode_normal FT_RENDER_MODE_NORMAL #define ft_render_mode_mono FT_RENDER_MODE_MONO /*************************************************************************/ /* */ /* <Function> */ /* FT_Render_Glyph */ /* */ /* <Description> */ /* Converts a given glyph image to a bitmap. It does so by */ /* inspecting the glyph image format, find the relevant renderer, and */ /* invoke it. */ /* */ /* <InOut> */ /* slot :: A handle to the glyph slot containing the image to */ /* convert. */ /* */ /* <Input> */ /* render_mode :: This is the render mode used to render the glyph */ /* image into a bitmap. See FT_Render_Mode for a list */ /* of possible values. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Render_Glyph( FT_GlyphSlot slot, FT_Render_Mode render_mode ); /*************************************************************************/ /* */ /* <Enum> */ /* FT_Kerning_Mode */ /* */ /* <Description> */ /* An enumeration used to specify which kerning values to return in */ /* @FT_Get_Kerning. */ /* */ /* <Values> */ /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ /* distances (value is 0). */ /* */ /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ /* distances. */ /* */ /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ /* units. */ /* */ typedef enum FT_Kerning_Mode_ { FT_KERNING_DEFAULT = 0, FT_KERNING_UNFITTED, FT_KERNING_UNSCALED } FT_Kerning_Mode; /*************************************************************************/ /* */ /* <Const> */ /* ft_kerning_default */ /* */ /* <Description> */ /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */ /* instead. */ /* */ #define ft_kerning_default FT_KERNING_DEFAULT /*************************************************************************/ /* */ /* <Const> */ /* ft_kerning_unfitted */ /* */ /* <Description> */ /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */ /* instead. */ /* */ #define ft_kerning_unfitted FT_KERNING_UNFITTED /*************************************************************************/ /* */ /* <Const> */ /* ft_kerning_unscaled */ /* */ /* <Description> */ /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */ /* instead. */ /* */ #define ft_kerning_unscaled FT_KERNING_UNSCALED /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Kerning */ /* */ /* <Description> */ /* Returns the kerning vector between two glyphs of a same face. */ /* */ /* <Input> */ /* face :: A handle to a source face object. */ /* */ /* left_glyph :: The index of the left glyph in the kern pair. */ /* */ /* right_glyph :: The index of the right glyph in the kern pair. */ /* */ /* kern_mode :: See @FT_Kerning_Mode for more information. */ /* Determines the scale/dimension of the returned */ /* kerning vector. */ /* */ /* <Output> */ /* akerning :: The kerning vector. This is in font units for */ /* scalable formats, and in pixels for fixed-sizes */ /* formats. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* Only horizontal layouts (left-to-right & right-to-left) are */ /* supported by this method. Other layouts, or more sophisticated */ /* kernings, are out of the scope of this API function -- they can be */ /* implemented through format-specific interfaces. */ /* */ FT_EXPORT( FT_Error ) FT_Get_Kerning( FT_Face face, FT_UInt left_glyph, FT_UInt right_glyph, FT_UInt kern_mode, FT_Vector *akerning ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Glyph_Name */ /* */ /* <Description> */ /* Retrieves the ASCII name of a given glyph in a face. This only */ /* works for those faces where FT_HAS_GLYPH_NAME(face) returns true. */ /* */ /* <Input> */ /* face :: A handle to a source face object. */ /* */ /* glyph_index :: The glyph index. */ /* */ /* buffer_max :: The maximal number of bytes available in the */ /* buffer. */ /* */ /* <Output> */ /* buffer :: A pointer to a target buffer where the name will be */ /* copied to. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* An error is returned if the face doesn't provide glyph names or if */ /* the glyph index is invalid. In all cases of failure, the first */ /* byte of `buffer' will be set to 0 to indicate an empty name. */ /* */ /* The glyph name is truncated to fit within the buffer if it is too */ /* long. The returned string is always zero-terminated. */ /* */ /* This function is not compiled within the library if the config */ /* macro FT_CONFIG_OPTION_NO_GLYPH_NAMES is defined in */ /* `include/freetype/config/ftoptions.h' */ /* */ FT_EXPORT( FT_Error ) FT_Get_Glyph_Name( FT_Face face, FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Postscript_Name */ /* */ /* <Description> */ /* Retrieves the ASCII Postscript name of a given face, if available. */ /* This should only work with Postscript and TrueType fonts. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ /* */ /* <Return> */ /* A pointer to the face's Postscript name. NULL if un-available. */ /* */ /* <Note> */ /* The returned pointer is owned by the face and will be destroyed */ /* with it. */ /* */ FT_EXPORT( const char* ) FT_Get_Postscript_Name( FT_Face face ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Select_Charmap */ /* */ /* <Description> */ /* Selects a given charmap by its encoding tag (as listed in */ /* `freetype.h'). */ /* */ /* <InOut> */ /* face :: A handle to the source face object. */ /* */ /* <Input> */ /* encoding :: A handle to the selected charmap. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* This function will return an error if no charmap in the face */ /* corresponds to the encoding queried here. */ /* */ FT_EXPORT( FT_Error ) FT_Select_Charmap( FT_Face face, FT_Encoding encoding ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_Charmap */ /* */ /* <Description> */ /* Selects a given charmap for character code to glyph index */ /* decoding. */ /* */ /* <InOut> */ /* face :: A handle to the source face object. */ /* */ /* <Input> */ /* charmap :: A handle to the selected charmap. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* This function will return an error if the charmap is not part of */ /* the face (i.e., if it is not listed in the face->charmaps[] */ /* table). */ /* */ FT_EXPORT( FT_Error ) FT_Set_Charmap( FT_Face face, FT_CharMap charmap ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Char_Index */ /* */ /* <Description> */ /* Returns the glyph index of a given character code. This function */ /* uses a charmap object to do the translation. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ /* */ /* charcode :: The character code. */ /* */ /* <Return> */ /* The glyph index. 0 means `undefined character code'. */ /* */ /* <Note> */ /* FreeType computes its own glyph indices which are not necessarily */ /* the same as used in the font in case the font is based on glyph */ /* indices. Reason for this behaviour is to assure that index 0 is */ /* never used, representing the missing glyph. */ /* */ FT_EXPORT( FT_UInt ) FT_Get_Char_Index( FT_Face face, FT_ULong charcode ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_First_Char */ /* */ /* <Description> */ /* This function is used to return the first character code in the */ /* current charmap of a given face. It will also return the */ /* corresponding glyph index. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ /* */ /* <Output> */ /* agindex :: Glyph index of first character code. 0 if charmap is */ /* empty. */ /* */ /* <Return> */ /* The charmap's first character code. */ /* */ /* <Note> */ /* You should use this function with @FT_Get_Next_Char to be able to */ /* parse all character codes available in a given charmap. The code */ /* should look like this: */ /* */ /* { */ /* FT_ULong charcode; */ /* FT_UInt gindex; */ /* */ /* */ /* charcode = FT_Get_First_Char( face, &gindex ); */ /* while ( gindex != 0 ) */ /* { */ /* ... do something with (charcode,gindex) pair ... */ /* */ /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ /* } */ /* } */ /* */ /* Note that `*agindex' will be set to 0 if the charmap is empty. */ /* The result itself can be 0 in two cases: if the charmap is empty */ /* or when the value 0 is the first valid character code. */ /* */ FT_EXPORT( FT_ULong ) FT_Get_First_Char( FT_Face face, FT_UInt *agindex ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Next_Char */ /* */ /* <Description> */ /* This function is used to return the next character code in the */ /* current charmap of a given face following the value 'char_code', */ /* as well as the corresponding glyph index. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ /* char_code :: The starting character code. */ /* */ /* <Output> */ /* agindex :: Glyph index of first character code. 0 if charmap */ /* is empty. */ /* */ /* <Return> */ /* The charmap's next character code. */ /* */ /* <Note> */ /* You should use this function with @FT_Get_First_Char to walk */ /* through all character codes available in a given charmap. See */ /* the note for this function for a simple code example. */ /* */ /* Note that `*agindex' will be set to 0 when there are no more codes */ /* in the charmap. */ /* */ FT_EXPORT( FT_ULong ) FT_Get_Next_Char( FT_Face face, FT_ULong char_code, FT_UInt *agindex ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Name_Index */ /* */ /* <Description> */ /* Returns the glyph index of a given glyph name. This function uses */ /* driver specific objects to do the translation. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ /* */ /* glyph_name :: The glyph name. */ /* */ /* <Return> */ /* The glyph index. 0 means `undefined character code'. */ /* */ FT_EXPORT( FT_UInt ) FT_Get_Name_Index( FT_Face face, FT_String* glyph_name ); /*************************************************************************/ /* */ /* <Section> */ /* computations */ /* */ /* <Title> */ /* Computations */ /* */ /* <Abstract> */ /* Crunching fixed numbers and vectors */ /* */ /* <Description> */ /* This section contains various functions used to perform */ /* computations on 16.16 fixed-float numbers or 2d vectors. */ /* */ /* <Order> */ /* FT_MulDiv */ /* FT_MulFix */ /* FT_DivFix */ /* FT_RoundFix */ /* FT_CeilFix */ /* FT_FloorFix */ /* FT_Vector_Transform */ /* FT_Matrix_Multiply */ /* FT_Matrix_Invert */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_MulDiv */ /* */ /* <Description> */ /* A very simple function used to perform the computation `(a*b)/c' */ /* with maximal accuracy (it uses a 64-bit intermediate integer */ /* whenever necessary). */ /* */ /* This function isn't necessarily as fast as some processor specific */ /* operations, but is at least completely portable. */ /* */ /* <Input> */ /* a :: The first multiplier. */ /* b :: The second multiplier. */ /* c :: The divisor. */ /* */ /* <Return> */ /* The result of `(a*b)/c'. This function never traps when trying to */ /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ /* on the signs of `a' and `b'. */ /* */ FT_EXPORT( FT_Long ) FT_MulDiv( FT_Long a, FT_Long b, FT_Long c ); /*************************************************************************/ /* */ /* <Function> */ /* FT_MulFix */ /* */ /* <Description> */ /* A very simple function used to perform the computation */ /* `(a*b)/0x10000' with maximal accuracy. Most of the time this is */ /* used to multiply a given value by a 16.16 fixed float factor. */ /* */ /* <Input> */ /* a :: The first multiplier. */ /* b :: The second multiplier. Use a 16.16 factor here whenever */ /* possible (see note below). */ /* */ /* <Return> */ /* The result of `(a*b)/0x10000'. */ /* */ /* <Note> */ /* This function has been optimized for the case where the absolute */ /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ /* As this happens mainly when scaling from notional units to */ /* fractional pixels in FreeType, it resulted in noticeable speed */ /* improvements between versions 2.x and 1.x. */ /* */ /* As a conclusion, always try to place a 16.16 factor as the */ /* _second_ argument of this function; this can make a great */ /* difference. */ /* */ FT_EXPORT( FT_Long ) FT_MulFix( FT_Long a, FT_Long b ); /*************************************************************************/ /* */ /* <Function> */ /* FT_DivFix */ /* */ /* <Description> */ /* A very simple function used to perform the computation */ /* `(a*0x10000)/b' with maximal accuracy. Most of the time, this is */ /* used to divide a given value by a 16.16 fixed float factor. */ /* */ /* <Input> */ /* a :: The first multiplier. */ /* b :: The second multiplier. Use a 16.16 factor here whenever */ /* possible (see note below). */ /* */ /* <Return> */ /* The result of `(a*0x10000)/b'. */ /* */ /* <Note> */ /* The optimization for FT_DivFix() is simple: If (a << 16) fits in */ /* 32 bits, then the division is computed directly. Otherwise, we */ /* use a specialized version of the old @FT_MulDiv64. */ /* */ FT_EXPORT( FT_Long ) FT_DivFix( FT_Long a, FT_Long b ); /*************************************************************************/ /* */ /* <Function> */ /* FT_RoundFix */ /* */ /* <Description> */ /* A very simple function used to round a 16.16 fixed number. */ /* */ /* <Input> */ /* a :: The number to be rounded. */ /* */ /* <Return> */ /* The result of `(a + 0x8000) & -0x10000'. */ /* */ FT_EXPORT( FT_Fixed ) FT_RoundFix( FT_Fixed a ); /*************************************************************************/ /* */ /* <Function> */ /* FT_CeilFix */ /* */ /* <Description> */ /* A very simple function used to compute the ceiling function of a */ /* 16.16 fixed number. */ /* */ /* <Input> */ /* a :: The number for which the ceiling function is to be computed. */ /* */ /* <Return> */ /* The result of `(a + 0x10000 - 1) & -0x10000'. */ /* */ FT_EXPORT( FT_Fixed ) FT_CeilFix( FT_Fixed a ); /*************************************************************************/ /* */ /* <Function> */ /* FT_FloorFix */ /* */ /* <Description> */ /* A very simple function used to compute the floor function of a */ /* 16.16 fixed number. */ /* */ /* <Input> */ /* a :: The number for which the floor function is to be computed. */ /* */ /* <Return> */ /* The result of `a & -0x10000'. */ /* */ FT_EXPORT( FT_Fixed ) FT_FloorFix( FT_Fixed a ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Vector_Transform */ /* */ /* <Description> */ /* Transforms a single vector through a 2x2 matrix. */ /* */ /* <InOut> */ /* vector :: The target vector to transform. */ /* */ /* <Input> */ /* matrix :: A pointer to the source 2x2 matrix. */ /* */ /* <Note> */ /* The result is undefined if either `vector' or `matrix' is invalid. */ /* */ FT_EXPORT( void ) FT_Vector_Transform( FT_Vector* vec, FT_Matrix* matrix ); /* */ FT_END_HEADER #endif /* __FREETYPE_H__ */ /* END */ old_contrib//root/sys/src/cmd/limbo/include/freetype/ft2build.h������������������������������������� 664 � 0 � 0 � 4266 10104124357 23665�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ft2build.h */ /* */ /* FreeType 2 build and setup macros. */ /* (Generic version) */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file corresponds to the default "ft2build.h" file for */ /* FreeType 2. It uses the "freetype" include root. */ /* */ /* Note that specific platforms might use a different configuration. */ /* See builds/unix/ft2unix.h for an example. */ /* */ /*************************************************************************/ #ifndef __FT2_BUILD_GENERIC_H__ #define __FT2_BUILD_GENERIC_H__ #pragma incomplete _off_ /* it's too hard */ #include <freetype/config/ftheader.h> #endif /* __FT2_BUILD_GENERIC_H__ */ /* END */ */ /* */ /* As a conclusion, always try to place a 16.16 factor as the */ /* _second_ argument of this function; this can make a great */ /* difference. old_contrib//root/sys/src/cmd/limbo/include/freetype/ftbbox.h��������������������������������������� 664 � 0 � 0 � 10376 7607330527 23451�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftbbox.h */ /* */ /* FreeType exact bbox computation (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This component has a _single_ role: to compute exact outline bounding */ /* boxes. */ /* */ /* It is separated from the rest of the engine for various technical */ /* reasons. It may well be integrated in `ftoutln' later. */ /* */ /*************************************************************************/ #ifndef __FTBBOX_H__ #define __FTBBOX_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* outline_processing */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Get_BBox */ /* */ /* <Description> */ /* Computes the exact bounding box of an outline. This is slower */ /* than computing the control box. However, it uses an advanced */ /* algorithm which returns _very_ quickly when the two boxes */ /* coincide. Otherwise, the outline Bezier arcs are walked over to */ /* extract their extrema. */ /* */ /* <Input> */ /* outline :: A pointer to the source outline. */ /* */ /* <Output> */ /* abbox :: The outline's exact bounding box. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Outline_Get_BBox( FT_Outline* outline, FT_BBox *abbox ); /* */ FT_END_HEADER #endif /* __FTBBOX_H__ */ /* END */ */ /* A very simple function used to compute the floor function of a */ /* 16.16 fixed number. */ /* */ /* <Input> old_contrib//root/sys/src/cmd/limbo/include/freetype/ftbdf.h���������������������������������������� 664 � 0 � 0 � 6553 7607330527 23234�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftbdf.h */ /* */ /* FreeType API for accessing BDF-specific strings (specification). */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTBDF_H__ #define __FTBDF_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* bdf_fonts */ /* */ /* <Title> */ /* BDF Fonts */ /* */ /* <Abstract> */ /* BDF-specific APIs */ /* */ /* <Description> */ /* This section contains the declaration of BDF-specific functions. */ /* */ /*************************************************************************/ /********************************************************************** * * @function: * FT_Get_BDF_Charset_ID * * @description: * Retrieves a BDF font character set identity, according to * the BDF specification. * * @input: * face :: * handle to input face * * @output: * acharset_encoding :: * Charset encoding, as a C string, owned by the face. * * acharset_registry :: * Charset registry, as a C string, owned by the face. * * @return: * FreeType rror code. 0 means success. * * @note: * This function only works with BDF faces, returning an error otherwise. */ FT_EXPORT( FT_Error ) FT_Get_BDF_Charset_ID( FT_Face face, const char* *acharset_encoding, const char* *acharset_registry ); /* */ FT_END_HEADER #endif /* __FTBDF_H__ */ /* END */ *****************/ /* */ /* This file corresponds to the default "ft2build.old_contrib//root/sys/src/cmd/limbo/include/freetype/ftcache.h�������������������������������������� 664 � 0 � 0 � 63421 7607330527 23561�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftcache.h */ /* */ /* FreeType Cache subsystem (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /********* *********/ /********* WARNING, THIS IS BETA CODE. *********/ /********* *********/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #ifndef __FTCACHE_H__ #define __FTCACHE_H__ #include <ft2build.h> #include FT_GLYPH_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* cache_subsystem */ /* */ /* <Title> */ /* Cache Sub-System */ /* */ /* <Abstract> */ /* How to cache face, size, and glyph data with FreeType 2. */ /* */ /* <Description> */ /* This section describes the FreeType 2 cache sub-system which is */ /* stile in beta. */ /* */ /* <Order> */ /* FTC_Manager */ /* FTC_FaceID */ /* FTC_Face_Requester */ /* */ /* FTC_Manager_New */ /* FTC_Manager_Lookup_Face */ /* FTC_Manager_Lookup_Size */ /* */ /* FTC_Node */ /* FTC_Node_Ref */ /* FTC_Node_Unref */ /* */ /* FTC_Font */ /* FTC_ImageDesc */ /* FTC_ImageCache */ /* FTC_ImageCache_New */ /* FTC_ImageCache_Lookup */ /* */ /* FTC_SBit */ /* FTC_SBitCache */ /* FTC_SBitCache_New */ /* FTC_SBitCache_Lookup */ /* */ /* */ /* FTC_Image_Desc */ /* FTC_Image_Cache */ /* FTC_Image_Cache_Lookup */ /* */ /* FTC_SBit_Cache */ /* FTC_SBit_Cache_Lookup */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** BASIC TYPE DEFINITIONS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FTC_FaceID */ /* */ /* <Description> */ /* A generic pointer type that is used to identity face objects. The */ /* contents of such objects is application-dependent. */ /* */ typedef FT_Pointer FTC_FaceID; /*************************************************************************/ /* */ /* <FuncType> */ /* FTC_Face_Requester */ /* */ /* <Description> */ /* A callback function provided by client applications. It is used */ /* to translate a given @FTC_FaceID into a new valid @FT_Face object. */ /* */ /* <Input> */ /* face_id :: The face ID to resolve. */ /* */ /* library :: A handle to a FreeType library object. */ /* */ /* data :: Application-provided request data. */ /* */ /* <Output> */ /* aface :: A new @FT_Face handle. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The face requester should not perform funny things on the returned */ /* face object, like creating a new @FT_Size for it, or setting a */ /* transformation through @FT_Set_Transform! */ /* */ typedef FT_Error (*FTC_Face_Requester)( FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face* aface ); /*************************************************************************/ /* */ /* <Struct> */ /* FTC_FontRec */ /* */ /* <Description> */ /* A simple structure used to describe a given `font' to the cache */ /* manager. Note that a `font' is the combination of a given face */ /* with a given character size. */ /* */ /* <Fields> */ /* face_id :: The ID of the face to use. */ /* */ /* pix_width :: The character width in integer pixels. */ /* */ /* pix_height :: The character height in integer pixels. */ /* */ typedef struct FTC_FontRec_ { FTC_FaceID face_id; FT_UShort pix_width; FT_UShort pix_height; } FTC_FontRec; /* */ #define FTC_FONT_COMPARE( f1, f2 ) \ ( (f1)->face_id == (f2)->face_id && \ (f1)->pix_width == (f2)->pix_width && \ (f1)->pix_height == (f2)->pix_height ) #define FT_POINTER_TO_ULONG( p ) ((FT_ULong)(FT_Pointer)(p)) #define FTC_FACE_ID_HASH( i ) \ ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) #define FTC_FONT_HASH( f ) \ (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ ((f)->pix_width << 8) ^ \ ((f)->pix_height) ) /*************************************************************************/ /* */ /* <Type> */ /* FTC_Font */ /* */ /* <Description> */ /* A simple handle to an @FTC_FontRec structure. */ /* */ typedef FTC_FontRec* FTC_Font; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** CACHE MANAGER OBJECT *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FTC_Manager */ /* */ /* <Description> */ /* This object is used to cache one or more @FT_Face objects, along */ /* with corresponding @FT_Size objects. */ /* */ typedef struct FTC_ManagerRec_* FTC_Manager; /*************************************************************************/ /* */ /* <Type> */ /* FTC_Node */ /* */ /* <Description> */ /* An opaque handle to a cache node object. Each cache node is */ /* reference-counted. A node with a count of 0 might be flushed */ /* out of a full cache whenever a lookup request is performed. */ /* */ /* If you lookup nodes, you have the ability to "acquire" them, i.e., */ /* to increment their reference count. This will prevent the node */ /* from being flushed out of the cache until you explicitly "release" */ /* it (see @FTC_Node_Release). */ /* */ /* See also @FTC_BitsetCache_Lookup and @FTC_ImageCache_Lookup. */ /* */ typedef struct FTC_NodeRec_* FTC_Node; /*************************************************************************/ /* */ /* <Function> */ /* FTC_Manager_New */ /* */ /* <Description> */ /* Creates a new cache manager. */ /* */ /* <Input> */ /* library :: The parent FreeType library handle to use. */ /* */ /* max_faces :: Maximum number of faces to keep alive in manager. */ /* Use 0 for defaults. */ /* */ /* max_sizes :: Maximum number of sizes to keep alive in manager. */ /* Use 0 for defaults. */ /* */ /* max_bytes :: Maximum number of bytes to use for cached data. */ /* Use 0 for defaults. */ /* */ /* requester :: An application-provided callback used to translate */ /* face IDs into real @FT_Face objects. */ /* */ /* req_data :: A generic pointer that is passed to the requester */ /* each time it is called (see @FTC_Face_Requester). */ /* */ /* <Output> */ /* amanager :: A handle to a new manager object. 0 in case of */ /* failure. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FTC_Manager_New( FT_Library library, FT_UInt max_faces, FT_UInt max_sizes, FT_ULong max_bytes, FTC_Face_Requester requester, FT_Pointer req_data, FTC_Manager *amanager ); /*************************************************************************/ /* */ /* <Function> */ /* FTC_Manager_Reset */ /* */ /* <Description> */ /* Empties a given cache manager. This simply gets rid of all the */ /* currently cached @FT_Face and @FT_Size objects within the manager. */ /* */ /* <InOut> */ /* manager :: A handle to the manager. */ /* */ FT_EXPORT( void ) FTC_Manager_Reset( FTC_Manager manager ); /*************************************************************************/ /* */ /* <Function> */ /* FTC_Manager_Done */ /* */ /* <Description> */ /* Destroys a given manager after emptying it. */ /* */ /* <Input> */ /* manager :: A handle to the target cache manager object. */ /* */ FT_EXPORT( void ) FTC_Manager_Done( FTC_Manager manager ); /*************************************************************************/ /* */ /* <Function> */ /* FTC_Manager_Lookup_Face */ /* */ /* <Description> */ /* Retrieves the @FT_Face object that corresponds to a given face ID */ /* through a cache manager. */ /* */ /* <Input> */ /* manager :: A handle to the cache manager. */ /* */ /* face_id :: The ID of the face object. */ /* */ /* <Output> */ /* aface :: A handle to the face object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The returned @FT_Face object is always owned by the manager. You */ /* should never try to discard it yourself. */ /* */ /* The @FT_Face object doesn't necessarily have a current size object */ /* (i.e., face->size can be 0). If you need a specific `font size', */ /* use @FTC_Manager_Lookup_Size instead. */ /* */ /* Never change the face's transformation matrix (i.e., never call */ /* the @FT_Set_Transform function) on a returned face! If you need */ /* to transform glyphs, do it yourself after glyph loading. */ /* */ FT_EXPORT( FT_Error ) FTC_Manager_Lookup_Face( FTC_Manager manager, FTC_FaceID face_id, FT_Face *aface ); /*************************************************************************/ /* */ /* <Function> */ /* FTC_Manager_Lookup_Size */ /* */ /* <Description> */ /* Retrieves the @FT_Face and @FT_Size objects that correspond to a */ /* given @FTC_SizeID. */ /* */ /* <Input> */ /* manager :: A handle to the cache manager. */ /* */ /* size_id :: The ID of the `font size' to use. */ /* */ /* <Output> */ /* aface :: A pointer to the handle of the face object. Set it to */ /* zero if you don't need it. */ /* */ /* asize :: A pointer to the handle of the size object. Set it to */ /* zero if you don't need it. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The returned @FT_Face object is always owned by the manager. You */ /* should never try to discard it yourself. */ /* */ /* Never change the face's transformation matrix (i.e., never call */ /* the @FT_Set_Transform function) on a returned face! If you need */ /* to transform glyphs, do it yourself after glyph loading. */ /* */ /* Similarly, the returned @FT_Size object is always owned by the */ /* manager. You should never try to discard it, and never change its */ /* settings with @FT_Set_Pixel_Sizes or @FT_Set_Char_Size! */ /* */ /* The returned size object is the face's current size, which means */ /* that you can call @FT_Load_Glyph with the face if you need to. */ /* */ FT_EXPORT( FT_Error ) FTC_Manager_Lookup_Size( FTC_Manager manager, FTC_Font font, FT_Face *aface, FT_Size *asize ); FT_END_HEADER #endif /* __FTCACHE_H__ */ /* END */ */ /* <Input> */ /* library :: The parent FreeType library handle to use. */ /* *old_contrib//root/sys/src/cmd/limbo/include/freetype/ftchapters.h����������������������������������� 664 � 0 � 0 � 11470 7607330527 24324�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* <Chapter> */ /* core_api */ /* */ /* <Title> */ /* Core API */ /* */ /* <Sections> */ /* basic_types */ /* base_interface */ /* glyph_management */ /* mac_specific */ /* sizes_management */ /* header_file_macros */ /* */ /***************************************************************************/ /***************************************************************************/ /* */ /* <Chapter> */ /* format_specific */ /* */ /* <Title> */ /* Format-Specific API */ /* */ /* <Sections> */ /* multiple_masters */ /* truetype_tables */ /* type1_tables */ /* sfnt_names */ /* bdf_fonts */ /* pfr_fonts */ /* */ /***************************************************************************/ /***************************************************************************/ /* */ /* <Chapter> */ /* cache_subsystem */ /* */ /* <Title> */ /* Cache Sub-System */ /* */ /* <Sections> */ /* cache_subsystem */ /* */ /***************************************************************************/ /***************************************************************************/ /* */ /* <Chapter> */ /* support_api */ /* */ /* <Title> */ /* Support API */ /* */ /* <Sections> */ /* computations */ /* list_processing */ /* outline_processing */ /* raster */ /* system_interface */ /* module_management */ /* */ /***************************************************************************/ reeType error code. 0 means success. */ /* */ /* <Note> old_contrib//root/sys/src/cmd/limbo/include/freetype/fterrdef.h������������������������������������� 664 � 0 � 0 � 25773 7607330527 23775�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* fterrdef.h */ /* */ /* FreeType error codes (specification). */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*******************************************************************/ /*******************************************************************/ /***** *****/ /***** LIST OF ERROR CODES/MESSAGES *****/ /***** *****/ /*******************************************************************/ /*******************************************************************/ /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ /* including this file. */ /* generic errors */ FT_NOERRORDEF_( Ok, 0x00, \ "no error" ) FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ "cannot open resource" ) FT_ERRORDEF_( Unknown_File_Format, 0x02, \ "unknown file format" ) FT_ERRORDEF_( Invalid_File_Format, 0x03, \ "broken file" ) FT_ERRORDEF_( Invalid_Version, 0x04, \ "invalid FreeType version" ) FT_ERRORDEF_( Lower_Module_Version, 0x05, \ "module version is too low" ) FT_ERRORDEF_( Invalid_Argument, 0x06, \ "invalid argument" ) FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ "unimplemented feature" ) FT_ERRORDEF_( Invalid_Table, 0x08, \ "broken table" ) FT_ERRORDEF_( Invalid_Offset, 0x09, \ "broken offset within table" ) /* glyph/character errors */ FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ "invalid glyph index" ) FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ "invalid character code" ) FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ "unsupported glyph image format" ) FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ "cannot render this glyph format" ) FT_ERRORDEF_( Invalid_Outline, 0x14, \ "invalid outline" ) FT_ERRORDEF_( Invalid_Composite, 0x15, \ "invalid composite glyph" ) FT_ERRORDEF_( Too_Many_Hints, 0x16, \ "too many hints" ) FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ "invalid pixel size" ) /* handle errors */ FT_ERRORDEF_( Invalid_Handle, 0x20, \ "invalid object handle" ) FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ "invalid library handle" ) FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ "invalid module handle" ) FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ "invalid face handle" ) FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ "invalid size handle" ) FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ "invalid glyph slot handle" ) FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ "invalid charmap handle" ) FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ "invalid cache manager handle" ) FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ "invalid stream handle" ) /* driver errors */ FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ "too many modules" ) FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ "too many extensions" ) /* memory errors */ FT_ERRORDEF_( Out_Of_Memory, 0x40, \ "out of memory" ) FT_ERRORDEF_( Unlisted_Object, 0x41, \ "unlisted object" ) /* stream errors */ FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ "cannot open stream" ) FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ "invalid stream seek" ) FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ "invalid stream skip" ) FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ "invalid stream read" ) FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ "invalid stream operation" ) FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ "invalid frame operation" ) FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ "nested frame access" ) FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ "invalid frame read" ) /* raster errors */ FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ "raster uninitialized" ) FT_ERRORDEF_( Raster_Corrupted, 0x61, \ "raster corrupted" ) FT_ERRORDEF_( Raster_Overflow, 0x62, \ "raster overflow" ) FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ "negative height while rastering" ) /* cache errors */ FT_ERRORDEF_( Too_Many_Caches, 0x70, \ "too many registered caches" ) /* TrueType and SFNT errors */ FT_ERRORDEF_( Invalid_Opcode, 0x80, \ "invalid opcode" ) FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ "too few arguments" ) FT_ERRORDEF_( Stack_Overflow, 0x82, \ "stack overflow" ) FT_ERRORDEF_( Code_Overflow, 0x83, \ "code overflow" ) FT_ERRORDEF_( Bad_Argument, 0x84, \ "bad argument" ) FT_ERRORDEF_( Divide_By_Zero, 0x85, \ "division by zero" ) FT_ERRORDEF_( Invalid_Reference, 0x86, \ "invalid reference" ) FT_ERRORDEF_( Debug_OpCode, 0x87, \ "found debug opcode" ) FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ "found ENDF opcode in execution stream" ) FT_ERRORDEF_( Nested_DEFS, 0x89, \ "nested DEFS" ) FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ "invalid code range" ) FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ "execution context too long" ) FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ "too many function definitions" ) FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ "too many instruction definitions" ) FT_ERRORDEF_( Table_Missing, 0x8E, \ "SFNT font table missing" ) FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ "horizontal header (hhea) table missing" ) FT_ERRORDEF_( Locations_Missing, 0x90, \ "locations (loca) table missing" ) FT_ERRORDEF_( Name_Table_Missing, 0x91, \ "name table missing" ) FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ "character map (cmap) table missing" ) FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ "horizontal metrics (hmtx) table missing" ) FT_ERRORDEF_( Post_Table_Missing, 0x94, \ "PostScript (post) table missing" ) FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ "invalid horizontal metrics" ) FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ "invalid character map (cmap) format" ) FT_ERRORDEF_( Invalid_PPem, 0x97, \ "invalid ppem value" ) FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ "invalid vertical metrics" ) FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ "could not find context" ) FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ "invalid PostScript (post) table format" ) FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ "invalid PostScript (post) table" ) /* CFF, CID, and Type 1 errors */ FT_ERRORDEF_( Syntax_Error, 0xA0, \ "opcode syntax error" ) FT_ERRORDEF_( Stack_Underflow, 0xA1, \ "argument stack underflow" ) /* BDF errors */ FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ "`STARTFONT' field missing" ) FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ "`FONT' field missing" ) FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ "`SIZE' field missing" ) FT_ERRORDEF_( Missing_Chars_Field, 0xB3, \ "`CHARS' field missing" ) FT_ERRORDEF_( Missing_Startchar_Field, 0xB4, \ "`STARTCHAR' field missing" ) FT_ERRORDEF_( Missing_Encoding_Field, 0xB5, \ "`ENCODING' field missing" ) FT_ERRORDEF_( Missing_Bbx_Field, 0xB6, \ "`BBX' field missing" ) /* END */ ndersold_contrib//root/sys/src/cmd/limbo/include/freetype/fterrors.h������������������������������������� 664 � 0 � 0 � 23031 7607330527 24023�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* fterrors.h */ /* */ /* FreeType error code handling (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This special header file is used to define the handling of FT2 */ /* enumeration constants. It can also be used to generate error message */ /* strings with a small macro trick explained below. */ /* */ /* I - Error Formats */ /* ----------------- */ /* */ /* Since release 2.1, the error constants have changed. The lower */ /* byte of the error value gives the "generic" error code, while the */ /* higher byte indicates in which module the error occurred. */ /* */ /* You can use the macro FT_ERROR_BASE(x) macro to extract the generic */ /* error code from an FT_Error value. */ /* */ /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ /* undefined in ftoption.h in order to make the higher byte always */ /* zero, in case you need to be compatible with previous versions of */ /* FreeType 2. */ /* */ /* */ /* II - Error Message strings */ /* -------------------------- */ /* */ /* The error definitions below are made through special macros that */ /* allow client applications to build a table of error message strings */ /* if they need it. The strings are not included in a normal build of */ /* FreeType 2 to save space (most client applications do not use */ /* them). */ /* */ /* To do so, you have to define the following macros before including */ /* this file: */ /* */ /* FT_ERROR_START_LIST :: */ /* This macro is called before anything else to define the start of */ /* the error list. It is followed by several FT_ERROR_DEF calls */ /* (see below). */ /* */ /* FT_ERROR_DEF( e, v, s ) :: */ /* This macro is called to define one single error. */ /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ /* `v' is the error numerical value. */ /* `s' is the corresponding error string. */ /* */ /* FT_ERROR_END_LIST :: */ /* This macro ends the list. */ /* */ /* Additionally, you have to undefine __FTERRORS_H__ before #including */ /* this file. */ /* */ /* Here is a simple example: */ /* */ /* { */ /* #undef __FTERRORS_H__ */ /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ /* #define FT_ERROR_START_LIST { */ /* #define FT_ERROR_END_LIST { 0, 0 } }; */ /* */ /* const struct */ /* { */ /* int err_code; */ /* const char* err_msg */ /* } ft_errors[] = */ /* */ /* #include FT_ERRORS_H */ /* } */ /* */ /*************************************************************************/ #ifndef __FTERRORS_H__ #define __FTERRORS_H__ /* include module base error codes */ #include FT_MODULE_ERRORS_H /*******************************************************************/ /*******************************************************************/ /***** *****/ /***** SETUP MACROS *****/ /***** *****/ /*******************************************************************/ /*******************************************************************/ #undef FT_NEED_EXTERN_C #undef FT_ERR_XCAT #undef FT_ERR_CAT #define FT_ERR_XCAT( x, y ) x ## y #define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ /* By default, we use `FT_Err_'. */ /* */ #ifndef FT_ERR_PREFIX #define FT_ERR_PREFIX FT_Err_ #endif /* FT_ERR_BASE is used as the base for module-specific errors. */ /* */ #ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS #ifndef FT_ERR_BASE #define FT_ERR_BASE FT_Mod_Err_Base #endif #else #undef FT_ERR_BASE #define FT_ERR_BASE 0 #endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ /* If FT_ERRORDEF is not defined, we need to define a simple */ /* enumeration type. */ /* */ #ifndef FT_ERRORDEF #define FT_ERRORDEF( e, v, s ) e = v, #define FT_ERROR_START_LIST enum { #define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; #ifdef __cplusplus #define FT_NEED_EXTERN_C extern "C" { #endif #endif /* !FT_ERRORDEF */ /* this macro is used to define an error */ #define FT_ERRORDEF_( e, v, s ) \ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) /* this is only used for FT_Err_Ok, which must be 0! */ #define FT_NOERRORDEF_( e, v, s ) \ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) #ifdef FT_ERROR_START_LIST FT_ERROR_START_LIST #endif /* no include the error codes */ #include FT_ERROR_DEFINITIONS_H #ifdef FT_ERROR_END_LIST FT_ERROR_END_LIST #endif /*******************************************************************/ /*******************************************************************/ /***** *****/ /***** SIMPLE CLEANUP *****/ /***** *****/ /*******************************************************************/ /*******************************************************************/ #ifdef FT_NEED_EXTERN_C } #endif #undef FT_ERROR_START_LIST #undef FT_ERROR_END_LIST #undef FT_ERRORDEF #undef FT_ERRORDEF_ #undef FT_NOERRORDEF_ #undef FT_NEED_EXTERN_C #undef FT_ERR_PREFIX #undef FT_ERR_BASE #undef FT_ERR_CONCAT #endif /* __FTERRORS_H__ */ /* END */ /cmd/limbo/include/freetype/fterrors.h������������������������������������� 664 � 0 � 0 � 23031 7607330527 24023�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/freetype/ftglyph.h�������������������������������������� 664 � 0 � 0 � 100263 7607330527 23655�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftglyph.h */ /* */ /* FreeType convenience functions to handle glyphs (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file contains the definition of several convenience functions */ /* that can be used by client applications to easily retrieve glyph */ /* bitmaps and outlines from a given face. */ /* */ /* These functions should be optional if you are writing a font server */ /* or text layout engine on top of FreeType. However, they are pretty */ /* handy for many other simple uses of the library. */ /* */ /*************************************************************************/ #ifndef __FTGLYPH_H__ #define __FTGLYPH_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* glyph_management */ /* */ /* <Title> */ /* Glyph Management */ /* */ /* <Abstract> */ /* Generic interface to manage individual glyph data. */ /* */ /* <Description> */ /* This section contains definitions used to manage glyph data */ /* through generic FT_Glyph objects. Each of them can contain a */ /* bitmap, a vector outline, or even images in other formats. */ /* */ /*************************************************************************/ /* forward declaration to a private type */ typedef struct FT_Glyph_Class_ FT_Glyph_Class; /*************************************************************************/ /* */ /* <Type> */ /* FT_Glyph */ /* */ /* <Description> */ /* Handle to an object used to model generic glyph images. It is a */ /* pointer to the @FT_GlyphRec structure and can contain a glyph */ /* bitmap or pointer. */ /* */ /* <Note> */ /* Glyph objects are not owned by the library. You must thus release */ /* them manually (through @FT_Done_Glyph) _before_ calling */ /* @FT_Done_FreeType. */ /* */ typedef struct FT_GlyphRec_* FT_Glyph; /*************************************************************************/ /* */ /* <Struct> */ /* FT_GlyphRec */ /* */ /* <Description> */ /* The root glyph structure contains a given glyph image plus its */ /* advance width in 16.16 fixed float format. */ /* */ /* <Fields> */ /* library :: A handle to the FreeType library object. */ /* */ /* clazz :: A pointer to the glyph's class. Private. */ /* */ /* format :: The format of the glyph's image. */ /* */ /* advance :: A 16.16 vector that gives the glyph's advance width. */ /* */ typedef struct FT_GlyphRec_ { FT_Library library; const FT_Glyph_Class* clazz; FT_Glyph_Format format; FT_Vector advance; } FT_GlyphRec; /*************************************************************************/ /* */ /* <Type> */ /* FT_BitmapGlyph */ /* */ /* <Description> */ /* A handle to an object used to model a bitmap glyph image. This is */ /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ /* */ typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; /*************************************************************************/ /* */ /* <Struct> */ /* FT_BitmapGlyphRec */ /* */ /* <Description> */ /* A structure used for bitmap glyph images. This really is a */ /* `sub-class' of `FT_GlyphRec'. */ /* */ /* <Fields> */ /* root :: The root FT_Glyph fields. */ /* */ /* left :: The left-side bearing, i.e., the horizontal distance */ /* from the current pen position to the left border of the */ /* glyph bitmap. */ /* */ /* top :: The top-side bearing, i.e., the vertical distance from */ /* the current pen position to the top border of the glyph */ /* bitmap. This distance is positive for upwards-y! */ /* */ /* bitmap :: A descriptor for the bitmap. */ /* */ /* <Note> */ /* You can typecast FT_Glyph to FT_BitmapGlyph if you have */ /* glyph->format == FT_GLYPH_FORMAT_BITMAP. This lets you access */ /* the bitmap's contents easily. */ /* */ /* The corresponding pixel buffer is always owned by the BitmapGlyph */ /* and is thus created and destroyed with it. */ /* */ typedef struct FT_BitmapGlyphRec_ { FT_GlyphRec root; FT_Int left; FT_Int top; FT_Bitmap bitmap; } FT_BitmapGlyphRec; /*************************************************************************/ /* */ /* <Type> */ /* FT_OutlineGlyph */ /* */ /* <Description> */ /* A handle to an object used to model an outline glyph image. This */ /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ /* */ typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; /*************************************************************************/ /* */ /* <Struct> */ /* FT_OutlineGlyphRec */ /* */ /* <Description> */ /* A structure used for outline (vectorial) glyph images. This */ /* really is a `sub-class' of `FT_GlyphRec'. */ /* */ /* <Fields> */ /* root :: The root FT_Glyph fields. */ /* */ /* outline :: A descriptor for the outline. */ /* */ /* <Note> */ /* You can typecast FT_Glyph to FT_OutlineGlyph if you have */ /* glyph->format == FT_GLYPH_FORMAT_OUTLINE. This lets you access */ /* the outline's content easily. */ /* */ /* As the outline is extracted from a glyph slot, its coordinates are */ /* expressed normally in 26.6 pixels, unless the flag */ /* FT_LOAD_NO_SCALE was used in FT_Load_Glyph() or FT_Load_Char(). */ /* */ /* The outline's tables are always owned by the object and are */ /* destroyed with it. */ /* */ typedef struct FT_OutlineGlyphRec_ { FT_GlyphRec root; FT_Outline outline; } FT_OutlineGlyphRec; /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Glyph */ /* */ /* <Description> */ /* A function used to extract a glyph image from a slot. */ /* */ /* <Input> */ /* slot :: A handle to the source glyph slot. */ /* */ /* <Output> */ /* aglyph :: A handle to the glyph object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Get_Glyph( FT_GlyphSlot slot, FT_Glyph *aglyph ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Glyph_Copy */ /* */ /* <Description> */ /* A function used to copy a glyph image. */ /* */ /* <Input> */ /* source :: A handle to the source glyph object. */ /* */ /* <Output> */ /* target :: A handle to the target glyph object. 0 in case of */ /* error. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Glyph_Copy( FT_Glyph source, FT_Glyph *target ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Glyph_Transform */ /* */ /* <Description> */ /* Transforms a glyph image if its format is scalable. */ /* */ /* <InOut> */ /* glyph :: A handle to the target glyph object. */ /* */ /* <Input> */ /* matrix :: A pointer to a 2x2 matrix to apply. */ /* */ /* delta :: A pointer to a 2d vector to apply. Coordinates are */ /* expressed in 1/64th of a pixel. */ /* */ /* <Return> */ /* FreeType error code (the glyph format is not scalable if it is */ /* not zero). */ /* */ /* <Note> */ /* The 2x2 transformation matrix is also applied to the glyph's */ /* advance vector. */ /* */ FT_EXPORT( FT_Error ) FT_Glyph_Transform( FT_Glyph glyph, FT_Matrix* matrix, FT_Vector* delta ); /* */ /*************************************************************************/ /* */ /* <Function> */ /* FT_Glyph_Get_CBox */ /* */ /* <Description> */ /* Returns a glyph's `control box'. The control box encloses all the */ /* outline's points, including Bezier control points. Though it */ /* coincides with the exact bounding box for most glyphs, it can be */ /* slightly larger in some situations (like when rotating an outline */ /* which contains Bezier outside arcs). */ /* */ /* Computing the control box is very fast, while getting the bounding */ /* box can take much more time as it needs to walk over all segments */ /* and arcs in the outline. To get the latter, you can use the */ /* `ftbbox' component which is dedicated to this single task. */ /* */ /* <Input> */ /* glyph :: A handle to the source glyph object. */ /* */ /* mode :: The mode which indicates how to interpret the returned */ /* bounding box values. */ /* */ /* <Output> */ /* acbox :: The glyph coordinate bounding box. Coordinates are */ /* expressed in 1/64th of pixels if it is grid-fitted. */ /* */ /* <Note> */ /* Coordinates are relative to the glyph origin, using the Y-upwards */ /* convention. */ /* */ /* If the glyph has been loaded with FT_LOAD_NO_SCALE, `bbox_mode' */ /* must be set to `ft_glyph_bbox_unscaled' to get unscaled font */ /* units. */ /* */ /* If `bbox_mode' is set to `ft_glyph_bbox_subpixels' the bbox */ /* coordinates are returned in 26.6 pixels (i.e. 1/64th of pixels). */ /* */ /* Note that the maximum coordinates are exclusive, which means that */ /* one can compute the width and height of the glyph image (be it in */ /* integer or 26.6 pixels) as: */ /* */ /* width = bbox.xMax - bbox.xMin; */ /* height = bbox.yMax - bbox.yMin; */ /* */ /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ /* `ft_glyph_bbox_gridfit', the coordinates will also be grid-fitted, */ /* which corresponds to: */ /* */ /* bbox.xMin = FLOOR(bbox.xMin); */ /* bbox.yMin = FLOOR(bbox.yMin); */ /* bbox.xMax = CEILING(bbox.xMax); */ /* bbox.yMax = CEILING(bbox.yMax); */ /* */ /* To get the bbox in pixel coordinates, set `bbox_mode' to */ /* `ft_glyph_bbox_truncate'. */ /* */ /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ /* to `ft_glyph_bbox_pixels'. */ /* */ /* The default value for `bbox_mode' is `ft_glyph_bbox_pixels'. */ /* */ enum { ft_glyph_bbox_unscaled = 0, /* return unscaled font units */ ft_glyph_bbox_subpixels = 0, /* return unfitted 26.6 coordinates */ ft_glyph_bbox_gridfit = 1, /* return grid-fitted 26.6 coordinates */ ft_glyph_bbox_truncate = 2, /* return coordinates in integer pixels */ ft_glyph_bbox_pixels = 3 /* return grid-fitted pixel coordinates */ }; FT_EXPORT( void ) FT_Glyph_Get_CBox( FT_Glyph glyph, FT_UInt bbox_mode, FT_BBox *acbox ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Glyph_To_Bitmap */ /* */ /* <Description> */ /* Converts a given glyph object to a bitmap glyph object. */ /* */ /* <InOut> */ /* the_glyph :: A pointer to a handle to the target glyph. */ /* */ /* <Input> */ /* render_mode :: An enumeration that describe how the data is */ /* rendered. */ /* */ /* origin :: A pointer to a vector used to translate the glyph */ /* image before rendering. Can be 0 (if no */ /* translation). The origin is expressed in */ /* 26.6 pixels. */ /* */ /* destroy :: A boolean that indicates that the original glyph */ /* image should be destroyed by this function. It is */ /* never destroyed in case of error. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The glyph image is translated with the `origin' vector before */ /* rendering. In case of error, it it translated back to its */ /* original position and the glyph is left untouched. */ /* */ /* The first parameter is a pointer to a FT_Glyph handle, that will */ /* be replaced by this function. Typically, you would use (omitting */ /* error handling): */ /* */ /* */ /* { */ /* FT_Glyph glyph; */ /* FT_BitmapGlyph glyph_bitmap; */ /* */ /* */ /* // load glyph */ /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ /* */ /* // extract glyph image */ /* error = FT_Get_Glyph( face->glyph, &glyph ); */ /* */ /* // convert to a bitmap (default render mode + destroy old) */ /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ /* { */ /* error = FT_Glyph_To_Bitmap( &glyph, ft_render_mode_default, */ /* 0, 1 ); */ /* if ( error ) // glyph unchanged */ /* ... */ /* } */ /* */ /* // access bitmap content by typecasting */ /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ /* */ /* // do funny stuff with it, like blitting/drawing */ /* ... */ /* */ /* // discard glyph image (bitmap or not) */ /* FT_Done_Glyph( glyph ); */ /* } */ /* */ /* */ /* This function will always fail if the glyph's format isn't */ /* scalable. */ /* */ FT_EXPORT( FT_Error ) FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, FT_Render_Mode render_mode, FT_Vector* origin, FT_Bool destroy ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Done_Glyph */ /* */ /* <Description> */ /* Destroys a given glyph. */ /* */ /* <Input> */ /* glyph :: A handle to the target glyph object. */ /* */ FT_EXPORT( void ) FT_Done_Glyph( FT_Glyph glyph ); /* other helpful functions */ /*************************************************************************/ /* */ /* <Section> */ /* computations */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_Matrix_Multiply */ /* */ /* <Description> */ /* Performs the matrix operation `b = a*b'. */ /* */ /* <Input> */ /* a :: A pointer to matrix `a'. */ /* */ /* <InOut> */ /* b :: A pointer to matrix `b'. */ /* */ /* <Note> */ /* The result is undefined if either `a' or `b' is zero. */ /* */ FT_EXPORT( void ) FT_Matrix_Multiply( FT_Matrix* a, FT_Matrix* b ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Matrix_Invert */ /* */ /* <Description> */ /* Inverts a 2x2 matrix. Returns an error if it can't be inverted. */ /* */ /* <InOut> */ /* matrix :: A pointer to the target matrix. Remains untouched in */ /* case of error. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Matrix_Invert( FT_Matrix* matrix ); /* */ FT_END_HEADER #endif /* __FTGLYPH_H__ */ /* END */ n grid-fitted 26.6 coordinates */ ft_glyph_bbox_truncate = 2, /* return coordinates in integer pixels */ ft_glyph_bbox_pixels = 3 /* return grid-fitted pixel coordinates */ }; FT_EXPORT( void ) FT_Glyph_Get_CBox( FT_Glyph glyph, FT_UInt bbox_mode, FT_BBox *acbox );old_contrib//root/sys/src/cmd/limbo/include/freetype/ftgzip.h��������������������������������������� 664 � 0 � 0 � 7620 7607330527 23446�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftgzip.h */ /* */ /* Gzip-compressed stream support. */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTXF86_H__ #define __FTXF86_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* gzip */ /* */ /* <Title> */ /* GZIP Streams */ /* */ /* <Abstract> */ /* Using gzip-compressed font files */ /* */ /* <Description> */ /* This section contains the declaration of Gzip-specific functions. */ /* */ /*************************************************************************/ /************************************************************************ * * @type: FT_Stream_OpenGzip * * @description: * open a new stream to parse gzip-compressed font files. This is * mainly used to support the compressed *.pcf.gz fonts that come * with XFree86 * * @input: * stream :: target embedding stream * source :: source stream, used to * * @return: * error code. 0 means success * * @note: * the source stream must be opened _before_ calling this function. * * calling @FT_Stream_Close on the new stream will *not* call * @FT_Stream_Close on the source stream. None of the stream objects * will be released to the heap. * * the stream implementation is very basic, and resets the decompression * process each time seeking backwards is needed within the stream * * in certain builds of the library, gzip compression recognition is * automatic when calling @FT_New_Face or @FT_Open_Face. This means that * if no font driver is capable of handling the raw compressed file, * the library will try to open a gzip stream from it and re-open * the face with it. * * this function may return "FT_Err_Unimplemented" if your build of * FreeType was not compiled with zlib support. */ FT_EXPORT( FT_Error ) FT_Stream_OpenGzip( FT_Stream stream, FT_Stream source ); /* */ FT_END_HEADER #endif /* __FTXF86_H__ */ ting */ /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ /old_contrib//root/sys/src/cmd/limbo/include/freetype/ftimage.h�������������������������������������� 664 � 0 � 0 � 227740 7607330530 23620�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftimage.h */ /* */ /* FreeType glyph image formats and default raster interface */ /* (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* Note: A `raster' is simply a scan-line converter, used to render */ /* FT_Outlines into FT_Bitmaps. */ /* */ /*************************************************************************/ #ifndef __FTIMAGE_H__ #define __FTIMAGE_H__ /* _STANDALONE_ is from ftgrays.c */ #ifndef _STANDALONE_ #include <ft2build.h> #endif FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* basic_types */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FT_Pos */ /* */ /* <Description> */ /* The type FT_Pos is a 32-bit integer used to store vectorial */ /* coordinates. Depending on the context, these can represent */ /* distances in integer font units, or 26.6 fixed float pixel */ /* coordinates. */ /* */ typedef signed long FT_Pos; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Vector */ /* */ /* <Description> */ /* A simple structure used to store a 2D vector; coordinates are of */ /* the FT_Pos type. */ /* */ /* <Fields> */ /* x :: The horizontal coordinate. */ /* y :: The vertical coordinate. */ /* */ typedef struct FT_Vector_ { FT_Pos x; FT_Pos y; } FT_Vector; /*************************************************************************/ /* */ /* <Struct> */ /* FT_BBox */ /* */ /* <Description> */ /* A structure used to hold an outline's bounding box, i.e., the */ /* coordinates of its extrema in the horizontal and vertical */ /* directions. */ /* */ /* <Fields> */ /* xMin :: The horizontal minimum (left-most). */ /* */ /* yMin :: The vertical minimum (bottom-most). */ /* */ /* xMax :: The horizontal maximum (right-most). */ /* */ /* yMax :: The vertical maximum (top-most). */ /* */ typedef struct FT_BBox_ { FT_Pos xMin, yMin; FT_Pos xMax, yMax; } FT_BBox; /*************************************************************************/ /* */ /* <Enum> */ /* FT_Pixel_Mode */ /* */ /* <Description> */ /* An enumeration type used to describe the format of pixels in a */ /* given bitmap. Note that additional formats may be added in the */ /* future. */ /* */ /* <Values> */ /* FT_PIXEL_MODE_NONE :: */ /* Value 0 is reserved. */ /* */ /* FT_PIXEL_MODE_MONO :: */ /* A monochrome bitmap, using 1 bit per pixel. Note that pixels */ /* are stored in most-significant order (MSB), which means that */ /* the left-most pixel in a byte has value 128. */ /* */ /* FT_PIXEL_MODE_GRAY :: */ /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ /* images. Each pixel is stored in one byte. Note that the number */ /* of value "gray" levels is stored in the `num_bytes' field of */ /* the @FT_Bitmap structure (it generally is 256). */ /* */ /* FT_PIXEL_MODE_GRAY2 :: */ /* A 2-bit/pixel bitmap, used to represent embedded anti-aliased */ /* bitmaps in font files according to the OpenType specification. */ /* We haven't found a single font using this format, however. */ /* */ /* FT_PIXEL_MODE_GRAY4 :: */ /* A 4-bit/pixel bitmap, used to represent embedded anti-aliased */ /* bitmaps in font files according to the OpenType specification. */ /* We haven't found a single font using this format, however. */ /* */ /* FT_PIXEL_MODE_LCD :: */ /* An 8-bit bitmap, used to represent RGB or BGR decimated glyph */ /* images used for display on LCD displays; the bitmap's width is */ /* three times wider than the original glyph image. See also */ /* @FT_RENDER_MODE_LCD. */ /* */ /* FT_PIXEL_MODE_LCD_V :: */ /* An 8-bit bitmap, used to represent RGB or BGR decimated glyph */ /* images used for display on rotated LCD displays; the bitmap's */ /* height is three times taller than the original glyph image. */ /* See also @FT_RENDER_MODE_LCD_V. */ /* */ typedef enum FT_Pixel_Mode_ { FT_PIXEL_MODE_NONE = 0, FT_PIXEL_MODE_MONO, FT_PIXEL_MODE_GRAY, FT_PIXEL_MODE_GRAY2, FT_PIXEL_MODE_GRAY4, FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V, FT_PIXEL_MODE_MAX /* do not remove */ } FT_Pixel_Mode; /*************************************************************************/ /* */ /* <Enum> */ /* ft_pixel_mode_xxx */ /* */ /* <Description> */ /* A list of deprecated constants. Use the corresponding */ /* @FT_Pixel_Mode values instead. */ /* */ /* <Values> */ /* ft_pixel_mode_none :: see @FT_PIXEL_MODE_NONE */ /* ft_pixel_mode_mono :: see @FT_PIXEL_MODE_MONO */ /* ft_pixel_mode_grays :: see @FT_PIXEL_MODE_GRAY */ /* ft_pixel_mode_pal2 :: see @FT_PIXEL_MODE_GRAY2 */ /* ft_pixel_mode_pal4 :: see @FT_PIXEL_MODE_GRAY4 */ /* */ #define ft_pixel_mode_none FT_PIXEL_MODE_NONE #define ft_pixel_mode_mono FT_PIXEL_MODE_MONO #define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY #define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 #define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 /* */ #if 0 /*************************************************************************/ /* */ /* <Enum> */ /* FT_Palette_Mode */ /* */ /* <Description> */ /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */ /* */ /* An enumeration type used to describe the format of a bitmap */ /* palette, used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ /* */ /* <Fields> */ /* ft_palette_mode_rgb :: The palette is an array of 3-bytes RGB */ /* records. */ /* */ /* ft_palette_mode_rgba :: The palette is an array of 4-bytes RGBA */ /* records. */ /* */ /* <Note> */ /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */ /* FreeType, these types are not handled by the library itself. */ /* */ typedef enum FT_Palette_Mode_ { ft_palette_mode_rgb = 0, ft_palette_mode_rgba, ft_palettte_mode_max /* do not remove */ } FT_Palette_Mode; /* */ #endif /*************************************************************************/ /* */ /* <Struct> */ /* FT_Bitmap */ /* */ /* <Description> */ /* A structure used to describe a bitmap or pixmap to the raster. */ /* Note that we now manage pixmaps of various depths through the */ /* `pixel_mode' field. */ /* */ /* <Fields> */ /* rows :: The number of bitmap rows. */ /* */ /* width :: The number of pixels in bitmap row. */ /* */ /* pitch :: The pitch's absolute value is the number of bytes */ /* taken by one bitmap row, including padding. */ /* However, the pitch is positive when the bitmap has */ /* a `down' flow, and negative when it has an `up' */ /* flow. In all cases, the pitch is an offset to add */ /* to a bitmap pointer in order to go down one row. */ /* */ /* buffer :: A typeless pointer to the bitmap buffer. This */ /* value should be aligned on 32-bit boundaries in */ /* most cases. */ /* */ /* num_grays :: This field is only used with */ /* `FT_PIXEL_MODE_GRAY'; it gives the number of gray */ /* levels used in the bitmap. */ /* */ /* pixel_mode :: The pixel_mode, i.e., how pixel bits are stored. */ /* */ /* palette_mode :: This field is only used with paletted pixel modes; */ /* it indicates how the palette is stored. */ /* */ /* palette :: A typeless pointer to the bitmap palette; only */ /* used for paletted pixel modes. */ /* */ /* <Note> */ /* For now, the only pixel mode supported by FreeType are mono and */ /* grays. However, drivers might be added in the future to support */ /* more `colorful' options. */ /* */ /* When using pixel modes pal2, pal4 and pal8 with a void `palette' */ /* field, a gray pixmap with respectively 4, 16, and 256 levels of */ /* gray is assumed. This, in order to be compatible with some */ /* embedded bitmap formats defined in the TrueType specification. */ /* */ /* Note that no font was found presenting such embedded bitmaps, so */ /* this is currently completely unhandled by the library. */ /* */ typedef struct FT_Bitmap_ { int rows; int width; int pitch; unsigned char* buffer; short num_grays; char pixel_mode; char palette_mode; void* palette; } FT_Bitmap; /*************************************************************************/ /* */ /* <Section> */ /* outline_processing */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* FT_Outline */ /* */ /* <Description> */ /* This structure is used to describe an outline to the scan-line */ /* converter. */ /* */ /* <Fields> */ /* n_contours :: The number of contours in the outline. */ /* */ /* n_points :: The number of points in the outline. */ /* */ /* points :: A pointer to an array of `n_points' FT_Vector */ /* elements, giving the outline's point coordinates. */ /* */ /* tags :: A pointer to an array of `n_points' chars, giving */ /* each outline point's type. If bit 0 is unset, the */ /* point is `off' the curve, i.e. a Bezier control */ /* point, while it is `on' when set. */ /* */ /* Bit 1 is meaningful for `off' points only. If set, */ /* it indicates a third-order Bezier arc control point; */ /* and a second-order control point if unset. */ /* */ /* contours :: An array of `n_contours' shorts, giving the end */ /* point of each contour within the outline. For */ /* example, the first contour is defined by the points */ /* `0' to `contours[0]', the second one is defined by */ /* the points `contours[0]+1' to `contours[1]', etc. */ /* */ /* flags :: A set of bit flags used to characterize the outline */ /* and give hints to the scan-converter and hinter on */ /* how to convert/grid-fit it. See FT_Outline_Flags. */ /* */ typedef struct FT_Outline_ { short n_contours; /* number of contours in glyph */ short n_points; /* number of points in the glyph */ FT_Vector* points; /* the outline's points */ char* tags; /* the points flags */ short* contours; /* the contour end points */ int flags; /* outline masks */ } FT_Outline; /*************************************************************************/ /* */ /* <Enum> */ /* FT_Outline_Flags */ /* */ /* <Description> */ /* A simple type used to enumerates the flags in an outline's */ /* `outline_flags' field. */ /* */ /* <Values> */ /* FT_OUTLINE_NONE :: Value 0 is reserved. */ /* */ /* FT_OUTLINE_OWNER :: If set, this flag indicates that the */ /* outline's field arrays (i.e. */ /* `points', `flags' & `contours') are */ /* `owned' by the outline object, and */ /* should thus be freed when it is */ /* destroyed. */ /* */ /* FT_OUTLINE_EVEN_ODD_FILL :: By default, outlines are filled using */ /* the non-zero winding rule. If set to */ /* 1, the outline will be filled using */ /* the even-odd fill rule (only works */ /* with the smooth raster). */ /* */ /* FT_OUTLINE_REVERSE_FILL :: By default, outside contours of an */ /* outline are oriented in clock-wise */ /* direction, as defined in the TrueType */ /* specification. This flag is set if */ /* the outline uses the opposite */ /* direction (typically for Type 1 */ /* fonts). This flag is ignored by the */ /* scan-converter. However, it is very */ /* important for the auto-hinter. */ /* */ /* FT_OUTLINE_IGNORE_DROPOUTS :: By default, the scan converter will */ /* try to detect drop-outs in an outline */ /* and correct the glyph bitmap to */ /* ensure consistent shape continuity. */ /* If set, this flag hints the scan-line */ /* converter to ignore such cases. */ /* */ /* FT_OUTLINE_HIGH_PRECISION :: This flag indicates that the */ /* scan-line converter should try to */ /* convert this outline to bitmaps with */ /* the highest possible quality. It is */ /* typically set for small character */ /* sizes. Note that this is only a */ /* hint, that might be completely */ /* ignored by a given scan-converter. */ /* */ /* FT_OUTLINE_SINGLE_PASS :: This flag is set to force a given */ /* scan-converter to only use a single */ /* pass over the outline to render a */ /* bitmap glyph image. Normally, it is */ /* set for very large character sizes. */ /* It is only a hint, that might be */ /* completely ignored by a given */ /* scan-converter. */ /* */ typedef enum FT_Outline_Flags_ { FT_OUTLINE_NONE = 0, FT_OUTLINE_OWNER = 1, FT_OUTLINE_EVEN_ODD_FILL = 2, FT_OUTLINE_REVERSE_FILL = 4, FT_OUTLINE_IGNORE_DROPOUTS = 8, FT_OUTLINE_HIGH_PRECISION = 256, FT_OUTLINE_SINGLE_PASS = 512 } FT_Outline_Flags; /************************************************************************* * * @enum: * ft_outline_xxx * * @description: * These constants are deprecated. Please use the corresponding * @FT_OUTLINE_XXX values. * * @values: * ft_outline_none :: See @FT_OUTLINE_NONE. * ft_outline_owner :: See @FT_OUTLINE_OWNER. * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL. * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL. * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS. * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION. * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS. */ #define ft_outline_none FT_OUTLINE_NONE #define ft_outline_owner FT_OUTLINE_OWNER #define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL #define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL #define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS #define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION #define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS /* */ #define FT_CURVE_TAG( flag ) ( flag & 3 ) #define FT_CURVE_TAG_ON 1 #define FT_CURVE_TAG_CONIC 0 #define FT_CURVE_TAG_CUBIC 2 #define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ #define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ #define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ FT_CURVE_TAG_TOUCH_Y ) #define FT_Curve_Tag_On FT_CURVE_TAG_ON #define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC #define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC #define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X #define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Outline_MoveToFunc */ /* */ /* <Description> */ /* A function pointer type used to describe the signature of a `move */ /* to' function during outline walking/decomposition. */ /* */ /* A `move to' is emitted to start a new contour in an outline. */ /* */ /* <Input> */ /* to :: A pointer to the target point of the `move to'. */ /* */ /* user :: A typeless pointer which is passed from the caller of the */ /* decomposition function. */ /* */ /* <Return> */ /* Error code. 0 means success. */ /* */ typedef int (*FT_Outline_MoveToFunc)( FT_Vector* to, void* user ); #define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Outline_LineToFunc */ /* */ /* <Description> */ /* A function pointer type used to describe the signature of a `line */ /* to' function during outline walking/decomposition. */ /* */ /* A `line to' is emitted to indicate a segment in the outline. */ /* */ /* <Input> */ /* to :: A pointer to the target point of the `line to'. */ /* */ /* user :: A typeless pointer which is passed from the caller of the */ /* decomposition function. */ /* */ /* <Return> */ /* Error code. 0 means success. */ /* */ typedef int (*FT_Outline_LineToFunc)( FT_Vector* to, void* user ); #define FT_Outline_LineTo_Func FT_Outline_LineToFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Outline_ConicToFunc */ /* */ /* <Description> */ /* A function pointer type use to describe the signature of a `conic */ /* to' function during outline walking/decomposition. */ /* */ /* A `conic to' is emitted to indicate a second-order Bezier arc in */ /* the outline. */ /* */ /* <Input> */ /* control :: An intermediate control point between the last position */ /* and the new target in `to'. */ /* */ /* to :: A pointer to the target end point of the conic arc. */ /* */ /* user :: A typeless pointer which is passed from the caller of */ /* the decomposition function. */ /* */ /* <Return> */ /* Error code. 0 means success. */ /* */ typedef int (*FT_Outline_ConicToFunc)( FT_Vector* control, FT_Vector* to, void* user ); #define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Outline_CubicToFunc */ /* */ /* <Description> */ /* A function pointer type used to describe the signature of a `cubic */ /* to' function during outline walking/decomposition. */ /* */ /* A `cubic to' is emitted to indicate a third-order Bezier arc. */ /* */ /* <Input> */ /* control1 :: A pointer to the first Bezier control point. */ /* */ /* control2 :: A pointer to the second Bezier control point. */ /* */ /* to :: A pointer to the target end point. */ /* */ /* user :: A typeless pointer which is passed from the caller of */ /* the decomposition function. */ /* */ /* <Return> */ /* Error code. 0 means success. */ /* */ typedef int (*FT_Outline_CubicToFunc)( FT_Vector* control1, FT_Vector* control2, FT_Vector* to, void* user ); #define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc /*************************************************************************/ /* */ /* <Struct> */ /* FT_Outline_Funcs */ /* */ /* <Description> */ /* A structure to hold various function pointers used during outline */ /* decomposition in order to emit segments, conic, and cubic Beziers, */ /* as well as `move to' and `close to' operations. */ /* */ /* <Fields> */ /* move_to :: The `move to' emitter. */ /* */ /* line_to :: The segment emitter. */ /* */ /* conic_to :: The second-order Bezier arc emitter. */ /* */ /* cubic_to :: The third-order Bezier arc emitter. */ /* */ /* shift :: The shift that is applied to coordinates before they */ /* are sent to the emitter. */ /* */ /* delta :: The delta that is applied to coordinates before they */ /* are sent to the emitter, but after the shift. */ /* */ /* <Note> */ /* The point coordinates sent to the emitters are the transformed */ /* version of the original coordinates (this is important for high */ /* accuracy during scan-conversion). The transformation is simple: */ /* */ /* x' = (x << shift) - delta */ /* y' = (x << shift) - delta */ /* */ /* Set the value of `shift' and `delta' to 0 to get the original */ /* point coordinates. */ /* */ typedef struct FT_Outline_Funcs_ { FT_Outline_MoveToFunc move_to; FT_Outline_LineToFunc line_to; FT_Outline_ConicToFunc conic_to; FT_Outline_CubicToFunc cubic_to; int shift; FT_Pos delta; } FT_Outline_Funcs; /*************************************************************************/ /* */ /* <Section> */ /* basic_types */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Macro> */ /* FT_IMAGE_TAG */ /* */ /* <Description> */ /* This macro converts four letter tags into an unsigned long. */ /* */ /* <Note> */ /* Since many 16bit compilers don't like 32bit enumerations, you */ /* should redefine this macro in case of problems to something like */ /* this: */ /* */ /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) (value) */ /* */ /* to get a simple enumeration without assigning special numbers. */ /* */ #ifndef FT_IMAGE_TAG #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ value = ( ( (unsigned long)_x1 << 24 ) | \ ( (unsigned long)_x2 << 16 ) | \ ( (unsigned long)_x3 << 8 ) | \ (unsigned long)_x4 ) #endif /* FT_IMAGE_TAG */ /*************************************************************************/ /* */ /* <Enum> */ /* FT_Glyph_Format */ /* */ /* <Description> */ /* An enumeration type used to describe the format of a given glyph */ /* image. Note that this version of FreeType only supports two image */ /* formats, even though future font drivers will be able to register */ /* their own format. */ /* */ /* <Values> */ /* FT_GLYPH_FORMAT_NONE :: */ /* The value 0 is reserved and does describe a glyph format. */ /* */ /* FT_GLYPH_FORMAT_COMPOSITE :: */ /* The glyph image is a composite of several other images. This */ /* format is _only_ used with @FT_LOAD_FLAG_NO_RECURSE, and is */ /* used to report compound glyphs (like accented characters). */ /* */ /* FT_GLYPH_FORMAT_BITMAP :: */ /* The glyph image is a bitmap, and can be described as an */ /* @FT_Bitmap. You generally need to access the `bitmap' field of */ /* the @FT_GlyphSlotRec structure to read it. */ /* */ /* FT_GLYPH_FORMAT_OUTLINE :: */ /* The glyph image is a vertorial outline made of line segments */ /* and Bezier arcs; it can be described as an @FT_Outline; you */ /* generally want to access the `outline' field of the */ /* @FT_GlyphSlotRec structure to read it. */ /* */ /* FT_GLYPH_FORMAT_PLOTTER :: */ /* The glyph image is a vectorial path with no inside/outside */ /* contours. Some Type 1 fonts, like those in the Hershey family, */ /* contain glyphs in this format. These are described as */ /* @FT_Outline, but FreeType isn't currently capable of rendering */ /* them correctly. */ /* */ typedef enum FT_Glyph_Format_ { FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) } FT_Glyph_Format; /*************************************************************************/ /* */ /* <Enum> */ /* ft_glyph_format_xxx */ /* */ /* <Description> */ /* A list of decprecated constants. Use the corresponding */ /* @FT_Glyph_Format values instead. */ /* */ /* <Values> */ /* ft_glyph_format_none :: see @FT_GLYPH_FORMAT_NONE */ /* ft_glyph_format_composite :: see @FT_GLYPH_FORMAT_COMPOSITE */ /* ft_glyph_format_bitmap :: see @FT_GLYPH_FORMAT_BITMAP */ /* ft_glyph_format_outline :: see @FT_GLYPH_FORMAT_OUTLINE */ /* ft_glyph_format_plotter :: see @FT_GLYPH_FORMAT_PLOTTER */ /* */ #define ft_glyph_format_none FT_GLYPH_FORMAT_NONE #define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE #define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP #define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE #define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** R A S T E R D E F I N I T I O N S *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* A raster is a scan converter, in charge of rendering an outline into */ /* a a bitmap. This section contains the public API for rasters. */ /* */ /* Note that in FreeType 2, all rasters are now encapsulated within */ /* specific modules called `renderers'. See `freetype/ftrender.h' for */ /* more details on renderers. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Section> */ /* raster */ /* */ /* <Title> */ /* Scanline converter */ /* */ /* <Abstract> */ /* How vectorial outlines are converted into bitmaps and pixmaps. */ /* */ /* <Description> */ /* This section contains technical definitions. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FT_Raster */ /* */ /* <Description> */ /* A handle (pointer) to a raster object. Each object can be used */ /* independently to convert an outline into a bitmap or pixmap. */ /* */ typedef struct FT_RasterRec_* FT_Raster; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Span */ /* */ /* <Description> */ /* A structure used to model a single span of gray (or black) pixels */ /* when rendering a monochrome or anti-aliased bitmap. */ /* */ /* <Fields> */ /* x :: The span's horizontal start position. */ /* */ /* len :: The span's length in pixels. */ /* */ /* coverage :: The span color/coverage, ranging from 0 (background) */ /* to 255 (foreground). Only used for anti-aliased */ /* rendering. */ /* */ /* <Note> */ /* This structure is used by the span drawing callback type named */ /* FT_SpanFunc which takes the y-coordinate of the span as a */ /* a parameter. */ /* */ /* The coverage value is always between 0 and 255, even if the number */ /* of gray levels have been set through FT_Set_Gray_Levels(). */ /* */ typedef struct FT_Span_ { short x; unsigned short len; unsigned char coverage; } FT_Span; /*************************************************************************/ /* */ /* <FuncType> */ /* FT_SpanFunc */ /* */ /* <Description> */ /* A function used as a call-back by the anti-aliased renderer in */ /* order to let client applications draw themselves the gray pixel */ /* spans on each scan line. */ /* */ /* <Input> */ /* y :: The scanline's y-coordinate. */ /* */ /* count :: The number of spans to draw on this scanline. */ /* */ /* spans :: A table of `count' spans to draw on the scanline. */ /* */ /* user :: User-supplied data that is passed to the callback. */ /* */ /* <Note> */ /* This callback allows client applications to directly render the */ /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ /* */ /* This can be used to write anti-aliased outlines directly to a */ /* given background bitmap, and even perform translucency. */ /* */ /* Note that the `count' field cannot be greater than a fixed value */ /* defined by the FT_MAX_GRAY_SPANS configuration macro in */ /* ftoption.h. By default, this value is set to 32, which means that */ /* if there are more than 32 spans on a given scanline, the callback */ /* will be called several times with the same `y' parameter in order */ /* to draw all callbacks. */ /* */ /* Otherwise, the callback is only called once per scan-line, and */ /* only for those scanlines that do have `gray' pixels on them. */ /* */ typedef void (*FT_SpanFunc)( int y, int count, FT_Span* spans, void* user ); #define FT_Raster_Span_Func FT_SpanFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Raster_BitTest_Func */ /* */ /* <Description> */ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ /* */ /* A function used as a call-back by the monochrome scan-converter */ /* to test whether a given target pixel is already set to the drawing */ /* `color'. These tests are crucial to implement drop-out control */ /* per-se the TrueType spec. */ /* */ /* <Input> */ /* y :: The pixel's y-coordinate. */ /* */ /* x :: The pixel's x-coordinate. */ /* */ /* user :: User-supplied data that is passed to the callback. */ /* */ /* <Return> */ /* 1 if the pixel is `set', 0 otherwise. */ /* */ typedef int (*FT_Raster_BitTest_Func)( int y, int x, void* user ); /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Raster_BitSet_Func */ /* */ /* <Description> */ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ /* */ /* A function used as a call-back by the monochrome scan-converter */ /* to set an individual target pixel. This is crucial to implement */ /* drop-out control according to the TrueType specification. */ /* */ /* <Input> */ /* y :: The pixel's y-coordinate. */ /* */ /* x :: The pixel's x-coordinate. */ /* */ /* user :: User-supplied data that is passed to the callback. */ /* */ /* <Return> */ /* 1 if the pixel is `set', 0 otherwise. */ /* */ typedef void (*FT_Raster_BitSet_Func)( int y, int x, void* user ); /*************************************************************************/ /* */ /* <Enum> */ /* FT_Raster_Flag */ /* */ /* <Description> */ /* An enumeration to list the bit flags as used in the `flags' field */ /* of a FT_Raster_Params structure. */ /* */ /* <Values> */ /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ /* */ /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ /* anti-aliased glyph image should be */ /* generated. Otherwise, it will be */ /* monochrome (1-bit) */ /* */ /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ /* rendering. In this mode, client */ /* applications must provide their own span */ /* callback. This lets them directly */ /* draw or compose over an existing bitmap. */ /* If this bit is not set, the target */ /* pixmap's buffer _must_ be zeroed before */ /* rendering. */ /* */ /* Note that for now, direct rendering is */ /* only possible with anti-aliased glyphs. */ /* */ /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ /* rendering mode. If set, the output will */ /* be clipped to a box specified in the */ /* "clip_box" field of the FT_Raster_Params */ /* structure. */ /* */ /* Note that by default, the glyph bitmap */ /* is clipped to the target pixmap, except */ /* in direct rendering mode where all spans */ /* are generated if no clipping box is set. */ /* */ typedef enum { FT_RASTER_FLAG_DEFAULT = 0, FT_RASTER_FLAG_AA = 1, FT_RASTER_FLAG_DIRECT = 2, FT_RASTER_FLAG_CLIP = 4 } FT_Raster_Flag; #define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT #define ft_raster_flag_aa FT_RASTER_FLAG_AA #define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT #define ft_raster_flag_clip FT_RASTER_FLAG_CLIP /*************************************************************************/ /* */ /* <Struct> */ /* FT_Raster_Params */ /* */ /* <Description> */ /* A structure to hold the arguments used by a raster's render */ /* function. */ /* */ /* <Fields> */ /* target :: The target bitmap. */ /* */ /* source :: A pointer to the source glyph image (e.g. an */ /* FT_Outline). */ /* */ /* flags :: The rendering flags. */ /* */ /* gray_spans :: The gray span drawing callback. */ /* */ /* black_spans :: The black span drawing callback. */ /* */ /* bit_test :: The bit test callback. UNIMPLEMENTED! */ /* */ /* bit_set :: The bit set callback. UNIMPLEMENTED! */ /* */ /* user :: User-supplied data that is passed to each drawing */ /* callback. */ /* */ /* clip_box :: An optional clipping box. It is only used in */ /* direct rendering mode. Note that coordinates here */ /* should be expressed in _integer_ pixels (and not in */ /* 26.6 fixed-point units). */ /* */ /* <Note> */ /* An anti-aliased glyph bitmap is drawn if the FT_RASTER_FLAG_AA bit */ /* flag is set in the `flags' field, otherwise a monochrome bitmap */ /* will be generated. */ /* */ /* If the FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ /* raster will call the `gray_spans' callback to draw gray pixel */ /* spans, in the case of an aa glyph bitmap, it will call */ /* `black_spans', and `bit_test' and `bit_set' in the case of a */ /* monochrome bitmap. This allows direct composition over a */ /* pre-existing bitmap through user-provided callbacks to perform the */ /* span drawing/composition. */ /* */ /* Note that the `bit_test' and `bit_set' callbacks are required when */ /* rendering a monochrome bitmap, as they are crucial to implement */ /* correct drop-out control as defined in the TrueType specification. */ /* */ typedef struct FT_Raster_Params_ { FT_Bitmap* target; void* source; int flags; FT_SpanFunc gray_spans; FT_SpanFunc black_spans; FT_Raster_BitTest_Func bit_test; /* doesn't work! */ FT_Raster_BitSet_Func bit_set; /* doesn't work! */ void* user; FT_BBox clip_box; } FT_Raster_Params; /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Raster_NewFunc */ /* */ /* <Description> */ /* A function used to create a new raster object. */ /* */ /* <Input> */ /* memory :: A handle to the memory allocator. */ /* */ /* <Output> */ /* raster :: A handle to the new raster object. */ /* */ /* <Return> */ /* Error code. 0 means success. */ /* */ /* <Note> */ /* The `memory' parameter is a typeless pointer in order to avoid */ /* un-wanted dependencies on the rest of the FreeType code. In */ /* practice, it is a FT_Memory, i.e., a handle to the standard */ /* FreeType memory allocator. However, this field can be completely */ /* ignored by a given raster implementation. */ /* */ typedef int (*FT_Raster_NewFunc)( void* memory, FT_Raster* raster ); #define FT_Raster_New_Func FT_Raster_NewFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Raster_DoneFunc */ /* */ /* <Description> */ /* A function used to destroy a given raster object. */ /* */ /* <Input> */ /* raster :: A handle to the raster object. */ /* */ typedef void (*FT_Raster_DoneFunc)( FT_Raster raster ); #define FT_Raster_Done_Func FT_Raster_DoneFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Raster_ResetFunc */ /* */ /* <Description> */ /* FreeType provides an area of memory called the `render pool', */ /* available to all registered rasters. This pool can be freely used */ /* during a given scan-conversion but is shared by all rasters. Its */ /* content is thus transient. */ /* */ /* This function is called each time the render pool changes, or just */ /* after a new raster object is created. */ /* */ /* <Input> */ /* raster :: A handle to the new raster object. */ /* */ /* pool_base :: The address in memory of the render pool. */ /* */ /* pool_size :: The size in bytes of the render pool. */ /* */ /* <Note> */ /* Rasters can ignore the render pool and rely on dynamic memory */ /* allocation if they want to (a handle to the memory allocator is */ /* passed to the raster constructor). However, this is not */ /* recommended for efficiency purposes. */ /* */ typedef void (*FT_Raster_ResetFunc)( FT_Raster raster, unsigned char* pool_base, unsigned long pool_size ); #define FT_Raster_Reset_Func FT_Raster_ResetFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Raster_SetModeFunc */ /* */ /* <Description> */ /* This function is a generic facility to change modes or attributes */ /* in a given raster. This can be used for debugging purposes, or */ /* simply to allow implementation-specific `features' in a given */ /* raster module. */ /* */ /* <Input> */ /* raster :: A handle to the new raster object. */ /* */ /* mode :: A 4-byte tag used to name the mode or property. */ /* */ /* args :: A pointer to the new mode/property to use. */ /* */ typedef int (*FT_Raster_SetModeFunc)( FT_Raster raster, unsigned long mode, void* args ); #define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Raster_RenderFunc */ /* */ /* <Description> */ /* Invokes a given raster to scan-convert a given glyph image into a */ /* target bitmap. */ /* */ /* <Input> */ /* raster :: A handle to the raster object. */ /* */ /* params :: A pointer to a FT_Raster_Params structure used to store */ /* the rendering parameters. */ /* */ /* <Return> */ /* Error code. 0 means success. */ /* */ /* <Note> */ /* The exact format of the source image depends on the raster's glyph */ /* format defined in its FT_Raster_Funcs structure. It can be an */ /* FT_Outline or anything else in order to support a large array of */ /* glyph formats. */ /* */ /* Note also that the render function can fail and return a */ /* FT_Err_Unimplemented_Feature error code if the raster used does */ /* not support direct composition. */ /* */ /* XXX: For now, the standard raster doesn't support direct */ /* composition but this should change for the final release (see */ /* the files demos/src/ftgrays.c and demos/src/ftgrays2.c for */ /* examples of distinct implementations which support direct */ /* composition). */ /* */ typedef int (*FT_Raster_RenderFunc)( FT_Raster raster, FT_Raster_Params* params ); #define FT_Raster_Render_Func FT_Raster_RenderFunc /*************************************************************************/ /* */ /* <Struct> */ /* FT_Raster_Funcs */ /* */ /* <Description> */ /* A structure used to describe a given raster class to the library. */ /* */ /* <Fields> */ /* glyph_format :: The supported glyph format for this raster. */ /* */ /* raster_new :: The raster constructor. */ /* */ /* raster_reset :: Used to reset the render pool within the raster. */ /* */ /* raster_render :: A function to render a glyph into a given bitmap. */ /* */ /* raster_done :: The raster destructor. */ /* */ typedef struct FT_Raster_Funcs_ { FT_Glyph_Format glyph_format; FT_Raster_NewFunc raster_new; FT_Raster_ResetFunc raster_reset; FT_Raster_SetModeFunc raster_set_mode; FT_Raster_RenderFunc raster_render; FT_Raster_DoneFunc raster_done; } FT_Raster_Funcs; /* */ FT_END_HEADER #endif /* __FTIMAGE_H__ */ /* END */ he `memory' parameter is a typelold_contrib//root/sys/src/cmd/limbo/include/freetype/ftincrem.h������������������������������������� 664 � 0 � 0 � 22141 7607330530 23757�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftincrem.h */ /* */ /* FreeType incremental loading (specification). */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTINCREM_H__ #define __FTINCREM_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************** * * @type: * FT_Incremental * * @description: * An opaque type describing a user-provided object used to implement * "incremental" glyph loading within FreeType. This is used to support * embedded fonts in certain environments (e.g. Postscript interpreters), * where the glyph data isn't in the font file, or must be overridden by * different values. * * @note: * It is up to client applications to create and implement @FT_Incremental * objects, as long as they provide implementations for the methods * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc * and @FT_Incremental_GetGlyphMetricsFunc. * * See the description of @FT_Incremental_InterfaceRec to understand how * to use incremental objects with FreeType. */ typedef struct FT_IncrementalRec_* FT_Incremental; /*************************************************************************** * * @struct: * FT_Incremental_Metrics * * @description: * A small structure used to contain the basic glyph metrics returned * by the @FT_Incremental_GetGlyphMetricsFunc method. * * @fields: * bearing_x :: * Left bearing, in font units. * * bearing_y :: * Top bearing, in font units. * * advance :: * Glyph advance, in font units. * * @note: * These correspond to horizontal or vertical metrics depending on the * value of the 'vertical' argument to the function * @FT_Incremental_GetGlyphMetricsFunc. */ typedef struct FT_Incremental_MetricsRec_ { FT_Long bearing_x; FT_Long bearing_y; FT_Long advance; } FT_Incremental_MetricsRec, *FT_Incremental_Metrics; /*************************************************************************** * * @type: * FT_Incremental_GetGlyphDataFunc * * @description: * A function called by FreeType to access a given glyph's data bytes * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is * enabled. * * Note that the format of the glyph's data bytes depends on the font * file format. For TrueType, it must correspond to the raw bytes within * the 'glyf' table. For Postscript formats, it must correspond to the * *unencrypted* charstring bytes, without any 'lenIV' header. It is * undefined for any other format. * * @input: * incremental :: * Handle to an opaque @FT_Incremental handle provided by the client * application. * * glyph_index :: * Index of relevant glyph. * * @output: * adata :: * A structure describing the returned glyph data bytes (which will be * accessed as a read-only byte block). * * @return: * FreeType error code. 0 means success. * * @note: * If this function returns succesfully the method * @FT_Incremental_FreeGlyphDataFunc will be called later to release * the data bytes. * * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for * compound glyphs. */ typedef FT_Error (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, FT_UInt glyph_index, FT_Data* adata ); /*************************************************************************** * * @type: * FT_Incremental_FreeGlyphDataFunc * * @description: * A function used to release the glyph data bytes returned by a * successful call to @FT_Incremental_GetGlyphDataFunc. * * @input: * incremental :: * A handle to an opaque @FT_Incremental handle provided by the client * application. * * data :: * A structure describing the glyph data bytes (which will be accessed * as a read-only byte block). */ typedef void (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, FT_Data* data ); /*************************************************************************** * * @type: * FT_Incremental_GetGlyphMetricsFunc * * @description: * A function used to retrieve the basic metrics of a given glyph index * before accessing its data. This is necessary because, in certain * formats like TrueType, the metrics are stored in a different place from * the glyph images proper. * * @input: * incremental :: * A handle to an opaque @FT_Incremental handle provided by the client * application. * * glyph_index :: * Index of relevant glyph. * * vertical :: * If true, return vertical metrics. * * @output: * ametrics :: * The glyph metrics in font units. * * afound :: * True if there are metrics at all. * */ typedef FT_Error (*FT_Incremental_GetGlyphMetricsFunc) ( FT_Incremental incremental, FT_UInt glyph_index, FT_Bool vertical, FT_Incremental_MetricsRec *ametrics, FT_Bool *afound ); /************************************************************************** * * @struct: * FT_Incremental_FuncsRec * * @description: * A table of functions for accessing fonts that load data * incrementally. Used in @FT_Incremental_Interface. * * @fields: * get_glyph_data :: * The function to get glyph data. Must not be null. * * free_glyph_data :: * The function to release glyph data. Must not be null. * * get_glyph_metrics :: * The function to get glyph metrics. May be null if the font does * not provide overriding glyph metrics. */ typedef struct FT_Incremental_FuncsRec_ { FT_Incremental_GetGlyphDataFunc get_glyph_data; FT_Incremental_FreeGlyphDataFunc free_glyph_data; FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; } FT_Incremental_FuncsRec; /*************************************************************************** * * @struct: * FT_Incremental_InterfaceRec * * @description: * A structure to be used with @FT_Open_Face to indicate that the user * wants to support incremental glyph loading. You should use it with * @FT_PARAM_TAG_INCREMENTAL as in the following example: * * { * FT_Incremental_InterfaceRec inc_int; * FT_Parameter parameter; * FT_Open_Args open_args; * * * // set up incremental descriptor * inc_int.funcs = my_funcs; * inc_int.object = my_object; * * // set up optional parameter * parameter.tag = FT_PARAM_TAG_INCREMENTAL; * parameter.data = &inc_int; * * // set up FT_Open_Args structure * open_args.flags = (FT_Open_Flags)( FT_OPEN_PATHNAME | * FT_OPEN_PARAMS ); * open_args.pathname = my_font_pathname; * open_args.num_params = 1; * open_args.params = ¶meter; // we use one optional argument * * // open the font * error = FT_Open_Face( library, &open_args, index, &face ); * ... * } */ typedef struct FT_Incremental_InterfaceRec_ { const FT_Incremental_FuncsRec* funcs; FT_Incremental object; } FT_Incremental_InterfaceRec; /*************************************************************************** * * @constant: * FT_PARAM_TAG_INCREMENTAL * * @description: * A constant used as the tag of @FT_Parameter structures to indicate * an incremental loading object to be used by FreeType. * */ #define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) /* */ FT_END_HEADER #endif /* __FTINCREM_H__ */ /* END */ */ typedef struct FT_Raster_Funcs_ { FT_Glyph_Format glyph_format; FT_Raster_NewFunc raster_new; FT_Raster_ResetFunc raster_reset; FT_Raster_SetModeFunc raster_set_mode; FT_Raster_RenderFunc raster_render; FT_Raster_DoneFunc raster_done; } FT_Raster_Funcs; /* */ FT_END_HEADER #endif /* __FTIMAGE_H__ */ /* END */ he `memory' parameter is a typelold_contrib//root/sys/src/cmd/limbo/include/freetype/ftlist.h��������������������������������������� 664 � 0 � 0 � 37713 7607330530 23470�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftlist.h */ /* */ /* Generic list support for FreeType (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file implements functions relative to list processing. Its */ /* data structures are defined in `freetype.h'. */ /* */ /*************************************************************************/ #ifndef __FTLIST_H__ #define __FTLIST_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* list_processing */ /* */ /* <Title> */ /* List Processing */ /* */ /* <Abstract> */ /* Simple management of lists. */ /* */ /* <Description> */ /* This section contains various definitions related to list */ /* processing using doubly-linked nodes. */ /* */ /* <Order> */ /* FT_List */ /* FT_ListNode */ /* FT_ListRec */ /* FT_ListNodeRec */ /* */ /* FT_List_Add */ /* FT_List_Insert */ /* FT_List_Find */ /* FT_List_Remove */ /* FT_List_Up */ /* FT_List_Iterate */ /* FT_List_Iterator */ /* FT_List_Finalize */ /* FT_List_Destructor */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_List_Find */ /* */ /* <Description> */ /* Finds the list node for a given listed object. */ /* */ /* <Input> */ /* list :: A pointer to the parent list. */ /* data :: The address of the listed object. */ /* */ /* <Return> */ /* List node. NULL if it wasn't found. */ /* */ FT_EXPORT( FT_ListNode ) FT_List_Find( FT_List list, void* data ); /*************************************************************************/ /* */ /* <Function> */ /* FT_List_Add */ /* */ /* <Description> */ /* Appends an element to the end of a list. */ /* */ /* <InOut> */ /* list :: A pointer to the parent list. */ /* node :: The node to append. */ /* */ FT_EXPORT( void ) FT_List_Add( FT_List list, FT_ListNode node ); /*************************************************************************/ /* */ /* <Function> */ /* FT_List_Insert */ /* */ /* <Description> */ /* Inserts an element at the head of a list. */ /* */ /* <InOut> */ /* list :: A pointer to parent list. */ /* node :: The node to insert. */ /* */ FT_EXPORT( void ) FT_List_Insert( FT_List list, FT_ListNode node ); /*************************************************************************/ /* */ /* <Function> */ /* FT_List_Remove */ /* */ /* <Description> */ /* Removes a node from a list. This function doesn't check whether */ /* the node is in the list! */ /* */ /* <Input> */ /* node :: The node to remove. */ /* */ /* <InOut> */ /* list :: A pointer to the parent list. */ /* */ FT_EXPORT( void ) FT_List_Remove( FT_List list, FT_ListNode node ); /*************************************************************************/ /* */ /* <Function> */ /* FT_List_Up */ /* */ /* <Description> */ /* Moves a node to the head/top of a list. Used to maintain LRU */ /* lists. */ /* */ /* <InOut> */ /* list :: A pointer to the parent list. */ /* node :: The node to move. */ /* */ FT_EXPORT( void ) FT_List_Up( FT_List list, FT_ListNode node ); /*************************************************************************/ /* */ /* <FuncType> */ /* FT_List_Iterator */ /* */ /* <Description> */ /* An FT_List iterator function which is called during a list parse */ /* by FT_List_Iterate(). */ /* */ /* <Input> */ /* node :: The current iteration list node. */ /* */ /* user :: A typeless pointer passed to FT_List_Iterate(). */ /* Can be used to point to the iteration's state. */ /* */ typedef FT_Error (*FT_List_Iterator)( FT_ListNode node, void* user ); /*************************************************************************/ /* */ /* <Function> */ /* FT_List_Iterate */ /* */ /* <Description> */ /* Parses a list and calls a given iterator function on each element. */ /* Note that parsing is stopped as soon as one of the iterator calls */ /* returns a non-zero value. */ /* */ /* <Input> */ /* list :: A handle to the list. */ /* iterator :: An interator function, called on each node of the */ /* list. */ /* user :: A user-supplied field which is passed as the second */ /* argument to the iterator. */ /* */ /* <Return> */ /* The result (a FreeType error code) of the last iterator call. */ /* */ FT_EXPORT( FT_Error ) FT_List_Iterate( FT_List list, FT_List_Iterator iterator, void* user ); /*************************************************************************/ /* */ /* <FuncType> */ /* FT_List_Destructor */ /* */ /* <Description> */ /* An FT_List iterator function which is called during a list */ /* finalization by FT_List_Finalize() to destroy all elements in a */ /* given list. */ /* */ /* <Input> */ /* system :: The current system object. */ /* */ /* data :: The current object to destroy. */ /* */ /* user :: A typeless pointer passed to FT_List_Iterate(). It can */ /* be used to point to the iteration's state. */ /* */ typedef void (*FT_List_Destructor)( FT_Memory memory, void* data, void* user ); /*************************************************************************/ /* */ /* <Function> */ /* FT_List_Finalize */ /* */ /* <Description> */ /* Destroys all elements in the list as well as the list itself. */ /* */ /* <Input> */ /* list :: A handle to the list. */ /* */ /* destroy :: A list destructor that will be applied to each element */ /* of the list. */ /* */ /* memory :: The current memory object which handles deallocation. */ /* */ /* user :: A user-supplied field which is passed as the last */ /* argument to the destructor. */ /* */ FT_EXPORT( void ) FT_List_Finalize( FT_List list, FT_List_Destructor destroy, FT_Memory memory, void* user ); /* */ FT_END_HEADER #endif /* __FTLIST_H__ */ /* END */ end of a list. */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/ftmac.h���������������������������������������� 664 � 0 � 0 � 16611 7607330530 23247�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftmac.h */ /* */ /* Additional Mac-specific API. */ /* */ /* Copyright 1996-2001 by */ /* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /***************************************************************************/ /* */ /* NOTE: Include this file after <freetype/freetype.h> and after the */ /* Mac-specific <Types.h> header (or any other Mac header that */ /* includes <Types.h>); we use Handle type. */ /* */ /***************************************************************************/ #ifndef __FTMAC_H__ #define __FTMAC_H__ #include <ft2build.h> FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* mac_specific */ /* */ /* <Title> */ /* Mac-Specific Interface */ /* */ /* <Abstract> */ /* Only available on the Macintosh. */ /* */ /* <Description> */ /* The following definitions are only available if FreeType is */ /* compiled on a Macintosh. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_New_Face_From_FOND */ /* */ /* <Description> */ /* Creates a new face object from an FOND resource. */ /* */ /* <InOut> */ /* library :: A handle to the library resource. */ /* */ /* <Input> */ /* fond :: An FOND resource. */ /* */ /* face_index :: Only supported for the -1 `sanity check' special */ /* case. */ /* */ /* <Output> */ /* aface :: A handle to a new face object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Notes> */ /* This function can be used to create FT_Face abjects from fonts */ /* that are installed in the system like so: */ /* */ /* { */ /* fond = GetResource( 'FOND', fontName ); */ /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ /* } */ /* */ FT_EXPORT( FT_Error ) FT_New_Face_From_FOND( FT_Library library, Handle fond, FT_Long face_index, FT_Face *aface ); /*************************************************************************/ /* */ /* <Function> */ /* FT_GetFile_From_Mac_Name */ /* */ /* <Description> */ /* Returns an FSSpec for the disk file containing the named font. */ /* */ /* <Input> */ /* fontName :: Mac OS name of the font (eg. Times New Roman Bold). */ /* */ /* <Output> */ /* pathSpec :: FSSpec to the file. For passing to @FT_New_Face. */ /* */ /* face_index :: Index of the face. For passing to @FT_New_Face. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT_DEF( FT_Error ) FT_GetFile_From_Mac_Name( char* fontName, FSSpec* pathSpec, FT_Long* face_index ); /* */ FT_END_HEADER #endif /* __FTMAC_H__ */ /* END */ ess pointer passed to FT_List_Iterate(). It can */ /* be used to point to the iteration's state. old_contrib//root/sys/src/cmd/limbo/include/freetype/ftmm.h����������������������������������������� 664 � 0 � 0 � 26150 7607330530 23117�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftmm.h */ /* */ /* FreeType Multiple Master font interface (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTMM_H__ #define __FTMM_H__ #include <ft2build.h> #include FT_TYPE1_TABLES_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* multiple_masters */ /* */ /* <Title> */ /* Multiple Masters */ /* */ /* <Abstract> */ /* How to manage Multiple Masters fonts. */ /* */ /* <Description> */ /* The following types and functions are used to manage Multiple */ /* Master fonts, i.e. the selection of specific design instances by */ /* setting design axis coordinates. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* FT_MM_Axis */ /* */ /* <Description> */ /* A simple structure used to model a given axis in design space for */ /* Multiple Masters fonts. */ /* */ /* <Fields> */ /* name :: The axis's name. */ /* */ /* minimum :: The axis's minimum design coordinate. */ /* */ /* maximum :: The axis's maximum design coordinate. */ /* */ typedef struct FT_MM_Axis_ { FT_String* name; FT_Long minimum; FT_Long maximum; } FT_MM_Axis; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Multi_Master */ /* */ /* <Description> */ /* A structure used to model the axes and space of a Multiple Masters */ /* font. */ /* */ /* <Fields> */ /* num_axis :: Number of axes. Cannot exceed 4. */ /* */ /* num_designs :: Number of designs; should ne normally 2^num_axis */ /* even though the Type 1 specification strangely */ /* allows for intermediate designs to be present. This */ /* number cannot exceed 16. */ /* */ /* axis :: A table of axis descriptors. */ /* */ typedef struct FT_Multi_Master_ { FT_UInt num_axis; FT_UInt num_designs; FT_MM_Axis axis[T1_MAX_MM_AXIS]; } FT_Multi_Master; /* */ typedef FT_Error (*FT_Get_MM_Func)( FT_Face face, FT_Multi_Master* master ); typedef FT_Error (*FT_Set_MM_Design_Func)( FT_Face face, FT_UInt num_coords, FT_Long* coords ); typedef FT_Error (*FT_Set_MM_Blend_Func)( FT_Face face, FT_UInt num_coords, FT_Long* coords ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Multi_Master */ /* */ /* <Description> */ /* Retrieves the Multiple Master descriptor of a given font. */ /* */ /* <Input> */ /* face :: A handle to the source face. */ /* */ /* <Output> */ /* amaster :: The Multiple Masters descriptor. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Get_Multi_Master( FT_Face face, FT_Multi_Master *amaster ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_MM_Design_Coordinates */ /* */ /* <Description> */ /* For Multiple Masters fonts, choose an interpolated font design */ /* through design coordinates. */ /* */ /* <InOut> */ /* face :: A handle to the source face. */ /* */ /* <Input> */ /* num_coords :: The number of design coordinates (must be equal to */ /* the number of axes in the font). */ /* */ /* coords :: An array of design coordinates. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Set_MM_Design_Coordinates( FT_Face face, FT_UInt num_coords, FT_Long* coords ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_MM_Blend_Coordinates */ /* */ /* <Description> */ /* For Multiple Masters fonts, choose an interpolated font design */ /* through normalized blend coordinates. */ /* */ /* <InOut> */ /* face :: A handle to the source face. */ /* */ /* <Input> */ /* num_coords :: The number of design coordinates (must be equal to */ /* the number of axes in the font). */ /* */ /* coords :: The design coordinates array (each element must be */ /* between 0 and 1.0). */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Set_MM_Blend_Coordinates( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ); /* */ FT_END_HEADER #endif /* __FTMM_H__ */ /* END */ */ /***************************************************************************/ #ifndef __FTMM_H__ #define __FTMM_H__ #include <ft2build.h> #include FT_TYPE1_TABLES_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> old_contrib//root/sys/src/cmd/limbo/include/freetype/ftmoderr.h������������������������������������� 664 � 0 � 0 � 15666 7607330530 24010�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftmoderr.h */ /* */ /* FreeType module error offsets (specification). */ /* */ /* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file is used to define the FreeType module error offsets. */ /* */ /* The lower byte gives the error code, the higher byte gives the */ /* module. The base module has error offset 0. For example, the error */ /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ /* `TT_Err_Invalid_File_Format' has value 0xB03, the error */ /* `T1_Err_Invalid_File_Format' has value 0xC03, etc. */ /* */ /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ /* to make the higher byte always zero (disabling the module error */ /* mechanism). */ /* */ /* It can also be used to create a module error message table easily */ /* with something like */ /* */ /* { */ /* #undef __FTMODERR_H__ */ /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ /* #define FT_MODERR_START_LIST { */ /* #define FT_MODERR_END_LIST { 0, 0 } }; */ /* */ /* const struct */ /* { */ /* int mod_err_offset; */ /* const char* mod_err_msg */ /* } ft_mod_errors[] = */ /* */ /* #include FT_MODULE_ERRORS_H */ /* } */ /* */ /* To use such a table, all errors must be ANDed with 0xFF00 to remove */ /* the error code. */ /* */ /*************************************************************************/ #ifndef __FTMODERR_H__ #define __FTMODERR_H__ /*******************************************************************/ /*******************************************************************/ /***** *****/ /***** SETUP MACROS *****/ /***** *****/ /*******************************************************************/ /*******************************************************************/ #undef FT_NEED_EXTERN_C #ifndef FT_MODERRDEF #ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS #define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, #else #define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, #endif #define FT_MODERR_START_LIST enum { #define FT_MODERR_END_LIST FT_Mod_Err_Max }; #ifdef __cplusplus #define FT_NEED_EXTERN_C extern "C" { #endif #endif /* !FT_MODERRDEF */ /*******************************************************************/ /*******************************************************************/ /***** *****/ /***** LIST MODULE ERROR BASES *****/ /***** *****/ /*******************************************************************/ /*******************************************************************/ #ifdef FT_MODERR_START_LIST FT_MODERR_START_LIST #endif FT_MODERRDEF( Base, 0x000, "base module" ) FT_MODERRDEF( Autohint, 0x100, "autohinter module" ) FT_MODERRDEF( Cache, 0x200, "cache module" ) FT_MODERRDEF( CFF, 0x300, "CFF module" ) FT_MODERRDEF( CID, 0x400, "CID module" ) FT_MODERRDEF( PCF, 0x500, "PCF module" ) FT_MODERRDEF( PSaux, 0x600, "PS auxiliary module" ) FT_MODERRDEF( PSnames, 0x700, "PS names module" ) FT_MODERRDEF( Raster, 0x800, "raster module" ) FT_MODERRDEF( SFNT, 0x900, "SFNT module" ) FT_MODERRDEF( Smooth, 0xA00, "smooth raster module" ) FT_MODERRDEF( TrueType, 0xB00, "TrueType module" ) FT_MODERRDEF( Type1, 0xC00, "Type 1 module" ) FT_MODERRDEF( Winfonts, 0xD00, "Windows FON/FNT module" ) FT_MODERRDEF( PFR, 0xE00, "PFR module" ) #ifdef FT_MODERR_END_LIST FT_MODERR_END_LIST #endif /*******************************************************************/ /*******************************************************************/ /***** *****/ /***** CLEANUP *****/ /***** *****/ /*******************************************************************/ /*******************************************************************/ #ifdef FT_NEED_EXTERN_C } #endif #undef FT_MODERR_START_LIST #undef FT_MODERR_END_LIST #undef FT_MODERRDEF #undef FT_NEED_EXTERN_C #endif /* __FTMODERR_H__ */ /* END */ */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/ftmodule.h������������������������������������� 664 � 0 � 0 � 42547 7607330530 24003�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftmodule.h */ /* */ /* FreeType modules public interface (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTMODULE_H__ #define __FTMODULE_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* module_management */ /* */ /* <Title> */ /* Module Management */ /* */ /* <Abstract> */ /* How to add, upgrade, and remove modules from FreeType. */ /* */ /* <Description> */ /* The definitions below are used to manage modules within FreeType. */ /* Modules can be added, upgraded, and removed at runtime. */ /* */ /*************************************************************************/ /* module bit flags */ typedef enum FT_Module_Flags_ { ft_module_font_driver = 1, /* this module is a font driver */ ft_module_renderer = 2, /* this module is a renderer */ ft_module_hinter = 4, /* this module is a glyph hinter */ ft_module_styler = 8, /* this module is a styler */ ft_module_driver_scalable = 0x100, /* the driver supports scalable */ /* fonts */ ft_module_driver_no_outlines = 0x200, /* the driver does not support */ /* vector outlines */ ft_module_driver_has_hinter = 0x400 /* the driver provides its own */ /* hinter */ } FT_Module_Flags; typedef void (*FT_Module_Interface)( void ); typedef FT_Error (*FT_Module_Constructor)( FT_Module module ); typedef void (*FT_Module_Destructor)( FT_Module module ); typedef FT_Module_Interface (*FT_Module_Requester)( FT_Module module, const char* name ); /*************************************************************************/ /* */ /* <Struct> */ /* FT_Module_Class */ /* */ /* <Description> */ /* The module class descriptor. */ /* */ /* <Fields> */ /* module_flags :: Bit flags describing the module. */ /* */ /* module_size :: The size of one module object/instance in */ /* bytes. */ /* */ /* module_name :: The name of the module. */ /* */ /* module_version :: The version, as a 16.16 fixed number */ /* (major.minor). */ /* */ /* module_requires :: The version of FreeType this module requires */ /* (starts at version 2.0, i.e 0x20000) */ /* */ /* module_init :: A function used to initialize (not create) a */ /* new module object. */ /* */ /* module_done :: A function used to finalize (not destroy) a */ /* given module object */ /* */ /* get_interface :: Queries a given module for a specific */ /* interface by name. */ /* */ typedef struct FT_Module_Class_ { FT_ULong module_flags; FT_Long module_size; const FT_String* module_name; FT_Fixed module_version; FT_Fixed module_requires; const void* module_interface; FT_Module_Constructor module_init; FT_Module_Destructor module_done; FT_Module_Requester get_interface; } FT_Module_Class; /*************************************************************************/ /* */ /* <Function> */ /* FT_Add_Module */ /* */ /* <Description> */ /* Adds a new module to a given library instance. */ /* */ /* <InOut> */ /* library :: A handle to the library object. */ /* */ /* <Input> */ /* clazz :: A pointer to class descriptor for the module. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* An error will be returned if a module already exists by that name, */ /* or if the module requires a version of FreeType that is too great. */ /* */ FT_EXPORT( FT_Error ) FT_Add_Module( FT_Library library, const FT_Module_Class* clazz ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Module */ /* */ /* <Description> */ /* Finds a module by its name. */ /* */ /* <Input> */ /* library :: A handle to the library object. */ /* */ /* module_name :: The module's name (as an ASCII string). */ /* */ /* <Return> */ /* A module handle. 0 if none was found. */ /* */ /* <Note> */ /* You should better be familiar with FreeType internals to know */ /* which module to look for :-) */ /* */ FT_EXPORT( FT_Module ) FT_Get_Module( FT_Library library, const char* module_name ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Remove_Module */ /* */ /* <Description> */ /* Removes a given module from a library instance. */ /* */ /* <InOut> */ /* library :: A handle to a library object. */ /* */ /* <Input> */ /* module :: A handle to a module object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The module object is destroyed by the function in case of success. */ /* */ FT_EXPORT( FT_Error ) FT_Remove_Module( FT_Library library, FT_Module module ); /*************************************************************************/ /* */ /* <Function> */ /* FT_New_Library */ /* */ /* <Description> */ /* This function is used to create a new FreeType library instance */ /* from a given memory object. It is thus possible to use libraries */ /* with distinct memory allocators within the same program. */ /* */ /* <Input> */ /* memory :: A handle to the original memory object. */ /* */ /* <Output> */ /* alibrary :: A pointer to handle of a new library object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_New_Library( FT_Memory memory, FT_Library *alibrary ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Done_Library */ /* */ /* <Description> */ /* Discards a given library object. This closes all drivers and */ /* discards all resource objects. */ /* */ /* <Input> */ /* library :: A handle to the target library. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Done_Library( FT_Library library ); typedef void (*FT_DebugHook_Func)( void* arg ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_Debug_Hook */ /* */ /* <Description> */ /* Sets a debug hook function for debugging the interpreter of a font */ /* format. */ /* */ /* <InOut> */ /* library :: A handle to the library object. */ /* */ /* <Input> */ /* hook_index :: The index of the debug hook. You should use the */ /* values defined in ftobjs.h, e.g. */ /* FT_DEBUG_HOOK_TRUETYPE. */ /* */ /* debug_hook :: The function used to debug the interpreter. */ /* */ /* <Note> */ /* Currently, four debug hook slots are available, but only two (for */ /* the TrueType and the Type 1 interpreter) are defined. */ /* */ FT_EXPORT( void ) FT_Set_Debug_Hook( FT_Library library, FT_UInt hook_index, FT_DebugHook_Func debug_hook ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Add_Default_Modules */ /* */ /* <Description> */ /* Adds the set of default drivers to a given library object. */ /* This is only useful when you create a library object with */ /* FT_New_Library() (usually to plug a custom memory manager). */ /* */ /* <InOut> */ /* library :: A handle to a new library object. */ /* */ FT_EXPORT( void ) FT_Add_Default_Modules( FT_Library library ); /* */ FT_END_HEADER #endif /* __FTMODULE_H__ */ /* END */ */ /* clazz :: A pointer to class descriptor for the module. */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/ftoutln.h�������������������������������������� 664 � 0 � 0 � 62331 7607330530 23650�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftoutln.h */ /* */ /* Support for the FT_Outline type used to store glyph shapes of */ /* most scalable font formats (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTOUTLN_H__ #define __FTOUTLN_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* outline_processing */ /* */ /* <Title> */ /* Outline Processing */ /* */ /* <Abstract> */ /* Functions to create, transform, and render vectorial glyph images. */ /* */ /* <Description> */ /* This section contains routines used to create and destroy scalable */ /* glyph images known as `outlines'. These can also be measured, */ /* transformed, and converted into bitmaps and pixmaps. */ /* */ /* <Order> */ /* FT_Outline */ /* FT_Outline_Flags */ /* FT_Outline_New */ /* FT_Outline_Done */ /* FT_Outline_Copy */ /* FT_Outline_Translate */ /* FT_Outline_Transform */ /* FT_Outline_Reverse */ /* FT_Outline_Check */ /* */ /* FT_Outline_Get_CBox */ /* FT_Outline_Get_BBox */ /* */ /* FT_Outline_Get_Bitmap */ /* FT_Outline_Render */ /* */ /* FT_Outline_Decompose */ /* FT_Outline_Funcs */ /* FT_Outline_MoveTo_Func */ /* FT_Outline_LineTo_Func */ /* FT_Outline_ConicTo_Func */ /* FT_Outline_CubicTo_Func */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Decompose */ /* */ /* <Description> */ /* Walks over an outline's structure to decompose it into individual */ /* segments and Bezier arcs. This function is also able to emit */ /* `move to' and `close to' operations to indicate the start and end */ /* of new contours in the outline. */ /* */ /* <Input> */ /* outline :: A pointer to the source target. */ /* */ /* func_interface :: A table of `emitters', i.e,. function pointers */ /* called during decomposition to indicate path */ /* operations. */ /* */ /* <InOut> */ /* user :: A typeless pointer which is passed to each */ /* emitter during the decomposition. It can be */ /* used to store the state during the */ /* decomposition. */ /* */ /* <Return> */ /* FreeType error code. 0 means sucess. */ /* */ FT_EXPORT( FT_Error ) FT_Outline_Decompose( FT_Outline* outline, const FT_Outline_Funcs* func_interface, void* user ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_New */ /* */ /* <Description> */ /* Creates a new outline of a given size. */ /* */ /* <Input> */ /* library :: A handle to the library object from where the */ /* outline is allocated. Note however that the new */ /* outline will NOT necessarily be FREED, when */ /* destroying the library, by FT_Done_FreeType(). */ /* */ /* numPoints :: The maximal number of points within the outline. */ /* */ /* numContours :: The maximal number of contours within the outline. */ /* */ /* <Output> */ /* anoutline :: A handle to the new outline. NULL in case of */ /* error. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The reason why this function takes a `library' parameter is simply */ /* to use the library's memory allocator. */ /* */ FT_EXPORT( FT_Error ) FT_Outline_New( FT_Library library, FT_UInt numPoints, FT_Int numContours, FT_Outline *anoutline ); FT_EXPORT( FT_Error ) FT_Outline_New_Internal( FT_Memory memory, FT_UInt numPoints, FT_Int numContours, FT_Outline *anoutline ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Done */ /* */ /* <Description> */ /* Destroys an outline created with FT_Outline_New(). */ /* */ /* <Input> */ /* library :: A handle of the library object used to allocate the */ /* outline. */ /* */ /* outline :: A pointer to the outline object to be discarded. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* If the outline's `owner' field is not set, only the outline */ /* descriptor will be released. */ /* */ /* The reason why this function takes an `library' parameter is */ /* simply to use FT_Free(). */ /* */ FT_EXPORT( FT_Error ) FT_Outline_Done( FT_Library library, FT_Outline* outline ); FT_EXPORT( FT_Error ) FT_Outline_Done_Internal( FT_Memory memory, FT_Outline* outline ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Check */ /* */ /* <Description> */ /* Check the contents of an outline descriptor. */ /* */ /* <Input> */ /* outline :: A handle to a source outline. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Outline_Check( FT_Outline* outline ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Get_CBox */ /* */ /* <Description> */ /* Returns an outline's `control box'. The control box encloses all */ /* the outline's points, including Bezier control points. Though it */ /* coincides with the exact bounding box for most glyphs, it can be */ /* slightly larger in some situations (like when rotating an outline */ /* which contains Bezier outside arcs). */ /* */ /* Computing the control box is very fast, while getting the bounding */ /* box can take much more time as it needs to walk over all segments */ /* and arcs in the outline. To get the latter, you can use the */ /* `ftbbox' component which is dedicated to this single task. */ /* */ /* <Input> */ /* outline :: A pointer to the source outline descriptor. */ /* */ /* <Output> */ /* acbox :: The outline's control box. */ /* */ FT_EXPORT( void ) FT_Outline_Get_CBox( FT_Outline* outline, FT_BBox *acbox ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Translate */ /* */ /* <Description> */ /* Applies a simple translation to the points of an outline. */ /* */ /* <InOut> */ /* outline :: A pointer to the target outline descriptor. */ /* */ /* <Input> */ /* xOffset :: The horizontal offset. */ /* */ /* yOffset :: The vertical offset. */ /* */ FT_EXPORT( void ) FT_Outline_Translate( FT_Outline* outline, FT_Pos xOffset, FT_Pos yOffset ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Copy */ /* */ /* <Description> */ /* Copies an outline into another one. Both objects must have the */ /* same sizes (number of points & number of contours) when this */ /* function is called. */ /* */ /* <Input> */ /* source :: A handle to the source outline. */ /* */ /* <Output> */ /* target :: A handle to the target outline. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Outline_Copy( FT_Outline* source, FT_Outline *target ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Transform */ /* */ /* <Description> */ /* Applies a simple 2x2 matrix to all of an outline's points. Useful */ /* for applying rotations, slanting, flipping, etc. */ /* */ /* <InOut> */ /* outline :: A pointer to the target outline descriptor. */ /* */ /* <Input> */ /* matrix :: A pointer to the transformation matrix. */ /* */ /* <Note> */ /* You can use FT_Outline_Translate() if you need to translate the */ /* outline's points. */ /* */ FT_EXPORT( void ) FT_Outline_Transform( FT_Outline* outline, FT_Matrix* matrix ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Reverse */ /* */ /* <Description> */ /* Reverses the drawing direction of an outline. This is used to */ /* ensure consistent fill conventions for mirrored glyphs. */ /* */ /* <InOut> */ /* outline :: A pointer to the target outline descriptor. */ /* */ /* <Note> */ /* This functions toggles the bit flag `FT_OUTLINE_REVERSE_FILL' in */ /* the outline's `flags' field. */ /* */ /* It shouldn't be used by a normal client application, unless it */ /* knows what it is doing. */ /* */ FT_EXPORT( void ) FT_Outline_Reverse( FT_Outline* outline ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Get_Bitmap */ /* */ /* <Description> */ /* Renders an outline within a bitmap. The outline's image is simply */ /* OR-ed to the target bitmap. */ /* */ /* <Input> */ /* library :: A handle to a FreeType library object. */ /* */ /* outline :: A pointer to the source outline descriptor. */ /* */ /* <Output> */ /* abitmap :: A pointer to the target bitmap descriptor. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* This function does NOT CREATE the bitmap, it only renders an */ /* outline image within the one you pass to it! */ /* */ /* It will use the raster correponding to the default glyph format. */ /* */ FT_EXPORT( FT_Error ) FT_Outline_Get_Bitmap( FT_Library library, FT_Outline* outline, FT_Bitmap *abitmap ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Outline_Render */ /* */ /* <Description> */ /* Renders an outline within a bitmap using the current scan-convert. */ /* This functions uses an FT_Raster_Params structure as an argument, */ /* allowing advanced features like direct composition, translucency, */ /* etc. */ /* */ /* <Input> */ /* library :: A handle to a FreeType library object. */ /* */ /* outline :: A pointer to the source outline descriptor. */ /* */ /* <InOut> */ /* params :: A pointer to a FT_Raster_Params structure used to */ /* describe the rendering operation. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* You should know what you are doing and how FT_Raster_Params works */ /* to use this function. */ /* */ /* The field `params.source' will be set to `outline' before the scan */ /* converter is called, which means that the value you give to it is */ /* actually ignored. */ /* */ FT_EXPORT( FT_Error ) FT_Outline_Render( FT_Library library, FT_Outline* outline, FT_Raster_Params* params ); /* */ FT_END_HEADER #endif /* __FTOUTLN_H__ */ /* END */ tor. */ /* */ /* <Input> */ /* xOffset :: The horizontal offset. */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/ftpfr.h���������������������������������������� 664 � 0 � 0 � 13412 7607330530 23272�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftpfr.h */ /* */ /* FreeType API for accessing PFR-specific data */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTPFR_H__ #define __FTPFR_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* pfr_fonts */ /* */ /* <Title> */ /* PFR Fonts */ /* */ /* <Abstract> */ /* PFR/TrueDoc specific APIs */ /* */ /* <Description> */ /* This section contains the declaration of PFR-specific functions. */ /* */ /*************************************************************************/ /********************************************************************** * * @function: * FT_Get_PFR_Metrics * * @description: * returns the outline and metrics resolutions of a given PFR * face. * * @input: * face :: handle to input face. It can be a non-PFR face. * * @output: * aoutline_resolution :: * outline resolution. This is equivalent to "face->units_per_EM". * optional (parameter can be NULL) * * ametrics_resolution :: * metrics_resolution. This is equivalent to "outline_resolution" * for non-PFR fonts. can be NULL * optional (parameter can be NULL) * * ametrics_x_scale :: * a 16.16 fixed-point number used to scale distance expressed * in metrics units to device sub-pixels. This is equivalent to * 'face->size->x_scale', but for metrics only. * optional (parameter can be NULL) * * ametrics_y_scale :: * same as 'ametrics_x_scale', but for the vertical direction. * optional (parameter can be NULL) * * @note: * if the input face is not a PFR, this function will return an error. * However, in all cases, it will return valid values. */ FT_EXPORT( FT_Error ) FT_Get_PFR_Metrics( FT_Face face, FT_UInt *aoutline_resolution, FT_UInt *ametrics_resolution, FT_Fixed *ametrics_x_scale, FT_Fixed *ametrics_y_scale ); /********************************************************************** * * @function: * FT_Get_PFR_Kerning * * @description: * returns the kerning pair corresponding to two glyphs in * a PFR face. The distance is expressed in metrics units, unlike * the result of @FT_Get_Kerning. * * @input: * face :: handle to input face. * left :: left glyph index * right :: right glyph index * * @output: * avector :: kerning vector * * @note: * this function always return distances in original PFR metrics * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED * mode, which always return distances converted to outline units. * * you can use the value of the 'x_scale' and 'y_scale' parameters * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels */ FT_EXPORT( FT_Error ) FT_Get_PFR_Kerning( FT_Face face, FT_UInt left, FT_UInt right, FT_Vector *avector ); /********************************************************************** * * @function: * FT_Get_PFR_Advance * * @description: * returns a given glyph advance, expressed in original metrics units, * from a PFR font. * * @input: * face :: handle to input face. * gindex :: glyph index * * @output: * aadvance :: glyph advance in metrics units * * @return: * error code. 0 means success * * @note: * you can use the 'x_scale' or 'y_scale' results of @FT_Get_PFR_Metrics * to convert the advance to device sub-pixels (i.e. 1/64th of pixels) */ FT_EXPORT( FT_Error ) FT_Get_PFR_Advance( FT_Face face, FT_UInt gindex, FT_Pos *aadvance ); /* */ FT_END_HEADER #endif /* __FTBDF_H__ */ /* END */ */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /*old_contrib//root/sys/src/cmd/limbo/include/freetype/ftrender.h������������������������������������� 664 � 0 � 0 � 25315 7607330530 23767�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftrender.h */ /* */ /* FreeType renderer modules public interface (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTRENDER_H__ #define __FTRENDER_H__ #include <ft2build.h> #include FT_MODULE_H #include FT_GLYPH_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* module_management */ /* */ /*************************************************************************/ /* create a new glyph object */ typedef FT_Error (*FT_Glyph_InitFunc)( FT_Glyph glyph, FT_GlyphSlot slot ); /* destroys a given glyph object */ typedef void (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); typedef void (*FT_Glyph_TransformFunc)( FT_Glyph glyph, FT_Matrix* matrix, FT_Vector* delta ); typedef void (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, FT_BBox* abbox ); typedef FT_Error (*FT_Glyph_CopyFunc)( FT_Glyph source, FT_Glyph target ); typedef FT_Error (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, FT_GlyphSlot slot ); /* deprecated */ #define FT_Glyph_Init_Func FT_Glyph_InitFunc #define FT_Glyph_Done_Func FT_Glyph_DoneFunc #define FT_Glyph_Transform_Func FT_Glyph_TransformFunc #define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc #define FT_Glyph_Copy_Func FT_Glyph_CopyFunc #define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc struct FT_Glyph_Class_ { FT_Long glyph_size; FT_Glyph_Format glyph_format; FT_Glyph_InitFunc glyph_init; FT_Glyph_DoneFunc glyph_done; FT_Glyph_CopyFunc glyph_copy; FT_Glyph_TransformFunc glyph_transform; FT_Glyph_GetBBoxFunc glyph_bbox; FT_Glyph_PrepareFunc glyph_prepare; }; typedef FT_Error (*FT_Renderer_RenderFunc)( FT_Renderer renderer, FT_GlyphSlot slot, FT_UInt mode, FT_Vector* origin ); typedef FT_Error (*FT_Renderer_TransformFunc)( FT_Renderer renderer, FT_GlyphSlot slot, FT_Matrix* matrix, FT_Vector* delta ); typedef void (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, FT_GlyphSlot slot, FT_BBox* cbox ); typedef FT_Error (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, FT_ULong mode_tag, FT_Pointer mode_ptr ); /* deprecated identifiers */ #define FTRenderer_render FT_Renderer_RenderFunc #define FTRenderer_transform FT_Renderer_TransformFunc #define FTRenderer_getCBox FT_Renderer_GetCBoxFunc #define FTRenderer_setMode FT_Renderer_SetModeFunc /*************************************************************************/ /* */ /* <Struct> */ /* FT_Renderer_Class */ /* */ /* <Description> */ /* The renderer module class descriptor. */ /* */ /* <Fields> */ /* root :: The root FT_Module_Class fields. */ /* */ /* glyph_format :: The glyph image format this renderer handles. */ /* */ /* render_glyph :: A method used to render the image that is in a */ /* given glyph slot into a bitmap. */ /* */ /* set_mode :: A method used to pass additional parameters. */ /* */ /* raster_class :: For `FT_GLYPH_FORMAT_OUTLINE' renderers only, this */ /* is a pointer to its raster's class. */ /* */ /* raster :: For `FT_GLYPH_FORMAT_OUTLINE' renderers only. this */ /* is a pointer to the corresponding raster object, */ /* if any. */ /* */ typedef struct FT_Renderer_Class_ { FT_Module_Class root; FT_Glyph_Format glyph_format; FT_Renderer_RenderFunc render_glyph; FT_Renderer_TransformFunc transform_glyph; FT_Renderer_GetCBoxFunc get_glyph_cbox; FT_Renderer_SetModeFunc set_mode; FT_Raster_Funcs* raster_class; } FT_Renderer_Class; /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Renderer */ /* */ /* <Description> */ /* Retrieves the current renderer for a given glyph format. */ /* */ /* <Input> */ /* library :: A handle to the library object. */ /* */ /* format :: The glyph format. */ /* */ /* <Return> */ /* A renderer handle. 0 if none found. */ /* */ /* <Note> */ /* An error will be returned if a module already exists by that name, */ /* or if the module requires a version of FreeType that is too great. */ /* */ /* To add a new renderer, simply use FT_Add_Module(). To retrieve a */ /* renderer by its name, use FT_Get_Module(). */ /* */ FT_EXPORT( FT_Renderer ) FT_Get_Renderer( FT_Library library, FT_Glyph_Format format ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Set_Renderer */ /* */ /* <Description> */ /* Sets the current renderer to use, and set additional mode. */ /* */ /* <InOut> */ /* library :: A handle to the library object. */ /* */ /* <Input> */ /* renderer :: A handle to the renderer object. */ /* */ /* num_params :: The number of additional parameters. */ /* */ /* parameters :: Additional parameters. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* In case of success, the renderer will be used to convert glyph */ /* images in the renderer's known format into bitmaps. */ /* */ /* This doesn't change the current renderer for other formats. */ /* */ FT_EXPORT( FT_Error ) FT_Set_Renderer( FT_Library library, FT_Renderer renderer, FT_UInt num_params, FT_Parameter* parameters ); /* */ FT_END_HEADER #endif /* __FTRENDER_H__ */ /* END */ s part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* undersold_contrib//root/sys/src/cmd/limbo/include/freetype/ftsizes.h�������������������������������������� 664 � 0 � 0 � 21766 7607330530 23653�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftsizes.h */ /* */ /* FreeType size objects management (specification). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* Typical application would normally not need to use these functions. */ /* However, they have been placed in a public API for the rare cases */ /* where they are needed. */ /* */ /*************************************************************************/ #ifndef __FTSIZES_H__ #define __FTSIZES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* sizes_management */ /* */ /* <Title> */ /* Size management */ /* */ /* <Abstract> */ /* Managing multiple sizes per face */ /* */ /* <Description> */ /* When creating a new face object (e.g. with @FT_New_Face), an */ /* @FT_Size object is automatically created and used to store all */ /* pixel-size dependent information, available in the "face->size" */ /* field. */ /* */ /* It is however possible to create more sizes for a given face, */ /* mostly in order to manage several character pixel sizes of the */ /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ /* */ /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ /* modify the contents of the current "active" size; you thus need */ /* to use @FT_Activate_Size to change it. */ /* */ /* 99% of applications won't need the functions provided here, */ /* especially if they use the caching sub-system, so be cautious */ /* when using these. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* FT_New_Size */ /* */ /* <Description> */ /* Creates a new size object from a given face object. */ /* */ /* <Input> */ /* face :: A handle to a parent face object. */ /* */ /* <Output> */ /* asize :: A handle to a new size object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* You need to call @FT_Activate_Size in order to select the new size */ /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ /* @FT_Load_Glyph, @FT_Load_Char, etc. */ /* */ FT_EXPORT( FT_Error ) FT_New_Size( FT_Face face, FT_Size* size ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Done_Size */ /* */ /* <Description> */ /* Discards a given size object. */ /* */ /* <Input> */ /* size :: A handle to a target size object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_EXPORT( FT_Error ) FT_Done_Size( FT_Size size ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Activate_Size */ /* */ /* <Description> */ /* Even though it is possible to create several size objects for a */ /* given face (see @FT_New_Size for details), functions like */ /* @FT_Load_Glyph or @FT_Load_Char only use the last-created one to */ /* determine the "current character pixel size". */ /* */ /* This function can be used to "activate" a previously created size */ /* object. */ /* */ /* <Input> */ /* size :: A handle to a target size object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* If "face" is the size's parent face object, this function changes */ /* the value of "face->size" to the input size handle. */ /* */ FT_EXPORT( FT_Error ) FT_Activate_Size( FT_Size size ); /* */ FT_END_HEADER #endif /* __FTSIZES_H__ */ /* END */ library, old_contrib//root/sys/src/cmd/limbo/include/freetype/ftsnames.h������������������������������������� 664 � 0 � 0 � 22560 7607330530 23775�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftsnames.h */ /* */ /* Simple interface to access SFNT name tables (which are used */ /* to hold font names, copyright info, notices, etc.) (specification). */ /* */ /* This is _not_ used to retrieve glyph names! */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FT_SFNT_NAMES_H__ #define __FT_SFNT_NAMES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* sfnt_names */ /* */ /* <Title> */ /* SFNT Names */ /* */ /* <Abstract> */ /* Access the names embedded in TrueType and OpenType files. */ /* */ /* <Description> */ /* The TrueType and OpenType specification allow the inclusion of */ /* a special `names table' in font files. This table contains */ /* textual (and internationalized) information regarding the font, */ /* like family name, copyright, version, etc. */ /* */ /* The definitions below are used to access them if available. */ /* */ /* Note that this has nothing to do with glyph names! */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* FT_SfntName */ /* */ /* <Description> */ /* A structure used to model an SFNT `name' table entry. */ /* */ /* <Fields> */ /* platform_id :: The platform ID for `string'. */ /* */ /* encoding_id :: The encoding ID for `string'. */ /* */ /* language_id :: The language ID for `string'. */ /* */ /* name_id :: An identifier for `string'. */ /* */ /* string :: The `name' string. Note that its format differs */ /* depending on the (platform,encoding) pair. It can */ /* be a Pascal String, a UTF-16 one, etc.. */ /* */ /* Generally speaking, the string is not */ /* zero-terminated. Please refer to the TrueType */ /* specification for details.. */ /* */ /* string_len :: The length of `string' in bytes. */ /* */ /* <Note> */ /* Possible values for `platform_id', `encoding_id', `language_id', */ /* and `name_id' are given in the file `ttnameid.h'. For details */ /* please refer to the TrueType or OpenType specification. */ /* */ typedef struct FT_SfntName_ { FT_UShort platform_id; FT_UShort encoding_id; FT_UShort language_id; FT_UShort name_id; FT_Byte* string; /* this string is *not* null-terminated! */ FT_UInt string_len; /* in bytes */ } FT_SfntName; /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Sfnt_Name_Count */ /* */ /* <Description> */ /* Retrieves the number of name strings in the SFNT `name' table. */ /* */ /* <Input> */ /* face :: A handle to the source face. */ /* */ /* <Return> */ /* The number of strings in the `name' table. */ /* */ FT_EXPORT( FT_UInt ) FT_Get_Sfnt_Name_Count( FT_Face face ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Sfnt_Name */ /* */ /* <Description> */ /* Retrieves a string of the SFNT `name' table for a given index. */ /* */ /* <Input> */ /* face :: A handle to the source face. */ /* */ /* idx :: The index of the `name' string. */ /* */ /* <Output> */ /* aname :: The indexed FT_SfntName structure. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The `string' array returned in the `aname' structure is not */ /* null-terminated. */ /* */ /* Use FT_Get_Sfnt_Name_Count() to get the total number of available */ /* `name' table entries, then do a loop until you get the right */ /* platform, encoding, and name ID. */ /* */ FT_EXPORT( FT_Error ) FT_Get_Sfnt_Name( FT_Face face, FT_UInt idx, FT_SfntName *aname ); /* */ FT_END_HEADER #endif /* __FT_SFNT_NAMES_H__ */ /* END */ */ FT_EXPORT( FT_Error ) FT_Activate_Size( FT_Size size ); /* */ FT_END_HEADER #endif /* __FTSIZES_H__ */ /* END */ library, old_contrib//root/sys/src/cmd/limbo/include/freetype/ftstroker.h������������������������������������ 664 � 0 � 0 � 7017 7607330530 24160�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __FT_STROKER_H__ #define __FT_STROKER_H__ #include <ft2build.h> #include FT_OUTLINE_H FT_BEGIN_HEADER /*@************************************************************* * * @type: FT_Stroker * * @description: * opaque handler to a path stroker object */ typedef struct FT_StrokerRec_* FT_Stroker; /*@************************************************************* * * @enum: FT_Stroker_LineJoin * * @description: * these values determine how two joining lines are rendered * in a stroker. * * @values: * FT_STROKER_LINEJOIN_ROUND :: * used to render rounded line joins. circular arcs are used * to join two lines smoothly * * FT_STROKER_LINEJOIN_BEVEL :: * used to render beveled line joins; i.e. the two joining lines * are extended until they intersect * * FT_STROKER_LINEJOIN_MITER :: * same as beveled rendering, except that an additional line * break is added if the angle between the two joining lines * is too closed (this is useful to avoid unpleasant spikes * in beveled rendering). */ typedef enum { FT_STROKER_LINEJOIN_ROUND = 0, FT_STROKER_LINEJOIN_BEVEL, FT_STROKER_LINEJOIN_MITER } FT_Stroker_LineJoin; /*@************************************************************* * * @enum: FT_Stroker_LineCap * * @description: * these values determine how the end of opened sub-paths are * rendered in a stroke * * @values: * FT_STROKER_LINECAP_BUTT :: * the end of lines is rendered as a full stop on the last * point itself * * FT_STROKER_LINECAP_ROUND :: * the end of lines is rendered as a half-circle around the * last point * * FT_STROKER_LINECAP_SQUARE :: * the end of lines is rendered as a square around the * last point */ typedef enum { FT_STROKER_LINECAP_BUTT = 0, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINECAP_SQUARE } FT_Stroker_LineCap; /* */ FT_EXPORT( FT_Error ) FT_Stroker_New( FT_Memory memory, FT_Stroker *astroker ); FT_EXPORT( void ) FT_Stroker_Set( FT_Stroker stroker, FT_Fixed radius, FT_Stroker_LineCap line_cap, FT_Stroker_LineJoin line_join, FT_Fixed miter_limit ); FT_EXPORT( FT_Error ) FT_Stroker_ParseOutline( FT_Stroker stroker, FT_Outline* outline, FT_Bool opened ); FT_EXPORT( FT_Error ) FT_Stroker_BeginSubPath( FT_Stroker stroker, FT_Vector* to, FT_Bool open ); FT_EXPORT( FT_Error ) FT_Stroker_EndSubPath( FT_Stroker stroker ); FT_EXPORT( FT_Error ) FT_Stroker_LineTo( FT_Stroker stroker, FT_Vector* to ); FT_EXPORT( FT_Error ) FT_Stroker_ConicTo( FT_Stroker stroker, FT_Vector* control, FT_Vector* to ); FT_EXPORT( FT_Error ) FT_Stroker_CubicTo( FT_Stroker stroker, FT_Vector* control1, FT_Vector* control2, FT_Vector* to ); FT_EXPORT( FT_Error ) FT_Stroker_GetCounts( FT_Stroker stroker, FT_UInt *anum_points, FT_UInt *anum_contours ); FT_EXPORT( void ) FT_Stroker_Export( FT_Stroker stroker, FT_Outline* outline ); FT_EXPORT( void ) FT_Stroker_Done( FT_Stroker stroker ); FT_END_HEADER #endif /* __FT_STROKER_H__ */ */ /* */ /* <Description> */ /* A structure used to model an SFNT `name' table entry. */ /* */ /* <Fields> */ /* platform_id :: The platform ID for `string'. old_contrib//root/sys/src/cmd/limbo/include/freetype/ftsynth.h�������������������������������������� 664 � 0 � 0 � 5666 7607330530 23644�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftsynth.h */ /* */ /* FreeType synthesizing code for emboldening and slanting */ /* (specification). */ /* */ /* Copyright 2000-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /********* *********/ /********* WARNING, THIS IS ALPHA CODE, THIS API *********/ /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ /********* FREETYPE DEVELOPMENT TEAM *********/ /********* *********/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #ifndef __FTSYNTH_H__ #define __FTSYNTH_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /* This code is completely experimental -- use with care! */ /* It will probably be completely rewritten in the future */ /* or even integrated into the library. */ FT_EXPORT( void ) FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); FT_EXPORT( void ) FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); /* */ FT_END_HEADER #endif /* __FTSYNTH_H__ */ /* END */ */ /* <Description> old_contrib//root/sys/src/cmd/limbo/include/freetype/ftsysio.h�������������������������������������� 664 � 0 � 0 � 12746 7607330530 23662�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __FT_SYSTEM_IO_H__ #define __FT_SYSTEM_IO_H__ /************************************************************************/ /************************************************************************/ /***** *****/ /***** NOTE: THE CONTENT OF THIS FILE IS NOT CURRENTLY USED *****/ /***** IN NORMAL BUILDS. CONSIDER IT EXPERIMENTAL. *****/ /***** *****/ /************************************************************************/ /************************************************************************/ /******************************************************************** * * designing custom streams is a bit different now * * * * * * * * * * * * * * * * * * * * * * * * */ #include <ft2build.h> #include FT_INTERNAL_OBJECT_H FT_BEGIN_HEADER /*@******************************************************************* * * @type: FT_Stream * * @description: * handle to an input stream object. These are also @FT_Object handles */ typedef struct FT_StreamRec_* FT_Stream; /*@******************************************************************* * * @type: FT_Stream_Class * * @description: * opaque handle to a @FT_Stream_ClassRec class structure describing * the methods of input streams */ typedef const struct FT_Stream_ClassRec_* FT_Stream_Class; /*@******************************************************************* * * @functype: FT_Stream_ReadFunc * * @description: * a method used to read bytes from an input stream into memory * * @input: * stream :: target stream handle * buffer :: target buffer address * size :: number of bytes to read * * @return: * number of bytes effectively read. Must be <= 'size'. */ typedef FT_ULong (*FT_Stream_ReadFunc)( FT_Stream stream, FT_Byte* buffer, FT_ULong size ); /*@******************************************************************* * * @functype: FT_Stream_SeekFunc * * @description: * a method used to seek to a new position within a stream * * @input: * stream :: target stream handle * pos :: new read position, from start of stream * * @return: * error code. 0 means success */ typedef FT_Error (*FT_Stream_SeekFunc)( FT_Stream stream, FT_ULong pos ); /*@******************************************************************* * * @struct: FT_Stream_ClassRec * * @description: * a structure used to describe an input stream class * * @input: * clazz :: root @FT_ClassRec fields * stream_read :: stream byte read method * stream_seek :: stream seek method */ typedef struct FT_Stream_ClassRec_ { FT_ClassRec clazz; FT_Stream_ReadFunc stream_read; FT_Stream_SeekFunc stream_seek; } FT_Stream_ClassRec; /* */ #define FT_STREAM_CLASS(x) ((FT_Stream_Class)(x)) #define FT_STREAM_CLASS__READ(x) FT_STREAM_CLASS(x)->stream_read #define FT_STREAM_CLASS__SEEK(x) FT_STREAM_CLASS(x)->stream_seek; /*@******************************************************************* * * @struct: FT_StreamRec * * @description: * the input stream object structure. See @FT_Stream_ClassRec for * its class descriptor * * @fields: * object :: root @FT_ObjectRec fields * size :: size of stream in bytes (0 if unknown) * pos :: current position within stream * base :: for memory-based streams, the address of the stream's * first data byte in memory. NULL otherwise * * cursor :: the current cursor position within an input stream * frame. Only valid within a FT_FRAME_ENTER .. FT_FRAME_EXIT * block; NULL otherwise * * limit :: the current frame limit within a FT_FRAME_ENTER .. * FT_FRAME_EXIT block. NULL otherwise */ typedef struct FT_StreamRec_ { FT_ObjectRec object; FT_ULong size; FT_ULong pos; const FT_Byte* base; const FT_Byte* cursor; const FT_Byte* limit; } FT_StreamRec; /* some useful macros */ #define FT_STREAM(x) ((FT_Stream)(x)) #define FT_STREAM_P(x) ((FT_Stream*)(x)) #define FT_STREAM__READ(x) FT_STREAM_CLASS__READ(FT_OBJECT__CLASS(x)) #define FT_STREAM__SEEK(x) FT_STREAM_CLASS__SEEK(FT_OBJECT__CLASS(x)) #define FT_STREAM_IS_BASED(x) ( FT_STREAM(x)->base != NULL ) /* */ /* create new memory-based stream */ FT_BASE( FT_Error ) ft_stream_new_memory( const FT_Byte* stream_base, FT_ULong stream_size, FT_Memory memory, FT_Stream *astream ); FT_BASE( FT_Error ) ft_stream_new_iso( const char* pathanme, FT_Memory memory, FT_Stream *astream ); /* handle to default stream class implementation for a given build */ /* this is used by "FT_New_Face" */ /* */ FT_APIVAR( FT_Type ) ft_stream_default_type; FT_END_HEADER #endif /* __FT_SYSTEM_STREAM_H__ */ ND_HEADER #endif /* __FT_old_contrib//root/sys/src/cmd/limbo/include/freetype/ftsysmem.h������������������������������������� 664 � 0 � 0 � 14260 7607330530 24022�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __FT_SYSTEM_MEMORY_H__ #define __FT_SYSTEM_MEMORY_H__ #include <ft2build.h> FT_BEGIN_HEADER /************************************************************************/ /************************************************************************/ /***** *****/ /***** NOTE: THE CONTENT OF THIS FILE IS NOT CURRENTLY USED *****/ /***** IN NORMAL BUILDS. CONSIDER IT EXPERIMENTAL. *****/ /***** *****/ /************************************************************************/ /************************************************************************/ /*@********************************************************************** * * @type: FT_Memory * * @description: * opaque handle to a memory manager handle. Note that since FreeType * 2.2, the memory manager structure FT_MemoryRec is hidden to client * applications. * * however, you can still define custom allocators easily using the * @ft_memory_new API */ typedef struct FT_MemoryRec_* FT_Memory; /*@********************************************************************** * * @functype: FT_Memory_AllocFunc * * @description: * a function used to allocate a block of memory. * * @input: * size :: size of blocks in bytes. Always > 0 !! * mem_data :: memory-manager specific optional argument * (see @ft_memory_new) * * @return: * address of new block. NULL in case of memory exhaustion */ typedef FT_Pointer (*FT_Memory_AllocFunc)( FT_ULong size, FT_Pointer mem_data ); /*@********************************************************************** * * @functype: FT_Memory_FreeFunc * * @description: * a function used to release a block of memory created through * @FT_Memory_AllocFunc or @FT_Memory_ReallocFunc * * @input: * block :: address of target memory block. cannot be NULL !! * mem_data :: memory-manager specific optional argument * (see @ft_memory_new) */ typedef void (*FT_Memory_FreeFunc) ( FT_Pointer block, FT_Pointer mem_data ); /*@********************************************************************** * * @functype: FT_Memory_ReallocFunc * * @description: * a function used to reallocate a memory block. * * @input: * block :: address of target memory block. cannot be NULL !! * new_size :: new requested size in bytes * cur_size :: current block size in bytes * mem_data :: memory-manager specific optional argument * (see @ft_memory_new) */ typedef FT_Pointer (*FT_Memory_ReallocFunc)( FT_Pointer block, FT_ULong new_size, FT_ULong cur_size, FT_Pointer mem_data ); /*@********************************************************************** * * @functype: FT_Memory_CreateFunc * * @description: * a function used to create a @FT_Memory object to model a * memory manager * * @input: * size :: size of memory manager structure in bytes * init_data :: optional initialisation argument * * @output: * amem_data :: memory-manager specific argument to block management * routines. * * @return: * handle to new memory manager object. NULL in case of failure */ typedef FT_Pointer (*FT_Memory_CreateFunc)( FT_UInt size, FT_Pointer init_data, FT_Pointer *amem_data ); /*@********************************************************************** * * @functype: FT_Memory_DestroyFunc * * @description: * a function used to destroy a given @FT_Memory manager * * @input: * memory :: target memory manager handle * mem_data :: option manager-specific argument */ typedef void (*FT_Memory_DestroyFunc)( FT_Memory memory, FT_Pointer mem_data ); /*@********************************************************************** * * @struct: FT_Memory_FuncsRec * * @description: * a function used to hold all methods of a given memory manager * implementation. * * @fields: * mem_alloc :: block allocation routine * mem_free :: block release routine * mem_realloc :: block re-allocation routine * mem_create :: manager creation routine * mem_destroy :: manager destruction routine */ typedef struct FT_Memory_FuncsRec_ { FT_Memory_AllocFunc mem_alloc; FT_Memory_FreeFunc mem_free; FT_Memory_ReallocFunc mem_realloc; FT_Memory_CreateFunc mem_create; FT_Memory_DestroyFunc mem_destroy; } FT_Memory_FuncsRec, *FT_Memory_Funcs; /*@********************************************************************** * * @type: FT_Memory_Funcs * * @description: * a pointer to a constant @FT_Memory_FuncsRec structure used to * describe a given memory manager implementation. */ typedef const FT_Memory_FuncsRec* FT_Memory_Funcs; /*@********************************************************************** * * @function: ft_memory_new * * @description: * create a new memory manager, given a set of memory methods * * @input: * mem_funcs :: handle to memory manager implementation descriptor * mem_init_data :: optional initialisation argument, passed to * @FT_Memory_CreateFunc * * @return: * new memory manager handle. NULL in case of failure */ FT_BASE( FT_Memory ) ft_memory_new( FT_Memory_Funcs mem_funcs, FT_Pointer mem_init_data ); /*@********************************************************************** * * @function: ft_memory_destroy * * @description: * destroy a given memory manager * * @input: * memory :: handle to target memory manager */ FT_BASE( void ) ft_memory_destroy( FT_Memory memory ); /* */ FT_END_HEADER #endif /* __FT_SYSTEM_MEMORY_H__ */ unc * * @description: * a method used to seek to a new position within a stream * * @input: * stream :: target stream handle * pos :: new read position, from start of stream * * @return: * error code. 0 means success */ typedef FT_Error (*FT_Stream_SeekFunc)( FT_Stream stream, old_contrib//root/sys/src/cmd/limbo/include/freetype/ftsystem.h������������������������������������� 664 � 0 � 0 � 43350 7607330530 24033�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftsystem.h */ /* */ /* FreeType low-level system interface definition (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTSYSTEM_H__ #define __FTSYSTEM_H__ #include <ft2build.h> FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* system_interface */ /* */ /* <Title> */ /* System Interface */ /* */ /* <Abstract> */ /* How FreeType manages memory and i/o. */ /* */ /* <Description> */ /* This section contains various definitions related to memory */ /* management and i/o access. You need to understand this */ /* information if you want to use a custom memory manager or you own */ /* input i/o streams. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* M E M O R Y M A N A G E M E N T */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* @type: */ /* FT_Memory */ /* */ /* @description: */ /* A handle to a given memory manager object, defined with a */ /* @FT_MemoryRec structure. */ /* */ typedef struct FT_MemoryRec_* FT_Memory; /*************************************************************************/ /* */ /* @functype: */ /* FT_Alloc_Func */ /* */ /* @description: */ /* A function used to allocate `size' bytes from `memory'. */ /* */ /* @input: */ /* memory :: A handle to the source memory manager. */ /* */ /* size :: The size in bytes to allocate. */ /* */ /* @return: */ /* Address of new memory block. 0 in case of failure. */ /* */ typedef void* (*FT_Alloc_Func)( FT_Memory memory, long size ); /*************************************************************************/ /* */ /* @functype: */ /* FT_Free_Func */ /* */ /* @description: */ /* A function used to release a given block of memory. */ /* */ /* @input: */ /* memory :: A handle to the source memory manager. */ /* */ /* block :: The address of the target memory block. */ /* */ typedef void (*FT_Free_Func)( FT_Memory memory, void* block ); /*************************************************************************/ /* */ /* @functype: */ /* FT_Realloc_Func */ /* */ /* @description: */ /* a function used to re-allocate a given block of memory. */ /* */ /* @input: */ /* memory :: A handle to the source memory manager. */ /* */ /* cur_size :: The block's current size in bytes. */ /* */ /* new_size :: The block's requested new size. */ /* */ /* block :: The block's current address. */ /* */ /* @return: */ /* New block address. 0 in case of memory shortage. */ /* */ /* @note: */ /* In case of error, the old block must still be available. */ /* */ typedef void* (*FT_Realloc_Func)( FT_Memory memory, long cur_size, long new_size, void* block ); /*************************************************************************/ /* */ /* @struct: */ /* FT_MemoryRec */ /* */ /* @description: */ /* A structure used to describe a given memory manager to FreeType 2. */ /* */ /* @fields: */ /* user :: A generic typeless pointer for user data. */ /* */ /* alloc :: A pointer type to an allocation function. */ /* */ /* free :: A pointer type to an memory freeing function. */ /* */ /* realloc :: A pointer type to a reallocation function. */ /* */ struct FT_MemoryRec_ { void* user; FT_Alloc_Func alloc; FT_Free_Func free; FT_Realloc_Func realloc; }; /*************************************************************************/ /* */ /* I / O M A N A G E M E N T */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* @type: */ /* FT_Stream */ /* */ /* @description: */ /* A handle to an input stream. */ /* */ typedef struct FT_StreamRec_* FT_Stream; /*************************************************************************/ /* */ /* @struct: */ /* FT_StreamDesc */ /* */ /* @description: */ /* A union type used to store either a long or a pointer. This is */ /* used to store a file descriptor or a FILE* in an input stream. */ /* */ typedef union FT_StreamDesc_ { long value; void* pointer; } FT_StreamDesc; /*************************************************************************/ /* */ /* @functype: */ /* FT_Stream_IoFunc */ /* */ /* @description: */ /* A function used to seek and read data from a given input stream. */ /* */ /* @input: */ /* stream :: A handle to the source stream. */ /* */ /* offset :: The offset of read in stream (always from start). */ /* */ /* buffer :: The address of the read buffer. */ /* */ /* count :: The number of bytes to read from the stream. */ /* */ /* @return: */ /* The number of bytes effectively read by the stream. */ /* */ /* @note: */ /* This function might be called to perform a seek or skip operation */ /* with a `count' of 0. */ /* */ typedef unsigned long (*FT_Stream_IoFunc)( FT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count ); /*************************************************************************/ /* */ /* @functype: */ /* FT_Stream_CloseFunc */ /* */ /* @description: */ /* A function used to close a given input stream. */ /* */ /* @input: */ /* stream :: A handle to the target stream. */ /* */ typedef void (*FT_Stream_CloseFunc)( FT_Stream stream ); /*************************************************************************/ /* */ /* @struct: */ /* FT_StreamRec */ /* */ /* @description: */ /* A structure used to describe an input stream. */ /* */ /* @input: */ /* base :: For memory-based streams, this is the address of the */ /* first stream byte in memory. This field should */ /* always be set to NULL for disk-based streams. */ /* */ /* size :: The stream size in bytes. */ /* */ /* pos :: The current position within the stream. */ /* */ /* descriptor :: This field is a union that can hold an integer or a */ /* pointer. It is used by stream implementations to */ /* store file descriptors or FILE* pointers. */ /* */ /* pathname :: This field is completely ignored by FreeType. */ /* However, it is often useful during debugging to use */ /* it to store the stream's filename (where available). */ /* */ /* read :: The stream's input function. */ /* */ /* close :: The stream;s close function. */ /* */ /* memory :: The memory manager to use to preload frames. This is */ /* set internally by FreeType and shouldn't be touched */ /* by stream implementations. */ /* */ /* cursor :: This field is set and used internally by FreeType */ /* when parsing frames. */ /* */ /* limit :: This field is set and used internally by FreeType */ /* when parsing frames. */ /* */ typedef struct FT_StreamRec_ { unsigned char* base; unsigned long size; unsigned long pos; FT_StreamDesc descriptor; FT_StreamDesc pathname; FT_Stream_IoFunc read; FT_Stream_CloseFunc close; FT_Memory memory; unsigned char* cursor; unsigned char* limit; } FT_StreamRec; /* */ FT_END_HEADER #endif /* __FTSYSTEM_H__ */ /* END */ */ /* In case of error, the old block must still be available. */ /* */ typedef void* (*FT_Realloc_Func)( FT_Memory memory, old_contrib//root/sys/src/cmd/limbo/include/freetype/fttrigon.h������������������������������������� 664 � 0 � 0 � 46542 7607330530 24017�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* fttrigon.h */ /* */ /* FreeType trigonometric functions (specification). */ /* */ /* Copyright 2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTTRIGON_H__ #define __FTTRIGON_H__ #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* @section: */ /* computations */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* @type: */ /* FT_Angle */ /* */ /* @description: */ /* This type is used to model angle values in FreeType. Note that */ /* the angle is a 16.16 fixed float value expressed in degrees. */ /* */ typedef FT_Fixed FT_Angle; /*************************************************************************/ /* */ /* @macro: */ /* FT_ANGLE_PI */ /* */ /* @description: */ /* The angle pi expressed in @FT_Angle units. */ /* */ #define FT_ANGLE_PI ( 180L << 16 ) /*************************************************************************/ /* */ /* @macro: */ /* FT_ANGLE_2PI */ /* */ /* @description: */ /* The angle 2*pi expressed in @FT_Angle units. */ /* */ #define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) /*************************************************************************/ /* */ /* @macro: */ /* FT_ANGLE_PI2 */ /* */ /* @description: */ /* The angle pi/2 expressed in @FT_Angle units. */ /* */ #define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) /*************************************************************************/ /* */ /* @macro: */ /* FT_ANGLE_PI4 */ /* */ /* @description: */ /* The angle pi/4 expressed in @FT_Angle units. */ /* */ #define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) /*************************************************************************/ /* */ /* @function: */ /* FT_Sin */ /* */ /* @description: */ /* Return the sinus of a given angle in fixed point format. */ /* */ /* @input: */ /* angle :: The input angle. */ /* */ /* @return: */ /* The sinus value. */ /* */ /* @note: */ /* If you need both the sinus and cosinus for a given angle, use the */ /* function @FT_Vector_Unit. */ /* */ FT_EXPORT( FT_Fixed ) FT_Sin( FT_Angle angle ); /*************************************************************************/ /* */ /* @function: */ /* FT_Cos */ /* */ /* @description: */ /* Return the cosinus of a given angle in fixed point format. */ /* */ /* @input: */ /* angle :: The input angle. */ /* */ /* @return: */ /* The cosinus value. */ /* */ /* @note: */ /* If you need both the sinus and cosinus for a given angle, use the */ /* function @FT_Vector_Unit. */ /* */ FT_EXPORT( FT_Fixed ) FT_Cos( FT_Angle angle ); /*************************************************************************/ /* */ /* @function: */ /* FT_Tan */ /* */ /* @description: */ /* Return the tangent of a given angle in fixed point format. */ /* */ /* @input: */ /* angle :: The input angle. */ /* */ /* @return: */ /* The tangent value. */ /* */ FT_EXPORT( FT_Fixed ) FT_Tan( FT_Angle angle ); /*************************************************************************/ /* */ /* @function: */ /* FT_Atan2 */ /* */ /* @description: */ /* Return the arc-tangent corresponding to a given vector (x,y) in */ /* the 2d plane. */ /* */ /* @input: */ /* x :: The horizontal vector coordinate. */ /* */ /* y :: The vertical vector coordinate. */ /* */ /* @return: */ /* The arc-tangent value (i.e. angle). */ /* */ FT_EXPORT( FT_Angle ) FT_Atan2( FT_Fixed x, FT_Fixed y ); /*************************************************************************/ /* */ /* @function: */ /* FT_Angle_Diff */ /* */ /* @description: */ /* Return the difference between two angles. The result is always */ /* constrained to the ]-PI..PI] interval. */ /* */ /* @input: */ /* angle1 :: First angle. */ /* */ /* angle2 :: Second angle. */ /* */ /* @return: */ /* Contrainted value of `value2-value1'. */ /* */ FT_EXPORT( FT_Angle ) FT_Angle_Diff( FT_Angle angle1, FT_Angle angle2 ); /*************************************************************************/ /* */ /* @function: */ /* FT_Vector_Unit */ /* */ /* @description: */ /* Return the unit vector corresponding to a given angle. After the */ /* call, the value of `vec.x' will be `sin(angle)', and the value of */ /* `vec.y' will be `cos(angle)'. */ /* */ /* This function is useful to retrieve both the sinus and cosinus of */ /* a given angle quickly. */ /* */ /* @output: */ /* vec :: The address of target vector. */ /* */ /* @input: */ /* angle :: The address of angle. */ /* */ FT_EXPORT( void ) FT_Vector_Unit( FT_Vector* vec, FT_Angle angle ); /*************************************************************************/ /* */ /* @function: */ /* FT_Vector_Rotate */ /* */ /* @description: */ /* Rotate a vector by a given angle. */ /* */ /* @inout: */ /* vec :: The address of target vector. */ /* */ /* @input: */ /* angle :: The address of angle. */ /* */ FT_EXPORT( void ) FT_Vector_Rotate( FT_Vector* vec, FT_Angle angle ); /*************************************************************************/ /* */ /* @function: */ /* FT_Vector_Length */ /* */ /* @description: */ /* Return the length of a given vector. */ /* */ /* @input: */ /* vec :: The address of target vector. */ /* */ /* @return: */ /* The vector length, expressed in the same units that the original */ /* vector coordinates. */ /* */ FT_EXPORT( FT_Fixed ) FT_Vector_Length( FT_Vector* vec ); /*************************************************************************/ /* */ /* @function: */ /* FT_Vector_Normalize */ /* */ /* @description: */ /* Normalize a given vector (i.e. compute the equivalent unit */ /* vector). */ /* */ /* @inout: */ /* vec :: The address of target vector. */ /* */ FT_EXPORT( void ) FT_Vector_Normalize( FT_Vector* vec ); /*************************************************************************/ /* */ /* @function: */ /* FT_Vector_Polarize */ /* */ /* @description: */ /* Compute both the length and angle of a given vector. */ /* */ /* @input: */ /* vec :: The address of source vector. */ /* */ /* @output: */ /* length :: The vector length. */ /* angle :: The vector angle. */ /* */ FT_EXPORT( void ) FT_Vector_Polarize( FT_Vector* vec, FT_Fixed *length, FT_Angle *angle ); /*************************************************************************/ /* */ /* @function: */ /* FT_Vector_From_Polar */ /* */ /* @description: */ /* Compute vector coordinates from a length and angle. */ /* */ /* @output: */ /* vec :: The address of source vector. */ /* */ /* @input: */ /* length :: The vector length. */ /* angle :: The vector angle. */ /* */ FT_EXPORT( void ) FT_Vector_From_Polar( FT_Vector* vec, FT_Fixed length, FT_Angle angle ); /* */ FT_END_HEADER #endif /* __FTTRIGON_H__ */ /* END */ */ /* */ /* @description: old_contrib//root/sys/src/cmd/limbo/include/freetype/fttypes.h�������������������������������������� 664 � 0 � 0 � 100440 7607330531 23666�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* fttypes.h */ /* */ /* FreeType simple types definitions (specification only). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTTYPES_H__ #define __FTTYPES_H__ #include <ft2build.h> #include FT_CONFIG_CONFIG_H #include FT_SYSTEM_H #include FT_IMAGE_H #include <stddef.h> FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* basic_types */ /* */ /* <Title> */ /* Basic Data Types */ /* */ /* <Abstract> */ /* The basic data types defined by the library. */ /* */ /* <Description> */ /* This section contains the basic data types defined by FreeType 2, */ /* ranging from simple scalar types to bitmap descriptors. More */ /* font-specific structures are defined in a different section. */ /* */ /* <Order> */ /* FT_Byte */ /* FT_Char */ /* FT_Int */ /* FT_UInt */ /* FT_Short */ /* FT_UShort */ /* FT_Long */ /* FT_ULong */ /* FT_Bool */ /* FT_Offset */ /* FT_PtrDist */ /* FT_String */ /* FT_Error */ /* FT_Fixed */ /* FT_Pointer */ /* FT_Pos */ /* FT_Vector */ /* FT_BBox */ /* FT_Matrix */ /* FT_FWord */ /* FT_UFWord */ /* FT_F2Dot14 */ /* FT_UnitVector */ /* FT_F26Dot6 */ /* */ /* */ /* FT_Generic */ /* FT_Generic_Finalizer */ /* */ /* FT_Bitmap */ /* FT_Pixel_Mode */ /* FT_Palette_Mode */ /* FT_Glyph_Format */ /* FT_IMAGE_TAG */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FT_Bool */ /* */ /* <Description> */ /* A typedef of unsigned char, used for simple booleans. */ /* */ typedef unsigned char FT_Bool; /*************************************************************************/ /* */ /* <Type> */ /* FT_FWord */ /* */ /* <Description> */ /* A signed 16-bit integer used to store a distance in original font */ /* units. */ /* */ typedef signed short FT_FWord; /* distance in FUnits */ /*************************************************************************/ /* */ /* <Type> */ /* FT_UFWord */ /* */ /* <Description> */ /* An unsigned 16-bit integer used to store a distance in original */ /* font units. */ /* */ typedef unsigned short FT_UFWord; /* unsigned distance */ /*************************************************************************/ /* */ /* <Type> */ /* FT_Char */ /* */ /* <Description> */ /* A simple typedef for the _signed_ char type. */ /* */ typedef signed char FT_Char; /*************************************************************************/ /* */ /* <Type> */ /* FT_Byte */ /* */ /* <Description> */ /* A simple typedef for the _unsigned_ char type. */ /* */ typedef unsigned char FT_Byte; /*************************************************************************/ /* */ /* <Type> */ /* FT_String */ /* */ /* <Description> */ /* A simple typedef for the char type, usually used for strings. */ /* */ typedef char FT_String; /*************************************************************************/ /* */ /* <Type> */ /* FT_Short */ /* */ /* <Description> */ /* A typedef for signed short. */ /* */ typedef signed short FT_Short; /*************************************************************************/ /* */ /* <Type> */ /* FT_UShort */ /* */ /* <Description> */ /* A typedef for unsigned short. */ /* */ typedef unsigned short FT_UShort; /*************************************************************************/ /* */ /* <Type> */ /* FT_Int */ /* */ /* <Description> */ /* A typedef for the int type. */ /* */ typedef int FT_Int; /*************************************************************************/ /* */ /* <Type> */ /* FT_UInt */ /* */ /* <Description> */ /* A typedef for the unsigned int type. */ /* */ typedef unsigned int FT_UInt; /*************************************************************************/ /* */ /* <Type> */ /* FT_Long */ /* */ /* <Description> */ /* A typedef for signed long. */ /* */ typedef signed long FT_Long; /*************************************************************************/ /* */ /* <Type> */ /* FT_ULong */ /* */ /* <Description> */ /* A typedef for unsigned long. */ /* */ typedef unsigned long FT_ULong; /*************************************************************************/ /* */ /* <Type> */ /* FT_F2Dot14 */ /* */ /* <Description> */ /* A signed 2.14 fixed float type used for unit vectors. */ /* */ typedef signed short FT_F2Dot14; /*************************************************************************/ /* */ /* <Type> */ /* FT_F26Dot6 */ /* */ /* <Description> */ /* A signed 26.6 fixed float type used for vectorial pixel */ /* coordinates. */ /* */ typedef signed long FT_F26Dot6; /*************************************************************************/ /* */ /* <Type> */ /* FT_Fixed */ /* */ /* <Description> */ /* This type is used to store 16.16 fixed float values, like scales */ /* or matrix coefficients. */ /* */ typedef signed long FT_Fixed; /*************************************************************************/ /* */ /* <Type> */ /* FT_Error */ /* */ /* <Description> */ /* The FreeType error code type. A value of 0 is always interpreted */ /* as a successful operation. */ /* */ typedef int FT_Error; /*************************************************************************/ /* */ /* <Type> */ /* FT_Pointer */ /* */ /* <Description> */ /* A simple typedef for a typeless pointer. */ /* */ typedef void* FT_Pointer; /*************************************************************************/ /* */ /* <Type> */ /* FT_Offset */ /* */ /* <Description> */ /* This is equivalent to the ANSI C `size_t' type, i.e. the largest */ /* _unsigned_ integer type used to express a file size or position, */ /* or a memory block size. */ /* */ typedef size_t FT_Offset; /*************************************************************************/ /* */ /* <Type> */ /* FT_PtrDist */ /* */ /* <Description> */ /* This is equivalent to the ANSI C `ptrdiff_t' type, i.e. the */ /* largest _signed_ integer type used to express the distance */ /* between two pointers. */ /* */ typedef size_t FT_PtrDist; /*************************************************************************/ /* */ /* <Struct> */ /* FT_UnitVector */ /* */ /* <Description> */ /* A simple structure used to store a 2D vector unit vector. Uses */ /* FT_F2Dot14 types. */ /* */ /* <Fields> */ /* x :: Horizontal coordinate. */ /* */ /* y :: Vertical coordinate. */ /* */ typedef struct FT_UnitVector_ { FT_F2Dot14 x; FT_F2Dot14 y; } FT_UnitVector; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Matrix */ /* */ /* <Description> */ /* A simple structure used to store a 2x2 matrix. Coefficients are */ /* in 16.16 fixed float format. The computation performed is: */ /* */ /* { */ /* x' = x*xx + y*xy */ /* y' = x*yx + y*yy */ /* } */ /* */ /* <Fields> */ /* xx :: Matrix coefficient. */ /* */ /* xy :: Matrix coefficient. */ /* */ /* yx :: Matrix coefficient. */ /* */ /* yy :: Matrix coefficient. */ /* */ typedef struct FT_Matrix_ { FT_Fixed xx, xy; FT_Fixed yx, yy; } FT_Matrix; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Data */ /* */ /* <Description> */ /* Read-only binary data represented as a pointer and a length. */ /* */ /* <Fields> */ /* pointer :: The data. */ /* */ /* length :: The length of the data in bytes. */ /* */ typedef struct FT_Data_ { const FT_Byte* pointer; FT_Int length; } FT_Data; /*************************************************************************/ /* */ /* <FuncType> */ /* FT_Generic_Finalizer */ /* */ /* <Description> */ /* Describes a function used to destroy the `client' data of any */ /* FreeType object. See the description of the FT_Generic type for */ /* details of usage. */ /* */ /* <Input> */ /* The address of the FreeType object which is under finalization. */ /* Its client data is accessed through its `generic' field. */ /* */ typedef void (*FT_Generic_Finalizer)(void* object); /*************************************************************************/ /* */ /* <Struct> */ /* FT_Generic */ /* */ /* <Description> */ /* Client applications often need to associate their own data to a */ /* variety of FreeType core objects. For example, a text layout API */ /* might want to associate a glyph cache to a given size object. */ /* */ /* Most FreeType object contains a `generic' field, of type */ /* FT_Generic, which usage is left to client applications and font */ /* servers. */ /* */ /* It can be used to store a pointer to client-specific data, as well */ /* as the address of a `finalizer' function, which will be called by */ /* FreeType when the object is destroyed (for example, the previous */ /* client example would put the address of the glyph cache destructor */ /* in the `finalizer' field). */ /* */ /* <Fields> */ /* data :: A typeless pointer to any client-specified data. This */ /* field is completely ignored by the FreeType library. */ /* */ /* finalizer :: A pointer to a `generic finalizer' function, which */ /* will be called when the object is destroyed. If this */ /* field is set to NULL, no code will be called. */ /* */ typedef struct FT_Generic_ { void* data; FT_Generic_Finalizer finalizer; } FT_Generic; /*************************************************************************/ /* */ /* <Macro> */ /* FT_MAKE_TAG */ /* */ /* <Description> */ /* This macro converts four letter tags which are used to label */ /* TrueType tables into an unsigned long to be used within FreeType. */ /* */ /* <Note> */ /* The produced values *must* be 32bit integers. Don't redefine this */ /* macro. */ /* */ #define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ ( ( (FT_ULong)_x1 << 24 ) | \ ( (FT_ULong)_x2 << 16 ) | \ ( (FT_ULong)_x3 << 8 ) | \ (FT_ULong)_x4 ) /*************************************************************************/ /*************************************************************************/ /* */ /* L I S T M A N A G E M E N T */ /* */ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Section> */ /* list_processing */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* FT_ListNode */ /* */ /* <Description> */ /* Many elements and objects in FreeType are listed through a */ /* FT_List record (see FT_ListRec). As its name suggests, a */ /* FT_ListNode is a handle to a single list element. */ /* */ typedef struct FT_ListNodeRec_* FT_ListNode; /*************************************************************************/ /* */ /* <Type> */ /* FT_List */ /* */ /* <Description> */ /* A handle to a list record (see FT_ListRec). */ /* */ typedef struct FT_ListRec_* FT_List; /*************************************************************************/ /* */ /* <Struct> */ /* FT_ListNodeRec */ /* */ /* <Description> */ /* A structure used to hold a single list element. */ /* */ /* <Fields> */ /* prev :: The previous element in the list. NULL if first. */ /* */ /* next :: The next element in the list. NULL if last. */ /* */ /* data :: A typeless pointer to the listed object. */ /* */ typedef struct FT_ListNodeRec_ { FT_ListNode prev; FT_ListNode next; void* data; } FT_ListNodeRec; /*************************************************************************/ /* */ /* <Struct> */ /* FT_ListRec */ /* */ /* <Description> */ /* A structure used to hold a simple doubly-linked list. These are */ /* used in many parts of FreeType. */ /* */ /* <Fields> */ /* head :: The head (first element) of doubly-linked list. */ /* */ /* tail :: The tail (last element) of doubly-linked list. */ /* */ typedef struct FT_ListRec_ { FT_ListNode head; FT_ListNode tail; } FT_ListRec; /* */ #define FT_IS_EMPTY( list ) ( (list).head == 0 ) /* return base error code (without module-specific prefix) */ #define FT_ERROR_BASE( x ) ( (x) & 0xFF ) /* return module error code */ #define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) #define FT_BOOL( x ) ( (FT_Bool)( x ) ) FT_END_HEADER #endif /* __FTTYPES_H__ */ /* END */ */ /* */ typedef struct FT_Data_ { const FT_Byte* pointer; FT_Int length; } FT_Data; /********************old_contrib//root/sys/src/cmd/limbo/include/freetype/ftxf86.h��������������������������������������� 664 � 0 � 0 � 5505 7607330531 23263�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftxf86.h */ /* */ /* Support functions for X11. */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTXF86_H__ #define __FTXF86_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /* this comment is intentionally disabled for now, to prevent this */ /* function from appearing in the API Reference. */ /*@***********************************************************************/ /* */ /* <Function> */ /* FT_Get_X11_Font_Format */ /* */ /* <Description> */ /* Return a string describing the format of a given face as an X11 */ /* FONT_PROPERTY. It should only be used by the FreeType 2 font */ /* backend of the XFree86 font server. */ /* */ /* <Input> */ /* face :: Input face handle. */ /* */ /* <Return> */ /* Font format string. NULL in case of error. */ /* */ FT_EXPORT_DEF( const char* ) FT_Get_X11_Font_Format( FT_Face face ); /* */ FT_END_HEADER #endif /* __FTXF86_H__ */ izer finalizer; } FT_Generic; /*************************************************************************/ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/�������������������������������������� 775 � 0 � 0 � 0 11411737753 23621��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/autohint.h���������������������������� 664 � 0 � 0 � 30474 7607330531 25630�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* autohint.h */ /* */ /* High-level `autohint' module-specific interface (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* The auto-hinter is used to load and automatically hint glyphs if a */ /* format-specific hinter isn't available. */ /* */ /*************************************************************************/ #ifndef __AUTOHINT_H__ #define __AUTOHINT_H__ /*************************************************************************/ /* */ /* A small technical note regarding automatic hinting in order to */ /* clarify this module interface. */ /* */ /* An automatic hinter might compute two kinds of data for a given face: */ /* */ /* - global hints: Usually some metrics that describe global properties */ /* of the face. It is computed by scanning more or less */ /* agressively the glyphs in the face, and thus can be */ /* very slow to compute (even if the size of global */ /* hints is really small). */ /* */ /* - glyph hints: These describe some important features of the glyph */ /* outline, as well as how to align them. They are */ /* generally much faster to compute than global hints. */ /* */ /* The current FreeType auto-hinter does a pretty good job while */ /* performing fast computations for both global and glyph hints. */ /* However, we might be interested in introducing more complex and */ /* powerful algorithms in the future, like the one described in the John */ /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ /* */ /* Because a sufficiently sophisticated font management system would */ /* typically implement an LRU cache of opened face objects to reduce */ /* memory usage, it is a good idea to be able to avoid recomputing */ /* global hints every time the same face is re-opened. */ /* */ /* We thus provide the ability to cache global hints outside of the face */ /* object, in order to speed up font re-opening time. Of course, this */ /* feature is purely optional, so most client programs won't even notice */ /* it. */ /* */ /* I initially thought that it would be a good idea to cache the glyph */ /* hints too. However, my general idea now is that if you really need */ /* to cache these too, you are simply in need of a new font format, */ /* where all this information could be stored within the font file and */ /* decoded on the fly. */ /* */ /*************************************************************************/ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER typedef struct FT_AutoHinterRec_ *FT_AutoHinter; /*************************************************************************/ /* */ /* <FuncType> */ /* FT_AutoHinter_GlobalGetFunc */ /* */ /* <Description> */ /* Retrieves the global hints computed for a given face object the */ /* resulting data is dissociated from the face and will survive a */ /* call to FT_Done_Face(). It must be discarded through the API */ /* FT_AutoHinter_GlobalDoneFunc(). */ /* */ /* <Input> */ /* hinter :: A handle to the source auto-hinter. */ /* */ /* face :: A handle to the source face object. */ /* */ /* <Output> */ /* global_hints :: A typeless pointer to the global hints. */ /* */ /* global_len :: The size in bytes of the global hints. */ /* */ typedef void (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, FT_Face face, void** global_hints, long* global_len ); /*************************************************************************/ /* */ /* <FuncType> */ /* FT_AutoHinter_GlobalDoneFunc */ /* */ /* <Description> */ /* Discards the global hints retrieved through */ /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ /* are freed from memory. */ /* */ /* <Input> */ /* hinter :: A handle to the auto-hinter module. */ /* */ /* global :: A pointer to retrieved global hints to discard. */ /* */ typedef void (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, void* global ); /*************************************************************************/ /* */ /* <FuncType> */ /* FT_AutoHinter_GlobalResetFunc */ /* */ /* <Description> */ /* This function is used to recompute the global metrics in a given */ /* font. This is useful when global font data changes (e.g. Multiple */ /* Masters fonts where blend coordinates change). */ /* */ /* <Input> */ /* hinter :: A handle to the source auto-hinter. */ /* */ /* face :: A handle to the face. */ /* */ typedef void (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, FT_Face face ); /*************************************************************************/ /* */ /* <FuncType> */ /* FT_AutoHinter_GlyphLoadFunc */ /* */ /* <Description> */ /* This function is used to load, scale, and automatically hint a */ /* glyph from a given face. */ /* */ /* <Input> */ /* face :: A handle to the face. */ /* */ /* glyph_index :: The glyph index. */ /* */ /* load_flags :: The load flags. */ /* */ /* <Note> */ /* This function is capable of loading composite glyphs by hinting */ /* each sub-glyph independently (which improves quality). */ /* */ /* It will call the font driver with FT_Load_Glyph(), with */ /* FT_LOAD_NO_SCALE set. */ /* */ typedef FT_Error (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, FT_GlyphSlot slot, FT_Size size, FT_UInt glyph_index, FT_Int32 load_flags ); /*************************************************************************/ /* */ /* <Struct> */ /* FT_AutoHinter_ServiceRec */ /* */ /* <Description> */ /* The auto-hinter module's interface. */ /* */ typedef struct FT_AutoHinter_ServiceRec_ { FT_AutoHinter_GlobalResetFunc reset_face; FT_AutoHinter_GlobalGetFunc get_global_hints; FT_AutoHinter_GlobalDoneFunc done_global_hints; FT_AutoHinter_GlyphLoadFunc load_glyph; } FT_AutoHinter_ServiceRec, *FT_AutoHinter_Service; FT_END_HEADER #endif /* __AUTOHINT_H__ */ /* END */ cribe global properties */ /* of the face. It is computed by scanning more or less */ /* agressively the glyphs in the face, and thus can be */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/bdftypes.h���������������������������� 664 � 0 � 0 � 2717 7607330531 25574�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* bdftypes.h FreeType font driver for bdf fonts Copyright (C) 2001, 2002 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __BDFTYPES_H__ #define __BDFTYPES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER typedef struct BDF_Public_FaceRec_ { FT_FaceRec root; char* charset_encoding; char* charset_registry; } BDF_Public_FaceRec, *BDF_Public_Face; FT_END_HEADER #endif /* __BDFTYPES_H__ */ /* END */ format, */ /* where all this information old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/cfftypes.h���������������������������� 664 � 0 � 0 � 17413 7607330531 25616�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* cfftypes.h */ /* */ /* Basic OpenType/CFF type definitions and interface (specification */ /* only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __CFFTYPES_H__ #define __CFFTYPES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Struct> */ /* CFF_IndexRec */ /* */ /* <Description> */ /* A structure used to model a CFF Index table. */ /* */ /* <Fields> */ /* stream :: The source input stream. */ /* */ /* count :: The number of elements in the index. */ /* */ /* off_size :: The size in bytes of object offsets in index. */ /* */ /* data_offset :: The position of first data byte in the index's */ /* bytes. */ /* */ /* offsets :: A table of element offsets in the index. */ /* */ /* bytes :: If the index is loaded in memory, its bytes. */ /* */ typedef struct CFF_IndexRec_ { FT_Stream stream; FT_UInt count; FT_Byte off_size; FT_ULong data_offset; FT_ULong* offsets; FT_Byte* bytes; } CFF_IndexRec, *CFF_Index; typedef struct CFF_EncodingRec_ { FT_UInt format; FT_ULong offset; FT_UInt count; FT_UShort sids [256]; /* avoid dynamic allocations */ FT_UShort codes[256]; } CFF_EncodingRec, *CFF_Encoding; typedef struct CFF_CharsetRec_ { FT_UInt format; FT_ULong offset; FT_UShort* sids; } CFF_CharsetRec, *CFF_Charset; typedef struct CFF_FontRecDictRec_ { FT_UInt version; FT_UInt notice; FT_UInt copyright; FT_UInt full_name; FT_UInt family_name; FT_UInt weight; FT_Bool is_fixed_pitch; FT_Fixed italic_angle; FT_Pos underline_position; FT_Pos underline_thickness; FT_Int paint_type; FT_Int charstring_type; FT_Matrix font_matrix; FT_UShort units_per_em; FT_Vector font_offset; FT_ULong unique_id; FT_BBox font_bbox; FT_Pos stroke_width; FT_ULong charset_offset; FT_ULong encoding_offset; FT_ULong charstrings_offset; FT_ULong private_offset; FT_ULong private_size; FT_Long synthetic_base; FT_UInt embedded_postscript; FT_UInt base_font_name; FT_UInt postscript; /* these should only be used for the top-level font dictionary */ FT_UInt cid_registry; FT_UInt cid_ordering; FT_ULong cid_supplement; FT_Long cid_font_version; FT_Long cid_font_revision; FT_Long cid_font_type; FT_Long cid_count; FT_ULong cid_uid_base; FT_ULong cid_fd_array_offset; FT_ULong cid_fd_select_offset; FT_UInt cid_font_name; } CFF_FontRecDictRec, *CFF_FontRecDict; typedef struct CFF_PrivateRec_ { FT_Byte num_blue_values; FT_Byte num_other_blues; FT_Byte num_family_blues; FT_Byte num_family_other_blues; FT_Pos blue_values[14]; FT_Pos other_blues[10]; FT_Pos family_blues[14]; FT_Pos family_other_blues[10]; FT_Fixed blue_scale; FT_Pos blue_shift; FT_Pos blue_fuzz; FT_Pos standard_width; FT_Pos standard_height; FT_Byte num_snap_widths; FT_Byte num_snap_heights; FT_Pos snap_widths[13]; FT_Pos snap_heights[13]; FT_Bool force_bold; FT_Fixed force_bold_threshold; FT_Int lenIV; FT_Int language_group; FT_Fixed expansion_factor; FT_Long initial_random_seed; FT_ULong local_subrs_offset; FT_Pos default_width; FT_Pos nominal_width; } CFF_PrivateRec, *CFF_Private; typedef struct CFF_FDSelectRec_ { FT_Byte format; FT_UInt range_count; /* that's the table, taken from the file `as is' */ FT_Byte* data; FT_UInt data_size; /* small cache for format 3 only */ FT_UInt cache_first; FT_UInt cache_count; FT_Byte cache_fd; } CFF_FDSelectRec, *CFF_FDSelect; /* A SubFont packs a font dict and a private dict together. They are */ /* needed to support CID-keyed CFF fonts. */ typedef struct CFF_SubFontRec_ { CFF_FontRecDictRec font_dict; CFF_PrivateRec private_dict; CFF_IndexRec local_subrs_index; FT_UInt num_local_subrs; FT_Byte** local_subrs; } CFF_SubFontRec, *CFF_SubFont; /* maximum number of sub-fonts in a CID-keyed file */ #define CFF_MAX_CID_FONTS 16 typedef struct CFF_FontRec_ { FT_Stream stream; FT_Memory memory; FT_UInt num_faces; FT_UInt num_glyphs; FT_Byte version_major; FT_Byte version_minor; FT_Byte header_size; FT_Byte absolute_offsize; CFF_IndexRec name_index; CFF_IndexRec top_dict_index; CFF_IndexRec string_index; CFF_IndexRec global_subrs_index; CFF_EncodingRec encoding; CFF_CharsetRec charset; CFF_IndexRec charstrings_index; CFF_IndexRec font_dict_index; CFF_IndexRec private_index; CFF_IndexRec local_subrs_index; FT_String* font_name; FT_UInt num_global_subrs; FT_Byte** global_subrs; CFF_SubFontRec top_font; FT_UInt num_subfonts; CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; CFF_FDSelectRec fd_select; /* interface to PostScript hinter */ void* pshinter; /* interface to Postscript Names service */ void* psnames; } CFF_FontRec, *CFF_Font; FT_END_HEADER #endif /* __CFFTYPES_H__ */ /* END */ etro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/fnttypes.h���������������������������� 664 � 0 � 0 � 7422 7607330531 25626�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* fnttypes.h */ /* */ /* Basic Windows FNT/FON type definitions and interface (specification */ /* only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FNTTYPES_H__ #define __FNTTYPES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER typedef struct WinMZ_HeaderRec_ { FT_UShort magic; /* skipped content */ FT_UShort lfanew; } WinMZ_HeaderRec; typedef struct WinNE_HeaderRec_ { FT_UShort magic; /* skipped content */ FT_UShort resource_tab_offset; FT_UShort rname_tab_offset; } WinNE_HeaderRec; typedef struct WinNameInfoRec_ { FT_UShort offset; FT_UShort length; FT_UShort flags; FT_UShort id; FT_UShort handle; FT_UShort usage; } WinNameInfoRec; typedef struct WinResourceInfoRec_ { FT_UShort type_id; FT_UShort count; } WinResourceInfoRec; #define WINFNT_MZ_MAGIC 0x5A4D #define WINFNT_NE_MAGIC 0x454E typedef struct WinFNT_HeaderRec_ { FT_UShort version; FT_ULong file_size; FT_Byte copyright[60]; FT_UShort file_type; FT_UShort nominal_point_size; FT_UShort vertical_resolution; FT_UShort horizontal_resolution; FT_UShort ascent; FT_UShort internal_leading; FT_UShort external_leading; FT_Byte italic; FT_Byte underline; FT_Byte strike_out; FT_UShort weight; FT_Byte charset; FT_UShort pixel_width; FT_UShort pixel_height; FT_Byte pitch_and_family; FT_UShort avg_width; FT_UShort max_width; FT_Byte first_char; FT_Byte last_char; FT_Byte default_char; FT_Byte break_char; FT_UShort bytes_per_row; FT_ULong device_offset; FT_ULong face_name_offset; FT_ULong bits_pointer; FT_ULong bits_offset; FT_Byte reserved; FT_ULong flags; FT_UShort A_space; FT_UShort B_space; FT_UShort C_space; FT_UShort color_table_offset; FT_Byte reserved2[4]; } WinFNT_HeaderRec, *WinFNT_Header; typedef struct FNT_FontRec_ { FT_ULong offset; FT_Int size_shift; WinFNT_HeaderRec header; FT_Byte* fnt_frame; FT_ULong fnt_size; } FNT_FontRec, *FNT_Font; typedef struct FNT_SizeRec_ { FT_SizeRec root; FNT_Font font; } FNT_SizeRec, *FNT_Size; typedef struct FNT_FaceRec_ { FT_FaceRec root; FT_UInt num_fonts; FNT_Font fonts; FT_CharMap charmap_handle; FT_CharMapRec charmap; /* a single charmap per face */ } FNT_FaceRec, *FNT_Face; FT_END_HEADER #endif /* __FNTTYPES_H__ */ /* END */ The number of elements in the index. */ /* */ /* off_size :: The size in bytes of object offsets in index. */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftcalc.h������������������������������ 664 � 0 � 0 � 6734 7607330531 25213�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftcalc.h */ /* */ /* Arithmetic computations (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTCALC_H__ #define __FTCALC_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER FT_EXPORT( FT_Int32 ) FT_SqrtFixed( FT_Int32 x ); #define SQRT_32( x ) FT_Sqrt32( x ) /*************************************************************************/ /* */ /* <Function> */ /* FT_Sqrt32 */ /* */ /* <Description> */ /* Computes the square root of an Int32 integer (which will be */ /* handled as an unsigned long value). */ /* */ /* <Input> */ /* x :: The value to compute the root for. */ /* */ /* <Return> */ /* The result of `sqrt(x)'. */ /* */ FT_EXPORT( FT_Int32 ) FT_Sqrt32( FT_Int32 x ); /*************************************************************************/ /* */ /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ /* */ /*************************************************************************/ #define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) #define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) #define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) #define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) #define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) #define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ : ( -( ( 32 - (x) ) & -64 ) ) ) FT_END_HEADER #endif /* __FTCALC_H__ */ /* END */ FT_Byte** local_subrsold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftcore.h������������������������������ 664 � 0 � 0 � 13256 7607330531 25256�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __FT_CORE_H__ #define __FT_CORE_H__ #include <ft2build.h> #include FT_TYPES_H #include FT_SYSTEM_MEMORY_H FT_BEGIN_HEADER /**************************************************************************/ /**************************************************************************/ /***** *****/ /***** C L E A N U P S T A C K *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ /************************************************************************ * * @functype: FT_CleanupFunc * * @description: * a function used to cleanup a given item on the cleanup stack * * @input: * item :: target item pointer * item_data :: optional argument to cleanup routine */ typedef void (*FT_CleanupFunc)( FT_Pointer item, FT_Pointer item_data ); /************************************************************************ * * @type: FT_XHandler * * @description: * handle to an exception-handler structure for the FreeType * exception sub-system * * @note: * exception handlers are allocated on the stack within a * @FT_XTRY macro. Do not try to access them directly. */ typedef struct FT_XHandlerRec_* FT_XHandler; /* the size of a cleanup chunk in bytes is FT_CLEANUP_CHUNK_SIZE*12 + 4 */ /* this must be a small power of 2 whenever possible.. */ /* */ /* with a value of 5, we have a byte size of 64 bytes per chunk.. */ /* */ #define FT_CLEANUP_CHUNK_SIZE 5 typedef struct FT_CleanupItemRec_ { FT_Pointer item; FT_CleanupFunc item_func; FT_Pointer item_data; } FT_CleanupItemRec; typedef struct FT_CleanupChunkRec_* FT_CleanupChunk; typedef struct FT_CleanupChunkRec_ { FT_CleanupChunk link; FT_CleanupItemRec items[ FT_CLEANUP_CHUNK_SIZE ]; } FT_CleanupChunkRec; typedef struct FT_CleanupStackRec_ { FT_CleanupItem top; FT_CleanupItem limit; FT_CleanupChunk chunk; FT_CleanupChunkRec chunk_0; /* avoids stupid dynamic allocation */ FT_Memory memory; } FT_CleanupStackRec, *FT_CleanupStack; FT_BASE( void ) ft_cleanup_stack_push( FT_CleanupStack stack, FT_Pointer item, FT_CleanupFunc item_func, FT_Pointer item_data ); FT_BASE( void ) ft_cleanup_stack_pop( FT_CleanupStack stack, FT_Int destroy ); FT_BASE( FT_CleanupItem ) ft_cleanup_stack_peek( FT_CleanupStack stack ); FT_BASE( void ) ft_cleanup_throw( FT_CleanupStack stack, FT_Error error ); /**************************************************************************/ /**************************************************************************/ /***** *****/ /***** M E M O R Y M A N A G E R *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ typedef struct FT_MemoryRec_ { FT_Memory_AllocFunc mem_alloc; /* shortcut to funcs->mem_alloc */ FT_Memory_FreeFunc mem_free; /* shortcut to funcs->mem_free */ FT_Pointer mem_data; const FT_Memory_Funcs mem_funcs; FT_CleanupStackRec cleanup_stack; FT_Pointer meta_class; } FT_MemoryRec; #define FT_MEMORY(x) ((FT_Memory)(x)) #define FT_MEMORY__ALLOC(x) FT_MEMORY(x)->mem_alloc #define FT_MEMORY__FREE(x) FT_MEMORY(x)->mem_free #define FT_MEMORY__REALLOC(x) FT_MEMORY(x)->mem_funcs->mem_realloc #define FT_MEMORY__CLEANUP(x) (&FT_MEMORY(x)->cleanup_stack) #define FT_MEMORY__META_CLASS(x) ((FT_MetaClass)(FT_MEMORY(x)->meta_class)) /**************************************************************************/ /**************************************************************************/ /***** *****/ /***** E X C E P T I O N H A N D L I N G *****/ /***** *****/ /**************************************************************************/ /**************************************************************************/ /************************************************************************ * * @struct: FT_XHandlerRec * * @description: * exception handler structure * * @fields: * previous :: previous handler in chain. * jum_buffer :: processor state used by setjmp/longjmp to implement * exception control transfer * error :: exception error code * mark :: top of cleanup stack when @FT_XTRY is used */ typedef struct FT_XHandlerRec_ { FT_XHandler previous; ft_jmp_buf jump_buffer; volatile FT_Error error; FT_Pointer mark; } FT_XHandlerRec; FT_BASE( void ) ft_xhandler_enter( FT_XHandler xhandler, FT_Memory memory ); FT_BASE( void ) ft_xhandler_exit( FT_XHandler xhandler ); FT_END_HEADER #endif /* __FT_CORE_H__ */ �����������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftdebug.h����������������������������� 664 � 0 � 0 � 17243 7607330531 25414�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftdebug.h */ /* */ /* Debugging and logging component (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /* */ /* IMPORTANT: A description of FreeType's debugging support can be */ /* found in "docs/DEBUG.TXT". Read it if you need to use or */ /* understand this code. */ /* */ /***************************************************************************/ #ifndef __FTDEBUG_H__ #define __FTDEBUG_H__ #include <ft2build.h> #include FT_CONFIG_CONFIG_H FT_BEGIN_HEADER /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ /* is already defined; this simplifies the following #ifdefs */ /* */ #ifdef FT_DEBUG_LEVEL_TRACE #undef FT_DEBUG_LEVEL_ERROR #define FT_DEBUG_LEVEL_ERROR #endif /*************************************************************************/ /* */ /* Define the trace enums as well as the trace levels array when they */ /* are needed. */ /* */ /*************************************************************************/ #ifdef FT_DEBUG_LEVEL_TRACE #define FT_TRACE_DEF( x ) trace_ ## x , /* defining the enumeration */ typedef enum { #include FT_INTERNAL_TRACE_H trace_count } FT_Trace; /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ extern int ft_trace_levels[trace_count]; #undef FT_TRACE_DEF #endif /* FT_DEBUG_LEVEL_TRACE */ /*************************************************************************/ /* */ /* Define the FT_TRACE macro */ /* */ /* IMPORTANT! */ /* */ /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ /* value before using any TRACE macro. */ /* */ /*************************************************************************/ #ifdef FT_DEBUG_LEVEL_TRACE #define FT_TRACE( level, varformat ) \ do \ { \ if ( ft_trace_levels[FT_COMPONENT] >= level ) \ FT_Message varformat; \ } while ( 0 ) #else /* !FT_DEBUG_LEVEL_TRACE */ #define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ #endif /* !FT_DEBUG_LEVEL_TRACE */ /*************************************************************************/ /* */ /* You need two opening resp. closing parentheses! */ /* */ /* Example: FT_TRACE0(( "Value is %i", foo )) */ /* */ /*************************************************************************/ #define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) #define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) #define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) #define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) #define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) #define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) #define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) #define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) /*************************************************************************/ /* */ /* Define the FT_ERROR macro */ /* */ /*************************************************************************/ #ifdef FT_DEBUG_LEVEL_ERROR #define FT_ERROR( varformat ) FT_Message varformat #else /* !FT_DEBUG_LEVEL_ERROR */ #define FT_ERROR( varformat ) do ; while ( 0 ) /* nothing */ #endif /* !FT_DEBUG_LEVEL_ERROR */ /*************************************************************************/ /* */ /* Define the FT_ASSERT macro */ /* */ /*************************************************************************/ #ifdef FT_DEBUG_LEVEL_ERROR #define FT_ASSERT( condition ) \ do \ { \ if ( !( condition ) ) \ FT_Panic( "assertion failed on line %d of file %s\n", \ __LINE__, __FILE__ ); \ } while ( 0 ) #else /* !FT_DEBUG_LEVEL_ERROR */ #define FT_ASSERT( condition ) do ; while ( 0 ) #endif /* !FT_DEBUG_LEVEL_ERROR */ /*************************************************************************/ /* */ /* Define 'FT_Message' and 'FT_Panic' when needed */ /* */ /*************************************************************************/ #ifdef FT_DEBUG_LEVEL_ERROR #include "stdio.h" /* for vprintf() */ /* print a message */ FT_EXPORT( void ) FT_Message( const char* fmt, ... ); /* print a message and exit */ FT_EXPORT( void ) FT_Panic( const char* fmt, ... ); #endif /* FT_DEBUG_LEVEL_ERROR */ FT_BASE( void ) ft_debug_init( void ); #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ /* we disable the warning `conditional expression is constant' here */ /* in order to compile cleanly with the maximum level of warnings */ #pragma warning( disable : 4127 ) #endif /* _MSC_VER */ FT_END_HEADER #endif /* __FTDEBUG_H__ */ /* END */ FT_MEMORY__CLEANUP(x) (&FT_MEMORY(x)->cleanup_stack) #define FT_MEMORY__META_CLASS(x) ((FT_MetaClass)(FT_MEMORY(x)->meta_class)) /**************************************************************************/ /**************************************************************************/ /***** old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftdriver.h���������������������������� 664 � 0 � 0 � 22354 7607330531 25620�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftdriver.h */ /* */ /* FreeType font driver interface (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTDRIVER_H__ #define __FTDRIVER_H__ #include <ft2build.h> #include FT_MODULE_H FT_BEGIN_HEADER typedef FT_Error (*FT_Face_InitFunc)( FT_Stream stream, FT_Face face, FT_Int typeface_index, FT_Int num_params, FT_Parameter* parameters ); typedef void (*FT_Face_DoneFunc)( FT_Face face ); typedef FT_Error (*FT_Size_InitFunc)( FT_Size size ); typedef void (*FT_Size_DoneFunc)( FT_Size size ); typedef FT_Error (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); typedef void (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); typedef FT_Error (*FT_Size_ResetPointsFunc)( FT_Size size, FT_F26Dot6 char_width, FT_F26Dot6 char_height, FT_UInt horz_resolution, FT_UInt vert_resolution ); typedef FT_Error (*FT_Size_ResetPixelsFunc)( FT_Size size, FT_UInt pixel_width, FT_UInt pixel_height ); typedef FT_Error (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, FT_Size size, FT_UInt glyph_index, FT_Int32 load_flags ); typedef FT_UInt (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, FT_Long charcode ); typedef FT_Long (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, FT_Long charcode ); typedef FT_Error (*FT_Face_GetKerningFunc)( FT_Face face, FT_UInt left_glyph, FT_UInt right_glyph, FT_Vector* kerning ); typedef FT_Error (*FT_Face_AttachFunc)( FT_Face face, FT_Stream stream ); typedef FT_Error (*FT_Face_GetAdvancesFunc)( FT_Face face, FT_UInt first, FT_UInt count, FT_Bool vertical, FT_UShort* advances ); /*************************************************************************/ /* */ /* <Struct> */ /* FT_Driver_ClassRec */ /* */ /* <Description> */ /* The font driver class. This structure mostly contains pointers to */ /* driver methods. */ /* */ /* <Fields> */ /* root :: The parent module. */ /* */ /* face_object_size :: The size of a face object in bytes. */ /* */ /* size_object_size :: The size of a size object in bytes. */ /* */ /* slot_object_size :: The size of a glyph object in bytes. */ /* */ /* init_face :: The format-specific face constructor. */ /* */ /* done_face :: The format-specific face destructor. */ /* */ /* init_size :: The format-specific size constructor. */ /* */ /* done_size :: The format-specific size destructor. */ /* */ /* init_slot :: The format-specific slot constructor. */ /* */ /* done_slot :: The format-specific slot destructor. */ /* */ /* set_char_sizes :: A handle to a function used to set the new */ /* character size in points + resolution. Can be */ /* set to 0 to indicate default behaviour. */ /* */ /* set_pixel_sizes :: A handle to a function used to set the new */ /* character size in pixels. Can be set to 0 to */ /* indicate default behaviour. */ /* */ /* load_glyph :: A function handle to load a given glyph image */ /* in a slot. This field is mandatory! */ /* */ /* get_char_index :: A function handle to return the glyph index of */ /* a given character for a given charmap. This */ /* field is mandatory! */ /* */ /* get_kerning :: A function handle to return the unscaled */ /* kerning for a given pair of glyphs. Can be */ /* set to 0 if the format doesn't support */ /* kerning. */ /* */ /* attach_file :: This function handle is used to read */ /* additional data for a face from another */ /* file/stream. For example, this can be used to */ /* add data from AFM or PFM files on a Type 1 */ /* face, or a CIDMap on a CID-keyed face. */ /* */ /* get_advances :: A function handle used to return the advances */ /* of 'count' glyphs, starting at `index'. the */ /* `vertical' flags must be set when vertical */ /* advances are queried. The advances buffer is */ /* caller-allocated. */ /* */ /* <Note> */ /* Most function pointers, with the exception of `load_glyph' and */ /* `get_char_index' can be set to 0 to indicate a default behaviour. */ /* */ typedef struct FT_Driver_ClassRec_ { FT_Module_Class root; FT_Int face_object_size; FT_Int size_object_size; FT_Int slot_object_size; FT_Face_InitFunc init_face; FT_Face_DoneFunc done_face; FT_Size_InitFunc init_size; FT_Size_DoneFunc done_size; FT_Slot_InitFunc init_slot; FT_Slot_DoneFunc done_slot; FT_Size_ResetPointsFunc set_char_sizes; FT_Size_ResetPixelsFunc set_pixel_sizes; FT_Slot_LoadFunc load_glyph; FT_Face_GetKerningFunc get_kerning; FT_Face_AttachFunc attach_file; FT_Face_GetAdvancesFunc get_advances; } FT_Driver_ClassRec, *FT_Driver_Class; FT_END_HEADER #endif /* __FTDRIVER_H__ */ /* END */ RY__META_CLASS(x) ((FT_MetaClass)(FT_MEMORY(x)->meta_class)) /**************************************************************************/ /**************************************************************************/ /***** old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftexcept.h���������������������������� 664 � 0 � 0 � 3775 7607330531 25603�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __FT_EXCEPT_H__ #define __FT_EXCEPT_H__ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H FT_BEGIN_HEADER /* I can't find a better place for this for now */ <<<<<<< ftexcept.h ======= /* the size of a cleanup chunk in bytes is FT_CLEANUP_CHUNK_SIZE*12 + 4 */ /* this must be a small power of 2 whenever possible.. */ /* */ /* with a value of 5, we have a byte size of 64 bytes per chunk.. */ /* */ #define FT_CLEANUP_CHUNK_SIZE 5 typedef struct FT_CleanupItemRec_ { FT_Pointer item; FT_CleanupFunc item_func; FT_Pointer item_data; } FT_CleanupItemRec; typedef struct FT_CleanupChunkRec_* FT_CleanupChunk; typedef struct FT_CleanupChunkRec_ { FT_CleanupChunk link; FT_CleanupItemRec items[ FT_CLEANUP_CHUNK_SIZE ]; } FT_CleanupChunkRec; typedef struct FT_CleanupStackRec_ { FT_CleanupItem top; FT_CleanupItem limit; FT_CleanupChunk chunk; FT_CleanupChunkRec chunk_0; /* avoids stupid dynamic allocation */ FT_Memory memory; } FT_CleanupStackRec, *FT_CleanupStack; FT_BASE( void ) ft_cleanup_stack_push( FT_CleanupStack stack, FT_Pointer item, FT_CleanupFunc item_func, FT_Pointer item_data ); FT_BASE( void ) ft_cleanup_stack_pop( FT_CleanupStack stack, FT_Int destroy ); FT_BASE( FT_CleanupItem ) ft_cleanup_stack_peek( FT_CleanupStack stack ); FT_BASE( void ) ft_xhandler_enter( FT_XHandler xhandler, FT_Memory memory ); FT_BASE( void ) ft_xhandler_exit( FT_XHandler xhandler ); FT_BASE( void ) ft_cleanup_throw( FT_CleanupStack stack, FT_Error error ); >>>>>>> 1.2 FT_END_HEADER #endif /* __FT_EXCEPT_H__ */ th,old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftgloadr.h���������������������������� 664 � 0 � 0 � 12456 7607330531 25577�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftgloadr.h */ /* */ /* The FreeType glyph loader (specification). */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTGLOADR_H__ #define __FTGLOADR_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Struct> */ /* FT_GlyphLoader */ /* */ /* <Description> */ /* The glyph loader is an internal object used to load several glyphs */ /* together (for example, in the case of composites). */ /* */ /* <Note> */ /* The glyph loader implementation is not part of the high-level API, */ /* hence the forward structure declaration. */ /* */ typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; #define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 #define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 #define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 #define FT_SUBGLYPH_FLAG_SCALE 8 #define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 #define FT_SUBGLYPH_FLAG_2X2 0x80 #define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 enum { FT_GLYPH_OWN_BITMAP = 1 }; typedef struct FT_SubGlyphRec_ { FT_Int index; FT_UShort flags; FT_Int arg1; FT_Int arg2; FT_Matrix transform; } FT_SubGlyphRec; typedef struct FT_GlyphLoadRec_ { FT_Outline outline; /* outline */ FT_Vector* extra_points; /* extra points table */ FT_UInt num_subglyphs; /* number of subglyphs */ FT_SubGlyph subglyphs; /* subglyphs */ } FT_GlyphLoadRec, *FT_GlyphLoad; typedef struct FT_GlyphLoaderRec_ { FT_Memory memory; FT_UInt max_points; FT_UInt max_contours; FT_UInt max_subglyphs; FT_Bool use_extra; FT_GlyphLoadRec base; FT_GlyphLoadRec current; void* other; /* for possible future extension? */ } FT_GlyphLoaderRec; /* create new empty glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_New( FT_Memory memory, FT_GlyphLoader *aloader ); /* add an extra points table to a glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); /* destroy a glyph loader */ FT_BASE( void ) FT_GlyphLoader_Done( FT_GlyphLoader loader ); /* reset a glyph loader (frees everything int it) */ FT_BASE( void ) FT_GlyphLoader_Reset( FT_GlyphLoader loader ); /* rewind a glyph loader */ FT_BASE( void ) FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); /* check that there is enough room to add 'n_points' and 'n_contours' */ /* to the glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, FT_UInt n_points, FT_UInt n_contours ); /* check that there is enough room to add 'n_subs' sub-glyphs to */ /* a glyph loader */ FT_BASE( FT_Error ) FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, FT_UInt n_subs ); /* prepare a glyph loader, i.e. empty the current glyph */ FT_BASE( void ) FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); /* add the current glyph to the base glyph */ FT_BASE( void ) FT_GlyphLoader_Add( FT_GlyphLoader loader ); /* copy points from one glyph loader to another */ FT_BASE( FT_Error ) FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, FT_GlyphLoader source ); /* */ FT_END_HEADER #endif /* __FTGLOADR_H__ */ /* END */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/fthash.h������������������������������ 664 � 0 � 0 � 34170 7607330531 25247�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************** * * fthash.h - fast dynamic hash tables * * Copyright 2002 by * David Turner, Robert Wilhelm, and Werner Lemberg * * This file is part of the FreeType project, and may only be used, * modified, and distributed under the terms of the FreeType project * license, LICENSE.TXT. By continuing to use, modify, or distribute * this file you indicate that you have read the license and * understand and accept it fully. * * * This header is used to define dynamic hash tables as described * by the article "Main-Memory Linear Hashing - Some Enhancements * of Larson's Algorithm" by Mikael Petterson. * * Basically, linear hashing prevents big "stalls" during * resizes of the buckets array by only splitting one bucket * at a time. This ensures excellent response time even when * the table is frequently resized.. * * * Note that the use of the FT_Hash type is rather unusual in order * to be as generic and efficient as possible. See the comments in the * following definitions for more details. */ #ifndef __FT_HASH_H__ #define __FT_HASH_H__ #include <ft2build.h> #include FT_TYPES_H FT_BEGIN_HEADER /*********************************************************** * * @type: FT_Hash * * @description: * handle to a @FT_HashRec structure used to model a * dynamic hash table */ typedef struct FT_HashRec_* FT_Hash; /*********************************************************** * * @type: FT_HashNode * * @description: * handle to a @FT_HashNodeRec structure used to model a * single node of a hash table */ typedef struct FT_HashNodeRec_* FT_HashNode; /*********************************************************** * * @type: FT_HashLookup * * @description: * handle to a @FT_HashNode pointer. This is returned by * the @ft_hash_lookup function and can later be used by * @ft_hash_add or @ft_hash_remove */ typedef FT_HashNode* FT_HashLookup; /*********************************************************** * * @type: FT_Hash_EqualFunc * * @description: * a function used to compare two nodes of the hash table * * @input: * node1 :: handle to first node * node2 :: handle to second node * * @return: * 1 iff the 'keys' in 'node1' and 'node2' are identical. * 0 otherwise. */ typedef FT_Int (*FT_Hash_EqualFunc)( FT_HashNode node1, FT_HashNode node2 ); /*********************************************************** * * @struct: FT_HashRec * * @description: * a structure used to model a dynamic hash table. * * @fields: * memory :: memory manager used to allocate * the buckets array and the hash nodes * * buckets :: array of hash buckets * * node_size :: size of node in bytes * node_compare :: a function used to compare two nodes * node_hash :: a function used to compute the hash * value of a given node * p :: * mask :: * slack :: * * @note: * 'p', 'mask' and 'slack' are control values managed by * the hash table. Do not try to interpret them directly. * * You can grab the hash table size by calling * '@ft_hash_get_size'. */ typedef struct FT_HashRec_ { FT_HashNode* buckets; FT_UInt p; FT_UInt mask; /* really maxp-1 */ FT_Long slack; FT_Hash_EqualFunc node_equal; FT_Memory memory; } FT_HashRec; /*********************************************************** * * @struct: FT_HashNodeRec * * @description: * a structure used to model the root fields of a dynamic * hash table node. * * it's up to client applications to "sub-class" this * structure to add relevant (key,value) definitions * * @fields: * link :: pointer to next node in bucket's collision list * hash :: 32-bit hash value for this node * * @note: * it's up to client applications to "sub-class" this structure * to add relevant (key,value) type definitions. For example, * if we want to build a "string -> int" mapping, we could use * something like: * * { * typedef struct MyNodeRec_ * { * FT_HashNodeRec hnode; * const char* key; * int value; * * } MyNodeRec, *MyNode; * } * */ typedef struct FT_HashNodeRec_ { FT_HashNode link; FT_UInt32 hash; } FT_HashNodeRec; /**************************************************************** * * @function: ft_hash_init * * @description: * initialize a dynamic hash table * * @input: * table :: handle to target hash table structure * node_equal :: node comparison function * memory :: memory manager handle used to allocate the * buckets array within the hash table * * @return: * error code. 0 means success * * @note: * the node comparison function should only compare node _keys_ * and ignore values !! with good hashing computation (which the * user must perform itself), the comparison function should be * pretty seldom called. * * here is a simple example: * * { * static int my_equal( MyNode node1, * MyNode node2 ) * { * // compare keys of 'node1' and 'node2' * return (strcmp( node1->key, node2->key ) == 0); * } * * .... * * ft_hash_init( &hash, (FT_Hash_EqualFunc) my_compare, memory ); * .... * } */ FT_BASE( FT_Error ) ft_hash_init( FT_Hash table, FT_Hash_EqualFunc compare, FT_Memory memory ); /**************************************************************** * * @function: ft_hash_lookup * * @description: * search a hash table to find a node corresponding to a given * key. * * @input: * table :: handle to target hash table structure * keynode :: handle to a reference hash node that will be * only used for key comparisons with the table's * elements * * @return: * a pointer-to-hash-node value, which must be used as followed: * * - if '*result' is NULL, the key wasn't found in the hash * table. The value of 'result' can be used to add new elements * through @ft_hash_add however.. * * - if '*result' is not NULL, it's a handle to the first table * node that corresponds to the search key. The value of 'result' * can be used to remove this element through @ft_hash_remove * * @note: * here is an example: * * { * // maps a string to an integer with a hash table * // returns -1 in case of failure * // * int my_lookup( FT_Hash table, * const char* key ) * { * MyNode* pnode; * MyNodeRec noderec; * * // set-up key node. It's 'hash' and 'key' fields must * // be set correctly.. we ignore 'link' and 'value' * // * noderec.hnode.hash = strhash( key ); * noderec.key = key; * * // perform search - return value * // * pnode = (MyNode) ft_hash_lookup( table, &noderec ); * if ( *pnode ) * { * // we found it * return (*pnode)->value; * } * return -1; * } * } */ FT_BASE_DEF( FT_HashLookup ) ft_hash_lookup( FT_Hash table, FT_HashNode keynode ); /**************************************************************** * * @function: ft_hash_add * * @description: * add a new node to a dynamic hash table. the user must * call @ft_hash_lookup and allocate a new node before calling * this function. * * @input: * table :: hash table handle * lookup :: pointer-to-hash-node value returned by @ft_hash_lookup * new_node :: handle to new hash node. All its fields must be correctly * set, including 'hash'. * * @return: * error code. 0 means success * * @note: * this function should always be used _after_ a call to @ft_hash_lookup * that returns a pointer to a NULL handle. Here's an example: * * { * // sets the value corresponding to a given string key * // * void my_set( FT_Hash table, * const char* key, * int value ) * { * MyNode* pnode; * MyNodeRec noderec; * MyNode node; * * // set-up key node. It's 'hash' and 'key' fields must * // be set correctly.. * noderec.hnode.hash = strhash( key ); * noderec.key = key; * * // perform search - return value * pnode = (MyNode) ft_hash_lookup( table, &noderec ); * if ( *pnode ) * { * // we found it, simply replace the value in the node * (*pnode)->value = value; * return; * } * * // allocate a new node - and set it up * node = (MyNode) malloc( sizeof(*node) ); * if ( node == NULL ) ..... * * node->hnode.hash = noderec.hnode.hash; * node->key = key; * node->value = value; * * // add it to the hash table * error = ft_hash_add( table, pnode, node ); * if (error) .... * } */ FT_BASE( FT_Error ) ft_hash_add( FT_Hash table, FT_HashLookup lookup, FT_HashNode new_node ); /**************************************************************** * * @function: ft_hash_remove * * @description: * try to remove the node corresponding to a given key from * a hash table. This must be called after @ft_hash_lookup * * @input: * table :: hash table handle * lookup :: pointer-to-hash-node value returned by @ft_hash_lookup * * @note: * this function doesn't free the node itself !! Here's an example: * * { * // sets the value corresponding to a given string key * // * void my_remove( FT_Hash table, * const char* key ) * { * MyNodeRec noderec; * MyNode node; * * noderec.hnode.hash = strhash(key); * noderec.key = key; * node = &noderec; * * pnode = ft_hash_lookup( table, &noderec ); * node = *pnode; * if ( node != NULL ) * { * error = ft_hash_remove( table, pnode ); * if ( !error ) * free( node ); * } * } * } */ FT_BASE( FT_Error ) ft_hash_remove( FT_Hash table, FT_HashLookup lookup ); /**************************************************************** * * @function: ft_hash_get_size * * @description: * return the number of elements in a given hash table * * @input: * table :: handle to target hash table structure * * @return: * number of elements. 0 if empty */ FT_BASE( FT_UInt ) ft_hash_get_size( FT_Hash table ); /**************************************************************** * * @functype: FT_Hash_ForeachFunc * * @description: * a function used to iterate over all elements of a given * hash table * * @input: * node :: handle to target @FT_HashNodeRec node structure * data :: optional argument to iteration routine * * @also: @ft_hash_foreach */ typedef void (*FT_Hash_ForeachFunc)( const FT_HashNode node, const FT_Pointer data ); /**************************************************************** * * @function: ft_hash_foreach * * @description: * parse over all elements in a hash table * * @input: * table :: handle to target hash table structure * foreach_func :: iteration routine called for each element * foreach_data :: optional argument to the iteration routine * * @note: * this function is often used to release all elements from a * hash table. See the example given for @ft_hash_done */ FT_BASE( void ) ft_hash_foreach( FT_Hash table, FT_Hash_ForeachFunc foreach_func, const FT_Pointer foreach_data ); /**************************************************************** * * @function: ft_hash_done * * @description: * finalize a given hash table * * @input: * table :: handle to target hash table structure * node_func :: optional iteration function pointer. this * can be used to destroy all nodes explicitely * node_data :: optional argument to the node iterator * * @note: * this function simply frees the hash table's buckets. * you probably will need to call @ft_hash_foreach to * destroy all its elements before @ft_hash_done, as in * the following example: * * { * static void my_node_clear( const MyNode node ) * { * free( node ); * } * * static void my_done( FT_Hash table ) * { * ft_hash_done( table, (FT_Hash_ForeachFunc) my_node_clear, NULL ); * } * } */ FT_BASE( void ) ft_hash_done( FT_Hash table, FT_Hash_ForeachFunc item_func, const FT_Pointer item_data ); /* */ /* compute bucket index from hash value in a dynamic hash table */ /* this is only used to break encapsulation to speed lookups in */ /* the FreeType cache manager !! */ /* */ #define FT_HASH_COMPUTE_INDEX(_table,_hash,_index) \ { \ FT_UInt _mask = (_table)->mask; \ FT_UInt _hash0 = (_hash); \ \ (_index) = (FT_UInt)( (_hash0) & _mask ) ); \ if ( (_index) < (_table)->p ) \ (_index) = (FT_uInt)( (_hash0) & ( 2*_mask+1 ) ); \ } FT_END_HEADER #endif /* __FT_HASH_H__ */ xample, * if we want to build a "string -> int" mapping, we could use * something like: * * { * typedef struct MyNodeRec_ * { * FT_HashNodeRec hnode; * const char* key; * int value; * * } MyNodeRec, *MyNode; * } * */ typedef struct FT_HashNodeRec_ { FT_HashNode link; FT_UInt32 hash; } FT_Hold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftmemory.h���������������������������� 664 � 0 � 0 � 35243 7607330531 25636�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftmemory.h */ /* */ /* The FreeType memory management macros (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTMEMORY_H__ #define __FTMEMORY_H__ #include <ft2build.h> #include FT_CONFIG_CONFIG_H #include FT_TYPES_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Macro> */ /* FT_SET_ERROR */ /* */ /* <Description> */ /* This macro is used to set an implicit `error' variable to a given */ /* expression's value (usually a function call), and convert it to a */ /* boolean which is set whenever the value is != 0. */ /* */ #undef FT_SET_ERROR #define FT_SET_ERROR( expression ) \ ( ( error = (expression) ) != 0 ) /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** M E M O R Y ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #ifdef FT_DEBUG_MEMORY FT_BASE( FT_Error ) FT_Alloc_Debug( FT_Memory memory, FT_Long size, void* *P, const char* file_name, FT_Long line_no ); FT_BASE( FT_Error ) FT_Realloc_Debug( FT_Memory memory, FT_Long current, FT_Long size, void* *P, const char* file_name, FT_Long line_no ); FT_BASE( void ) FT_Free_Debug( FT_Memory memory, FT_Pointer block, const char* file_name, FT_Long line_no ); #endif /*************************************************************************/ /* */ /* <Function> */ /* FT_Alloc */ /* */ /* <Description> */ /* Allocates a new block of memory. The returned area is always */ /* zero-filled; this is a strong convention in many FreeType parts. */ /* */ /* <Input> */ /* memory :: A handle to a given `memory object' which handles */ /* allocation. */ /* */ /* size :: The size in bytes of the block to allocate. */ /* */ /* <Output> */ /* P :: A pointer to the fresh new block. It should be set to */ /* NULL if `size' is 0, or in case of error. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_BASE( FT_Error ) FT_Alloc( FT_Memory memory, FT_Long size, void* *P ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Realloc */ /* */ /* <Description> */ /* Reallocates a block of memory pointed to by `*P' to `Size' bytes */ /* from the heap, possibly changing `*P'. */ /* */ /* <Input> */ /* memory :: A handle to a given `memory object' which handles */ /* reallocation. */ /* */ /* current :: The current block size in bytes. */ /* */ /* size :: The new block size in bytes. */ /* */ /* <InOut> */ /* P :: A pointer to the fresh new block. It should be set to */ /* NULL if `size' is 0, or in case of error. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* All callers of FT_Realloc() _must_ provide the current block size */ /* as well as the new one. */ /* */ FT_BASE( FT_Error ) FT_Realloc( FT_Memory memory, FT_Long current, FT_Long size, void** P ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Free */ /* */ /* <Description> */ /* Releases a given block of memory allocated through FT_Alloc(). */ /* */ /* <Input> */ /* memory :: A handle to a given `memory object' which handles */ /* memory deallocation */ /* */ /* P :: This is the _address_ of a _pointer_ which points to the */ /* allocated block. It is always set to NULL on exit. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* If P or *P are NULL, this function should return successfully. */ /* This is a strong convention within all of FreeType and its */ /* drivers. */ /* */ FT_BASE( void ) FT_Free( FT_Memory memory, void** P ); #define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) #define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) #define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) #define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) #define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) /*************************************************************************/ /* */ /* We first define FT_MEM_ALLOC, FT_MEM_REALLOC, and FT_MEM_FREE. All */ /* macros use an _implicit_ `memory' parameter to access the current */ /* memory allocator. */ /* */ #ifdef FT_DEBUG_MEMORY #define FT_MEM_ALLOC( _pointer_, _size_ ) \ FT_Alloc_Debug( memory, _size_, \ (void**)&(_pointer_), __FILE__, __LINE__ ) #define FT_MEM_REALLOC( _pointer_, _current_, _size_ ) \ FT_Realloc_Debug( memory, _current_, _size_, \ (void**)&(_pointer_), __FILE__, __LINE__ ) #define FT_MEM_FREE( _pointer_ ) \ FT_Free_Debug( memory, (void**)&(_pointer_), __FILE__, __LINE__ ) #else /* !FT_DEBUG_MEMORY */ #define FT_MEM_ALLOC( _pointer_, _size_ ) \ FT_Alloc( memory, _size_, (void**)&(_pointer_) ) #define FT_MEM_FREE( _pointer_ ) \ FT_Free( memory, (void**)&(_pointer_) ) #define FT_MEM_REALLOC( _pointer_, _current_, _size_ ) \ FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) ) #endif /* !FT_DEBUG_MEMORY */ /*************************************************************************/ /* */ /* The following functions macros expect that their pointer argument is */ /* _typed_ in order to automatically compute array element sizes. */ /* */ #define FT_MEM_NEW( _pointer_ ) \ FT_MEM_ALLOC( _pointer_, sizeof ( *(_pointer_) ) ) #define FT_MEM_NEW_ARRAY( _pointer_, _count_ ) \ FT_MEM_ALLOC( _pointer_, (_count_) * sizeof ( *(_pointer_) ) ) #define FT_MEM_RENEW_ARRAY( _pointer_, _old_, _new_ ) \ FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( *(_pointer_) ), \ (_new_) * sizeof ( *(_pointer_) ) ) /*************************************************************************/ /* */ /* the following macros are obsolete but kept for compatibility reasons */ /* */ #define FT_MEM_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ FT_MEM_ALLOC( _pointer_, (_count_) * sizeof ( _type_ ) ) #define FT_MEM_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \ FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( _type ), \ (_new_) * sizeof ( _type_ ) ) /*************************************************************************/ /* */ /* The following macros are variants of their FT_MEM_XXXX equivalents; */ /* they are used to set an _implicit_ `error' variable and return TRUE */ /* if an error occured (i.e. if 'error != 0'). */ /* */ #define FT_ALLOC( _pointer_, _size_ ) \ FT_SET_ERROR( FT_MEM_ALLOC( _pointer_, _size_ ) ) #define FT_REALLOC( _pointer_, _current_, _size_ ) \ FT_SET_ERROR( FT_MEM_REALLOC( _pointer_, _current_, _size_ ) ) #define FT_FREE( _pointer_ ) \ FT_MEM_FREE( _pointer_ ) #define FT_NEW( _pointer_ ) \ FT_SET_ERROR( FT_MEM_NEW( _pointer_ ) ) #define FT_NEW_ARRAY( _pointer_, _count_ ) \ FT_SET_ERROR( FT_MEM_NEW_ARRAY( _pointer_, _count_ ) ) #define FT_RENEW_ARRAY( _pointer_, _old_, _new_ ) \ FT_SET_ERROR( FT_MEM_RENEW_ARRAY( _pointer_, _old_, _new_ ) ) #define FT_ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ FT_SET_ERROR( FT_MEM_ALLOC( _pointer_, \ (_count_) * sizeof ( _type_ ) ) ) #define FT_REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \ FT_SET_ERROR( FT_MEM_REALLOC( _pointer_, \ (_old_) * sizeof ( _type_ ), \ (_new_) * sizeof ( _type_ ) ) ) /* */ FT_END_HEADER #endif /* __FTMEMORY_H__ */ /* END */ */ /* size :: The size in bytes of the block to allocate. */ /* */ /* <Output> */ /* P :: A pointer to the fresh new bold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftobject.h���������������������������� 664 � 0 � 0 � 32705 7607330531 25574�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __FT_OBJECT_H__ #define __FT_OBJECT_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /************************************************************** * * @type: FT_Object * * @description: * handle to a FreeType Object. See @FT_ObjectRec */ typedef struct FT_ObjectRec_* FT_Object; /************************************************************** * * @type: FT_Class * * @description: * handle to a constant class handle to a FreeType Object. * * Note that a class is itself a @FT_Object and are dynamically * allocated on the heap. * * @also: * @FT_ClassRec, @FT_Object, @FT_ObjectRec, @FT_Type, @FT_TypeRec */ typedef const struct FT_ClassRec_* FT_Class; /************************************************************** * * @type: FT_Type * * @description: * handle to a constant structure (of type @FT_TypeRec) used * to describe a given @FT_Class type to the FreeType object * sub-system. */ typedef const struct FT_TypeRec_* FT_Type; /************************************************************** * * @struct: FT_ObjectRec * * @description: * a structure describing the root fields of all @FT_Object * class instances in FreeType * * @fields: * clazz :: handle to the object's class * ref_count :: object's reference count. Starts at 1 */ typedef struct FT_ObjectRec_ { FT_Class clazz; FT_Int ref_count; } FT_ObjectRec; /************************************************************** * * @macro: FT_OBJECT (x) * * @description: * a useful macro to type-cast anything to a @FT_Object * handle. No check performed.. */ #define FT_OBJECT(x) ((FT_Object)(x)) /************************************************************** * * @macro: FT_OBJECT_P (x) * * @description: * a useful macro to type-cast anything to a pointer to * @FT_Object handle. */ #define FT_OBJECT_P(x) ((FT_Object*)(x)) /************************************************************** * * @macro: FT_OBJECT__CLASS (obj) * * @description: * a useful macro to return the class of any object */ #define FT_OBJECT__CLASS(x) FT_OBJECT(x)->clazz /************************************************************** * * @macro: FT_OBJECT__REF_COUNT (obj) * * @description: * a useful macro to return the reference count of any object */ #define FT_OBJECT__REF_COUNT(x) FT_OBJECT(x)->ref_count /************************************************************** * * @macro: FT_OBJECT__MEMORY (obj) * * @description: * a useful macro to return a handle to the memory manager * used to allocate a given object */ #define FT_OBJECT__MEMORY(x) FT_CLASS__MEMORY(FT_OBJECT(x)->clazz) /************************************************************** * * @macro: FT_OBJECT__LIBRARY (obj) * * @description: * a useful macro to return a handle to the library handle * that owns the object */ #define FT_OBJECT__LIBRARY(x) FT_CLASS__LIBRARY(FT_OBJECT(x)->clazz) /************************************************************** * * @functype: FT_Object_InitFunc * * @description: * a function used to initialize a new object * * @input: * object :: target object handle * init_data :: optional pointer to initialization data * * @return: * error code. 0 means success */ typedef FT_Error (*FT_Object_InitFunc)( FT_Object object, FT_Pointer init_data ); /************************************************************** * * @functype: FT_Object_DoneFunc * * @description: * a function used to finalize a given object * * @input: * object :: handle to target object */ typedef void (*FT_Object_DoneFunc)( FT_Object object ); /************************************************************** * * @struct: FT_ClassRec * * @description: * a structure used to describe a given object class within * FreeType * * @fields: * object :: root @FT_ObjectRec fields, since each class is * itself an object. (it's an instance of the * "metaclass", a special object of the FreeType * object sub-system.) * * magic :: a 32-bit magic number used for decoding * super :: pointer to super class * type :: the @FT_Type descriptor of this class * memory :: the current memory manager handle * library :: the current library handle * info :: an opaque pointer to class-specific information * managed by the FreeType object sub-system * * class_done :: the class destructor function * * obj_size :: size of class instances in bytes * obj_init :: class instance constructor * obj_done :: class instance destructor */ typedef struct FT_ClassRec_ { FT_ObjectRec object; FT_UInt32 magic; FT_Class super; FT_Type type; FT_Memory memory; FT_Library library; FT_Pointer info; FT_Object_DoneFunc class_done; FT_UInt obj_size; FT_Object_InitFunc obj_init; FT_Object_DoneFunc obj_done; } FT_ClassRec; /************************************************************** * * @macro: FT_CLASS (x) * * @description: * a useful macro to convert anything to a class handle * without checks */ #define FT_CLASS(x) ((FT_Class)(x)) /************************************************************** * * @macro: FT_CLASS_P (x) * * @description: * a useful macro to convert anything to a pointer to a class * handle without checks */ #define FT_CLASS_P(x) ((FT_Class*)(x)) /************************************************************** * * @macro: FT_CLASS__MEMORY (clazz) * * @description: * a useful macro to return the memory manager handle of a * given class */ #define FT_CLASS__MEMORY(x) FT_CLASS(x)->memory /************************************************************** * * @macro: FT_CLASS__LIBRARY (clazz) * * @description: * a useful macro to return the library handle of a * given class */ #define FT_CLASS__LIBRARY(x) FT_CLASS(x)->library /************************************************************** * * @macro: FT_CLASS__TYPE (clazz) * * @description: * a useful macro to return the type of a given class * given class */ #define FT_CLASS__TYPE(x) FT_CLASS(x)->type /* */ #define FT_CLASS__INFO(x) FT_CLASS(x)->info #define FT_CLASS__MAGIC(x) FT_CLASS(x)->magic /************************************************************** * * @struct: FT_TypeRec * * @description: * a structure used to describe a given class to the FreeType * object sub-system. * * @fields: * name :: class name. only used for debugging * super :: type of super-class. NULL if none * * class_size :: size of class structure in bytes * class_init :: class constructor * class_done :: class finalizer * * obj_size :: instance size in bytes * obj_init :: instance constructor. can be NULL * obj_done :: instance destructor. can be NULL * * @note: * if 'obj_init' is NULL, the class will use it's parent * constructor, if any * * if 'obj_done' is NULL, the class will use it's parent * finalizer, if any * * the object sub-system allocates a new class, copies * the content of its super-class into the new structure, * _then_ calls 'clazz_init'. * * 'class_init' and 'class_done' can be NULL, in which case * the parent's class constructor and destructor wil be used */ typedef struct FT_TypeRec_ { const char* name; FT_Type super; FT_UInt class_size; FT_Object_InitFunc class_init; FT_Object_DoneFunc class_done; FT_UInt obj_size; FT_Object_InitFunc obj_init; FT_Object_DoneFunc obj_done; } FT_TypeRec; /************************************************************** * * @macro: FT_TYPE (x) * * @description: * a useful macro to convert anything to a class type handle * without checks */ #define FT_TYPE(x) ((FT_Type)(x)) /************************************************************** * * @function: ft_object_check * * @description: * checks that a handle points to a valid @FT_Object * * @input: * obj :: handle/pointer * * @return: * 1 iff the handle points to a valid object. 0 otherwise */ FT_BASE( FT_Int ) ft_object_check( FT_Pointer obj ); /************************************************************** * * @function: ft_object_is_a * * @description: * checks that a handle points to a valid @FT_Object that * is an instance of a given class (or of any of its sub-classes) * * @input: * obj :: handle/pointer * clazz :: class handle to check * * @return: * 1 iff the handle points to a valid 'clazz' instance. 0 * otherwise. */ FT_BASE( FT_Int ) ft_object_is_a( FT_Pointer obj, FT_Class clazz ); /************************************************************** * * @function: ft_object_create * * @description: * create a new object (class instance) * * @output: * aobject :: new object handle. NULL in case of error * * @input: * clazz :: object's class pointer * init_data :: optional pointer to initialization data * * @return: * error code. 0 means success */ FT_BASE( FT_Error ) ft_object_create( FT_Object *aobject, FT_Class clazz, FT_Pointer init_data ); /************************************************************** * * @function: ft_object_create_from_type * * @description: * create a new object (class instance) from a @FT_Type * * @output: * aobject :: new object handle. NULL in case of error * * @input: * type :: object's type descriptor * init_data :: optional pointer to initialization data * * @return: * error code. 0 means success * * @note: * this function is slower than @ft_object_create * * this is equivalent to calling @ft_class_from_type followed by * @ft_object_create */ FT_BASE( FT_Error ) ft_object_create_from_type( FT_Object *aobject, FT_Type type, FT_Pointer init_data, FT_Library library ); /************************************************************** * * @macro FT_OBJ_CREATE (object,class,init) * * @description: * a convenient macro used to create new objects. see * @ft_object_create for details */ #define FT_OBJ_CREATE( _obj, _clazz, _init ) \ ft_object_create( FT_OBJECT_P(&(_obj)), _clazz, _init ) /************************************************************** * * @macro FT_CREATE (object,class,init) * * @description: * a convenient macro used to create new objects. It also * sets an _implicit_ local variable named "error" to the error * code returned by the object constructor. */ #define FT_CREATE( _obj, _clazz, _init ) \ FT_SET_ERROR( FT_OBJ_CREATE( _obj, _clazz, _init ) ) /************************************************************** * * @macro FT_OBJ_CREATE_FROM_TYPE (object,type,init) * * @description: * a convenient macro used to create new objects. see * @ft_object_create_from_type for details */ #define FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \ ft_object_create_from_type( FT_OBJECT_P(&(_obj)), _type, _init, _lib ) /************************************************************** * * @macro FT_CREATE_FROM_TYPE (object,type,init) * * @description: * a convenient macro used to create new objects. It also * sets an _implicit_ local variable named "error" to the error * code returned by the object constructor. */ #define FT_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \ FT_SET_ERROR( FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) ) /* */ /************************************************************** * * @function: ft_class_from_type * * @description: * retrieves the class object corresponding to a given type * descriptor. The class is created when needed * * @output: * aclass :: handle to corresponding class object. NULL in * case of error * * @input: * type :: type descriptor handle * library :: library handle * * @return: * error code. 0 means success */ FT_BASE( FT_Error ) ft_class_from_type( FT_Class *aclass, FT_Type type, FT_Library library ); /* */ #include FT_INTERNAL_HASH_H typedef struct FT_ClassHNodeRec_* FT_ClassHNode; typedef struct FT_ClassHNodeRec_ { FT_HashNodeRec hnode; FT_Type type; FT_Class clazz; } FT_ClassHNodeRec; typedef struct FT_MetaClassRec_ { FT_ClassRec clazz; /* the meta-class is a class itself */ FT_HashRec type_to_class; /* the type => class hash table */ } FT_MetaClassRec, *FT_MetaClass; /* initialize meta class */ FT_BASE( FT_Error ) ft_metaclass_init( FT_MetaClass meta, FT_Library library ); /* finalize meta class - destroy all registered class objects */ FT_BASE( void ) ft_metaclass_done( FT_MetaClass meta ); /* */ FT_END_HEADER #endif /* __FT_OBJECT_H__ */ , FT_Pointer inold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftobjs.h������������������������������ 664 � 0 � 0 � 116706 7607330531 25307�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftobjs.h */ /* */ /* The FreeType private base classes (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file contains the definition of all internal FreeType classes. */ /* */ /*************************************************************************/ #ifndef __FTOBJS_H__ #define __FTOBJS_H__ #include <ft2build.h> #include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ #include FT_RENDER_H #include FT_SIZES_H #include FT_INTERNAL_MEMORY_H #include FT_INTERNAL_GLYPH_LOADER_H #include FT_INTERNAL_DRIVER_H #include FT_INTERNAL_AUTOHINT_H #include FT_INTERNAL_OBJECT_H #ifdef FT_CONFIG_OPTION_INCREMENTAL #include FT_INCREMENTAL_H #endif FT_BEGIN_HEADER /*************************************************************************/ /* */ /* Some generic definitions. */ /* */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef NULL #define NULL (void*)0 #endif /*************************************************************************/ /* */ /* The min and max functions missing in C. As usual, be careful not to */ /* write things like MIN( a++, b++ ) to avoid side effects. */ /* */ #ifndef MIN #define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) #endif #ifndef MAX #define MAX( a, b ) ( (a) > (b) ? (a) : (b) ) #endif #ifndef ABS #define ABS( a ) ( (a) < 0 ? -(a) : (a) ) #endif /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** V A L I D A T I O N ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* handle to a validation object */ typedef struct FT_ValidatorRec_* FT_Validator; /*************************************************************************/ /* */ /* There are three distinct validation levels defined here: */ /* */ /* FT_VALIDATE_DEFAULT :: */ /* A table that passes this validation level can be used reliably by */ /* FreeType. It generally means that all offsets have been checked to */ /* prevent out-of-bound reads, array counts are correct, etc. */ /* */ /* FT_VALIDATE_TIGHT :: */ /* A table that passes this validation level can be used reliably and */ /* doesn't contain invalid data. For example, a charmap table that */ /* returns invalid glyph indices will not pass, even though it can */ /* be used with FreeType in default mode (the library will simply */ /* return an error later when trying to load the glyph). */ /* */ /* It also check that fields that must be a multiple of 2, 4, or 8 */ /* dont' have incorrect values, etc. */ /* */ /* FT_VALIDATE_PARANOID :: */ /* Only for font debugging. Checks that a table follows the */ /* specification by 100%. Very few fonts will be able to pass this */ /* level anyway but it can be useful for certain tools like font */ /* editors/converters. */ /* */ typedef enum FT_ValidationLevel_ { FT_VALIDATE_DEFAULT = 0, FT_VALIDATE_TIGHT, FT_VALIDATE_PARANOID } FT_ValidationLevel; /* validator structure */ typedef struct FT_ValidatorRec_ { const FT_Byte* base; /* address of table in memory */ const FT_Byte* limit; /* `base' + sizeof(table) in memory */ FT_ValidationLevel level; /* validation level */ FT_Error error; /* error returned. 0 means success */ ft_jmp_buf jump_buffer; /* used for exception handling */ } FT_ValidatorRec; #define FT_VALIDATOR( x ) ((FT_Validator)( x )) FT_BASE( void ) ft_validator_init( FT_Validator valid, const FT_Byte* base, const FT_Byte* limit, FT_ValidationLevel level ); FT_BASE( FT_Int ) ft_validator_run( FT_Validator valid ); /* Sets the error field in a validator, then calls `longjmp' to return */ /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ /* error checks within the validation routines. */ /* */ FT_BASE( void ) ft_validator_error( FT_Validator valid, FT_Error error ); /* Calls ft_validate_error. Assumes that the `valid' local variable */ /* holds a pointer to the current validator object. */ /* */ #define FT_INVALID( _error ) ft_validator_error( valid, _error ) /* called when a broken table is detected */ #define FT_INVALID_TOO_SHORT FT_INVALID( FT_Err_Invalid_Table ) /* called when an invalid offset is detected */ #define FT_INVALID_OFFSET FT_INVALID( FT_Err_Invalid_Offset ) /* called when an invalid format/value is detected */ #define FT_INVALID_FORMAT FT_INVALID( FT_Err_Invalid_Table ) /* called when an invalid glyph index is detected */ #define FT_INVALID_GLYPH_ID FT_INVALID( FT_Err_Invalid_Glyph_Index ) /* called when an invalid field value is detected */ #define FT_INVALID_DATA FT_INVALID( FT_Err_Invalid_Table ) /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** C H A R M A P S ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* handle to internal charmap object */ typedef struct FT_CMapRec_* FT_CMap; /* handle to charmap class structure */ typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; /* internal charmap object structure */ typedef struct FT_CMapRec_ { FT_CharMapRec charmap; FT_CMap_Class clazz; } FT_CMapRec; /* typecase any pointer to a charmap handle */ #define FT_CMAP( x ) ((FT_CMap)( x )) /* obvious macros */ #define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id #define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id #define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding #define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face /* class method definitions */ typedef FT_Error (*FT_CMap_InitFunc)( FT_CMap cmap, FT_Pointer init_data ); typedef void (*FT_CMap_DoneFunc)( FT_CMap cmap ); typedef FT_UInt (*FT_CMap_CharIndexFunc)( FT_CMap cmap, FT_UInt32 char_code ); typedef FT_UInt (*FT_CMap_CharNextFunc)( FT_CMap cmap, FT_UInt32 *achar_code ); typedef struct FT_CMap_ClassRec_ { FT_UInt size; FT_CMap_InitFunc init; FT_CMap_DoneFunc done; FT_CMap_CharIndexFunc char_index; FT_CMap_CharNextFunc char_next; } FT_CMap_ClassRec; /* create a new charmap and add it to charmap->face */ FT_BASE( FT_Error ) FT_CMap_New( FT_CMap_Class clazz, FT_Pointer init_data, FT_CharMap charmap, FT_CMap *acmap ); /* destroy a charmap (don't remove it from face's list though) */ FT_BASE( void ) FT_CMap_Done( FT_CMap cmap ); /*************************************************************************/ /* */ /* <Struct> */ /* FT_Face_InternalRec */ /* */ /* <Description> */ /* This structure contains the internal fields of each FT_Face */ /* object. These fields may change between different releases of */ /* FreeType. */ /* */ /* <Fields> */ /* max_points :: The maximal number of points used to store the */ /* vectorial outline of any glyph in this face. */ /* If this value cannot be known in advance, or */ /* if the face isn't scalable, this should be set */ /* to 0. Only relevant for scalable formats. */ /* */ /* max_contours :: The maximal number of contours used to store */ /* the vectorial outline of any glyph in this */ /* face. If this value cannot be known in */ /* advance, or if the face isn't scalable, this */ /* should be set to 0. Only relevant for */ /* scalable formats. */ /* */ /* transform_matrix :: A 2x2 matrix of 16.16 coefficients used to */ /* transform glyph outlines after they are loaded */ /* from the font. Only used by the convenience */ /* functions. */ /* */ /* transform_delta :: A translation vector used to transform glyph */ /* outlines after they are loaded from the font. */ /* Only used by the convenience functions. */ /* */ /* transform_flags :: Some flags used to classify the transform. */ /* Only used by the convenience functions. */ /* */ /* hint_flags :: Some flags used to change the hinters' */ /* behaviour. Only used for debugging for now. */ /* */ /* postscript_name :: Postscript font name for this face. */ /* */ /* incremental_interface :: */ /* If non-null, the interface through */ /* which glyph data and metrics are loaded */ /* incrementally for faces that do not provide */ /* all of this data when first opened. */ /* This field exists only if */ /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ /* */ typedef struct FT_Face_InternalRec_ { FT_UShort max_points; FT_Short max_contours; FT_Matrix transform_matrix; FT_Vector transform_delta; FT_Int transform_flags; FT_UInt32 hint_flags; const char* postscript_name; #ifdef FT_CONFIG_OPTION_INCREMENTAL FT_Incremental_InterfaceRec* incremental_interface; #endif } FT_Face_InternalRec; /*************************************************************************/ /* */ /* <Struct> */ /* FT_Slot_InternalRec */ /* */ /* <Description> */ /* This structure contains the internal fields of each FT_GlyphSlot */ /* object. These fields may change between different releases of */ /* FreeType. */ /* */ /* <Fields> */ /* loader :: The glyph loader object used to load outlines */ /* into the glyph slot. */ /* */ /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ /* must be transformed through a specific */ /* font transformation. This is _not_ the same */ /* as the face transform set through */ /* FT_Set_Transform(). */ /* */ /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ /* transformation, if necessary. */ /* */ /* glyph_delta :: The 2d translation vector corresponding to */ /* the glyph transformation, if necessary. */ /* */ /* glyph_hints :: Format-specific glyph hints management. */ /* */ typedef struct FT_Slot_InternalRec_ { FT_GlyphLoader loader; FT_Bool glyph_transformed; FT_Matrix glyph_matrix; FT_Vector glyph_delta; void* glyph_hints; } FT_GlyphSlot_InternalRec; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** M O D U L E S ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* FT_ModuleRec */ /* */ /* <Description> */ /* A module object instance. */ /* */ /* <Fields> */ /* clazz :: A pointer to the module's class. */ /* */ /* library :: A handle to the parent library object. */ /* */ /* memory :: A handle to the memory manager. */ /* */ /* generic :: A generic structure for user-level extensibility (?). */ /* */ typedef struct FT_ModuleRec_ { FT_Module_Class* clazz; FT_Library library; FT_Memory memory; FT_Generic generic; } FT_ModuleRec; /* typecast an object to a FT_Module */ #define FT_MODULE( x ) ((FT_Module)( x )) #define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz #define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library #define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory #define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ ft_module_font_driver ) #define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ ft_module_renderer ) #define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ ft_module_hinter ) #define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ ft_module_styler ) #define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ ft_module_driver_scalable ) #define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ ft_module_driver_no_outlines ) #define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ ft_module_driver_has_hinter ) /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Module_Interface */ /* */ /* <Description> */ /* Finds a module and returns its specific interface as a typeless */ /* pointer. */ /* */ /* <Input> */ /* library :: A handle to the library object. */ /* */ /* module_name :: The module's name (as an ASCII string). */ /* */ /* <Return> */ /* A module-specific interface if available, 0 otherwise. */ /* */ /* <Note> */ /* You should better be familiar with FreeType internals to know */ /* which module to look for, and what its interface is :-) */ /* */ FT_BASE( const void* ) FT_Get_Module_Interface( FT_Library library, const char* mod_name ); /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* a few macros used to perform easy typecasts with minimal brain damage */ #define FT_FACE( x ) ((FT_Face)(x)) #define FT_SIZE( x ) ((FT_Size)(x)) #define FT_SLOT( x ) ((FT_GlyphSlot)(x)) #define FT_FACE_DRIVER( x ) FT_FACE( x )->driver #define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library #define FT_FACE_MEMORY( x ) FT_FACE( x )->memory #define FT_FACE_STREAM( x ) FT_FACE( x )->stream #define FT_SIZE_FACE( x ) FT_SIZE( x )->face #define FT_SLOT_FACE( x ) FT_SLOT( x )->face #define FT_FACE_SLOT( x ) FT_FACE( x )->glyph #define FT_FACE_SIZE( x ) FT_FACE( x )->size /*************************************************************************/ /* */ /* <Function> */ /* FT_New_GlyphSlot */ /* */ /* <Description> */ /* It is sometimes useful to have more than one glyph slot for a */ /* given face object. This function is used to create additional */ /* slots. All of them are automatically discarded when the face is */ /* destroyed. */ /* */ /* <Input> */ /* face :: A handle to a parent face object. */ /* */ /* <Output> */ /* aslot :: A handle to a new glyph slot object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_BASE( FT_Error ) FT_New_GlyphSlot( FT_Face face, FT_GlyphSlot *aslot ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Done_GlyphSlot */ /* */ /* <Description> */ /* Destroys a given glyph slot. Remember however that all slots are */ /* automatically destroyed with its parent. Using this function is */ /* not always mandatory. */ /* */ /* <Input> */ /* slot :: A handle to a target glyph slot. */ /* */ FT_BASE( void ) FT_Done_GlyphSlot( FT_GlyphSlot slot ); /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** R E N D E R E R S ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #define FT_RENDERER( x ) ((FT_Renderer)( x )) #define FT_GLYPH( x ) ((FT_Glyph)( x )) #define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) #define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) typedef struct FT_RendererRec_ { FT_ModuleRec root; FT_Renderer_Class* clazz; FT_Glyph_Format glyph_format; FT_Glyph_Class glyph_class; FT_Raster raster; FT_Raster_Render_Func raster_render; FT_Renderer_RenderFunc render; } FT_RendererRec; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** F O N T D R I V E R S ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* typecast a module into a driver easily */ #define FT_DRIVER( x ) ((FT_Driver)(x)) /* typecast a module as a driver, and get its driver class */ #define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz /*************************************************************************/ /* */ /* <Struct> */ /* FT_DriverRec */ /* */ /* <Description> */ /* The root font driver class. A font driver is responsible for */ /* managing and loading font files of a given format. */ /* */ /* <Fields> */ /* root :: Contains the fields of the root module class. */ /* */ /* clazz :: A pointer to the font driver's class. Note that */ /* this is NOT root.clazz. `class' wasn't used */ /* as it is a reserved word in C++. */ /* */ /* faces_list :: The list of faces currently opened by this */ /* driver. */ /* */ /* extensions :: A typeless pointer to the driver's extensions */ /* registry, if they are supported through the */ /* configuration macro FT_CONFIG_OPTION_EXTENSIONS. */ /* */ /* glyph_loader :: The glyph loader for all faces managed by this */ /* driver. This object isn't defined for unscalable */ /* formats. */ /* */ typedef struct FT_DriverRec_ { FT_ModuleRec root; FT_Driver_Class clazz; FT_ListRec faces_list; void* extensions; FT_GlyphLoader glyph_loader; } FT_DriverRec; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** L I B R A R I E S ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ #define FT_DEBUG_HOOK_TRUETYPE 0 #define FT_DEBUG_HOOK_TYPE1 1 /*************************************************************************/ /* */ /* <Struct> */ /* FT_LibraryRec */ /* */ /* <Description> */ /* The FreeType library class. This is the root of all FreeType */ /* data. Use FT_New_Library() to create a library object, and */ /* FT_Done_Library() to discard it and all child objects. */ /* */ /* <Fields> */ /* memory :: The library's memory object. Manages memory */ /* allocation. */ /* */ /* generic :: Client data variable. Used to extend the */ /* Library class by higher levels and clients. */ /* */ /* num_modules :: The number of modules currently registered */ /* within this library. This is set to 0 for new */ /* libraries. New modules are added through the */ /* FT_Add_Module() API function. */ /* */ /* modules :: A table used to store handles to the currently */ /* registered modules. Note that each font driver */ /* contains a list of its opened faces. */ /* */ /* renderers :: The list of renderers currently registered */ /* within the library. */ /* */ /* cur_renderer :: The current outline renderer. This is a */ /* shortcut used to avoid parsing the list on */ /* each call to FT_Outline_Render(). It is a */ /* handle to the current renderer for the */ /* FT_GLYPH_FORMAT_OUTLINE format. */ /* */ /* auto_hinter :: XXX */ /* */ /* raster_pool :: The raster object's render pool. This can */ /* ideally be changed dynamically at run-time. */ /* */ /* raster_pool_size :: The size of the render pool in bytes. */ /* */ /* debug_hooks :: XXX */ /* */ typedef struct FT_LibraryRec_ { FT_Memory memory; /* library's memory manager */ FT_Generic generic; FT_Int version_major; FT_Int version_minor; FT_Int version_patch; FT_UInt num_modules; FT_Module modules[FT_MAX_MODULES]; /* module objects */ FT_ListRec renderers; /* list of renderers */ FT_Renderer cur_renderer; /* current outline renderer */ FT_Module auto_hinter; FT_Byte* raster_pool; /* scan-line conversion */ /* render pool */ FT_ULong raster_pool_size; /* size of render pool in bytes */ FT_DebugHook_Func debug_hooks[4]; FT_MetaClassRec meta_class; } FT_LibraryRec; FT_BASE( FT_Renderer ) FT_Lookup_Renderer( FT_Library library, FT_Glyph_Format format, FT_ListNode* node ); FT_BASE( FT_Error ) FT_Render_Glyph_Internal( FT_Library library, FT_GlyphSlot slot, FT_Render_Mode render_mode ); typedef const char* (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); typedef FT_Error (*FT_Face_GetGlyphNameFunc)( FT_Face face, FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ); typedef FT_UInt (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, FT_String* glyph_name ); #ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM /*************************************************************************/ /* */ /* <Function> */ /* FT_New_Memory */ /* */ /* <Description> */ /* Creates a new memory object. */ /* */ /* <Return> */ /* A pointer to the new memory object. 0 in case of error. */ /* */ FT_EXPORT( FT_Memory ) FT_New_Memory( void ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Done_Memory */ /* */ /* <Description> */ /* Discards memory manager. */ /* */ /* <Input> */ /* memory :: A handle to the memory manager. */ /* */ FT_EXPORT( void ) FT_Done_Memory( FT_Memory memory ); #endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ /* Define default raster's interface. The default raster is located in */ /* `src/base/ftraster.c'. */ /* */ /* Client applications can register new rasters through the */ /* FT_Set_Raster() API. */ #ifndef FT_NO_DEFAULT_RASTER FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; #endif FT_END_HEADER #endif /* __FTOBJS_H__ */ /* END */ ging and loading font files of a given format. old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/ftstream.h���������������������������� 664 � 0 � 0 � 51705 7607330531 25622�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ftstream.h */ /* */ /* Stream handling (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __FTSTREAM_H__ #define __FTSTREAM_H__ #include <ft2build.h> #include FT_SYSTEM_H #include FT_INTERNAL_OBJECTS_H FT_BEGIN_HEADER /* format of an 8-bit frame_op value: */ /* */ /* bit 76543210 */ /* xxxxxxes */ /* */ /* s is set to 1 if the value is signed. */ /* e is set to 1 if the value is little-endian. */ /* xxx is a command. */ #define FT_FRAME_OP_SHIFT 2 #define FT_FRAME_OP_SIGNED 1 #define FT_FRAME_OP_LITTLE 2 #define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) #define FT_MAKE_FRAME_OP( command, little, sign ) \ ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) #define FT_FRAME_OP_END 0 #define FT_FRAME_OP_START 1 /* start a new frame */ #define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ #define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ #define FT_FRAME_OP_LONG 4 /* read 4-byte value */ #define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ #define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ typedef enum FT_Frame_Op_ { ft_frame_end = 0, ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) } FT_Frame_Op; typedef struct FT_Frame_Field_ { FT_Byte value; FT_Byte size; FT_UShort offset; } FT_Frame_Field; /* Construct an FT_Frame_Field out of a structure type and a field name. */ /* The structure type must be set in the FT_STRUCTURE macro before */ /* calling the FT_FRAME_START() macro. */ /* */ #define FT_FIELD_SIZE( f ) \ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) #define FT_FIELD_SIZE_DELTA( f ) \ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) #define FT_FIELD_OFFSET( f ) \ (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) #define FT_FRAME_FIELD( frame_op, field ) \ { \ frame_op, \ FT_FIELD_SIZE( field ), \ FT_FIELD_OFFSET( field ) \ } #define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } #define FT_FRAME_START( size ) { ft_frame_start, 0, size } #define FT_FRAME_END { ft_frame_end, 0, 0 } #define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) #define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) #define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) #define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) #define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) #define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) #define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) #define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) #define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) #define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) #define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) #define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) #define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) #define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) #define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } #define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } #define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } #define FT_FRAME_BYTES( field, count ) \ { \ ft_frame_bytes, \ count, \ FT_FIELD_OFFSET( field ) \ } #define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } /*************************************************************************/ /* */ /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */ /* type `char*' or equivalent (1-byte elements). */ /* */ #define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) #define FT_INT8_( p, i ) ( ((const FT_Char*)(p))[(i)] ) #define FT_INT16( x ) ( (FT_Int16)(x) ) #define FT_UINT16( x ) ( (FT_UInt16)(x) ) #define FT_INT32( x ) ( (FT_Int32)(x) ) #define FT_UINT32( x ) ( (FT_UInt32)(x) ) #define FT_BYTE_I16( p, i, s ) ( FT_INT16( FT_BYTE_( p, i ) ) << (s) ) #define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) #define FT_BYTE_I32( p, i, s ) ( FT_INT32( FT_BYTE_( p, i ) ) << (s) ) #define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) #define FT_INT8_I16( p, i, s ) ( FT_INT16( FT_INT8_( p, i ) ) << (s) ) #define FT_INT8_U16( p, i, s ) ( FT_UINT16( FT_INT8_( p, i ) ) << (s) ) #define FT_INT8_I32( p, i, s ) ( FT_INT32( FT_INT8_( p, i ) ) << (s) ) #define FT_INT8_U32( p, i, s ) ( FT_UINT32( FT_INT8_( p, i ) ) << (s) ) #define FT_PEEK_SHORT( p ) FT_INT16( FT_INT8_I16( p, 0, 8) | \ FT_BYTE_I16( p, 1, 0) ) #define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ FT_BYTE_U16( p, 1, 0 ) ) #define FT_PEEK_LONG( p ) FT_INT32( FT_INT8_I32( p, 0, 24 ) | \ FT_BYTE_I32( p, 1, 16 ) | \ FT_BYTE_I32( p, 2, 8 ) | \ FT_BYTE_I32( p, 3, 0 ) ) #define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ FT_BYTE_U32( p, 1, 16 ) | \ FT_BYTE_U32( p, 2, 8 ) | \ FT_BYTE_U32( p, 3, 0 ) ) #define FT_PEEK_OFF3( p ) FT_INT32( FT_INT8_I32( p, 0, 16 ) | \ FT_BYTE_I32( p, 1, 8 ) | \ FT_BYTE_I32( p, 2, 0 ) ) #define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ FT_BYTE_U32( p, 1, 8 ) | \ FT_BYTE_U32( p, 2, 0 ) ) #define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_INT8_I16( p, 1, 8 ) | \ FT_BYTE_I16( p, 0, 0 ) ) #define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ FT_BYTE_U16( p, 0, 0 ) ) #define FT_PEEK_LONG_LE( p ) FT_INT32( FT_INT8_I32( p, 3, 24 ) | \ FT_BYTE_I32( p, 2, 16 ) | \ FT_BYTE_I32( p, 1, 8 ) | \ FT_BYTE_I32( p, 0, 0 ) ) #define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ FT_BYTE_U32( p, 2, 16 ) | \ FT_BYTE_U32( p, 1, 8 ) | \ FT_BYTE_U32( p, 0, 0 ) ) #define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_INT8_I32( p, 2, 16 ) | \ FT_BYTE_I32( p, 1, 8 ) | \ FT_BYTE_I32( p, 0, 0 ) ) #define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ FT_BYTE_U32( p, 1, 8 ) | \ FT_BYTE_U32( p, 0, 0 ) ) #define FT_NEXT_CHAR( buffer ) \ ( (signed char)*buffer++ ) #define FT_NEXT_BYTE( buffer ) \ ( (unsigned char)*buffer++ ) #define FT_NEXT_SHORT( buffer ) \ ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) #define FT_NEXT_USHORT( buffer ) \ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) #define FT_NEXT_OFF3( buffer ) \ ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) #define FT_NEXT_UOFF3( buffer ) \ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) #define FT_NEXT_LONG( buffer ) \ ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) #define FT_NEXT_ULONG( buffer ) \ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) #define FT_NEXT_SHORT_LE( buffer ) \ ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) #define FT_NEXT_USHORT_LE( buffer ) \ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) #define FT_NEXT_OFF3_LE( buffer ) \ ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) #define FT_NEXT_UOFF3_LE( buffer ) \ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) #define FT_NEXT_LONG_LE( buffer ) \ ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) #define FT_NEXT_ULONG_LE( buffer ) \ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) /*************************************************************************/ /* */ /* Each GET_xxxx() macro uses an implicit `stream' variable. */ /* */ #define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) #define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) #define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) #define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_Short ) #define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_UShort ) #define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_Long ) #define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_ULong ) #define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetLong, FT_Long ) #define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) #define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) #define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_Short ) #define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort ) #define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long ) #define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong ) #define FT_READ_MACRO( func, type, var ) \ ( var = (type)func( stream, &error ), \ error != FT_Err_Ok ) #define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) #define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) #define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_Short, var ) #define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_UShort, var ) #define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_Long, var ) #define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_ULong, var ) #define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_Long, var ) #define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_ULong, var ) #define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_Short, var ) #define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_UShort, var ) #define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_Long, var ) #define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_ULong, var ) #ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM /* initialize a stream for reading a regular system stream */ FT_EXPORT( FT_Error ) FT_Stream_Open( FT_Stream stream, const char* filepathname ); #endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ /* initialize a stream for reading in-memory data */ FT_BASE( void ) FT_Stream_OpenMemory( FT_Stream stream, const FT_Byte* base, FT_ULong size ); /* close a stream (does not destroy the stream structure) */ FT_BASE( void ) FT_Stream_Close( FT_Stream stream ); /* seek within a stream. position is relative to start of stream */ FT_BASE( FT_Error ) FT_Stream_Seek( FT_Stream stream, FT_ULong pos ); /* skip bytes in a stream */ FT_BASE( FT_Error ) FT_Stream_Skip( FT_Stream stream, FT_Long distance ); /* return current stream position */ FT_BASE( FT_Long ) FT_Stream_Pos( FT_Stream stream ); /* read bytes from a stream into a user-allocated buffer, returns an */ /* error if not all bytes could be read. */ FT_BASE( FT_Error ) FT_Stream_Read( FT_Stream stream, FT_Byte* buffer, FT_ULong count ); /* read bytes from a stream at a given position */ FT_BASE( FT_Error ) FT_Stream_ReadAt( FT_Stream stream, FT_ULong pos, FT_Byte* buffer, FT_ULong count ); /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ /* error if the frame could not be read/accessed. The caller can use */ /* the FT_Stream_Get_XXX functions to retrieve frame data without */ /* error checks. */ /* */ /* You must _always_ call FT_Stream_ExitFrame() once you have entered */ /* a stream frame! */ /* */ FT_BASE( FT_Error ) FT_Stream_EnterFrame( FT_Stream stream, FT_ULong count ); /* exit a stream frame */ FT_BASE( void ) FT_Stream_ExitFrame( FT_Stream stream ); /* Extract a stream frame. If the stream is disk-based, a heap block */ /* is allocated and the frame bytes are read into it. If the stream */ /* is memory-based, this function simply set a pointer to the data. */ /* */ /* Useful to optimize access to memory-based streams transparently. */ /* */ /* All extracted frames must be `freed` with a call to the function */ /* FT_Stream_ReleaseFrame(). */ /* */ FT_BASE( FT_Error ) FT_Stream_ExtractFrame( FT_Stream stream, FT_ULong count, FT_Byte** pbytes ); /* release an extract frame (see FT_Stream_ExtractFrame) */ FT_BASE( void ) FT_Stream_ReleaseFrame( FT_Stream stream, FT_Byte** pbytes ); /* read a byte from an entered frame */ FT_BASE( FT_Char ) FT_Stream_GetChar( FT_Stream stream ); /* read a 16-bit big-endian integer from an entered frame */ FT_BASE( FT_Short ) FT_Stream_GetShort( FT_Stream stream ); /* read a 24-bit big-endian integer from an entered frame */ FT_BASE( FT_Long ) FT_Stream_GetOffset( FT_Stream stream ); /* read a 32-bit big-endian integer from an entered frame */ FT_BASE( FT_Long ) FT_Stream_GetLong( FT_Stream stream ); /* read a 16-bit little-endian integer from an entered frame */ FT_BASE( FT_Short ) FT_Stream_GetShortLE( FT_Stream stream ); /* read a 32-bit little-endian integer from an entered frame */ FT_BASE( FT_Long ) FT_Stream_GetLongLE( FT_Stream stream ); /* read a byte from a stream */ FT_BASE( FT_Char ) FT_Stream_ReadChar( FT_Stream stream, FT_Error* error ); /* read a 16-bit big-endian integer from a stream */ FT_BASE( FT_Short ) FT_Stream_ReadShort( FT_Stream stream, FT_Error* error ); /* read a 24-bit big-endian integer from a stream */ FT_BASE( FT_Long ) FT_Stream_ReadOffset( FT_Stream stream, FT_Error* error ); /* read a 32-bit big-endian integer from a stream */ FT_BASE( FT_Long ) FT_Stream_ReadLong( FT_Stream stream, FT_Error* error ); /* read a 16-bit little-endian integer from a stream */ FT_BASE( FT_Short ) FT_Stream_ReadShortLE( FT_Stream stream, FT_Error* error ); /* read a 32-bit little-endian integer from a stream */ FT_BASE( FT_Long ) FT_Stream_ReadLongLE( FT_Stream stream, FT_Error* error ); /* Read a structure from a stream. The structure must be described */ /* by an array of FT_Frame_Field records. */ FT_BASE( FT_Error ) FT_Stream_ReadFields( FT_Stream stream, const FT_Frame_Field* fields, void* structure ); #define FT_STREAM_POS() \ FT_Stream_Pos( stream ) #define FT_STREAM_SEEK( position ) \ FT_SET_ERROR( FT_Stream_Seek( stream, position ) ) #define FT_STREAM_SKIP( distance ) \ FT_SET_ERROR( FT_Stream_Skip( stream, distance ) ) #define FT_STREAM_READ( buffer, count ) \ FT_SET_ERROR( FT_Stream_Read( stream, \ (FT_Byte*)buffer, \ count ) ) #define FT_STREAM_READ_AT( position, buffer, count ) \ FT_SET_ERROR( FT_Stream_ReadAt( stream, \ position, \ (FT_Byte*)buffer, \ count ) ) #define FT_STREAM_READ_FIELDS( fields, object ) \ FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) #define FT_FRAME_ENTER( size ) \ FT_SET_ERROR( FT_Stream_EnterFrame( stream, size ) ) #define FT_FRAME_EXIT() \ FT_Stream_ExitFrame( stream ) #define FT_FRAME_EXTRACT( size, bytes ) \ FT_SET_ERROR( FT_Stream_ExtractFrame( stream, size, \ (FT_Byte**)&(bytes) ) ) #define FT_FRAME_RELEASE( bytes ) \ FT_Stream_ReleaseFrame( stream, (FT_Byte**)&(bytes) ) FT_END_HEADER #endif /* __FTSTREAM_H__ */ /* END */ ) \ ( old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/fttrace.h����������������������������� 664 � 0 � 0 � 10013 7607330532 25411�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* fttrace.h */ /* */ /* Tracing handling (specification only). */ /* */ /* Copyright 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /* definitions of trace levels for FreeType 2 */ /* the first level must always be `trace_any' */ FT_TRACE_DEF( any ) /* base components */ FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ FT_TRACE_DEF( list ) /* list management (ftlist.c) */ FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ /* Cache sub-system */ FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc..) */ /* SFNT driver components */ FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ /* TrueType driver components */ FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ /* Type 1 driver components */ FT_TRACE_DEF( t1driver ) FT_TRACE_DEF( t1gload ) FT_TRACE_DEF( t1hint ) FT_TRACE_DEF( t1load ) FT_TRACE_DEF( t1objs ) FT_TRACE_DEF( t1parse ) /* PostScript helper module `psaux' */ FT_TRACE_DEF( t1decode ) FT_TRACE_DEF( psobjs ) /* PostScript hinting module `pshinter' */ FT_TRACE_DEF( pshrec ) FT_TRACE_DEF( pshalgo1 ) FT_TRACE_DEF( pshalgo2 ) /* Type 2 driver components */ FT_TRACE_DEF( cffdriver ) FT_TRACE_DEF( cffgload ) FT_TRACE_DEF( cffload ) FT_TRACE_DEF( cffobjs ) FT_TRACE_DEF( cffparse ) /* Type 42 driver component */ FT_TRACE_DEF( t42 ) /* CID driver components */ FT_TRACE_DEF( cidafm ) FT_TRACE_DEF( ciddriver ) FT_TRACE_DEF( cidgload ) FT_TRACE_DEF( cidload ) FT_TRACE_DEF( cidobjs ) FT_TRACE_DEF( cidparse ) /* Windows fonts component */ FT_TRACE_DEF( winfnt ) /* PCF fonts components */ FT_TRACE_DEF( pcfdriver ) FT_TRACE_DEF( pcfread ) /* BDF fonts component */ FT_TRACE_DEF( bdfdriver ) FT_TRACE_DEF( bdflib ) /* PFR fonts component */ FT_TRACE_DEF( pfr ) /* END */ Byte* buffer, FT_ULong count ); /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ /* error if the frame could not be read/accessed. The caller can use */ /* the FT_Stream_Get_XXX functions to retrieve frame data without */ /* error checks. */ /* */ /* You must _always_ call FT_Stream_ExitFrame() once you have old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/internal.h���������������������������� 664 � 0 � 0 � 6720 7607330532 25567�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* internal.h */ /* */ /* Internal header files (specification only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /*************************************************************************/ /* */ /* This file is automatically included by `ft2build.h'. */ /* Do not include it manually! */ /* */ /*************************************************************************/ #define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> #define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> #define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> #define FT_INTERNAL_EXTENSION_H <freetype/internal/ftextend.h> #define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> #define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> #define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> #define FT_INTERNAL_EXTEND_H <freetype/internal/ftextend.h> #define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> #define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> #define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> #define FT_INTERNAL_HASH_H <freetype/internal/fthash.h> #define FT_INTERNAL_OBJECT_H <freetype/internal/ftobject.h> #define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> #define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> #define FT_INTERNAL_TYPE42_TYPES_H <freetype/internal/t42types.h> #define FT_INTERNAL_CFF_TYPES_H <freetype/internal/cfftypes.h> #define FT_INTERNAL_FNT_TYPES_H <freetype/internal/fnttypes.h> #define FT_INTERNAL_BDF_TYPES_H <freetype/internal/bdftypes.h> #define FT_INTERNAL_PFR_H <freetype/internal/pfr.h> #define FT_INTERNAL_POSTSCRIPT_NAMES_H <freetype/internal/psnames.h> #define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> #define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> #define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> #define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> /* END */ FT_SET_ERROR( FT_Stream_ReadAt( streamold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/pcftypes.h���������������������������� 664 � 0 � 0 � 3023 7607330532 25601�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* pcftypes.h FreeType font driver for pcf fonts Copyright (C) 2000-2001 by Francesco Zappa Nardelli Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __PCFTYPES_H__ #define __PCFTYPES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER typedef struct PCF_Public_FaceRec_ { FT_FaceRec root; FT_StreamRec gzip_stream; FT_Stream gzip_source; char* charset_encoding; char* charset_registry; } PCF_Public_FaceRec, *PCF_Public_Face; FT_END_HEADER #endif /* __PCFTYPES_H__ */ /* END */ */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* undersold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/pfr.h��������������������������������� 664 � 0 � 0 � 2273 7607330532 24541�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __FT_INTERNAL_PFR_H__ #define __FT_INTERNAL_PFR_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER typedef FT_Error (*FT_PFR_GetMetricsFunc)( FT_Face face, FT_UInt *aoutline, FT_UInt *ametrics, FT_Fixed *ax_scale, FT_Fixed *ay_scale ); typedef FT_Error (*FT_PFR_GetKerningFunc)( FT_Face face, FT_UInt left, FT_UInt right, FT_Vector *avector ); typedef FT_Error (*FT_PFR_GetAdvanceFunc)( FT_Face face, FT_UInt gindex, FT_Pos *aadvance ); typedef struct FT_PFR_ServiceRec_ { FT_PFR_GetMetricsFunc get_metrics; FT_PFR_GetKerningFunc get_kerning; FT_PFR_GetAdvanceFunc get_advance; } FT_PFR_ServiceRec, *FT_PFR_Service; #define FT_PFR_SERVICE_NAME "pfr" FT_END_HEADER #endif /* __FT_INTERNAL_PFR_H__ */ tdriver ) /* TT font driver (ttdriver.c) */ FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c)old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/psaux.h������������������������������� 664 � 0 � 0 � 72307 7607330532 25137�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* psaux.h */ /* */ /* Auxiliary functions and data structures related to PostScript fonts */ /* (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __PSAUX_H__ #define __PSAUX_H__ #include <ft2build.h> #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_TYPE1_TYPES_H FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** T1_TABLE *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct PS_TableRec_* PS_Table; typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; /*************************************************************************/ /* */ /* <Struct> */ /* PS_Table_FuncsRec */ /* */ /* <Description> */ /* A set of function pointers to manage PS_Table objects. */ /* */ /* <Fields> */ /* table_init :: Used to initialize a table. */ /* */ /* table_done :: Finalizes resp. destroy a given table. */ /* */ /* table_add :: Adds a new object to a table. */ /* */ /* table_release :: Releases table data, then finalizes it. */ /* */ typedef struct PS_Table_FuncsRec_ { FT_Error (*init)( PS_Table table, FT_Int count, FT_Memory memory ); void (*done)( PS_Table table ); FT_Error (*add)( PS_Table table, FT_Int index, void* object, FT_Int length ); void (*release)( PS_Table table ); } PS_Table_FuncsRec; /*************************************************************************/ /* */ /* <Struct> */ /* PS_TableRec */ /* */ /* <Description> */ /* A PS_Table is a simple object used to store an array of objects in */ /* a single memory block. */ /* */ /* <Fields> */ /* block :: The address in memory of the growheap's block. This */ /* can change between two object adds, due to */ /* reallocation. */ /* */ /* cursor :: The current top of the grow heap within its block. */ /* */ /* capacity :: The current size of the heap block. Increments by */ /* 1kByte chunks. */ /* */ /* max_elems :: The maximum number of elements in table. */ /* */ /* num_elems :: The current number of elements in table. */ /* */ /* elements :: A table of element addresses within the block. */ /* */ /* lengths :: A table of element sizes within the block. */ /* */ /* memory :: The object used for memory operations */ /* (alloc/realloc). */ /* */ /* funcs :: A table of method pointers for this object. */ /* */ typedef struct PS_TableRec_ { FT_Byte* block; /* current memory block */ FT_Offset cursor; /* current cursor in memory block */ FT_Offset capacity; /* current size of memory block */ FT_Long init; FT_Int max_elems; FT_Int num_elems; FT_Byte** elements; /* addresses of table elements */ FT_Int* lengths; /* lengths of table elements */ FT_Memory memory; PS_Table_FuncsRec funcs; } PS_TableRec; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** T1 FIELDS & TOKENS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct PS_ParserRec_* PS_Parser; typedef struct T1_TokenRec_* T1_Token; typedef struct T1_FieldRec_* T1_Field; /* simple enumeration type used to identify token types */ typedef enum T1_TokenType_ { T1_TOKEN_TYPE_NONE = 0, T1_TOKEN_TYPE_ANY, T1_TOKEN_TYPE_STRING, T1_TOKEN_TYPE_ARRAY, /* do not remove */ T1_TOKEN_TYPE_MAX } T1_TokenType; /* a simple structure used to identify tokens */ typedef struct T1_TokenRec_ { FT_Byte* start; /* first character of token in input stream */ FT_Byte* limit; /* first character after the token */ T1_TokenType type; /* type of token */ } T1_TokenRec; /* enumeration type used to identify object fields */ typedef enum T1_FieldType_ { T1_FIELD_TYPE_NONE = 0, T1_FIELD_TYPE_BOOL, T1_FIELD_TYPE_INTEGER, T1_FIELD_TYPE_FIXED, T1_FIELD_TYPE_STRING, T1_FIELD_TYPE_BBOX, T1_FIELD_TYPE_INTEGER_ARRAY, T1_FIELD_TYPE_FIXED_ARRAY, T1_FIELD_TYPE_CALLBACK, /* do not remove */ T1_FIELD_TYPE_MAX } T1_FieldType; typedef enum T1_FieldLocation_ { T1_FIELD_LOCATION_CID_INFO, T1_FIELD_LOCATION_FONT_DICT, T1_FIELD_LOCATION_FONT_INFO, T1_FIELD_LOCATION_PRIVATE, T1_FIELD_LOCATION_BBOX, /* do not remove */ T1_FIELD_LOCATION_MAX } T1_FieldLocation; typedef void (*T1_Field_ParseFunc)( FT_Face face, FT_Pointer parser ); /* structure type used to model object fields */ typedef struct T1_FieldRec_ { const char* ident; /* field identifier */ T1_FieldLocation location; T1_FieldType type; /* type of field */ T1_Field_ParseFunc reader; FT_UInt offset; /* offset of field in object */ FT_Byte size; /* size of field in bytes */ FT_UInt array_max; /* maximal number of elements for */ /* array */ FT_UInt count_offset; /* offset of element count for */ /* arrays */ } T1_FieldRec; #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname ) \ { \ _ident, T1CODE, _type, \ 0, \ FT_FIELD_OFFSET( _fname ), \ FT_FIELD_SIZE( _fname ), \ 0, 0 \ }, #define T1_NEW_CALLBACK_FIELD( _ident, _reader ) \ { \ _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ (T1_Field_ParseFunc)_reader, \ 0, 0, \ 0, 0 \ }, #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max ) \ { \ _ident, T1CODE, _type, \ 0, \ FT_FIELD_OFFSET( _fname ), \ FT_FIELD_SIZE_DELTA( _fname ), \ _max, \ FT_FIELD_OFFSET( num_ ## _fname ) \ }, #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max ) \ { \ _ident, T1CODE, _type, \ 0, \ FT_FIELD_OFFSET( _fname ), \ FT_FIELD_SIZE_DELTA( _fname ), \ _max, 0 \ }, #define T1_FIELD_TYPE_BOOL( _ident, _fname ) \ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname ) #define T1_FIELD_NUM( _ident, _fname ) \ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname ) #define T1_FIELD_FIXED( _ident, _fname ) \ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname ) #define T1_FIELD_STRING( _ident, _fname ) \ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname ) #define T1_FIELD_BBOX( _ident, _fname ) \ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname ) #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax ) \ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ _fname, _fmax ) #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax ) \ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ _fname, _fmax ) #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax ) \ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ _fname, _fmax ) #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax ) \ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ _fname, _fmax ) #define T1_FIELD_CALLBACK( _ident, _name ) \ T1_NEW_CALLBACK_FIELD( _ident, _name ) /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** T1 PARSER *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; typedef struct PS_Parser_FuncsRec_ { void (*init)( PS_Parser parser, FT_Byte* base, FT_Byte* limit, FT_Memory memory ); void (*done)( PS_Parser parser ); void (*skip_spaces)( PS_Parser parser ); void (*skip_alpha)( PS_Parser parser ); FT_Long (*to_int)( PS_Parser parser ); FT_Fixed (*to_fixed)( PS_Parser parser, FT_Int power_ten ); FT_Int (*to_coord_array)( PS_Parser parser, FT_Int max_coords, FT_Short* coords ); FT_Int (*to_fixed_array)( PS_Parser parser, FT_Int max_values, FT_Fixed* values, FT_Int power_ten ); void (*to_token)( PS_Parser parser, T1_Token token ); void (*to_token_array)( PS_Parser parser, T1_Token tokens, FT_UInt max_tokens, FT_Int* pnum_tokens ); FT_Error (*load_field)( PS_Parser parser, const T1_Field field, void** objects, FT_UInt max_objects, FT_ULong* pflags ); FT_Error (*load_field_table)( PS_Parser parser, const T1_Field field, void** objects, FT_UInt max_objects, FT_ULong* pflags ); } PS_Parser_FuncsRec; /*************************************************************************/ /* */ /* <Struct> */ /* PS_ParserRec */ /* */ /* <Description> */ /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ /* */ /* <Fields> */ /* cursor :: The current position in the text. */ /* */ /* base :: Start of the processed text. */ /* */ /* limit :: End of the processed text. */ /* */ /* error :: The last error returned. */ /* */ /* memory :: The object used for memory operations (alloc/realloc). */ /* */ /* funcs :: A table of functions for the parser. */ /* */ typedef struct PS_ParserRec_ { FT_Byte* cursor; FT_Byte* base; FT_Byte* limit; FT_Error error; FT_Memory memory; PS_Parser_FuncsRec funcs; } PS_ParserRec; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** T1 BUILDER *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct T1_BuilderRec_* T1_Builder; typedef FT_Error (*T1_Builder_Check_Points_Func)( T1_Builder builder, FT_Int count ); typedef void (*T1_Builder_Add_Point_Func)( T1_Builder builder, FT_Pos x, FT_Pos y, FT_Byte flag ); typedef FT_Error (*T1_Builder_Add_Point1_Func)( T1_Builder builder, FT_Pos x, FT_Pos y ); typedef FT_Error (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); typedef FT_Error (*T1_Builder_Start_Point_Func)( T1_Builder builder, FT_Pos x, FT_Pos y ); typedef void (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; typedef struct T1_Builder_FuncsRec_ { void (*init)( T1_Builder builder, FT_Face face, FT_Size size, FT_GlyphSlot slot, FT_Bool hinting ); void (*done)( T1_Builder builder ); T1_Builder_Check_Points_Func check_points; T1_Builder_Add_Point_Func add_point; T1_Builder_Add_Point1_Func add_point1; T1_Builder_Add_Contour_Func add_contour; T1_Builder_Start_Point_Func start_point; T1_Builder_Close_Contour_Func close_contour; } T1_Builder_FuncsRec; /*************************************************************************/ /* */ /* <Structure> */ /* T1_BuilderRec */ /* */ /* <Description> */ /* A structure used during glyph loading to store its outline. */ /* */ /* <Fields> */ /* memory :: The current memory object. */ /* */ /* face :: The current face object. */ /* */ /* glyph :: The current glyph slot. */ /* */ /* loader :: XXX */ /* */ /* base :: The base glyph outline. */ /* */ /* current :: The current glyph outline. */ /* */ /* max_points :: maximum points in builder outline */ /* */ /* max_contours :: Maximal number of contours in builder outline. */ /* */ /* last :: The last point position. */ /* */ /* scale_x :: The horizontal scale (FUnits to sub-pixels). */ /* */ /* scale_y :: The vertical scale (FUnits to sub-pixels). */ /* */ /* pos_x :: The horizontal translation (if composite glyph). */ /* */ /* pos_y :: The vertical translation (if composite glyph). */ /* */ /* left_bearing :: The left side bearing point. */ /* */ /* advance :: The horizontal advance vector. */ /* */ /* bbox :: Unused. */ /* */ /* path_begun :: A flag which indicates that a new path has begun. */ /* */ /* load_points :: If this flag is not set, no points are loaded. */ /* */ /* no_recurse :: Set but not used. */ /* */ /* error :: An error code that is only used to report memory */ /* allocation problems. */ /* */ /* metrics_only :: A boolean indicating that we only want to compute */ /* the metrics of a given glyph, not load all of its */ /* points. */ /* */ /* funcs :: An array of function pointers for the builder. */ /* */ typedef struct T1_BuilderRec_ { FT_Memory memory; FT_Face face; FT_GlyphSlot glyph; FT_GlyphLoader loader; FT_Outline* base; FT_Outline* current; FT_Vector last; FT_Fixed scale_x; FT_Fixed scale_y; FT_Pos pos_x; FT_Pos pos_y; FT_Vector left_bearing; FT_Vector advance; FT_BBox bbox; /* bounding box */ FT_Bool path_begun; FT_Bool load_points; FT_Bool no_recurse; FT_Bool shift; FT_Error error; /* only used for memory errors */ FT_Bool metrics_only; void* hints_funcs; /* hinter-specific */ void* hints_globals; /* hinter-specific */ T1_Builder_FuncsRec funcs; } T1_BuilderRec; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** T1 DECODER *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ #if 0 /*************************************************************************/ /* */ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ /* calls during glyph loading. */ /* */ #define T1_MAX_SUBRS_CALLS 8 /*************************************************************************/ /* */ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ /* minimum of 16 is required. */ /* */ #define T1_MAX_CHARSTRINGS_OPERANDS 32 #endif /* 0 */ typedef struct T1_Decoder_ZoneRec_ { FT_Byte* cursor; FT_Byte* base; FT_Byte* limit; } T1_Decoder_ZoneRec, *T1_Decoder_Zone; typedef struct T1_DecoderRec_* T1_Decoder; typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; typedef FT_Error (*T1_Decoder_Callback)( T1_Decoder decoder, FT_UInt glyph_index ); typedef struct T1_Decoder_FuncsRec_ { FT_Error (*init)( T1_Decoder decoder, FT_Face face, FT_Size size, FT_GlyphSlot slot, FT_Byte** glyph_names, PS_Blend blend, FT_Bool hinting, FT_Render_Mode hint_mode, T1_Decoder_Callback callback ); void (*done)( T1_Decoder decoder ); FT_Error (*parse_charstrings)( T1_Decoder decoder, FT_Byte* base, FT_UInt len ); } T1_Decoder_FuncsRec; typedef struct T1_DecoderRec_ { T1_BuilderRec builder; FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; FT_Long* top; T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; T1_Decoder_Zone zone; PSNames_Service psnames; /* for seac */ FT_UInt num_glyphs; FT_Byte** glyph_names; FT_Int lenIV; /* internal for sub routine calls */ FT_UInt num_subrs; FT_Byte** subrs; FT_Int* subrs_len; /* array of subrs length (optional) */ FT_Matrix font_matrix; FT_Vector font_offset; FT_Int flex_state; FT_Int num_flex_vectors; FT_Vector flex_vectors[7]; PS_Blend blend; /* for multiple master support */ FT_UInt32 hint_flags; FT_Render_Mode hint_mode; T1_Decoder_Callback parse_callback; T1_Decoder_FuncsRec funcs; } T1_DecoderRec; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** TYPE1 CHARMAPS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; typedef struct T1_CMap_ClassesRec_ { FT_CMap_Class standard; FT_CMap_Class expert; FT_CMap_Class custom; FT_CMap_Class unicode; } T1_CMap_ClassesRec; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** PSAux Module Interface *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct PSAux_ServiceRec_ { /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ const PS_Table_FuncsRec* ps_table_funcs; const PS_Parser_FuncsRec* ps_parser_funcs; const T1_Builder_FuncsRec* t1_builder_funcs; const T1_Decoder_FuncsRec* t1_decoder_funcs; void (*t1_decrypt)( FT_Byte* buffer, FT_Offset length, FT_UShort seed ); T1_CMap_Classes t1_cmap_classes; } PSAux_ServiceRec, *PSAux_Service; /* backwards-compatible type definition */ typedef PSAux_ServiceRec PSAux_Interface; FT_END_HEADER #endif /* __PSAUX_H__ */ /* END */ o store its outline. */ /* */ /* <Fields> */ /* memory :: The current memory object. */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/pshints.h����������������������������� 664 � 0 � 0 � 114776 7607330532 25516�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* pshints.h */ /* */ /* Interface to Postscript-specific (Type 1 and Type 2) hints */ /* recorders (specification only). These are used to support native */ /* T1/T2 hints in the "type1", "cid" and "cff" font drivers. */ /* */ /* Copyright 2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __PSHINTS_H__ #define __PSHINTS_H__ #include <ft2build.h> #include FT_FREETYPE_H #include FT_TYPE1_TABLES_H FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** INTERNAL REPRESENTATION OF GLOBALS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct PSH_GlobalsRec_* PSH_Globals; typedef FT_Error (*PSH_Globals_NewFunc)( FT_Memory memory, T1_Private* private_dict, PSH_Globals* aglobals ); typedef FT_Error (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, FT_Fixed x_scale, FT_Fixed y_scale, FT_Fixed x_delta, FT_Fixed y_delta ); typedef void (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); typedef struct PSH_Globals_FuncsRec_ { PSH_Globals_NewFunc create; PSH_Globals_SetScaleFunc set_scale; PSH_Globals_DestroyFunc destroy; } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** PUBLIC TYPE 1 HINTS RECORDER *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* @type: */ /* T1_Hints */ /* */ /* @description: */ /* This is a handle to an opaque structure used to record glyph hints */ /* from a Type 1 character glyph character string. */ /* */ /* The methods used to operate on this object are defined by the */ /* @T1_Hints_FuncsRec structure. Recording glyph hints is normally */ /* achieved through the following scheme: */ /* */ /* - Open a new hint recording session by calling the "open" method. */ /* This will rewind the recorder and prepare it for new input. */ /* */ /* - For each hint found in the glyph charstring, call the */ /* corresponding method ("stem", "stem3", or "reset"). Note that */ /* these functions do not return an error code. */ /* */ /* - Close the recording session by calling the "close" method. It */ /* will return an error code if the hints were invalid or something */ /* strange happened (e.g. memory shortage). */ /* */ /* The hints accumulated in the object can later be used by the */ /* PostScript hinter. */ /* */ typedef struct T1_HintsRec_* T1_Hints; /*************************************************************************/ /* */ /* @type: */ /* T1_Hints_Funcs */ /* */ /* @description: */ /* A pointer to the @T1_Hints_FuncsRec structure that defines the */ /* API of a given @T1_Hints object. */ /* */ typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; /*************************************************************************/ /* */ /* @functype: */ /* T1_Hints_OpenFunc */ /* */ /* @description: */ /* A method of the @T1_Hints class used to prepare it for a new */ /* Type 1 hints recording session. */ /* */ /* @input: */ /* hints :: A handle to the Type 1 hints recorder. */ /* */ /* @note: */ /* You should always call the @T1_Hints_CloseFunc method in order to */ /* close an opened recording session. */ /* */ typedef void (*T1_Hints_OpenFunc)( T1_Hints hints ); /*************************************************************************/ /* */ /* @functype: */ /* T1_Hints_SetStemFunc */ /* */ /* @description: */ /* A method of the @T1_Hints class used to record a new horizontal or */ /* vertical stem. This corresponds to the Type 1 "hstem" and "vstem" */ /* operators. */ /* */ /* @input: */ /* hints :: A handle to the Type 1 hints recorder. */ /* */ /* dimension :: 0 for horizontal stems (hstem), 1 for vertical ones */ /* (vstem). */ /* */ /* coords :: Array of 2 integers, used as (position,length) stem */ /* descriptor. */ /* */ /* @note: */ /* Use vertical coordinates (y) for horizontal stems (dim=0). Use */ /* horizontal coordinates (x) for vertical stems (dim=1). */ /* */ /* "coords[0]" is the absolute stem position (lowest coordinate); */ /* "coords[1]" is the length. */ /* */ /* The length can be negative, in which case it must be either -20 or */ /* -21. It will be interpreted as a "ghost" stem, according to */ /* Type 1 specification. */ /* */ /* If the length is -21 (corresponding to a bottom ghost stem), then */ /* the real stem position is "coords[0]+coords[1]". */ /* */ typedef void (*T1_Hints_SetStemFunc)( T1_Hints hints, FT_UInt dimension, FT_Long* coords ); /*************************************************************************/ /* */ /* @functype: */ /* T1_Hints_SetStem3Func */ /* */ /* @description: */ /* A method of the @T1_Hints class used to record three */ /* counter-controlled horizontal or vertical stems at once. */ /* */ /* @input: */ /* hints :: A handle to the Type 1 hints recorder. */ /* */ /* dimension :: 0 for horizontal stems, 1 for vertical ones. */ /* */ /* coords :: An array of 6 integers, holding 3 (position,length) */ /* pairs for the counter-controlled stems. */ /* */ /* @note: */ /* Use vertical coordinates (y) for horizontal stems (dim=0). Use */ /* horizontal coordinates (x) for vertical stems (dim=1). */ /* */ /* The lengths cannot be negative (ghost stems are never */ /* counter-controlled). */ /* */ typedef void (*T1_Hints_SetStem3Func)( T1_Hints hints, FT_UInt dimension, FT_Long* coords ); /*************************************************************************/ /* */ /* @functype: */ /* T1_Hints_ResetFunc */ /* */ /* @description: */ /* A method of the @T1_Hints class used to reset the stems hints in a */ /* recording session. */ /* */ /* @input: */ /* hints :: A handle to the Type 1 hints recorder. */ /* */ /* end_point :: The index of the last point in the input glyph in */ /* which the previously defined hints apply. */ /* */ typedef void (*T1_Hints_ResetFunc)( T1_Hints hints, FT_UInt end_point ); /*************************************************************************/ /* */ /* @functype: */ /* T1_Hints_CloseFunc */ /* */ /* @description: */ /* A method of the @T1_Hints class used to close a hint recording */ /* session. */ /* */ /* @input: */ /* hints :: A handle to the Type 1 hints recorder. */ /* */ /* end_point :: The index of the last point in the input glyph. */ /* */ /* @return: */ /* FreeType error code. 0 means success. */ /* */ /* @note: */ /* The error code will be set to indicate that an error occured */ /* during the recording session. */ /* */ typedef FT_Error (*T1_Hints_CloseFunc)( T1_Hints hints, FT_UInt end_point ); /*************************************************************************/ /* */ /* @functype: */ /* T1_Hints_ApplyFunc */ /* */ /* @description: */ /* A method of the @T1_Hints class used to apply hints to the */ /* corresponding glyph outline. Must be called once all hints have */ /* been recorded. */ /* */ /* @input: */ /* hints :: A handle to the Type 1 hints recorder. */ /* */ /* outline :: A pointer to the target outline descriptor. */ /* */ /* globals :: The hinter globals for this font. */ /* */ /* hint_flags :: Hinter bit flags. */ /* */ /* @return: */ /* FreeType error code. 0 means success. */ /* */ /* @note: */ /* On input, all points within the outline are in font coordinates. */ /* On output, they are in 1/64th of pixels. */ /* */ /* The scaling transformation is taken from the "globals" object */ /* which must correspond to the same font as the glyph. */ /* */ typedef FT_Error (*T1_Hints_ApplyFunc)( T1_Hints hints, FT_Outline* outline, PSH_Globals globals, FT_Render_Mode hint_mode ); /*************************************************************************/ /* */ /* @struct: */ /* T1_Hints_FuncsRec */ /* */ /* @description: */ /* The structure used to provide the API to @T1_Hints objects. */ /* */ /* @fields: */ /* hints :: A handle to the T1 Hints recorder. */ /* */ /* open :: The function to open a recording session. */ /* */ /* close :: The function to close a recording session. */ /* */ /* stem :: The function to set a simple stem. */ /* */ /* stem3 :: The function to set counter-controlled stems. */ /* */ /* reset :: The function to reset stem hints. */ /* */ /* apply :: The function to apply the hints to the corresponding */ /* glyph outline. */ /* */ typedef struct T1_Hints_FuncsRec_ { T1_Hints hints; T1_Hints_OpenFunc open; T1_Hints_CloseFunc close; T1_Hints_SetStemFunc stem; T1_Hints_SetStem3Func stem3; T1_Hints_ResetFunc reset; T1_Hints_ApplyFunc apply; } T1_Hints_FuncsRec; /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** PUBLIC TYPE 2 HINTS RECORDER *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* @type: */ /* T2_Hints */ /* */ /* @description: */ /* This is a handle to an opaque structure used to record glyph hints */ /* from a Type 2 character glyph character string. */ /* */ /* The methods used to operate on this object are defined by the */ /* @T2_Hints_FuncsRec structure. Recording glyph hints is normally */ /* achieved through the following scheme: */ /* */ /* - Open a new hint recording session by calling the "open" method. */ /* This will rewind the recorder and prepare it for new input. */ /* */ /* - For each hint found in the glyph charstring, call the */ /* corresponding method ("stems", "hintmask", "counters"). Note */ /* that these functions do not return an error code. */ /* */ /* - Close the recording session by calling the "close" method. It */ /* will return an error code if the hints were invalid or something */ /* strange happened (e.g. memory shortage). */ /* */ /* The hints accumulated in the object can later be used by the */ /* Postscript hinter. */ /* */ typedef struct T2_HintsRec_* T2_Hints; /*************************************************************************/ /* */ /* @type: */ /* T2_Hints_Funcs */ /* */ /* @description: */ /* A pointer to the @T2_Hints_FuncsRec structure that defines the API */ /* of a given @T2_Hints object. */ /* */ typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; /*************************************************************************/ /* */ /* @functype: */ /* T2_Hints_OpenFunc */ /* */ /* @description: */ /* A method of the @T2_Hints class used to prepare it for a new */ /* Type 2 hints recording session. */ /* */ /* @input: */ /* hints :: A handle to the Type 2 hints recorder. */ /* */ /* @note: */ /* You should always call the @T2_Hints_CloseFunc method in order to */ /* close an opened recording session. */ /* */ typedef void (*T2_Hints_OpenFunc)( T2_Hints hints ); /*************************************************************************/ /* */ /* @functype: */ /* T2_Hints_StemsFunc */ /* */ /* @description: */ /* A method of the @T2_Hints class used to set the table of stems in */ /* either the vertical or horizontal dimension. Equivalent to the */ /* "hstem", "vstem", "hstemhm", and "vstemhm" Type 2 operators. */ /* */ /* @input: */ /* hints :: A handle to the Type 2 hints recorder. */ /* */ /* dimension :: 0 for horizontal stems (hstem), 1 for vertical ones */ /* (vstem). */ /* */ /* count :: The number of stems. */ /* */ /* coords :: An array of "count" (position,length) pairs. */ /* */ /* @note: */ /* Use vertical coordinates (y) for horizontal stems (dim=0). Use */ /* horizontal coordinates (x) for vertical stems (dim=1). */ /* */ /* There are "2*count" elements in the "coords" aray. Each even */ /* element is an absolute position in font units, each odd element is */ /* a length in font units. */ /* */ /* A length can be negative, in which case it must be either -20 or */ /* -21. It will be interpreted as a "ghost" stem, according to the */ /* Type 1 specification. */ /* */ typedef void (*T2_Hints_StemsFunc)( T2_Hints hints, FT_UInt dimension, FT_UInt count, FT_Fixed* coordinates ); /*************************************************************************/ /* */ /* @functype: */ /* T2_Hints_MaskFunc */ /* */ /* @description: */ /* A method of the @T2_Hints class used to set a given hintmask */ /* (this corresponds to the "hintmask" Type 2 operator). */ /* */ /* @input: */ /* hints :: A handle to the Type 2 hints recorder. */ /* */ /* end_point :: The glyph index of the last point to which the */ /* previously defined/activated hints apply. */ /* */ /* bit_count :: The number of bits in the hint mask. */ /* */ /* bytes :: An array of bytes modelling the hint mask. */ /* */ /* @note: */ /* If the hintmask starts the charstring (before any glyph point */ /* definition), the value of "end_point" should be 0. */ /* */ /* "bit_count" is the number of meaningful bits in the "bytes" array; */ /* it must be equal to the total number of hints defined so far */ /* (i.e. horizontal+verticals). */ /* */ /* The "bytes" array can come directly from the Type 2 charstring and */ /* respects the same format. */ /* */ typedef void (*T2_Hints_MaskFunc)( T2_Hints hints, FT_UInt end_point, FT_UInt bit_count, const FT_Byte* bytes ); /*************************************************************************/ /* */ /* @functype: */ /* T2_Hints_CounterFunc */ /* */ /* @description: */ /* A method of the @T2_Hints class used to set a given counter mask */ /* (this corresponds to the "hintmask" Type 2 operator). */ /* */ /* @input: */ /* hints :: A handle to the Type 2 hints recorder. */ /* */ /* end_point :: A glyph index of the last point to which the */ /* previously defined/active hints apply. */ /* */ /* bit_count :: The number of bits in the hint mask. */ /* */ /* bytes :: An array of bytes modelling the hint mask. */ /* */ /* @note: */ /* If the hintmask starts the charstring (before any glyph point */ /* definition), the value of "end_point" should be 0. */ /* */ /* "bit_count" is the number of meaningful bits in the "bytes" array; */ /* it must be equal to the total number of hints defined so far */ /* (i.e. horizontal+verticals). */ /* */ /* The "bytes" array can come directly from the Type 2 charstring and */ /* respects the same format. */ /* */ typedef void (*T2_Hints_CounterFunc)( T2_Hints hints, FT_UInt bit_count, const FT_Byte* bytes ); /*************************************************************************/ /* */ /* @functype: */ /* T2_Hints_CloseFunc */ /* */ /* @description: */ /* A method of the @T2_Hints class used to close a hint recording */ /* session. */ /* */ /* @input: */ /* hints :: A handle to the Type 2 hints recorder. */ /* */ /* end_point :: The index of the last point in the input glyph. */ /* */ /* @return: */ /* FreeType error code. 0 means success. */ /* */ /* @note: */ /* The error code will be set to indicate that an error occured */ /* during the recording session. */ /* */ typedef FT_Error (*T2_Hints_CloseFunc)( T2_Hints hints, FT_UInt end_point ); /*************************************************************************/ /* */ /* @functype: */ /* T2_Hints_ApplyFunc */ /* */ /* @description: */ /* A method of the @T2_Hints class used to apply hints to the */ /* corresponding glyph outline. Must be called after the "close" */ /* method. */ /* */ /* @input: */ /* hints :: A handle to the Type 2 hints recorder. */ /* */ /* outline :: A pointer to the target outline descriptor. */ /* */ /* globals :: The hinter globals for this font. */ /* */ /* hint_flags :: Hinter bit flags. */ /* */ /* @return: */ /* FreeType error code. 0 means success. */ /* */ /* @note: */ /* On input, all points within the outline are in font coordinates. */ /* On output, they are in 1/64th of pixels. */ /* */ /* The scaling transformation is taken from the "globals" object */ /* which must correspond to the same font than the glyph. */ /* */ typedef FT_Error (*T2_Hints_ApplyFunc)( T2_Hints hints, FT_Outline* outline, PSH_Globals globals, FT_Render_Mode hint_mode ); /*************************************************************************/ /* */ /* @struct: */ /* T2_Hints_FuncsRec */ /* */ /* @description: */ /* The structure used to provide the API to @T2_Hints objects. */ /* */ /* @fields: */ /* hints :: A handle to the T2 hints recorder object. */ /* */ /* open :: The function to open a recording session. */ /* */ /* close :: The function to close a recording session. */ /* */ /* stems :: The function to set the dimension's stems table. */ /* */ /* hintmask :: The function to set hint masks. */ /* */ /* counter :: The function to set counter masks. */ /* */ /* apply :: The function to apply the hints on the corresponding */ /* glyph outline. */ /* */ typedef struct T2_Hints_FuncsRec_ { T2_Hints hints; T2_Hints_OpenFunc open; T2_Hints_CloseFunc close; T2_Hints_StemsFunc stems; T2_Hints_MaskFunc hintmask; T2_Hints_CounterFunc counter; T2_Hints_ApplyFunc apply; } T2_Hints_FuncsRec; /* */ typedef struct PSHinter_Interface_ { PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); } PSHinter_Interface; typedef PSHinter_Interface* PSHinter_Service; FT_END_HEADER #endif /* __PSHINTS_H__ */ /* END */ gold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/psnames.h����������������������������� 664 � 0 � 0 � 32735 7607330532 25446�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* psnames.h */ /* */ /* High-level interface for the `PSNames' module (in charge of */ /* various functions related to Postscript glyph names conversion). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __PSNAMES_H__ #define __PSNAMES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <FuncType> */ /* PS_Unicode_Value_Func */ /* */ /* <Description> */ /* A function used to return the Unicode index corresponding to a */ /* given glyph name. */ /* */ /* <Input> */ /* glyph_name :: The glyph name. */ /* */ /* <Return> */ /* The Unicode character index resp. the non-Unicode value 0xFFFF if */ /* the glyph name has no known Unicode meaning. */ /* */ /* <Note> */ /* This function is able to map several different glyph names to the */ /* same Unicode value, according to the rules defined in the Adobe */ /* Glyph List table. */ /* */ /* This function will not be compiled if the configuration macro */ /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */ /* */ typedef FT_UInt32 (*PS_Unicode_Value_Func)( const char* glyph_name ); /*************************************************************************/ /* */ /* <FuncType> */ /* PS_Unicode_Index_Func */ /* */ /* <Description> */ /* A function used to return the glyph index corresponding to a given */ /* Unicode value. */ /* */ /* <Input> */ /* num_glyphs :: The number of glyphs in the face. */ /* */ /* glyph_names :: An array of glyph name pointers. */ /* */ /* unicode :: The Unicode value. */ /* */ /* <Return> */ /* The glyph index resp. 0xFFFF if no glyph corresponds to this */ /* Unicode value. */ /* */ /* <Note> */ /* This function is able to recognize several glyph names per Unicode */ /* value, according to the Adobe Glyph List. */ /* */ /* This function will not be compiled if the configuration macro */ /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is undefined. */ /* */ typedef FT_UInt (*PS_Unicode_Index_Func)( FT_UInt num_glyphs, const char** glyph_names, FT_ULong unicode ); /*************************************************************************/ /* */ /* <FuncType> */ /* PS_Macintosh_Name_Func */ /* */ /* <Description> */ /* A function used to return the glyph name corresponding to an Apple */ /* glyph name index. */ /* */ /* <Input> */ /* name_index :: The index of the Mac name. */ /* */ /* <Return> */ /* The glyph name, or 0 if the index is invalid. */ /* */ /* <Note> */ /* This function will not be compiled if the configuration macro */ /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */ /* */ typedef const char* (*PS_Macintosh_Name_Func)( FT_UInt name_index ); typedef const char* (*PS_Adobe_Std_Strings_Func)( FT_UInt string_index ); typedef struct PS_UniMap_ { FT_UInt unicode; FT_UInt glyph_index; } PS_UniMap; /*************************************************************************/ /* */ /* <Struct> */ /* PS_Unicodes */ /* */ /* <Description> */ /* A simple table used to map Unicode values to glyph indices. It is */ /* built by the PS_Build_Unicodes table according to the glyphs */ /* present in a font file. */ /* */ /* <Fields> */ /* num_codes :: The number of glyphs in the font that match a given */ /* Unicode value. */ /* */ /* unicodes :: An array of unicode values, sorted in increasing */ /* order. */ /* */ /* gindex :: An array of glyph indices, corresponding to each */ /* Unicode value. */ /* */ /* <Note> */ /* Use the function PS_Lookup_Unicode() to retrieve the glyph index */ /* corresponding to a given Unicode character code. */ /* */ typedef struct PS_Unicodes_ { FT_UInt num_maps; PS_UniMap* maps; } PS_Unicodes; typedef FT_Error (*PS_Build_Unicodes_Func)( FT_Memory memory, FT_UInt num_glyphs, const char** glyph_names, PS_Unicodes* unicodes ); typedef FT_UInt (*PS_Lookup_Unicode_Func)( PS_Unicodes* unicodes, FT_UInt unicode ); typedef FT_ULong (*PS_Next_Unicode_Func)( PS_Unicodes* unicodes, FT_ULong unicode ); /*************************************************************************/ /* */ /* <Struct> */ /* PSNames_Interface */ /* */ /* <Description> */ /* This structure defines the PSNames interface. */ /* */ /* <Fields> */ /* unicode_value :: A function used to convert a glyph name */ /* into a Unicode character code. */ /* */ /* build_unicodes :: A function which builds up the Unicode */ /* mapping table. */ /* */ /* lookup_unicode :: A function used to return the glyph index */ /* corresponding to a given Unicode */ /* character. */ /* */ /* macintosh_name :: A function used to return the standard */ /* Apple glyph Postscript name corresponding */ /* to a given string index (used by the */ /* TrueType `post' table). */ /* */ /* adobe_std_strings :: A function that returns a pointer to a */ /* Adobe Standard String for a given SID. */ /* */ /* adobe_std_encoding :: A table of 256 unsigned shorts that maps */ /* character codes in the Adobe Standard */ /* Encoding to SIDs. */ /* */ /* adobe_expert_encoding :: A table of 256 unsigned shorts that maps */ /* character codes in the Adobe Expert */ /* Encoding to SIDs. */ /* */ /* <Note> */ /* `unicode_value' and `unicode_index' will be set to 0 if the */ /* configuration macro FT_CONFIG_OPTION_ADOBE_GLYPH_LIST is */ /* undefined. */ /* */ /* `macintosh_name' will be set to 0 if the configuration macro */ /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES is undefined. */ /* */ typedef struct PSNames_Interface_ { PS_Unicode_Value_Func unicode_value; PS_Build_Unicodes_Func build_unicodes; PS_Lookup_Unicode_Func lookup_unicode; PS_Macintosh_Name_Func macintosh_name; PS_Adobe_Std_Strings_Func adobe_std_strings; const unsigned short* adobe_std_encoding; const unsigned short* adobe_expert_encoding; PS_Next_Unicode_Func next_unicode; } PSNames_Interface; typedef PSNames_Interface* PSNames_Service; FT_END_HEADER #endif /* __PSNAMES_H__ */ /* END */ <FuncType> old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/sfnt.h�������������������������������� 664 � 0 � 0 � 100430 7607330532 24756�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* sfnt.h */ /* */ /* High-level `sfnt' driver interface (specification). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __SFNT_H__ #define __SFNT_H__ #include <ft2build.h> #include FT_INTERNAL_DRIVER_H #include FT_INTERNAL_TRUETYPE_TYPES_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Init_Face_Func */ /* */ /* <Description> */ /* First part of the SFNT face object initialization. This will find */ /* the face in a SFNT file or collection, and load its format tag in */ /* face->format_tag. */ /* */ /* <Input> */ /* stream :: The input stream. */ /* */ /* face :: A handle to the target face object. */ /* */ /* face_index :: The index of the TrueType font, if we are opening a */ /* collection. */ /* */ /* num_params :: The number of additional parameters. */ /* */ /* params :: Optional additional parameters. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The stream cursor must be at the font file's origin. */ /* */ /* This function recognizes fonts embedded in a `TrueType */ /* collection'. */ /* */ /* Once the format tag has been validated by the font driver, it */ /* should then call the TT_Load_Face_Func() callback to read the rest */ /* of the SFNT tables in the object. */ /* */ typedef FT_Error (*TT_Init_Face_Func)( FT_Stream stream, TT_Face face, FT_Int face_index, FT_Int num_params, FT_Parameter* params ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Load_Face_Func */ /* */ /* <Description> */ /* Second part of the SFNT face object initialization. This will */ /* load the common SFNT tables (head, OS/2, maxp, metrics, etc.) in */ /* the face object. */ /* */ /* <Input> */ /* stream :: The input stream. */ /* */ /* face :: A handle to the target face object. */ /* */ /* face_index :: The index of the TrueType font, if we are opening a */ /* collection. */ /* */ /* num_params :: The number of additional parameters. */ /* */ /* params :: Optional additional parameters. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* This function must be called after TT_Init_Face_Func(). */ /* */ typedef FT_Error (*TT_Load_Face_Func)( FT_Stream stream, TT_Face face, FT_Int face_index, FT_Int num_params, FT_Parameter* params ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Done_Face_Func */ /* */ /* <Description> */ /* A callback used to delete the common SFNT data from a face. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ /* <Note> */ /* This function does NOT destroy the face object. */ /* */ typedef void (*TT_Done_Face_Func)( TT_Face face ); typedef FT_Module_Interface (*SFNT_Get_Interface_Func)( FT_Module module, const char* func_interface ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Load_SFNT_HeaderRec_Func */ /* */ /* <Description> */ /* Loads the header of a SFNT font file. Supports collections. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ /* stream :: The input stream. */ /* */ /* face_index :: The index of the TrueType font, if we are opening a */ /* collection. */ /* */ /* <Output> */ /* sfnt :: The SFNT header. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The stream cursor must be at the font file's origin. */ /* */ /* This function recognizes fonts embedded in a `TrueType */ /* collection'. */ /* */ /* This function checks that the header is valid by looking at the */ /* values of `search_range', `entry_selector', and `range_shift'. */ /* */ typedef FT_Error (*TT_Load_SFNT_HeaderRec_Func)( TT_Face face, FT_Stream stream, FT_Long face_index, SFNT_Header sfnt ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Load_Directory_Func */ /* */ /* <Description> */ /* Loads the table directory into a face object. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ /* stream :: The input stream. */ /* */ /* sfnt :: The SFNT header. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The stream cursor must be on the first byte after the 4-byte font */ /* format tag. This is the case just after a call to */ /* TT_Load_Format_Tag(). */ /* */ typedef FT_Error (*TT_Load_Directory_Func)( TT_Face face, FT_Stream stream, SFNT_Header sfnt ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Load_Any_Func */ /* */ /* <Description> */ /* Loads any font table into client memory. */ /* */ /* <Input> */ /* face :: The face object to look for. */ /* */ /* tag :: The tag of table to load. Use the value 0 if you want */ /* to access the whole font file, else set this parameter */ /* to a valid TrueType table tag that you can forge with */ /* the MAKE_TT_TAG macro. */ /* */ /* offset :: The starting offset in the table (or the file if */ /* tag == 0). */ /* */ /* length :: The address of the decision variable: */ /* */ /* If length == NULL: */ /* Loads the whole table. Returns an error if */ /* `offset' == 0! */ /* */ /* If *length == 0: */ /* Exits immediately; returning the length of the given */ /* table or of the font file, depending on the value of */ /* `tag'. */ /* */ /* If *length != 0: */ /* Loads the next `length' bytes of table or font, */ /* starting at offset `offset' (in table or font too). */ /* */ /* <Output> */ /* buffer :: The address of target buffer. */ /* */ /* <Return> */ /* TrueType error code. 0 means success. */ /* */ typedef FT_Error (*TT_Load_Any_Func)( TT_Face face, FT_ULong tag, FT_Long offset, FT_Byte *buffer, FT_ULong* length ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Load_SBit_Image_Func */ /* */ /* <Description> */ /* Loads a given glyph sbit image from the font resource. This also */ /* returns its metrics. */ /* */ /* <Input> */ /* face :: The target face object. */ /* */ /* x_ppem :: The horizontal resolution in points per EM. */ /* */ /* y_ppem :: The vertical resolution in points per EM. */ /* */ /* glyph_index :: The current glyph index. */ /* */ /* stream :: The input stream. */ /* */ /* <Output> */ /* amap :: The target pixmap. */ /* */ /* ametrics :: A big sbit metrics structure for the glyph image. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. Returns an error if no */ /* glyph sbit exists for the index. */ /* */ /* <Note> */ /* The `map.buffer' field is always freed before the glyph is loaded. */ /* */ typedef FT_Error (*TT_Load_SBit_Image_Func)( TT_Face face, FT_ULong strike_index, FT_UInt glyph_index, FT_UInt load_flags, FT_Stream stream, FT_Bitmap *amap, TT_SBit_MetricsRec *ametrics ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Set_SBit_Strike_Func */ /* */ /* <Description> */ /* Selects an sbit strike for given horizontal and vertical ppem */ /* values. */ /* */ /* <Input> */ /* face :: The target face object. */ /* */ /* x_ppem :: The horizontal resolution in points per EM. */ /* */ /* y_ppem :: The vertical resolution in points per EM. */ /* */ /* <Output> */ /* astrike_index :: The index of the sbit strike. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. Returns an error if no */ /* sbit strike exists for the selected ppem values. */ /* */ typedef FT_Error (*TT_Set_SBit_Strike_Func)( TT_Face face, FT_Int x_ppem, FT_Int y_ppem, FT_ULong *astrike_index ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Get_PS_Name_Func */ /* */ /* <Description> */ /* Gets the PostScript glyph name of a glyph. */ /* */ /* <Input> */ /* idx :: The glyph index. */ /* */ /* PSname :: The address of a string pointer. Will be NULL in case */ /* of error, otherwise it is a pointer to the glyph name. */ /* */ /* You must not modify the returned string! */ /* */ /* <Output> */ /* FreeType error code. 0 means success. */ /* */ typedef FT_Error (*TT_Get_PS_Name_Func)( TT_Face face, FT_UInt idx, FT_String** PSname ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Load_Metrics_Func */ /* */ /* <Description> */ /* Loads the horizontal or vertical header in a face object. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ /* stream :: The input stream. */ /* */ /* vertical :: A boolean flag. If set, load vertical metrics. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ typedef FT_Error (*TT_Load_Metrics_Func)( TT_Face face, FT_Stream stream, FT_Bool vertical ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_CharMap_Load_Func */ /* */ /* <Description> */ /* Loads a given TrueType character map into memory. */ /* */ /* <Input> */ /* face :: A handle to the parent face object. */ /* */ /* stream :: A handle to the current stream object. */ /* */ /* <InOut> */ /* cmap :: A pointer to a cmap object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The function assumes that the stream is already in use (i.e., */ /* opened). In case of error, all partially allocated tables are */ /* released. */ /* */ typedef FT_Error (*TT_CharMap_Load_Func)( TT_Face face, TT_CMapTable cmap, FT_Stream input ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_CharMap_Free_Func */ /* */ /* <Description> */ /* Destroys a character mapping table. */ /* */ /* <Input> */ /* face :: A handle to the parent face object. */ /* */ /* cmap :: A handle to a cmap object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ typedef FT_Error (*TT_CharMap_Free_Func)( TT_Face face, TT_CMapTable cmap ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Load_Table_Func */ /* */ /* <Description> */ /* Loads a given TrueType table. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ /* stream :: The input stream. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The function will use `face->goto_table' to seek the stream to */ /* the start of the table. */ /* */ typedef FT_Error (*TT_Load_Table_Func)( TT_Face face, FT_Stream stream ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Free_Table_Func */ /* */ /* <Description> */ /* Frees a given TrueType table. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ typedef void (*TT_Free_Table_Func)( TT_Face face ); /*************************************************************************/ /* */ /* <Struct> */ /* SFNT_Interface */ /* */ /* <Description> */ /* This structure holds pointers to the functions used to load and */ /* free the basic tables that are required in a `sfnt' font file. */ /* */ /* <Fields> */ /* Check the various xxx_Func() descriptions for details. */ /* */ typedef struct SFNT_Interface_ { TT_Loader_GotoTableFunc goto_table; TT_Init_Face_Func init_face; TT_Load_Face_Func load_face; TT_Done_Face_Func done_face; SFNT_Get_Interface_Func get_interface; TT_Load_Any_Func load_any; TT_Load_SFNT_HeaderRec_Func load_sfnt_header; TT_Load_Directory_Func load_directory; /* these functions are called by `load_face' but they can also */ /* be called from external modules, if there is a need to do so */ TT_Load_Table_Func load_header; TT_Load_Metrics_Func load_metrics; TT_Load_Table_Func load_charmaps; TT_Load_Table_Func load_max_profile; TT_Load_Table_Func load_os2; TT_Load_Table_Func load_psnames; TT_Load_Table_Func load_names; TT_Free_Table_Func free_names; /* optional tables */ TT_Load_Table_Func load_hdmx; TT_Free_Table_Func free_hdmx; TT_Load_Table_Func load_kerning; TT_Load_Table_Func load_gasp; TT_Load_Table_Func load_pclt; /* see `ttload.h' */ TT_Load_Table_Func load_bitmap_header; /* see `ttsbit.h' */ TT_Set_SBit_Strike_Func set_sbit_strike; TT_Load_Table_Func load_sbits; TT_Load_SBit_Image_Func load_sbit_image; TT_Free_Table_Func free_sbits; /* see `ttpost.h' */ TT_Get_PS_Name_Func get_psname; TT_Free_Table_Func free_psnames; /* see `ttcmap.h' */ TT_CharMap_Load_Func load_charmap; TT_CharMap_Free_Func free_charmap; } SFNT_Interface; /* transitional */ typedef SFNT_Interface* SFNT_Service; FT_END_HEADER #endif /* __SFNT_H__ */ /* END */ */ /* <FuncType> */ /* TT_Load_Metrics_Func */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/t1types.h����������������������������� 664 � 0 � 0 � 17532 7607330532 25407�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* t1types.h */ /* */ /* Basic Type1/Type2 type definitions and interface (specification */ /* only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __T1TYPES_H__ #define __T1TYPES_H__ #include <ft2build.h> #include FT_TYPE1_TABLES_H #include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* T1_EncodingRec */ /* */ /* <Description> */ /* A structure modeling a custom encoding. */ /* */ /* <Fields> */ /* num_chars :: The number of character codes in the encoding. */ /* Usually 256. */ /* */ /* code_first :: The lowest valid character code in the encoding. */ /* */ /* code_last :: The highest valid character code in the encoding. */ /* */ /* char_index :: An array of corresponding glyph indices. */ /* */ /* char_name :: An array of corresponding glyph names. */ /* */ typedef struct T1_EncodingRecRec_ { FT_Int num_chars; FT_Int code_first; FT_Int code_last; FT_UShort* char_index; FT_String** char_name; } T1_EncodingRec, *T1_Encoding; typedef enum T1_EncodingType_ { T1_ENCODING_TYPE_NONE = 0, T1_ENCODING_TYPE_ARRAY, T1_ENCODING_TYPE_STANDARD, T1_ENCODING_TYPE_ISOLATIN1, T1_ENCODING_TYPE_EXPERT } T1_EncodingType; typedef struct T1_FontRec_ { PS_FontInfoRec font_info; /* font info dictionary */ PS_PrivateRec private_dict; /* private dictionary */ FT_String* font_name; /* top-level dictionary */ T1_EncodingType encoding_type; T1_EncodingRec encoding; FT_Byte* subrs_block; FT_Byte* charstrings_block; FT_Byte* glyph_names_block; FT_Int num_subrs; FT_Byte** subrs; FT_Int* subrs_len; FT_Int num_glyphs; FT_String** glyph_names; /* array of glyph names */ FT_Byte** charstrings; /* array of glyph charstrings */ FT_Int* charstrings_len; FT_Byte paint_type; FT_Byte font_type; FT_Matrix font_matrix; FT_Vector font_offset; FT_BBox font_bbox; FT_Long font_id; FT_Int stroke_width; } T1_FontRec, *T1_Font; typedef struct CID_SubrsRec_ { FT_UInt num_subrs; FT_Byte** code; } CID_SubrsRec, *CID_Subrs; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* This structure/class is defined here because it is common to the */ /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ /* */ /* Note, however, that the classes TT_Size, TT_GlyphSlot, and TT_CharMap */ /* are not shared between font drivers, and are thus defined normally in */ /* `ttobjs.h'. */ /* */ /*************************************************************************/ typedef struct T1_FaceRec_* T1_Face; typedef struct CID_FaceRec_* CID_Face; typedef struct T1_FaceRec_ { FT_FaceRec root; T1_FontRec type1; const void* psnames; const void* psaux; const void* afm_data; FT_CharMapRec charmaprecs[2]; FT_CharMap charmaps[2]; PS_Unicodes unicode_map; /* support for Multiple Masters fonts */ PS_Blend blend; /* since FT 2.1 - interface to PostScript hinter */ const void* pshinter; } T1_FaceRec; typedef struct CID_FaceRec_ { FT_FaceRec root; void* psnames; void* psaux; CID_FaceInfoRec cid; void* afm_data; CID_Subrs subrs; /* since FT 2.1 - interface to PostScript hinter */ void* pshinter; } CID_FaceRec; FT_END_HEADER #endif /* __T1TYPES_H__ */ /* END */ ory_Func load_directory; /* these functions are called by `load_face' but they can also */ /* be called from external modules, if there is a need to dold_contrib//root/sys/src/cmd/limbo/include/freetype/internal/t42types.h���������������������������� 664 � 0 � 0 � 3513 7607330532 25446�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* t42types.h */ /* */ /* Type 42 font data types (specification only). */ /* */ /* Copyright 2002 by Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __T42TYPES_H__ #define __T42TYPES_H__ #include <ft2build.h> #include FT_FREETYPE_H #include FT_TYPE1_TABLES_H #include FT_INTERNAL_TYPE1_TYPES_H #include FT_INTERNAL_POSTSCRIPT_NAMES_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H FT_BEGIN_HEADER typedef struct T42_FaceRec_ { FT_FaceRec root; T1_FontRec type1; const void* psnames; const void* psaux; const void* afm_data; FT_Byte* ttf_data; FT_ULong ttf_size; FT_Face ttf_face; FT_CharMapRec charmaprecs[2]; FT_CharMap charmaps[2]; PS_Unicodes unicode_map; } T42_FaceRec, *T42_Face; FT_END_HEADER #endif /* __T1TYPES_H__ */ /* END */ ype2 type definitions and interface (specification */ /* only). */ /* old_contrib//root/sys/src/cmd/limbo/include/freetype/internal/tttypes.h����������������������������� 664 � 0 � 0 � 264253 7607330532 25536�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* tttypes.h */ /* */ /* Basic SFNT/TrueType type definitions and interface (specification */ /* only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __TTTYPES_H__ #define __TTTYPES_H__ #include <ft2build.h> #include FT_TRUETYPE_TABLES_H #include FT_INTERNAL_OBJECTS_H FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* TTC_HeaderRec */ /* */ /* <Description> */ /* TrueType collection header. This table contains the offsets of */ /* the font headers of each distinct TrueType face in the file. */ /* */ /* <Fields> */ /* tag :: Must be `ttc ' to indicate a TrueType collection. */ /* */ /* version :: The version number. */ /* */ /* count :: The number of faces in the collection. The */ /* specification says this should be an unsigned long, but */ /* we use a signed long since we need the value -1 for */ /* specific purposes. */ /* */ /* offsets :: The offsets of the font headers, one per face. */ /* */ typedef struct TTC_HeaderRec_ { FT_ULong tag; FT_Fixed version; FT_Long count; FT_ULong* offsets; } TTC_HeaderRec; /*************************************************************************/ /* */ /* <Struct> */ /* SFNT_HeaderRec */ /* */ /* <Description> */ /* SFNT file format header. */ /* */ /* <Fields> */ /* format_tag :: The font format tag. */ /* */ /* num_tables :: The number of tables in file. */ /* */ /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */ /* */ /* entry_selector :: Must be log2 of `search_range / 16'. */ /* */ /* range_shift :: Must be `num_tables * 16 - search_range'. */ /* */ typedef struct SFNT_HeaderRec_ { FT_ULong format_tag; FT_UShort num_tables; FT_UShort search_range; FT_UShort entry_selector; FT_UShort range_shift; FT_ULong offset; /* not in file */ } SFNT_HeaderRec, *SFNT_Header; /*************************************************************************/ /* */ /* <Struct> */ /* TT_TableDirRec */ /* */ /* <Description> */ /* This structure models a TrueType table directory. It is used to */ /* access the various tables of the font face. */ /* */ /* <Fields> */ /* version :: The version number; starts with 0x00010000. */ /* */ /* numTables :: The number of tables. */ /* */ /* searchRange :: Unused. */ /* */ /* entrySelector :: Unused. */ /* */ /* rangeShift :: Unused. */ /* */ /* <Note> */ /* This structure is only used during font opening. */ /* */ typedef struct TT_TableDirRec_ { FT_Fixed version; /* should be 0x10000 */ FT_UShort numTables; /* number of tables */ FT_UShort searchRange; /* These parameters are only used */ FT_UShort entrySelector; /* for a dichotomy search in the */ FT_UShort rangeShift; /* directory. We ignore them. */ } TT_TableDirRec; /*************************************************************************/ /* */ /* <Struct> */ /* TT_TableRec */ /* */ /* <Description> */ /* This structure describes a given table of a TrueType font. */ /* */ /* <Fields> */ /* Tag :: A four-bytes tag describing the table. */ /* */ /* CheckSum :: The table checksum. This value can be ignored. */ /* */ /* Offset :: The offset of the table from the start of the TrueType */ /* font in its resource. */ /* */ /* Length :: The table length (in bytes). */ /* */ typedef struct TT_TableRec_ { FT_ULong Tag; /* table type */ FT_ULong CheckSum; /* table checksum */ FT_ULong Offset; /* table file offset */ FT_ULong Length; /* table length */ } TT_TableRec, *TT_Table; /*************************************************************************/ /* */ /* <Struct> */ /* TT_CMapDirRec */ /* */ /* <Description> */ /* This structure describes the directory of the `cmap' table, */ /* containing the font's character mappings table. */ /* */ /* <Fields> */ /* tableVersionNumber :: The version number. */ /* */ /* numCMaps :: The number of charmaps in the font. */ /* */ /* <Note> */ /* This structure is only used during font loading. */ /* */ typedef struct TT_CMapDirRec_ { FT_UShort tableVersionNumber; FT_UShort numCMaps; } TT_CMapDirRec, *TT_CMapDir; /*************************************************************************/ /* */ /* <Struct> */ /* TT_CMapDirEntryRec */ /* */ /* <Description> */ /* This structure describes a charmap in a TrueType font. */ /* */ /* <Fields> */ /* platformID :: An ID used to specify for which platform this */ /* charmap is defined (FreeType manages all platforms). */ /* */ /* encodingID :: A platform-specific ID used to indicate which source */ /* encoding is used in this charmap. */ /* */ /* offset :: The offset of the charmap relative to the start of */ /* the `cmap' table. */ /* */ /* <Note> */ /* This structure is only used during font loading. */ /* */ typedef struct TT_CMapDirEntryRec_ { FT_UShort platformID; FT_UShort platformEncodingID; FT_Long offset; } TT_CMapDirEntryRec, *TT_CMapDirEntry; /*************************************************************************/ /* */ /* <Struct> */ /* TT_LongMetricsRec */ /* */ /* <Description> */ /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ /* TrueType tables. The values are expressed in font units. */ /* */ /* <Fields> */ /* advance :: The advance width or height for the glyph. */ /* */ /* bearing :: The left-side or top-side bearing for the glyph. */ /* */ typedef struct TT_LongMetricsRec_ { FT_UShort advance; FT_Short bearing; } TT_LongMetricsRec, *TT_LongMetrics; /*************************************************************************/ /* */ /* <Type> */ /* TT_ShortMetrics */ /* */ /* <Description> */ /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ /* tables. */ /* */ typedef FT_Short TT_ShortMetrics; /*************************************************************************/ /* */ /* <Struct> */ /* TT_NameEntryRec */ /* */ /* <Description> */ /* A structure modeling TrueType name records. Name records are used */ /* to store important strings like family name, style name, */ /* copyright, etc. in _localized_ versions (i.e., language, encoding, */ /* etc). */ /* */ /* <Fields> */ /* platformID :: The ID of the name's encoding platform. */ /* */ /* encodingID :: The platform-specific ID for the name's encoding. */ /* */ /* languageID :: The platform-specific ID for the name's language. */ /* */ /* nameID :: The ID specifying what kind of name this is. */ /* */ /* stringLength :: The length of the string in bytes. */ /* */ /* stringOffset :: The offset to the string in the `name' table. */ /* */ /* string :: A pointer to the string's bytes. Note that these */ /* are usually UTF-16 encoded characters. */ /* */ typedef struct TT_NameEntryRec_ { FT_UShort platformID; FT_UShort encodingID; FT_UShort languageID; FT_UShort nameID; FT_UShort stringLength; FT_ULong stringOffset; /* this last field is not defined in the spec */ /* but used by the FreeType engine */ FT_Byte* string; } TT_NameEntryRec, *TT_NameEntry; /*************************************************************************/ /* */ /* <Struct> */ /* TT_NameTableRec */ /* */ /* <Description> */ /* A structure modeling the TrueType name table. */ /* */ /* <Fields> */ /* format :: The format of the name table. */ /* */ /* numNameRecords :: The number of names in table. */ /* */ /* storageOffset :: The offset of the name table in the `name' */ /* TrueType table. */ /* */ /* names :: An array of name records. */ /* */ /* stream :: the file's input stream. */ /* */ typedef struct TT_NameTableRec_ { FT_UShort format; FT_UInt numNameRecords; FT_UInt storageOffset; TT_NameEntryRec* names; FT_Stream stream; } TT_NameTableRec, *TT_NameTable; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* TT_GaspRangeRec */ /* */ /* <Description> */ /* A tiny structure used to model a gasp range according to the */ /* TrueType specification. */ /* */ /* <Fields> */ /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */ /* */ /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */ /* modes to be used. */ /* */ typedef struct TT_GaspRangeRec_ { FT_UShort maxPPEM; FT_UShort gaspFlag; } TT_GaspRangeRec, *TT_GaspRange; #define TT_GASP_GRIDFIT 0x01 #define TT_GASP_DOGRAY 0x02 /*************************************************************************/ /* */ /* <Struct> */ /* TT_GaspRec */ /* */ /* <Description> */ /* A structure modeling the TrueType `gasp' table used to specify */ /* grid-fitting and anti-aliasing behaviour. */ /* */ /* <Fields> */ /* version :: The version number. */ /* */ /* numRanges :: The number of gasp ranges in table. */ /* */ /* gaspRanges :: An array of gasp ranges. */ /* */ typedef struct TT_Gasp_ { FT_UShort version; FT_UShort numRanges; TT_GaspRange gaspRanges; } TT_GaspRec; /*************************************************************************/ /* */ /* <Struct> */ /* TT_HdmxEntryRec */ /* */ /* <Description> */ /* A small structure used to model the pre-computed widths of a given */ /* size. They are found in the `hdmx' table. */ /* */ /* <Fields> */ /* ppem :: The pixels per EM value at which these metrics apply. */ /* */ /* max_width :: The maximum advance width for this metric. */ /* */ /* widths :: An array of widths. Note: These are 8-bit bytes. */ /* */ typedef struct TT_HdmxEntryRec_ { FT_Byte ppem; FT_Byte max_width; FT_Byte* widths; } TT_HdmxEntryRec, *TT_HdmxEntry; /*************************************************************************/ /* */ /* <Struct> */ /* TT_HdmxRec */ /* */ /* <Description> */ /* A structure used to model the `hdmx' table, which contains */ /* pre-computed widths for a set of given sizes/dimensions. */ /* */ /* <Fields> */ /* version :: The version number. */ /* */ /* num_records :: The number of hdmx records. */ /* */ /* records :: An array of hdmx records. */ /* */ typedef struct TT_HdmxRec_ { FT_UShort version; FT_Short num_records; TT_HdmxEntry records; } TT_HdmxRec, *TT_Hdmx; /*************************************************************************/ /* */ /* <Struct> */ /* TT_Kern0_PairRec */ /* */ /* <Description> */ /* A structure used to model a kerning pair for the kerning table */ /* format 0. The engine now loads this table if it finds one in the */ /* font file. */ /* */ /* <Fields> */ /* left :: The index of the left glyph in pair. */ /* */ /* right :: The index of the right glyph in pair. */ /* */ /* value :: The kerning distance. A positive value spaces the */ /* glyphs, a negative one makes them closer. */ /* */ typedef struct TT_Kern0_PairRec_ { FT_UShort left; /* index of left glyph in pair */ FT_UShort right; /* index of right glyph in pair */ FT_FWord value; /* kerning value */ } TT_Kern0_PairRec, *TT_Kern0_Pair; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** EMBEDDED BITMAPS SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* TT_SBit_MetricsRec */ /* */ /* <Description> */ /* A structure used to hold the big metrics of a given glyph bitmap */ /* in a TrueType or OpenType font. These are usually found in the */ /* `EBDT' (Microsoft) or `bloc' (Apple) table. */ /* */ /* <Fields> */ /* height :: The glyph height in pixels. */ /* */ /* width :: The glyph width in pixels. */ /* */ /* horiBearingX :: The horizontal left bearing. */ /* */ /* horiBearingY :: The horizontal top bearing. */ /* */ /* horiAdvance :: The horizontal advance. */ /* */ /* vertBearingX :: The vertical left bearing. */ /* */ /* vertBearingY :: The vertical top bearing. */ /* */ /* vertAdvance :: The vertical advance. */ /* */ typedef struct TT_SBit_MetricsRec_ { FT_Byte height; FT_Byte width; FT_Char horiBearingX; FT_Char horiBearingY; FT_Byte horiAdvance; FT_Char vertBearingX; FT_Char vertBearingY; FT_Byte vertAdvance; } TT_SBit_MetricsRec, *TT_SBit_Metrics; /*************************************************************************/ /* */ /* <Struct> */ /* TT_SBit_SmallMetricsRec */ /* */ /* <Description> */ /* A structure used to hold the small metrics of a given glyph bitmap */ /* in a TrueType or OpenType font. These are usually found in the */ /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */ /* */ /* <Fields> */ /* height :: The glyph height in pixels. */ /* */ /* width :: The glyph width in pixels. */ /* */ /* bearingX :: The left-side bearing. */ /* */ /* bearingY :: The top-side bearing. */ /* */ /* advance :: The advance width or height. */ /* */ typedef struct TT_SBit_Small_Metrics_ { FT_Byte height; FT_Byte width; FT_Char bearingX; FT_Char bearingY; FT_Byte advance; } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; /*************************************************************************/ /* */ /* <Struct> */ /* TT_SBit_LineMetricsRec */ /* */ /* <Description> */ /* A structure used to describe the text line metrics of a given */ /* bitmap strike, for either a horizontal or vertical layout. */ /* */ /* <Fields> */ /* ascender :: The ascender in pixels. */ /* */ /* descender :: The descender in pixels. */ /* */ /* max_width :: The maximum glyph width in pixels. */ /* */ /* caret_slope_enumerator :: Rise of the caret slope, typically set */ /* to 1 for non-italic fonts. */ /* */ /* caret_slope_denominator :: Rise of the caret slope, typically set */ /* to 0 for non-italic fonts. */ /* */ /* caret_offset :: Offset in pixels to move the caret for */ /* proper positioning. */ /* */ /* min_origin_SB :: Minimum of horiBearingX (resp. */ /* vertBearingY). */ /* min_advance_SB :: Minimum of */ /* */ /* horizontal advance - */ /* ( horiBearingX + width ) */ /* */ /* resp. */ /* */ /* vertical advance - */ /* ( vertBearingY + height ) */ /* */ /* max_before_BL :: Maximum of horiBearingY (resp. */ /* vertBearingY). */ /* */ /* min_after_BL :: Minimum of */ /* */ /* horiBearingY - height */ /* */ /* resp. */ /* */ /* vertBearingX - width */ /* */ /* pads :: Unused (to make the size of the record */ /* a multiple of 32 bits. */ /* */ typedef struct TT_SBit_LineMetricsRec_ { FT_Char ascender; FT_Char descender; FT_Byte max_width; FT_Char caret_slope_numerator; FT_Char caret_slope_denominator; FT_Char caret_offset; FT_Char min_origin_SB; FT_Char min_advance_SB; FT_Char max_before_BL; FT_Char min_after_BL; FT_Char pads[2]; } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; /*************************************************************************/ /* */ /* <Struct> */ /* TT_SBit_RangeRec */ /* */ /* <Description> */ /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ /* (Microsoft) or `bloc' (Apple) tables. */ /* */ /* <Fields> */ /* first_glyph :: The first glyph index in the range. */ /* */ /* last_glyph :: The last glyph index in the range. */ /* */ /* index_format :: The format of index table. Valid values are 1 */ /* to 5. */ /* */ /* image_format :: The format of `EBDT' image data. */ /* */ /* image_offset :: The offset to image data in `EBDT'. */ /* */ /* image_size :: For index formats 2 and 5. This is the size in */ /* bytes of each glyph bitmap. */ /* */ /* big_metrics :: For index formats 2 and 5. This is the big */ /* metrics for each glyph bitmap. */ /* */ /* num_glyphs :: For index formats 4 and 5. This is the number of */ /* glyphs in the code array. */ /* */ /* glyph_offsets :: For index formats 1 and 3. */ /* */ /* glyph_codes :: For index formats 4 and 5. */ /* */ /* table_offset :: The offset of the index table in the `EBLC' */ /* table. Only used during strike loading. */ /* */ typedef struct TT_SBit_RangeRec { FT_UShort first_glyph; FT_UShort last_glyph; FT_UShort index_format; FT_UShort image_format; FT_ULong image_offset; FT_ULong image_size; TT_SBit_MetricsRec metrics; FT_ULong num_glyphs; FT_ULong* glyph_offsets; FT_UShort* glyph_codes; FT_ULong table_offset; } TT_SBit_RangeRec, *TT_SBit_Range; /*************************************************************************/ /* */ /* <Struct> */ /* TT_SBit_StrikeRec */ /* */ /* <Description> */ /* A structure used describe a given bitmap strike in the `EBLC' */ /* (Microsoft) or `bloc' (Apple) tables. */ /* */ /* <Fields> */ /* num_index_ranges :: The number of index ranges. */ /* */ /* index_ranges :: An array of glyph index ranges. */ /* */ /* color_ref :: Unused. `color_ref' is put in for future */ /* enhancements, but these fields are already */ /* in use by other platforms (e.g. Newton). */ /* For details, please see */ /* */ /* http://fonts.apple.com/ */ /* TTRefMan/RM06/Chap6bloc.html */ /* */ /* hori :: The line metrics for horizontal layouts. */ /* */ /* vert :: The line metrics for vertical layouts. */ /* */ /* start_glyph :: The lowest glyph index for this strike. */ /* */ /* end_glyph :: The highest glyph index for this strike. */ /* */ /* x_ppem :: The number of horizontal pixels per EM. */ /* */ /* y_ppem :: The number of vertical pixels per EM. */ /* */ /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */ /* and 8. */ /* */ /* flags :: Is this a vertical or horizontal strike? For */ /* details, please see */ /* */ /* http://fonts.apple.com/ */ /* TTRefMan/RM06/Chap6bloc.html */ /* */ typedef struct TT_SBit_StrikeRec_ { FT_Int num_ranges; TT_SBit_Range sbit_ranges; FT_ULong ranges_offset; FT_ULong color_ref; TT_SBit_LineMetricsRec hori; TT_SBit_LineMetricsRec vert; FT_UShort start_glyph; FT_UShort end_glyph; FT_Byte x_ppem; FT_Byte y_ppem; FT_Byte bit_depth; FT_Char flags; } TT_SBit_StrikeRec, *TT_SBit_Strike; /*************************************************************************/ /* */ /* <Struct> */ /* TT_SBit_ComponentRec */ /* */ /* <Description> */ /* A simple structure to describe a compound sbit element. */ /* */ /* <Fields> */ /* glyph_code :: The element's glyph index. */ /* */ /* x_offset :: The element's left bearing. */ /* */ /* y_offset :: The element's top bearing. */ /* */ typedef struct TT_SBit_ComponentRec_ { FT_UShort glyph_code; FT_Char x_offset; FT_Char y_offset; } TT_SBit_ComponentRec, *TT_SBit_Component; /*************************************************************************/ /* */ /* <Struct> */ /* TT_SBit_ScaleRec */ /* */ /* <Description> */ /* A structure used describe a given bitmap scaling table, as defined */ /* in the `EBSC' table. */ /* */ /* <Fields> */ /* hori :: The horizontal line metrics. */ /* */ /* vert :: The vertical line metrics. */ /* */ /* x_ppem :: The number of horizontal pixels per EM. */ /* */ /* y_ppem :: The number of vertical pixels per EM. */ /* */ /* x_ppem_substitute :: Substitution x_ppem value. */ /* */ /* y_ppem_substitute :: Substitution y_ppem value. */ /* */ typedef struct TT_SBit_ScaleRec_ { TT_SBit_LineMetricsRec hori; TT_SBit_LineMetricsRec vert; FT_Byte x_ppem; FT_Byte y_ppem; FT_Byte x_ppem_substitute; FT_Byte y_ppem_substitute; } TT_SBit_ScaleRec, *TT_SBit_Scale; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* TT_Post_20Rec */ /* */ /* <Description> */ /* Postscript names sub-table, format 2.0. Stores the PS name of */ /* each glyph in the font face. */ /* */ /* <Fields> */ /* num_glyphs :: The number of named glyphs in the table. */ /* */ /* num_names :: The number of PS names stored in the table. */ /* */ /* glyph_indices :: The indices of the glyphs in the names arrays. */ /* */ /* glyph_names :: The PS names not in Mac Encoding. */ /* */ typedef struct TT_Post_20Rec_ { FT_UShort num_glyphs; FT_UShort num_names; FT_UShort* glyph_indices; FT_Char** glyph_names; } TT_Post_20Rec, *TT_Post_20; /*************************************************************************/ /* */ /* <Struct> */ /* TT_Post_25Rec */ /* */ /* <Description> */ /* Postscript names sub-table, format 2.5. Stores the PS name of */ /* each glyph in the font face. */ /* */ /* <Fields> */ /* num_glyphs :: The number of glyphs in the table. */ /* */ /* offsets :: An array of signed offsets in a normal Mac */ /* Postscript name encoding. */ /* */ typedef struct TT_Post_25_ { FT_UShort num_glyphs; FT_Char* offsets; } TT_Post_25Rec, *TT_Post_25; /*************************************************************************/ /* */ /* <Struct> */ /* TT_Post_NamesRec */ /* */ /* <Description> */ /* Postscript names table, either format 2.0 or 2.5. */ /* */ /* <Fields> */ /* loaded :: A flag to indicate whether the PS names are loaded. */ /* */ /* format_20 :: The sub-table used for format 2.0. */ /* */ /* format_25 :: The sub-table used for format 2.5. */ /* */ typedef struct TT_Post_NamesRec_ { FT_Bool loaded; union { TT_Post_20Rec format_20; TT_Post_25Rec format_25; } names; } TT_Post_NamesRec, *TT_Post_Names; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** TRUETYPE CHARMAPS SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* format 0 */ typedef struct TT_CMap0_ { FT_ULong language; /* for Mac fonts (originally ushort) */ FT_Byte* glyphIdArray; } TT_CMap0Rec, *TT_CMap0; /* format 2 */ typedef struct TT_CMap2SubHeaderRec_ { FT_UShort firstCode; /* first valid low byte */ FT_UShort entryCount; /* number of valid low bytes */ FT_Short idDelta; /* delta value to glyphIndex */ FT_UShort idRangeOffset; /* offset from here to 1st code */ } TT_CMap2SubHeaderRec, *TT_CMap2SubHeader; typedef struct TT_CMap2Rec_ { FT_ULong language; /* for Mac fonts (originally ushort) */ FT_UShort* subHeaderKeys; /* high byte mapping table */ /* value = subHeader index * 8 */ TT_CMap2SubHeader subHeaders; FT_UShort* glyphIdArray; FT_UShort numGlyphId; /* control value */ } TT_CMap2Rec, *TT_CMap2; /* format 4 */ typedef struct TT_CMap4Segment_ { FT_UShort endCount; FT_UShort startCount; FT_Short idDelta; FT_UShort idRangeOffset; } TT_CMap4SegmentRec, *TT_CMap4Segment; typedef struct TT_CMap4Rec_ { FT_ULong language; /* for Mac fonts (originally ushort) */ FT_UShort segCountX2; /* number of segments * 2 */ FT_UShort searchRange; /* these parameters can be used */ FT_UShort entrySelector; /* for a binary search */ FT_UShort rangeShift; TT_CMap4Segment segments; FT_UShort* glyphIdArray; FT_UShort numGlyphId; /* control value */ TT_CMap4Segment last_segment; /* last used segment; this is a small */ /* cache to potentially increase speed */ } TT_CMap4Rec, *TT_CMap4; /* format 6 */ typedef struct TT_CMap6_ { FT_ULong language; /* for Mac fonts (originally ushort) */ FT_UShort firstCode; /* first character code of subrange */ FT_UShort entryCount; /* number of character codes in subrange */ FT_UShort* glyphIdArray; } TT_CMap6Rec, *TT_CMap6; /* auxiliary table for format 8 and 12 */ typedef struct TT_CMapGroupRec_ { FT_ULong startCharCode; FT_ULong endCharCode; FT_ULong startGlyphID; } TT_CMapGroupRec, *TT_CMapGroup; /* FreeType handles format 8 and 12 identically. It is not necessary to cover mixed 16bit and 32bit codes since FreeType always uses FT_ULong for input character codes -- converting Unicode surrogates to 32bit character codes must be done by the application. */ typedef struct TT_CMap8_12Rec_ { FT_ULong language; /* for Mac fonts */ FT_ULong nGroups; TT_CMapGroup groups; TT_CMapGroup last_group; /* last used group; this is a small */ /* cache to potentially increase speed */ } TT_CMap8_12Rec, *TT_CMap8_12; /* format 10 */ typedef struct TT_CMap10Rec_ { FT_ULong language; /* for Mac fonts */ FT_ULong startCharCode; /* first character covered */ FT_ULong numChars; /* number of characters covered */ FT_UShort* glyphs; } TT_CMap10Rec, *TT_CMap10; typedef struct TT_CMapTableRec_* TT_CMapTable; typedef FT_UInt (*TT_CharMap_Func)( TT_CMapTable charmap, FT_ULong char_code ); typedef FT_ULong (*TT_CharNext_Func)( TT_CMapTable charmap, FT_ULong char_code ); /* charmap table */ typedef struct TT_CMapTableRec_ { FT_UShort platformID; FT_UShort platformEncodingID; FT_UShort format; FT_ULong length; /* must be ulong for formats 8, 10, and 12 */ FT_Bool loaded; FT_ULong offset; union { TT_CMap0Rec cmap0; TT_CMap2Rec cmap2; TT_CMap4Rec cmap4; TT_CMap6Rec cmap6; TT_CMap8_12Rec cmap8_12; TT_CMap10Rec cmap10; } c; TT_CharMap_Func get_index; TT_CharNext_Func get_next_char; } TT_CMapTableRec; /*************************************************************************/ /* */ /* <Struct> */ /* TT_CharMapRec */ /* */ /* <Description> */ /* The TrueType character map object type. */ /* */ /* <Fields> */ /* root :: The parent character map structure. */ /* */ /* cmap :: The used character map. */ /* */ typedef struct TT_CharMapRec_ { FT_CharMapRec root; TT_CMapTableRec cmap; } TT_CharMapRec; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*** ***/ /*** ***/ /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* This structure/class is defined here because it is common to the */ /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ /* */ /* Note, however, that the classes TT_Size, TT_GlyphSlot, and TT_CharMap */ /* are not shared between font drivers, and are thus defined in */ /* `ttobjs.h'. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Type> */ /* TT_Face */ /* */ /* <Description> */ /* A handle to a TrueType face/font object. A TT_Face encapsulates */ /* the resolution and scaling independent parts of a TrueType font */ /* resource. */ /* */ /* <Note> */ /* The TT_Face structure is also used as a `parent class' for the */ /* OpenType-CFF class (T2_Face). */ /* */ typedef struct TT_FaceRec_* TT_Face; /*************************************************************************/ /* */ /* <Type> */ /* TT_CharMap */ /* */ /* <Description> */ /* A handle to a TrueType character mapping object. */ /* */ typedef struct TT_CharMapRec_* TT_CharMap; /* a function type used for the truetype bytecode interpreter hooks */ typedef FT_Error (*TT_Interpreter)( void* exec_context ); /* forward declaration */ typedef struct TT_LoaderRec_* TT_Loader; /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Loader_GotoTableFunc */ /* */ /* <Description> */ /* Seeks a stream to the start of a given TrueType table. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ /* tag :: A 4-byte tag used to name the table. */ /* */ /* stream :: The input stream. */ /* */ /* <Output> */ /* length :: The length of the table in bytes. Set to 0 if not */ /* needed. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* The stream cursor must be at the font file's origin. */ /* */ typedef FT_Error (*TT_Loader_GotoTableFunc)( TT_Face face, FT_ULong tag, FT_Stream stream, FT_ULong* length ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Loader_StartGlyphFunc */ /* */ /* <Description> */ /* Seeks a stream to the start of a given glyph element, and opens a */ /* frame for it. */ /* */ /* <Input> */ /* loader :: The current TrueType glyph loader object. */ /* */ /* glyph index :: The index of the glyph to access. */ /* */ /* offset :: The offset of the glyph according to the */ /* `locations' table. */ /* */ /* byte_count :: The size of the frame in bytes. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* This function is normally equivalent to FT_STREAM_SEEK(offset) */ /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */ /* but alternative formats (e.g. compressed ones) might use something */ /* different. */ /* */ typedef FT_Error (*TT_Loader_StartGlyphFunc)( TT_Loader loader, FT_UInt glyph_index, FT_ULong offset, FT_UInt byte_count ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Loader_ReadGlyphFunc */ /* */ /* <Description> */ /* Reads one glyph element (its header, a simple glyph, or a */ /* composite) from the loader's current stream frame. */ /* */ /* <Input> */ /* loader :: The current TrueType glyph loader object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ typedef FT_Error (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); /*************************************************************************/ /* */ /* <FuncType> */ /* TT_Loader_EndGlyphFunc */ /* */ /* <Description> */ /* Closes the current loader stream frame for the glyph. */ /* */ /* <Input> */ /* loader :: The current TrueType glyph loader object. */ /* */ typedef void (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); /*************************************************************************/ /* */ /* TrueType Face Type */ /* */ /* <Struct> */ /* TT_Face */ /* */ /* <Description> */ /* The TrueType face class. These objects model the resolution and */ /* point-size independent data found in a TrueType font file. */ /* */ /* <Fields> */ /* root :: The base FT_Face structure, managed by the */ /* base layer. */ /* */ /* ttc_header :: The TrueType collection header, used when */ /* the file is a `ttc' rather than a `ttf'. */ /* For ordinary font files, the field */ /* `ttc_header.count' is set to 0. */ /* */ /* format_tag :: The font format tag. */ /* */ /* num_tables :: The number of TrueType tables in this font */ /* file. */ /* */ /* dir_tables :: The directory of TrueType tables for this */ /* font file. */ /* */ /* header :: The font's font header (`head' table). */ /* Read on font opening. */ /* */ /* horizontal :: The font's horizontal header (`hhea' */ /* table). This field also contains the */ /* associated horizontal metrics table */ /* (`hmtx'). */ /* */ /* max_profile :: The font's maximum profile table. Read on */ /* font opening. Note that some maximum */ /* values cannot be taken directly from this */ /* table. We thus define additional fields */ /* below to hold the computed maxima. */ /* */ /* max_components :: The maximum number of glyph components */ /* required to load any composite glyph from */ /* this font. Used to size the load stack. */ /* */ /* vertical_info :: A boolean which is set when the font file */ /* contains vertical metrics. If not, the */ /* value of the `vertical' field is */ /* undefined. */ /* */ /* vertical :: The font's vertical header (`vhea' table). */ /* This field also contains the associated */ /* vertical metrics table (`vmtx'), if found. */ /* IMPORTANT: The contents of this field is */ /* undefined if the `verticalInfo' field is */ /* unset. */ /* */ /* num_names :: The number of name records within this */ /* TrueType font. */ /* */ /* name_table :: The table of name records (`name'). */ /* */ /* os2 :: The font's OS/2 table (`OS/2'). */ /* */ /* postscript :: The font's PostScript table (`post' */ /* table). The PostScript glyph names are */ /* not loaded by the driver on face opening. */ /* See the `ttpost' module for more details. */ /* */ /* cmap_table :: Address of the face's `cmap' SFNT table */ /* in memory (it's an extracted frame). */ /* */ /* cmap_size :: The size in bytes of the `cmap_table' */ /* described above. */ /* */ /* num_charmaps :: The number of character mappings in the */ /* font. */ /* */ /* charmaps :: The array of charmap objects for this font */ /* file. Note that this field is a typeless */ /* pointer. The Reason is that the format of */ /* charmaps varies with the underlying font */ /* format and cannot be determined here. */ /* */ /* goto_table :: A function called by each TrueType table */ /* loader to position a stream's cursor to */ /* the start of a given table according to */ /* its tag. It defaults to TT_Goto_Face but */ /* can be different for strange formats (e.g. */ /* Type 42). */ /* */ /* access_glyph_frame :: A function used to access the frame of a */ /* given glyph within the face's font file. */ /* */ /* forget_glyph_frame :: A function used to forget the frame of a */ /* given glyph when all data has been loaded. */ /* */ /* read_glyph_header :: A function used to read a glyph header. */ /* It must be called between an `access' and */ /* `forget'. */ /* */ /* read_simple_glyph :: A function used to read a simple glyph. */ /* It must be called after the header was */ /* read, and before the `forget'. */ /* */ /* read_composite_glyph :: A function used to read a composite glyph. */ /* It must be called after the header was */ /* read, and before the `forget'. */ /* */ /* sfnt :: A pointer to the SFNT `driver' interface. */ /* */ /* psnames :: A pointer to the `PSNames' module */ /* interface. */ /* */ /* hdmx :: The face's horizontal device metrics */ /* (`hdmx' table). This table is optional in */ /* TrueType/OpenType fonts. */ /* */ /* gasp :: The grid-fitting and scaling properties */ /* table (`gasp'). This table is optional in */ /* TrueType/OpenType fonts. */ /* */ /* pclt :: The `pclt' SFNT table. */ /* */ /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */ /* sizes, embedded in this font. */ /* */ /* sbit_strikes :: An array of sbit strikes embedded in this */ /* font. This table is optional in a */ /* TrueType/OpenType font. */ /* */ /* num_sbit_scales :: The number of sbit scales for this font. */ /* */ /* sbit_scales :: Array of sbit scales embedded in this */ /* font. This table is optional in a */ /* TrueType/OpenType font. */ /* */ /* postscript_names :: A table used to store the Postscript names */ /* of the glyphs for this font. See the */ /* file `ttconfig.h' for comments on the */ /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ /* */ /* num_locations :: The number of glyph locations in this */ /* TrueType file. This should be */ /* identical to the number of glyphs. */ /* Ignored for Type 2 fonts. */ /* */ /* glyph_locations :: An array of longs. These are offsets to */ /* glyph data within the `glyf' table. */ /* Ignored for Type 2 font faces. */ /* */ /* font_program_size :: Size in bytecodes of the face's font */ /* program. 0 if none defined. Ignored for */ /* Type 2 fonts. */ /* */ /* font_program :: The face's font program (bytecode stream) */ /* executed at load time, also used during */ /* glyph rendering. Comes from the `fpgm' */ /* table. Ignored for Type 2 font fonts. */ /* */ /* cvt_program_size :: The size in bytecodes of the face's cvt */ /* program. Ignored for Type 2 fonts. */ /* */ /* cvt_program :: The face's cvt program (bytecode stream) */ /* executed each time an instance/size is */ /* changed/reset. Comes from the `prep' */ /* table. Ignored for Type 2 fonts. */ /* */ /* cvt_size :: Size of the control value table (in */ /* entries). Ignored for Type 2 fonts. */ /* */ /* cvt :: The face's original control value table. */ /* Coordinates are expressed in unscaled font */ /* units. Comes from the `cvt ' table. */ /* Ignored for Type 2 fonts. */ /* */ /* num_kern_pairs :: The number of kerning pairs present in the */ /* font file. The engine only loads the */ /* first horizontal format 0 kern table it */ /* finds in the font file. Ignored for */ /* Type 2 fonts. */ /* */ /* kern_table_index :: The index of the kerning table in the font */ /* kerning directory. Ignored for Type 2 */ /* fonts. */ /* */ /* interpreter :: A pointer to the TrueType bytecode */ /* interpreters field is also used to hook */ /* the debugger in `ttdebug'. */ /* */ /* extra :: Reserved for third-party font drivers. */ /* */ typedef struct TT_FaceRec_ { FT_FaceRec root; TTC_HeaderRec ttc_header; FT_ULong format_tag; FT_UShort num_tables; TT_Table dir_tables; TT_Header header; /* TrueType header table */ TT_HoriHeader horizontal; /* TrueType horizontal header */ TT_MaxProfile max_profile; FT_ULong max_components; FT_Bool vertical_info; TT_VertHeader vertical; /* TT Vertical header, if present */ FT_UShort num_names; /* number of name records */ TT_NameTableRec name_table; /* name table */ TT_OS2 os2; /* TrueType OS/2 table */ TT_Postscript postscript; /* TrueType Postscript table */ FT_Byte* cmap_table; /* extracted 'cmap' table */ FT_ULong cmap_size; TT_Loader_GotoTableFunc goto_table; TT_Loader_StartGlyphFunc access_glyph_frame; TT_Loader_EndGlyphFunc forget_glyph_frame; TT_Loader_ReadGlyphFunc read_glyph_header; TT_Loader_ReadGlyphFunc read_simple_glyph; TT_Loader_ReadGlyphFunc read_composite_glyph; /* a typeless pointer to the SFNT_Interface table used to load */ /* the basic TrueType tables in the face object */ void* sfnt; /* a typeless pointer to the PSNames_Interface table used to */ /* handle glyph names <-> unicode & Mac values */ void* psnames; /***********************************************************************/ /* */ /* Optional TrueType/OpenType tables */ /* */ /***********************************************************************/ /* horizontal device metrics */ TT_HdmxRec hdmx; /* grid-fitting and scaling table */ TT_GaspRec gasp; /* the `gasp' table */ /* PCL 5 table */ TT_PCLT pclt; /* embedded bitmaps support */ FT_ULong num_sbit_strikes; TT_SBit_Strike sbit_strikes; FT_ULong num_sbit_scales; TT_SBit_Scale sbit_scales; /* postscript names table */ TT_Post_NamesRec postscript_names; /***********************************************************************/ /* */ /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ /* */ /***********************************************************************/ /* the glyph locations */ FT_UShort num_locations; FT_Long* glyph_locations; /* the font program, if any */ FT_ULong font_program_size; FT_Byte* font_program; /* the cvt program, if any */ FT_ULong cvt_program_size; FT_Byte* cvt_program; /* the original, unscaled, control value table */ FT_ULong cvt_size; FT_Short* cvt; /* the format 0 kerning table, if any */ FT_Int num_kern_pairs; FT_Int kern_table_index; TT_Kern0_Pair kern_pairs; /* A pointer to the bytecode interpreter to use. This is also */ /* used to hook the debugger for the `ttdebug' utility. */ TT_Interpreter interpreter; /***********************************************************************/ /* */ /* Other tables or fields. This is used by derivative formats like */ /* OpenType. */ /* */ /***********************************************************************/ FT_Generic extra; } TT_FaceRec; /*************************************************************************/ /* */ /* <Struct> */ /* TT_GlyphZoneRec */ /* */ /* <Description> */ /* A glyph zone is used to load, scale and hint glyph outline */ /* coordinates. */ /* */ /* <Fields> */ /* memory :: A handle to the memory manager. */ /* */ /* max_points :: The maximal size in points of the zone. */ /* */ /* max_contours :: Max size in links contours of thez one. */ /* */ /* n_points :: The current number of points in the zone. */ /* */ /* n_contours :: The current number of contours in the zone. */ /* */ /* org :: The original glyph coordinates (font */ /* units/scaled). */ /* */ /* cur :: The current glyph coordinates (scaled/hinted). */ /* */ /* tags :: The point control tags. */ /* */ /* contours :: The contours end points. */ /* */ typedef struct TT_GlyphZoneRec_ { FT_Memory memory; FT_UShort max_points; FT_UShort max_contours; FT_UShort n_points; /* number of points in zone */ FT_Short n_contours; /* number of contours */ FT_Vector* org; /* original point coordinates */ FT_Vector* cur; /* current point coordinates */ FT_Byte* tags; /* current touch flags */ FT_UShort* contours; /* contour end points */ } TT_GlyphZoneRec, *TT_GlyphZone; /* handle to execution context */ typedef struct TT_ExecContextRec_* TT_ExecContext; /* glyph loader structure */ typedef struct TT_LoaderRec_ { FT_Face face; FT_Size size; FT_GlyphSlot glyph; FT_GlyphLoader gloader; FT_ULong load_flags; FT_UInt glyph_index; FT_Stream stream; FT_Int byte_len; FT_Short n_contours; FT_BBox bbox; FT_Int left_bearing; FT_Int advance; FT_Int linear; FT_Bool linear_def; FT_Bool preserve_pps; FT_Vector pp1; FT_Vector pp2; FT_ULong glyf_offset; /* the zone where we load our glyphs */ TT_GlyphZoneRec base; TT_GlyphZoneRec zone; TT_ExecContext exec; FT_Byte* instructions; FT_ULong ins_pos; /* for possible extensibility in other formats */ void* other; } TT_LoaderRec; FT_END_HEADER #endif /* __TTTYPES_H__ */ /* END */ changed/reset. Comes from the `prep' */ /* table. Ignored for Type 2 fonts. */ /* */ /* cvt_size :: Size of the control value table (in */ /* entrieold_contrib//root/sys/src/cmd/limbo/include/freetype/t1tables.h������������������������������������� 664 � 0 � 0 � 34331 7607330532 23675�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* t1tables.h */ /* */ /* Basic Type 1/Type 2 tables definitions and interface (specification */ /* only). */ /* */ /* Copyright 1996-2001, 2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __T1TABLES_H__ #define __T1TABLES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* type1_tables */ /* */ /* <Title> */ /* Type 1 Tables */ /* */ /* <Abstract> */ /* Type 1 (PostScript) specific font tables. */ /* */ /* <Description> */ /* This section contains the definition of Type 1-specific tables, */ /* including structures related to other PostScript font formats. */ /* */ /*************************************************************************/ /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ /* structures in order to support Multiple Master fonts. */ /*************************************************************************/ /* */ /* <Struct> */ /* PS_FontInfoRec */ /* */ /* <Description> */ /* A structure used to model a Type1/Type2 FontInfo dictionary. Note */ /* that for Multiple Master fonts, each instance has its own */ /* FontInfo. */ /* */ typedef struct PS_FontInfoRec { FT_String* version; FT_String* notice; FT_String* full_name; FT_String* family_name; FT_String* weight; FT_Long italic_angle; FT_Bool is_fixed_pitch; FT_Short underline_position; FT_UShort underline_thickness; } PS_FontInfoRec, *PS_FontInfo; /*************************************************************************/ /* */ /* <Struct> */ /* T1_FontInfo */ /* */ /* <Description> */ /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ /* kept to maintain source compatibility between various versions of */ /* FreeType. */ /* */ typedef PS_FontInfoRec T1_FontInfo; /*************************************************************************/ /* */ /* <Struct> */ /* PS_PrivateRec */ /* */ /* <Description> */ /* A structure used to model a Type1/Type2 private dictionary. Note */ /* that for Multiple Master fonts, each instance has its own Private */ /* dictionary. */ /* */ typedef struct PS_PrivateRec_ { FT_Int unique_id; FT_Int lenIV; FT_Byte num_blue_values; FT_Byte num_other_blues; FT_Byte num_family_blues; FT_Byte num_family_other_blues; FT_Short blue_values[14]; FT_Short other_blues[10]; FT_Short family_blues [14]; FT_Short family_other_blues[10]; FT_Fixed blue_scale; FT_Int blue_shift; FT_Int blue_fuzz; FT_UShort standard_width[1]; FT_UShort standard_height[1]; FT_Byte num_snap_widths; FT_Byte num_snap_heights; FT_Bool force_bold; FT_Bool round_stem_up; FT_Short snap_widths [13]; /* including std width */ FT_Short snap_heights[13]; /* including std height */ FT_Long language_group; FT_Long password; FT_Short min_feature[2]; } PS_PrivateRec, *PS_Private; /*************************************************************************/ /* */ /* <Struct> */ /* T1_Private */ /* */ /* <Description> */ /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ /* kept to maintain source compatibility between various versions of */ /* FreeType. */ /* */ typedef PS_PrivateRec T1_Private; /*************************************************************************/ /* */ /* <Enum> */ /* T1_Blend_Flags */ /* */ /* <Description> */ /* A set of flags used to indicate which fields are present in a */ /* given blen dictionary (font info or private). Used to support */ /* Multiple Masters fonts. */ /* */ typedef enum { /*# required fields in a FontInfo blend dictionary */ T1_BLEND_UNDERLINE_POSITION = 0, T1_BLEND_UNDERLINE_THICKNESS, T1_BLEND_ITALIC_ANGLE, /*# required fields in a Private blend dictionary */ T1_BLEND_BLUE_VALUES, T1_BLEND_OTHER_BLUES, T1_BLEND_STANDARD_WIDTH, T1_BLEND_STANDARD_HEIGHT, T1_BLEND_STEM_SNAP_WIDTHS, T1_BLEND_STEM_SNAP_HEIGHTS, T1_BLEND_BLUE_SCALE, T1_BLEND_BLUE_SHIFT, T1_BLEND_FAMILY_BLUES, T1_BLEND_FAMILY_OTHER_BLUES, T1_BLEND_FORCE_BOLD, /*# never remove */ T1_BLEND_MAX } T1_Blend_Flags; /*# backwards compatible definitions */ #define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION #define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS #define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE #define t1_blend_blue_values T1_BLEND_BLUE_VALUES #define t1_blend_other_blues T1_BLEND_OTHER_BLUES #define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH #define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT #define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS #define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS #define t1_blend_blue_scale T1_BLEND_BLUE_SCALE #define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT #define t1_blend_family_blues T1_BLEND_FAMILY_BLUES #define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES #define t1_blend_force_bold T1_BLEND_FORCE_BOLD #define t1_blend_max T1_BLEND_MAX /* maximum number of Multiple Masters designs, as defined in the spec */ #define T1_MAX_MM_DESIGNS 16 /* maximum number of Multiple Masters axes, as defined in the spec */ #define T1_MAX_MM_AXIS 4 /* maximum number of elements in a design map */ #define T1_MAX_MM_MAP_POINTS 20 /* this structure is used to store the BlendDesignMap entry for an axis */ typedef struct PS_DesignMap_ { FT_Byte num_points; FT_Fixed* design_points; FT_Fixed* blend_points; } PS_DesignMapRec, *PS_DesignMap; /* backwards-compatible definition */ typedef PS_DesignMapRec T1_DesignMap; typedef struct PS_BlendRec_ { FT_UInt num_designs; FT_UInt num_axis; FT_String* axis_names[T1_MAX_MM_AXIS]; FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; FT_Fixed* weight_vector; FT_Fixed* default_weight_vector; PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; PS_Private privates [T1_MAX_MM_DESIGNS + 1]; FT_ULong blend_bitflags; FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; } PS_BlendRec, *PS_Blend; /* backwards-compatible definition */ typedef PS_BlendRec T1_Blend; typedef struct CID_FaceDictRec_ { PS_PrivateRec private_dict; FT_UInt len_buildchar; FT_Fixed forcebold_threshold; FT_Pos stroke_width; FT_Fixed expansion_factor; FT_Byte paint_type; FT_Byte font_type; FT_Matrix font_matrix; FT_Vector font_offset; FT_UInt num_subrs; FT_ULong subrmap_offset; FT_Int sd_bytes; } CID_FaceDictRec, *CID_FaceDict; /* backwards-compatible definition */ typedef CID_FaceDictRec CID_FontDict; typedef struct CID_FaceInfoRec_ { FT_String* cid_font_name; FT_Fixed cid_version; FT_Int cid_font_type; FT_String* registry; FT_String* ordering; FT_Int supplement; PS_FontInfoRec font_info; FT_BBox font_bbox; FT_ULong uid_base; FT_Int num_xuid; FT_ULong xuid[16]; FT_ULong cidmap_offset; FT_Int fd_bytes; FT_Int gd_bytes; FT_ULong cid_count; FT_Int num_dicts; CID_FaceDict font_dicts; FT_ULong data_offset; } CID_FaceInfoRec, *CID_FaceInfo; /*************************************************************************/ /* */ /* <Struct> */ /* CID_Info */ /* */ /* <Description> */ /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ /* kept to maintain source compatibility between various versions of */ /* FreeType. */ /* */ typedef CID_FaceInfoRec CID_Info; /* */ /************************************************************************ * * @function: * FT_Has_PS_Glyph_Names * * @description: * Return true if a given face provides reliable Postscript glyph * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, * except that certain fonts (mostly TrueType) contain incorrect * glyph name tables. * * When this function returns true, the caller is sure that the glyph * names returned by @FT_Get_Glyph_Name are reliable. * * @input: * face :: * face handle * * @return: * Boolean. True if glyph names are reliable. */ FT_EXPORT( FT_Int ) FT_Has_PS_Glyph_Names( FT_Face face ); /************************************************************************ * * @function: * FT_Get_PS_Font_Info * * @description: * Retrieve the @PS_FontInfoRec structure corresponding to a given * Postscript font. * * @input: * face :: * Postscript face handle. * * @output: * afont_info :: * Output font info structure pointer. * * @return: * FreeType error code. 0 means success. * * @note: * The string pointers within the font info structure are owned by * the face and don't need to be freed by the caller. * * If the font's format is not Postscript-based, this function will * return the @FT_Err_Invalid_Argument error code. */ FT_EXPORT( FT_Error ) FT_Get_PS_Font_Info( FT_Face face, PS_FontInfoRec *afont_info ); /* */ FT_END_HEADER #endif /* __T1TABLES_H__ */ /* END */ */ /* <Description> */ /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ /* kept to maintain source compatibility between various versions of */ /* FreeType. old_contrib//root/sys/src/cmd/limbo/include/freetype/ttnameid.h������������������������������������� 664 � 0 � 0 � 136506 7607330532 24012�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* ttnameid.h */ /* */ /* TrueType name ID definitions (specification only). */ /* */ /* Copyright 1996-2002 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __TTNAMEID_H__ #define __TTNAMEID_H__ #include <ft2build.h> FT_BEGIN_HEADER /*************************************************************************/ /* */ /* Possible values for the `platform' identifier code in the name */ /* records of the TTF `name' table. */ /* */ /*************************************************************************/ /*********************************************************************** * * @enum: * TT_PLATFORM_XXX * * @description: * A list of valid values for the `platform_id' identifier code in * @FT_CharmapRec and @FT_SfntName structures. * * @values: * TT_PLATFORM_APPLE_UNICODE :: * Used by Apple to indicate a Unicode character map and/or name entry. * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note * that name entries in this format are coded as big-endian UCS-2 * character codes _only_. * * TT_PLATFORM_MACINTOSH :: * Used by Apple to indicate a MacOS-specific charmap and/or name entry. * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that * most TrueType fonts contain an Apple roman charmap to be usable on * MacOS systems (even if they contain a Microsoft charmap as well). * * TT_PLATFORM_ISO :: * This value was used to specify Unicode charmaps. It is however * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding * `encoding_id' values. * * TT_PLATFORM_MICROSOFT :: * Used by Microsoft to indicate Windows-specific charmaps. See * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. * Note that most fonts contain a Unicode charmap using * (@TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). * * TT_PLATFORM_CUSTOM :: * Used to indicate application-specific charmaps. * * TT_PLATFORM_ADOBE :: * This value isn't part of any font format specification, but is used * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec * structure. See @TT_ADOBE_ID_XXX. */ #define TT_PLATFORM_APPLE_UNICODE 0 #define TT_PLATFORM_MACINTOSH 1 #define TT_PLATFORM_ISO 2 /* deprecated */ #define TT_PLATFORM_MICROSOFT 3 #define TT_PLATFORM_CUSTOM 4 #define TT_PLATFORM_ADOBE 7 /* artificial */ /*********************************************************************** * * @enum: * TT_APPLE_ID_XXX * * @description: * A list of valid values for the `encoding_id' for * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. * * @values: * TT_APPLE_ID_DEFAULT :: * Unicode version 1.0. * TT_APPLE_ID_UNICODE_1_1 :: * Unicode 1.1; specifies Hangul characters starting at U+34xx. * TT_APPLE_ID_ISO_10646 :: * Deprecated. * TT_APPLE_ID_UNICODE_2_0 :: * Unicode 2.0 and beyond (UTF-16 BMP only). * TT_APPLE_ID_UNICODE_32 :: * UTF-32 (Adobe proposal for OpenType). */ #define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ #define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ #define TT_APPLE_ID_ISO_10646 2 /* deprecated */ #define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ #define TT_APPLE_ID_UNICODE_32 4 /* Adobe proposal */ /*********************************************************************** * * @enum: * TT_MAC_ID_XXX * * @description: * A list of valid values for the `encoding_id' for * @TT_PLATFORM_MACINTOSH charmaps and name entries. * * @values: * TT_MAC_ID_ROMAN :: * TT_MAC_ID_JAPANESE :: * TT_MAC_ID_TRADITIONAL_CHINESE :: * TT_MAC_ID_KOREAN :: * TT_MAC_ID_ARABIC :: * TT_MAC_ID_HEBREW :: * TT_MAC_ID_GREEK :: * TT_MAC_ID_RUSSIAN :: * TT_MAC_ID_RSYMBOL :: * TT_MAC_ID_DEVANAGARI :: * TT_MAC_ID_GURMUKHI :: * TT_MAC_ID_GUJARATI :: * TT_MAC_ID_ORIYA :: * TT_MAC_ID_BENGALI :: * TT_MAC_ID_TAMIL :: * TT_MAC_ID_TELUGU :: * TT_MAC_ID_KANNADA :: * TT_MAC_ID_MALAYALAM :: * TT_MAC_ID_SINHALESE :: * TT_MAC_ID_BURMESE :: * TT_MAC_ID_KHMER :: * TT_MAC_ID_THAI :: * TT_MAC_ID_LAOTIAN :: * TT_MAC_ID_GEORGIAN :: * TT_MAC_ID_ARMENIAN :: * TT_MAC_ID_MALDIVIAN :: * TT_MAC_ID_SIMPLIFIED_CHINESE :: * TT_MAC_ID_TIBETAN :: * TT_MAC_ID_MONGOLIAN :: * TT_MAC_ID_GEEZ :: * TT_MAC_ID_SLAVIC :: * TT_MAC_ID_VIETNAMESE :: * TT_MAC_ID_SINDHI :: * TT_MAC_ID_UNINTERP :: */ #define TT_MAC_ID_ROMAN 0 #define TT_MAC_ID_JAPANESE 1 #define TT_MAC_ID_TRADITIONAL_CHINESE 2 #define TT_MAC_ID_KOREAN 3 #define TT_MAC_ID_ARABIC 4 #define TT_MAC_ID_HEBREW 5 #define TT_MAC_ID_GREEK 6 #define TT_MAC_ID_RUSSIAN 7 #define TT_MAC_ID_RSYMBOL 8 #define TT_MAC_ID_DEVANAGARI 9 #define TT_MAC_ID_GURMUKHI 10 #define TT_MAC_ID_GUJARATI 11 #define TT_MAC_ID_ORIYA 12 #define TT_MAC_ID_BENGALI 13 #define TT_MAC_ID_TAMIL 14 #define TT_MAC_ID_TELUGU 15 #define TT_MAC_ID_KANNADA 16 #define TT_MAC_ID_MALAYALAM 17 #define TT_MAC_ID_SINHALESE 18 #define TT_MAC_ID_BURMESE 19 #define TT_MAC_ID_KHMER 20 #define TT_MAC_ID_THAI 21 #define TT_MAC_ID_LAOTIAN 22 #define TT_MAC_ID_GEORGIAN 23 #define TT_MAC_ID_ARMENIAN 24 #define TT_MAC_ID_MALDIVIAN 25 #define TT_MAC_ID_SIMPLIFIED_CHINESE 25 #define TT_MAC_ID_TIBETAN 26 #define TT_MAC_ID_MONGOLIAN 27 #define TT_MAC_ID_GEEZ 28 #define TT_MAC_ID_SLAVIC 29 #define TT_MAC_ID_VIETNAMESE 30 #define TT_MAC_ID_SINDHI 31 #define TT_MAC_ID_UNINTERP 32 /*********************************************************************** * * @enum: * TT_ISO_ID_XXX * * @description: * A list of valid values for the `encoding_id' for * @TT_PLATFORM_ISO charmaps and name entries. * * Their use is now deprecated. * * @values: * TT_ISO_ID_7BIT_ASCII :: * ASCII. * TT_ISO_ID_10646 :: * ISO/10646. * TT_ISO_ID_8859_1 :: * Also known as Latin-1. */ #define TT_ISO_ID_7BIT_ASCII 0 #define TT_ISO_ID_10646 1 #define TT_ISO_ID_8859_1 2 /*********************************************************************** * * @enum: * TT_MS_ID_XXX * * @description: * A list of valid values for the `encoding_id' for * @TT_PLATFORM_MICROSOFT charmaps and name entries. * * @values: * TT_MS_ID_SYMBOL_CS :: * Corresponds to symbol encodings. see @FT_ENCODING_MS_SYMBOL. * * TT_MS_ID_UNICODE_CS :: * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See * @FT_ENCODING_UNICODE. * * TT_MS_ID_SJIS :: * Corresponds to Microsoft SJIS Japanese encoding. * See @FT_ENCODING_MS_SJIS. * * TT_MS_ID_GB2312 :: * Corresponds to Microsoft Simplified Chinese as used in Mainland * China. See @FT_ENCODING_MS_GB2312. * * TT_MS_ID_BIG_5 :: * Corresponds to Microsoft Traditional Chinese as used in Taiwan and * Hong Kong. See @FT_ENCODING_MS_BIG5. * * TT_MS_ID_WANSUNG :: * Corresponds to Microsoft Korean Wansung encoding. See * @FT_ENCODING_MS_WANSUNG. * * TT_MS_ID_JOHAB :: * Corresponds to Microsoft Johab encoding. See @FT_ENCODING_MS_JOHAB. * * TT_MS_ID_UCS_4 :: * Corresponds to UCS-4 or UTF-32 charmaps. This is a recent Adobe * proposal for OpenType. */ #define TT_MS_ID_SYMBOL_CS 0 #define TT_MS_ID_UNICODE_CS 1 #define TT_MS_ID_SJIS 2 #define TT_MS_ID_GB2312 3 #define TT_MS_ID_BIG_5 4 #define TT_MS_ID_WANSUNG 5 #define TT_MS_ID_JOHAB 6 #define TT_MS_ID_UCS_4 10 /*********************************************************************** * * @enum: * TT_ADOBE_ID_XXX * * @description: * A list of valid values for the `encoding_id' for * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! * * @values: * TT_ADOBE_ID_STANDARD :: * Adobe standard encoding. * TT_ADOBE_ID_EXPERT :: * Adobe expert encoding. * TT_ADOBE_ID_CUSTOM :: * Adobe custom encoding. */ #define TT_ADOBE_ID_STANDARD 0 #define TT_ADOBE_ID_EXPERT 1 #define TT_ADOBE_ID_CUSTOM 2 /*************************************************************************/ /* */ /* Possible values of the language identifier field in the name records */ /* of the TTF `name' table if the `platform' identifier code is */ /* TT_PLATFORM_MACINTOSH. */ /* */ /* The canonical source for the Apple assigned Language ID's is at */ /* */ /* http://fonts.apple.com/TTRefMan/RM06/Chap6name.html */ /* */ #define TT_MAC_LANGID_ENGLISH 0 #define TT_MAC_LANGID_FRENCH 1 #define TT_MAC_LANGID_GERMAN 2 #define TT_MAC_LANGID_ITALIAN 3 #define TT_MAC_LANGID_DUTCH 4 #define TT_MAC_LANGID_SWEDISH 5 #define TT_MAC_LANGID_SPANISH 6 #define TT_MAC_LANGID_DANISH 7 #define TT_MAC_LANGID_PORTUGUESE 8 #define TT_MAC_LANGID_NORWEGIAN 9 #define TT_MAC_LANGID_HEBREW 10 #define TT_MAC_LANGID_JAPANESE 11 #define TT_MAC_LANGID_ARABIC 12 #define TT_MAC_LANGID_FINNISH 13 #define TT_MAC_LANGID_GREEK 14 #define TT_MAC_LANGID_ICELANDIC 15 #define TT_MAC_LANGID_MALTESE 16 #define TT_MAC_LANGID_TURKISH 17 #define TT_MAC_LANGID_CROATIAN 18 #define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 #define TT_MAC_LANGID_URDU 20 #define TT_MAC_LANGID_HINDI 21 #define TT_MAC_LANGID_THAI 22 #define TT_MAC_LANGID_KOREAN 23 #define TT_MAC_LANGID_LITHUANIAN 24 #define TT_MAC_LANGID_POLISH 25 #define TT_MAC_LANGID_HUNGARIAN 26 #define TT_MAC_LANGID_ESTONIAN 27 #define TT_MAC_LANGID_LETTISH 28 #define TT_MAC_LANGID_SAAMISK 29 #define TT_MAC_LANGID_FAEROESE 30 #define TT_MAC_LANGID_FARSI 31 #define TT_MAC_LANGID_RUSSIAN 32 #define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 #define TT_MAC_LANGID_FLEMISH 34 #define TT_MAC_LANGID_IRISH 35 #define TT_MAC_LANGID_ALBANIAN 36 #define TT_MAC_LANGID_ROMANIAN 37 #define TT_MAC_LANGID_CZECH 38 #define TT_MAC_LANGID_SLOVAK 39 #define TT_MAC_LANGID_SLOVENIAN 40 #define TT_MAC_LANGID_YIDDISH 41 #define TT_MAC_LANGID_SERBIAN 42 #define TT_MAC_LANGID_MACEDONIAN 43 #define TT_MAC_LANGID_BULGARIAN 44 #define TT_MAC_LANGID_UKRAINIAN 45 #define TT_MAC_LANGID_BYELORUSSIAN 46 #define TT_MAC_LANGID_UZBEK 47 #define TT_MAC_LANGID_KAZAKH 48 #define TT_MAC_LANGID_AZERBAIJANI 49 #define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 #define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 #define TT_MAC_LANGID_ARMENIAN 51 #define TT_MAC_LANGID_GEORGIAN 52 #define TT_MAC_LANGID_MOLDAVIAN 53 #define TT_MAC_LANGID_KIRGHIZ 54 #define TT_MAC_LANGID_TAJIKI 55 #define TT_MAC_LANGID_TURKMEN 56 #define TT_MAC_LANGID_MONGOLIAN 57 #define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 #define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 #define TT_MAC_LANGID_PASHTO 59 #define TT_MAC_LANGID_KURDISH 60 #define TT_MAC_LANGID_KASHMIRI 61 #define TT_MAC_LANGID_SINDHI 62 #define TT_MAC_LANGID_TIBETAN 63 #define TT_MAC_LANGID_NEPALI 64 #define TT_MAC_LANGID_SANSKRIT 65 #define TT_MAC_LANGID_MARATHI 66 #define TT_MAC_LANGID_BENGALI 67 #define TT_MAC_LANGID_ASSAMESE 68 #define TT_MAC_LANGID_GUJARATI 69 #define TT_MAC_LANGID_PUNJABI 70 #define TT_MAC_LANGID_ORIYA 71 #define TT_MAC_LANGID_MALAYALAM 72 #define TT_MAC_LANGID_KANNADA 73 #define TT_MAC_LANGID_TAMIL 74 #define TT_MAC_LANGID_TELUGU 75 #define TT_MAC_LANGID_SINHALESE 76 #define TT_MAC_LANGID_BURMESE 77 #define TT_MAC_LANGID_KHMER 78 #define TT_MAC_LANGID_LAO 79 #define TT_MAC_LANGID_VIETNAMESE 80 #define TT_MAC_LANGID_INDONESIAN 81 #define TT_MAC_LANGID_TAGALOG 82 #define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 #define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 #define TT_MAC_LANGID_AMHARIC 85 #define TT_MAC_LANGID_TIGRINYA 86 #define TT_MAC_LANGID_GALLA 87 #define TT_MAC_LANGID_SOMALI 88 #define TT_MAC_LANGID_SWAHILI 89 #define TT_MAC_LANGID_RUANDA 90 #define TT_MAC_LANGID_RUNDI 91 #define TT_MAC_LANGID_CHEWA 92 #define TT_MAC_LANGID_MALAGASY 93 #define TT_MAC_LANGID_ESPERANTO 94 #define TT_MAC_LANGID_WELSH 128 #define TT_MAC_LANGID_BASQUE 129 #define TT_MAC_LANGID_CATALAN 130 #define TT_MAC_LANGID_LATIN 131 #define TT_MAC_LANGID_QUECHUA 132 #define TT_MAC_LANGID_GUARANI 133 #define TT_MAC_LANGID_AYMARA 134 #define TT_MAC_LANGID_TATAR 135 #define TT_MAC_LANGID_UIGHUR 136 #define TT_MAC_LANGID_DZONGKHA 137 #define TT_MAC_LANGID_JAVANESE 138 #define TT_MAC_LANGID_SUNDANESE 139 #if 0 /* these seem to be errors that have been dropped */ #define TT_MAC_LANGID_SCOTTISH_GAELIC 140 #define TT_MAC_LANGID_IRISH_GAELIC 141 #endif /* The following codes are new as of 2000-03-10 */ #define TT_MAC_LANGID_GALICIAN 140 #define TT_MAC_LANGID_AFRIKAANS 141 #define TT_MAC_LANGID_BRETON 142 #define TT_MAC_LANGID_INUKTITUT 143 #define TT_MAC_LANGID_SCOTTISH_GAELIC 144 #define TT_MAC_LANGID_MANX_GAELIC 145 #define TT_MAC_LANGID_IRISH_GAELIC 146 #define TT_MAC_LANGID_TONGAN 147 #define TT_MAC_LANGID_GREEK_POLYTONIC 148 #define TT_MAC_LANGID_GREELANDIC 149 #define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 /*************************************************************************/ /* */ /* Possible values of the language identifier field in the name records */ /* of the TTF `name' table if the `platform' identifier code is */ /* TT_PLATFORM_MICROSOFT. */ /* */ /* The canonical source for the MS assigned LCID's is at */ /* */ /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ /* */ #define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 #define TT_MS_LANGID_ARABIC_IRAQ 0x0801 #define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 #define TT_MS_LANGID_ARABIC_LIBYA 0x1001 #define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 #define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 #define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 #define TT_MS_LANGID_ARABIC_OMAN 0x2001 #define TT_MS_LANGID_ARABIC_YEMEN 0x2401 #define TT_MS_LANGID_ARABIC_SYRIA 0x2801 #define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 #define TT_MS_LANGID_ARABIC_LEBANON 0x3001 #define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 #define TT_MS_LANGID_ARABIC_UAE 0x3801 #define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 #define TT_MS_LANGID_ARABIC_QATAR 0x4001 #define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 #define TT_MS_LANGID_CATALAN_SPAIN 0x0403 #define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 #define TT_MS_LANGID_CHINESE_PRC 0x0804 #define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 #define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 #if 1 /* this used to be this value (and it still is in many places) */ #define TT_MS_LANGID_CHINESE_MACAU 0x1404 #else /* but beware, Microsoft may change its mind... the most recent Word reference has the following: */ #define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG #endif #define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 #define TT_MS_LANGID_DANISH_DENMARK 0x0406 #define TT_MS_LANGID_GERMAN_GERMANY 0x0407 #define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 #define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 #define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 #define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 #define TT_MS_LANGID_GREEK_GREECE 0x0408 #define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 #define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 #define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 #define TT_MS_LANGID_ENGLISH_CANADA 0x1009 #define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 #define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 #define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 #define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 #define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 #define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 #define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 #define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 #define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 #define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a #define TT_MS_LANGID_SPANISH_MEXICO 0x080a #define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a #define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a #define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a #define TT_MS_LANGID_SPANISH_PANAMA 0x180a #define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a #define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a #define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a #define TT_MS_LANGID_SPANISH_PERU 0x280a #define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a #define TT_MS_LANGID_SPANISH_ECUADOR 0x300a #define TT_MS_LANGID_SPANISH_CHILE 0x340a #define TT_MS_LANGID_SPANISH_URUGUAY 0x380a #define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a #define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a #define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a #define TT_MS_LANGID_SPANISH_HONDURAS 0x480a #define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a #define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a #define TT_MS_LANGID_FINNISH_FINLAND 0x040b #define TT_MS_LANGID_FRENCH_FRANCE 0x040c #define TT_MS_LANGID_FRENCH_BELGIUM 0x080c #define TT_MS_LANGID_FRENCH_CANADA 0x0c0c #define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c #define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c #define TT_MS_LANGID_FRENCH_MONACO 0x180c #define TT_MS_LANGID_HEBREW_ISRAEL 0x040d #define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e #define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f #define TT_MS_LANGID_ITALIAN_ITALY 0x0410 #define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 #define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 #define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 #define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 #define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 #define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 #define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 #define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 #define TT_MS_LANGID_POLISH_POLAND 0x0415 #define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 #define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 #define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 #define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 #define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 #define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 #define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 #define TT_MS_LANGID_CROATIAN_CROATIA 0x041a #define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a #define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a #define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b #define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c #define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d #define TT_MS_LANGID_SWEDISH_FINLAND 0x081d #define TT_MS_LANGID_THAI_THAILAND 0x041e #define TT_MS_LANGID_TURKISH_TURKEY 0x041f #define TT_MS_LANGID_URDU_PAKISTAN 0x0420 #define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 #define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 #define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 #define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 #define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 #define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 #define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 #define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 #if 0 /* this seems to be an error that have been dropped */ #define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0428 #endif #define TT_MS_LANGID_FARSI_IRAN 0x0429 #define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a #define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b #define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c #define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c #define TT_MS_LANGID_BASQUE_SPAIN 0x042d #define TT_MS_LANGID_SORBIAN_GERMANY 0x042e #define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f #define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 #define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 #define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 #define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 #define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 #define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 #define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 #define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 #define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 #define TT_MS_LANGID_HINDI_INDIA 0x0439 #define TT_MS_LANGID_MALTESE_MALTA 0x043a #define TT_MS_LANGID_SAAMI_LAPONIA 0x043b #if 0 /* this seems to be a previous invertion */ #define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c #define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c #else #define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c #define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c #endif #define TT_MS_LANGID_MALAY_MALAYSIA 0x043e #define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e #define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f #define TT_MS_LANGID_SWAHILI_KENYA 0x0441 #define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 #define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 #define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 #define TT_MS_LANGID_BENGALI_INDIA 0x0445 #define TT_MS_LANGID_PUNJABI_INDIA 0x0446 #define TT_MS_LANGID_GUJARATI_INDIA 0x0447 #define TT_MS_LANGID_ORIYA_INDIA 0x0448 #define TT_MS_LANGID_TAMIL_INDIA 0x0449 #define TT_MS_LANGID_TELUGU_INDIA 0x044a #define TT_MS_LANGID_KANNADA_INDIA 0x044b #define TT_MS_LANGID_MALAYALAM_INDIA 0x044c #define TT_MS_LANGID_ASSAMESE_INDIA 0x044d #define TT_MS_LANGID_MARATHI_INDIA 0x044e #define TT_MS_LANGID_SANSKRIT_INDIA 0x044f #define TT_MS_LANGID_KONKANI_INDIA 0x0457 /* new as of 2001-01-01 */ #define TT_MS_LANGID_ARABIC_GENERAL 0x0001 #define TT_MS_LANGID_CHINESE_GENERAL 0x0004 #define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 #define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c #define TT_MS_LANGID_FRENCH_REUNION 0x200c #define TT_MS_LANGID_FRENCH_CONGO 0x240c /* which was formerly: */ #define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO #define TT_MS_LANGID_FRENCH_SENEGAL 0x280c #define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c #define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c #define TT_MS_LANGID_FRENCH_MALI 0x340c #define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a #define TT_MS_LANGID_URDU_INDIA 0x0820 #define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 #define TT_MS_LANGID_YIDDISH_GERMANY 0x043d #define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN 0x0440 /* alias declared in Windows 2000 */ #define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN #define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 #define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 /* the following seems to be inconsistent; here is the current "official" way: */ #define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 /* and here is what is used by Passport SDK */ #define TT_MS_LANGID_TIBETAN_CHINA 0x0451 #define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 /* end of inconsistency */ #define TT_MS_LANGID_WELSH_WALES 0x0452 #define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 #define TT_MS_LANGID_LAO_LAOS 0x0454 #define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 #define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 #define TT_MS_LANGID_MANIPURI_INDIA 0x0458 #define TT_MS_LANGID_SINDHI_INDIA 0x0459 /* the following one is only encountered in Microsoft RTF specification */ #define TT_MS_LANGID_KASHMIRI_PAKISTAN 0x0460 /* the following one is not in the Passport list, looks like an omission */ #define TT_MS_LANGID_KASHMIRI_INDIA 0x0860 #define TT_MS_LANGID_NEPALI_NEPAL 0x0461 #define TT_MS_LANGID_NEPALI_INDIA 0x0861 #define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 /* new as of 2001-03-01 (from Office Xp) */ #define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09 #define TT_MS_LANGID_ENGLISH_INDIA 0x4009 #define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 #define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 #define TT_MS_LANGID_SYRIAC_SYRIA 0x045a #define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b #define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c #define TT_MS_LANGID_INUKTITUT_CANADA 0x045d #define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e #define TT_MS_LANGID_TAMAZIGHT_MOROCCO 0x045f #define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f #define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 #define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 #define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 /* alias declared in Windows 2000 */ #define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES /* for language codes from 0x0466 to 0x0471 see below */ #define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 #define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 #define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 /* also spelled in the `Passport SDK' list as: */ #define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA /* New additions from Windows Xp/Passport SDK 2001-11-10. */ /* don't ask what this one means... It is commented out currently. */ #if 0 #define TT_MS_LANGID_GREEK_GREECE2 0x2008 #endif #define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a /* The following two IDs blatantly violate MS specs by using a */ /* sublanguage > 0x1F. */ #define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40a #define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40c #define TT_MS_LANGID_FRENCH_MOROCCO 0x380c #define TT_MS_LANGID_FRENCH_HAITI 0x3c0c #define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 #define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 #define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 #define TT_MS_LANGID_EDO_NIGERIA 0x0466 #define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 #define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 #define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 #define TT_MS_LANGID_YORUBA_NIGERIA 0x046a /* language codes from 0x046b to 0x046f are (still) unknown. */ #define TT_MS_LANGID_IGBO_NIGERIA 0x0470 #define TT_MS_LANGID_KANURI_NIGERIA 0x0471 #define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 #define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 #define TT_MS_LANGID_LATIN 0x0476 #define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ /* not written (but OTOH the peculiar writing system is worth */ /* studying). */ #define TT_MS_LANGID_YI_CHINA 0x0478 #define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 /*************************************************************************/ /* */ /* Possible values of the `name' identifier field in the name records of */ /* the TTF `name' table. These values are platform independent. */ /* */ #define TT_NAME_ID_COPYRIGHT 0 #define TT_NAME_ID_FONT_FAMILY 1 #define TT_NAME_ID_FONT_SUBFAMILY 2 #define TT_NAME_ID_UNIQUE_ID 3 #define TT_NAME_ID_FULL_NAME 4 #define TT_NAME_ID_VERSION_STRING 5 #define TT_NAME_ID_PS_NAME 6 #define TT_NAME_ID_TRADEMARK 7 /* the following values are from the OpenType spec */ #define TT_NAME_ID_MANUFACTURER 8 #define TT_NAME_ID_DESIGNER 9 #define TT_NAME_ID_DESCRIPTION 10 #define TT_NAME_ID_VENDOR_URL 11 #define TT_NAME_ID_DESIGNER_URL 12 #define TT_NAME_ID_LICENSE 13 #define TT_NAME_ID_LICENSE_URL 14 /* number 15 is reserved */ #define TT_NAME_ID_PREFERRED_FAMILY 16 #define TT_NAME_ID_PREFERRED_SUBFAMILY 17 #define TT_NAME_ID_MAC_FULL_NAME 18 /* The following code is new as of 2000-01-21 */ #define TT_NAME_ID_SAMPLE_TEXT 19 /* This is new in OpenType 1.3 */ #define TT_NAME_ID_CID_FINDFONT_NAME 20 /*************************************************************************/ /* */ /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ /* */ /* Updated 02-Jul-2000. */ /* */ /* General Scripts Area */ /* Bit 0 Basic Latin */ #define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ /* Bit 1 C1 Controls and Latin-1 Supplement */ #define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ /* Bit 2 Latin Extended-A */ #define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ /* Bit 3 Latin Extended-B */ #define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ /* Bit 4 IPA Extensions */ #define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ /* Bit 5 Spacing Modifier Letters */ #define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ /* Bit 6 Combining Diacritical Marks */ #define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ /* Bit 7 Greek and Coptic */ #define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ /* Bit 8 is reserved (was: Greek Symbols and Coptic) */ /* Bit 9 Cyrillic */ #define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ /* Bit 10 Armenian */ #define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ /* Bit 11 Hebrew */ #define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ /* Bit 12 is reserved (was: Hebrew Extended) */ /* Bit 13 Arabic */ #define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ /* Bit 14 is reserved (was: Arabic Extended) */ /* Bit 15 Devanagari */ #define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ /* Bit 16 Bengali */ #define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ /* Bit 17 Gurmukhi */ #define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ /* Bit 18 Gujarati */ #define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ /* Bit 19 Oriya */ #define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ /* Bit 20 Tamil */ #define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ /* Bit 21 Telugu */ #define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ /* Bit 22 Kannada */ #define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ /* Bit 23 Malayalam */ #define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ /* Bit 24 Thai */ #define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ /* Bit 25 Lao */ #define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ /* Bit 26 Georgian */ #define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ /* Bit 27 is reserved (was Georgian Extended) */ /* Bit 28 Hangul Jamo */ #define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ /* Bit 29 Latin Extended Additional */ #define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ /* Bit 30 Greek Extended */ #define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ /* Symbols Area */ /* Bit 31 General Punctuation */ #define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ /* Bit 32 Superscripts And Subscripts */ #define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ /* Bit 33 Currency Symbols */ #define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ /* Bit 34 Combining Diacritical Marks For Symbols */ #define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ /* Bit 35 Letterlike Symbols */ #define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ /* Bit 36 Number Forms */ #define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ /* Bit 37 Arrows */ #define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ /* Bit 38 Mathematical Operators */ #define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ /* Bit 39 Miscellaneous Technical */ #define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ /* Bit 40 Control Pictures */ #define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ /* Bit 41 Optical Character Recognition */ #define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ /* Bit 42 Enclosed Alphanumerics */ #define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ /* Bit 43 Box Drawing */ #define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ /* Bit 44 Block Elements */ #define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ /* Bit 45 Geometric Shapes */ #define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ /* Bit 46 Miscellaneous Symbols */ #define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ /* Bit 47 Dingbats */ #define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ /* CJK Phonetics and Symbols Area */ /* Bit 48 CJK Symbols and Punctuation */ #define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ /* Bit 49 Hiragana */ #define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ /* Bit 50 Katakana */ #define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ /* Bit 51 Bopomofo + */ /* Bopomofo Extended */ #define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ /* U+31A0-U+31BF */ /* Bit 52 Hangul Compatibility Jamo */ #define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ /* Bit 53 Kanbun */ #define TT_UCR_CJK_MISC (1L << 21) /* U+3190-U+319F */ #define TT_UCR_KANBUN TT_UCR_CJK_MISC /* Bit 54 Enclosed CJK Letters and Months */ #define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ /* Bit 55 CJK Compatibility */ #define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ /* Hangul Syllables Area */ /* Bit 56 Hangul */ #define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ /* Surrogates Area */ /* Bit 57 High Surrogates + */ /* High Private Use Surrogates + */ /* Low Surrogates */ #define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ /* U+DB80-U+DBFF */ /* U+DC00-U+DFFF */ /* According to OpenType specs v.1.3+, setting bit 57 implies that there */ /* is at least one codepoint beyond the Basic Multilingual Plane that is */ /* supported by this font. So it really means: >= U+10000 */ /* Bit 58 is reserved for Unicode SubRanges */ /* CJK Ideographs Area */ /* Bit 59 CJK Unified Ideographs + */ /* CJK Radicals Supplement + */ /* Kangxi Radicals + */ /* Ideographic Description Characters + */ /* CJK Unified Ideographs Extension A */ #define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ /* U+2E80-U+2EFF */ /* U+2F00-U+2FDF */ /* U+2FF0-U+2FFF */ /* U+3400-U+4DB5 */ /* Private Use Area */ /* Bit 60 Private Use */ #define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ /* Compatibility Area and Specials */ /* Bit 61 CJK Compatibility Ideographs */ #define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+F900-U+FAFF */ /* Bit 62 Alphabetic Presentation Forms */ #define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ /* Bit 63 Arabic Presentation Forms-A */ #define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ /* Bit 64 Combining Half Marks */ #define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ /* Bit 65 CJK Compatibility Forms */ #define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE30-U+FE4F */ /* Bit 66 Small Form Variants */ #define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ /* Bit 67 Arabic Presentation Forms-B */ #define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ /* Bit 68 Halfwidth and Fullwidth Forms */ #define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ /* Bit 69 Specials */ #define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ /* Bit 70 Tibetan */ #define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ /* Bit 71 Syriac */ #define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ /* Bit 72 Thaana */ #define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ /* Bit 73 Sinhala */ #define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ /* Bit 74 Myanmar */ #define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ /* Bit 75 Ethiopic */ #define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ /* Bit 76 Cherokee */ #define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ /* Bit 77 Unified Canadian Aboriginal Syllabics */ #define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ /* Bit 78 Ogham */ #define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ /* Bit 79 Runic */ #define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ /* Bit 80 Khmer */ #define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ /* Bit 81 Mongolian */ #define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ /* Bit 82 Braille Patterns */ #define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ /* Bit 83 Yi Syllables + */ /* Yi Radicals */ #define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ /* U+A490-U+A4CF */ /*************************************************************************/ /* */ /* Some compilers have a very limited length of identifiers. */ /* */ #if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) #define HAVE_LIMIT_ON_IDENTS #endif #ifndef HAVE_LIMIT_ON_IDENTS /*************************************************************************/ /* */ /* Here some alias #defines in order to be clearer. */ /* */ /* These are not always #defined to stay within the 31 character limit */ /* which some compilers have. */ /* */ /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ /* If you get a warning with such a compiler, use the -i40 switch. */ /* */ #define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ TT_UCR_ARABIC_PRESENTATIONS_A #define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ TT_UCR_ARABIC_PRESENTATIONS_B #define TT_UCR_COMBINING_DIACRITICAL_MARKS \ TT_UCR_COMBINING_DIACRITICS #define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ TT_UCR_COMBINING_DIACRITICS_SYMB #endif /* !HAVE_LIMIT_ON_IDENTS */ FT_END_HEADER #endif /* __TTNAMEID_H__ */ /* END */ (1L << 20) /* U+0B80-U+0BFF */ /* Bit 21 Telugu */ #define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ /* Bit 22 Kannada */ #define TT_UCR_KANold_contrib//root/sys/src/cmd/limbo/include/freetype/tttables.h������������������������������������� 664 � 0 � 0 � 100672 7607330532 24022�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* tttables.h */ /* */ /* Basic SFNT/TrueType tables definitions and interface */ /* (specification only). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __TTTABLES_H__ #define __TTTABLES_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Section> */ /* truetype_tables */ /* */ /* <Title> */ /* TrueType Tables */ /* */ /* <Abstract> */ /* TrueType-specific table types and functions. */ /* */ /* <Description> */ /* This section contains the definition of TrueType-specific tables */ /* as well as some routines used to access and process them. */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Struct> */ /* TT_Header */ /* */ /* <Description> */ /* A structure used to model a TrueType font header table. All */ /* fields follow the TrueType specification. */ /* */ typedef struct TT_Header_ { FT_Fixed Table_Version; FT_Fixed Font_Revision; FT_Long CheckSum_Adjust; FT_Long Magic_Number; FT_UShort Flags; FT_UShort Units_Per_EM; FT_Long Created [2]; FT_Long Modified[2]; FT_Short xMin; FT_Short yMin; FT_Short xMax; FT_Short yMax; FT_UShort Mac_Style; FT_UShort Lowest_Rec_PPEM; FT_Short Font_Direction; FT_Short Index_To_Loc_Format; FT_Short Glyph_Data_Format; } TT_Header; /*************************************************************************/ /* */ /* <Struct> */ /* TT_HoriHeader */ /* */ /* <Description> */ /* A structure used to model a TrueType horizontal header, the `hhea' */ /* table, as well as the corresponding horizontal metrics table, */ /* i.e., the `hmtx' table. */ /* */ /* <Fields> */ /* Version :: The table version. */ /* */ /* Ascender :: The font's ascender, i.e., the distance */ /* from the baseline to the top-most of all */ /* glyph points found in the font. */ /* */ /* This value is invalid in many fonts, as */ /* it is usually set by the font designer, */ /* and often reflects only a portion of the */ /* glyphs found in the font (maybe ASCII). */ /* */ /* You should use the `sTypoAscender' field */ /* of the OS/2 table instead if you want */ /* the correct one. */ /* */ /* Descender :: The font's descender, i.e., the distance */ /* from the baseline to the bottom-most of */ /* all glyph points found in the font. It */ /* is negative. */ /* */ /* This value is invalid in many fonts, as */ /* it is usually set by the font designer, */ /* and often reflects only a portion of the */ /* glyphs found in the font (maybe ASCII). */ /* */ /* You should use the `sTypoDescender' */ /* field of the OS/2 table instead if you */ /* want the correct one. */ /* */ /* Line_Gap :: The font's line gap, i.e., the distance */ /* to add to the ascender and descender to */ /* get the BTB, i.e., the */ /* baseline-to-baseline distance for the */ /* font. */ /* */ /* advance_Width_Max :: This field is the maximum of all advance */ /* widths found in the font. It can be */ /* used to compute the maximum width of an */ /* arbitrary string of text. */ /* */ /* min_Left_Side_Bearing :: The minimum left side bearing of all */ /* glyphs within the font. */ /* */ /* min_Right_Side_Bearing :: The minimum right side bearing of all */ /* glyphs within the font. */ /* */ /* xMax_Extent :: The maximum horizontal extent (i.e., the */ /* `width' of a glyph's bounding box) for */ /* all glyphs in the font. */ /* */ /* caret_Slope_Rise :: The rise coefficient of the cursor's */ /* slope of the cursor (slope=rise/run). */ /* */ /* caret_Slope_Run :: The run coefficient of the cursor's */ /* slope. */ /* */ /* Reserved :: 10 reserved bytes. */ /* */ /* metric_Data_Format :: Always 0. */ /* */ /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ /* table -- this value can be smaller than */ /* the total number of glyphs in the font. */ /* */ /* long_metrics :: A pointer into the `hmtx' table. */ /* */ /* short_metrics :: A pointer into the `hmtx' table. */ /* */ /* <Note> */ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ /* be identical except for the names of their fields which */ /* are different. */ /* */ /* This ensures that a single function in the `ttload' */ /* module is able to read both the horizontal and vertical */ /* headers. */ /* */ typedef struct TT_HoriHeader_ { FT_Fixed Version; FT_Short Ascender; FT_Short Descender; FT_Short Line_Gap; FT_UShort advance_Width_Max; /* advance width maximum */ FT_Short min_Left_Side_Bearing; /* minimum left-sb */ FT_Short min_Right_Side_Bearing; /* minimum right-sb */ FT_Short xMax_Extent; /* xmax extents */ FT_Short caret_Slope_Rise; FT_Short caret_Slope_Run; FT_Short caret_Offset; FT_Short Reserved[4]; FT_Short metric_Data_Format; FT_UShort number_Of_HMetrics; /* The following fields are not defined by the TrueType specification */ /* but they are used to connect the metrics header to the relevant */ /* `HMTX' table. */ void* long_metrics; void* short_metrics; } TT_HoriHeader; /*************************************************************************/ /* */ /* <Struct> */ /* TT_VertHeader */ /* */ /* <Description> */ /* A structure used to model a TrueType vertical header, the `vhea' */ /* table, as well as the corresponding vertical metrics table, i.e., */ /* the `vmtx' table. */ /* */ /* <Fields> */ /* Version :: The table version. */ /* */ /* Ascender :: The font's ascender, i.e., the distance */ /* from the baseline to the top-most of */ /* all glyph points found in the font. */ /* */ /* This value is invalid in many fonts, as */ /* it is usually set by the font designer, */ /* and often reflects only a portion of */ /* the glyphs found in the font (maybe */ /* ASCII). */ /* */ /* You should use the `sTypoAscender' */ /* field of the OS/2 table instead if you */ /* want the correct one. */ /* */ /* Descender :: The font's descender, i.e., the */ /* distance from the baseline to the */ /* bottom-most of all glyph points found */ /* in the font. It is negative. */ /* */ /* This value is invalid in many fonts, as */ /* it is usually set by the font designer, */ /* and often reflects only a portion of */ /* the glyphs found in the font (maybe */ /* ASCII). */ /* */ /* You should use the `sTypoDescender' */ /* field of the OS/2 table instead if you */ /* want the correct one. */ /* */ /* Line_Gap :: The font's line gap, i.e., the distance */ /* to add to the ascender and descender to */ /* get the BTB, i.e., the */ /* baseline-to-baseline distance for the */ /* font. */ /* */ /* advance_Height_Max :: This field is the maximum of all */ /* advance heights found in the font. It */ /* can be used to compute the maximum */ /* height of an arbitrary string of text. */ /* */ /* min_Top_Side_Bearing :: The minimum top side bearing of all */ /* glyphs within the font. */ /* */ /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ /* glyphs within the font. */ /* */ /* yMax_Extent :: The maximum vertical extent (i.e., the */ /* `height' of a glyph's bounding box) for */ /* all glyphs in the font. */ /* */ /* caret_Slope_Rise :: The rise coefficient of the cursor's */ /* slope of the cursor (slope=rise/run). */ /* */ /* caret_Slope_Run :: The run coefficient of the cursor's */ /* slope. */ /* */ /* caret_Offset :: The cursor's offset for slanted fonts. */ /* This value is `reserved' in vmtx */ /* version 1.0. */ /* */ /* Reserved :: 8 reserved bytes. */ /* */ /* metric_Data_Format :: Always 0. */ /* */ /* number_Of_HMetrics :: Number of VMetrics entries in the */ /* `vmtx' table -- this value can be */ /* smaller than the total number of glyphs */ /* in the font. */ /* */ /* long_metrics :: A pointer into the `vmtx' table. */ /* */ /* short_metrics :: A pointer into the `vmtx' table. */ /* */ /* <Note> */ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ /* be identical except for the names of their fields which */ /* are different. */ /* */ /* This ensures that a single function in the `ttload' */ /* module is able to read both the horizontal and vertical */ /* headers. */ /* */ typedef struct TT_VertHeader_ { FT_Fixed Version; FT_Short Ascender; FT_Short Descender; FT_Short Line_Gap; FT_UShort advance_Height_Max; /* advance height maximum */ FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ FT_Short yMax_Extent; /* xmax or ymax extents */ FT_Short caret_Slope_Rise; FT_Short caret_Slope_Run; FT_Short caret_Offset; FT_Short Reserved[4]; FT_Short metric_Data_Format; FT_UShort number_Of_VMetrics; /* The following fields are not defined by the TrueType specification */ /* but they're used to connect the metrics header to the relevant */ /* `HMTX' or `VMTX' table. */ void* long_metrics; void* short_metrics; } TT_VertHeader; /*************************************************************************/ /* */ /* <Struct> */ /* TT_OS2 */ /* */ /* <Description> */ /* A structure used to model a TrueType OS/2 table. This is the long */ /* table version. All fields comply to the TrueType specification. */ /* */ /* Note that we now support old Mac fonts which do not include an */ /* OS/2 table. In this case, the `version' field is always set to */ /* 0xFFFF. */ /* */ typedef struct TT_OS2_ { FT_UShort version; /* 0x0001 - more or 0xFFFF */ FT_Short xAvgCharWidth; FT_UShort usWeightClass; FT_UShort usWidthClass; FT_Short fsType; FT_Short ySubscriptXSize; FT_Short ySubscriptYSize; FT_Short ySubscriptXOffset; FT_Short ySubscriptYOffset; FT_Short ySuperscriptXSize; FT_Short ySuperscriptYSize; FT_Short ySuperscriptXOffset; FT_Short ySuperscriptYOffset; FT_Short yStrikeoutSize; FT_Short yStrikeoutPosition; FT_Short sFamilyClass; FT_Byte panose[10]; FT_ULong ulUnicodeRange1; /* Bits 0-31 */ FT_ULong ulUnicodeRange2; /* Bits 32-63 */ FT_ULong ulUnicodeRange3; /* Bits 64-95 */ FT_ULong ulUnicodeRange4; /* Bits 96-127 */ FT_Char achVendID[4]; FT_UShort fsSelection; FT_UShort usFirstCharIndex; FT_UShort usLastCharIndex; FT_Short sTypoAscender; FT_Short sTypoDescender; FT_Short sTypoLineGap; FT_UShort usWinAscent; FT_UShort usWinDescent; /* only version 1 tables: */ FT_ULong ulCodePageRange1; /* Bits 0-31 */ FT_ULong ulCodePageRange2; /* Bits 32-63 */ /* only version 2 tables: */ FT_Short sxHeight; FT_Short sCapHeight; FT_UShort usDefaultChar; FT_UShort usBreakChar; FT_UShort usMaxContext; } TT_OS2; /*************************************************************************/ /* */ /* <Struct> */ /* TT_Postscript */ /* */ /* <Description> */ /* A structure used to model a TrueType Postscript table. All fields */ /* comply to the TrueType table. This structure does not reference */ /* the Postscript glyph names, which can be nevertheless accessed */ /* with the `ttpost' module. */ /* */ typedef struct TT_Postscript_ { FT_Fixed FormatType; FT_Fixed italicAngle; FT_Short underlinePosition; FT_Short underlineThickness; FT_ULong isFixedPitch; FT_ULong minMemType42; FT_ULong maxMemType42; FT_ULong minMemType1; FT_ULong maxMemType1; /* Glyph names follow in the file, but we don't */ /* load them by default. See the ttpost.c file. */ } TT_Postscript; /*************************************************************************/ /* */ /* <Struct> */ /* TT_PCLT */ /* */ /* <Description> */ /* A structure used to model a TrueType PCLT table. All fields */ /* comply to the TrueType table. */ /* */ typedef struct TT_PCLT_ { FT_Fixed Version; FT_ULong FontNumber; FT_UShort Pitch; FT_UShort xHeight; FT_UShort Style; FT_UShort TypeFamily; FT_UShort CapHeight; FT_UShort SymbolSet; FT_Char TypeFace[16]; FT_Char CharacterComplement[8]; FT_Char FileName[6]; FT_Char StrokeWeight; FT_Char WidthType; FT_Byte SerifStyle; FT_Byte Reserved; } TT_PCLT; /*************************************************************************/ /* */ /* <Struct> */ /* TT_MaxProfile */ /* */ /* <Description> */ /* The maximum profile is a table containing many max values which */ /* can be used to pre-allocate arrays. This ensures that no memory */ /* allocation occurs during a glyph load. */ /* */ /* <Fields> */ /* version :: The version number. */ /* */ /* numGlyphs :: The number of glyphs in this TrueType */ /* font. */ /* */ /* maxPoints :: The maximum number of points in a */ /* non-composite TrueType glyph. See also */ /* the structure element */ /* `maxCompositePoints'. */ /* */ /* maxContours :: The maximum number of contours in a */ /* non-composite TrueType glyph. See also */ /* the structure element */ /* `maxCompositeContours'. */ /* */ /* maxCompositePoints :: The maximum number of points in a */ /* composite TrueType glyph. See also the */ /* structure element `maxPoints'. */ /* */ /* maxCompositeContours :: The maximum number of contours in a */ /* composite TrueType glyph. See also the */ /* structure element `maxContours'. */ /* */ /* maxZones :: The maximum number of zones used for */ /* glyph hinting. */ /* */ /* maxTwilightPoints :: The maximum number of points in the */ /* twilight zone used for glyph hinting. */ /* */ /* maxStorage :: The maximum number of elements in the */ /* storage area used for glyph hinting. */ /* */ /* maxFunctionDefs :: The maximum number of function */ /* definitions in the TrueType bytecode for */ /* this font. */ /* */ /* maxInstructionDefs :: The maximum number of instruction */ /* definitions in the TrueType bytecode for */ /* this font. */ /* */ /* maxStackElements :: The maximum number of stack elements used */ /* during bytecode interpretation. */ /* */ /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ /* used for glyph hinting. */ /* */ /* maxComponentElements :: An obscure value related to composite */ /* glyphs definitions. */ /* */ /* maxComponentDepth :: An obscure value related to composite */ /* glyphs definitions. Probably the maximum */ /* number of simple glyphs in a composite. */ /* */ /* <Note> */ /* This structure is only used during font loading. */ /* */ typedef struct TT_MaxProfile_ { FT_Fixed version; FT_UShort numGlyphs; FT_UShort maxPoints; FT_UShort maxContours; FT_UShort maxCompositePoints; FT_UShort maxCompositeContours; FT_UShort maxZones; FT_UShort maxTwilightPoints; FT_UShort maxStorage; FT_UShort maxFunctionDefs; FT_UShort maxInstructionDefs; FT_UShort maxStackElements; FT_UShort maxSizeOfInstructions; FT_UShort maxComponentElements; FT_UShort maxComponentDepth; } TT_MaxProfile; /* */ typedef enum { ft_sfnt_head = 0, ft_sfnt_maxp = 1, ft_sfnt_os2 = 2, ft_sfnt_hhea = 3, ft_sfnt_vhea = 4, ft_sfnt_post = 5, ft_sfnt_pclt = 6, sfnt_max /* don't remove */ } FT_Sfnt_Tag; /* internal use only */ typedef void* (*FT_Get_Sfnt_Table_Func)( FT_Face face, FT_Sfnt_Tag tag ); /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Sfnt_Table */ /* */ /* <Description> */ /* Returns a pointer to a given SFNT table within a face. */ /* */ /* <Input> */ /* face :: A handle to the source. */ /* */ /* tag :: The index of the SFNT table. */ /* */ /* <Return> */ /* A type-less pointer to the table. This will be 0 in case of */ /* error, or if the corresponding table was not found *OR* loaded */ /* from the file. */ /* */ /* <Note> */ /* The table is owned by the face object and disappears with it. */ /* */ /* This function is only useful to access SFNT tables that are loaded */ /* by the sfnt/truetype/opentype drivers. See FT_Sfnt_Tag for a */ /* list. */ /* */ FT_EXPORT( void* ) FT_Get_Sfnt_Table( FT_Face face, FT_Sfnt_Tag tag ); /* */ FT_END_HEADER #endif /* __TTTABLES_H__ */ /* END */ */ /* A structure used to model a TrueType Postscriptold_contrib//root/sys/src/cmd/limbo/include/freetype/tttags.h��������������������������������������� 664 � 0 � 0 � 6454 7607330532 23451�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************************************************************/ /* */ /* tttags.h */ /* */ /* Tags for TrueType tables (specification only). */ /* */ /* Copyright 1996-2001 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #ifndef __TTAGS_H__ #define __TTAGS_H__ #include <ft2build.h> #include FT_FREETYPE_H FT_BEGIN_HEADER #define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) #define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) #define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) #define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) #define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) #define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) #define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) #define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) #define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) #define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) #define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) #define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) #define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) #define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) #define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) #define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) #define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) #define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) #define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) #define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) #define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) #define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) #define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) #define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) #define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) #define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) #define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) #define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) #define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) #define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) #define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) #define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) #define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) #define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) #define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) #define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) #define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) FT_END_HEADER #endif /* __TTAGS_H__ */ /* END */ */ /* maxCompositePoints :: The maximum number of points in a */ /* composite TrueType glyph. See also the old_contrib//root/sys/src/cmd/limbo/include/freetype.h���������������������������������������������� 664 � 0 � 0 � 2030 7732341364 22131�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * interface to libfreetype without recourse to the real freetype headers * which would otherwise require full-blown CPP */ typedef struct FTfaceinfo FTfaceinfo; struct FTfaceinfo { int nfaces; int index; int style; int height; int ascent; char* familyname; char* stylename; }; typedef struct FTface FTface; struct FTface { void* ft_lib; void* ft_face; }; typedef struct FTglyph FTglyph; struct FTglyph { int top; int left; int advx; int advy; int height; int width; int bpr; uchar* bitmap; }; typedef struct FTmatrix FTmatrix; struct FTmatrix { int a; int b; int c; int d; }; typedef struct FTvector FTvector; struct FTvector { int dx; int dy; }; extern char* ftnewface(char *, int, FTface*, FTfaceinfo*); extern char* ftloadmemface(void*, int, int, FTface*, FTfaceinfo*); extern char* ftsetcharsize(FTface, int, int, int, FTfaceinfo*); extern void ftsettransform(FTface, FTmatrix*, FTvector*); extern int fthaschar(FTface,int); extern char* ftloadglyph(FTface, int, FTglyph*); extern void ftdoneface(FTface); */ /* definitions in the TrueType bytecode for */ /* this font. */ /* */ /* maxStackElements :: The maximum number of stack elements used */ /* during bytecode interpretation. */ /* */ /* maxSizeold_contrib//root/sys/src/cmd/limbo/include/interp.h������������������������������������������������ 664 � 0 � 0 � 31142 10426335106 21644�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������typedef uchar BYTE; /* 8 bits */ typedef int WORD; /* 32 bits */ typedef unsigned int UWORD; /* 32 bits */ typedef vlong LONG; /* 64 bits */ typedef uvlong ULONG; /* 64 bits */ typedef double REAL; /* 64 double IEEE754 */ typedef short SHORT; /* 16 bits */ typedef float SREAL; /* 32 float IEEE754 */ enum ProgState { Palt, /* blocked in alt instruction */ Psend, /* waiting to send */ Precv, /* waiting to recv */ Pdebug, /* debugged */ Pready, /* ready to be scheduled */ Prelease, /* interpreter released */ Pexiting, /* exit because of kill or error */ Pbroken, /* thread crashed */ }; enum { propagator = 3, /* gc marking color */ PRNSIZE = 1024, BIHASH = 23, PQUANTA = 2048, /* prog time slice */ /* STRUCTALIGN is the unit to which the compiler aligns structs. */ /* It really should be defined somewhere else */ STRUCTALIGN = sizeof(int) /* must be >=2 because of Strings */ }; enum { Ppropagate = 1<<0, Pnotifyleader = 1<<1, Prestrict = 1<<2, Prestricted = 1<<3, Pkilled = 1<<4 }; typedef struct Alt Alt; typedef struct Channel Channel; typedef struct Progq Progq; typedef struct Import Import; typedef struct Inst Inst; typedef struct Module Module; typedef struct Modlink Modlink; typedef struct Modl Modl; typedef struct Type Type; typedef struct Prog Prog; typedef struct Progs Progs; typedef struct Heap Heap; typedef struct Link Link; typedef struct List List; typedef struct Array Array; typedef struct String String; typedef union Linkpc Linkpc; typedef struct REG REG; typedef struct Frame Frame; typedef union Stkext Stkext; typedef struct Atidle Atidle; typedef struct Altc Altc; typedef struct Except Except; typedef struct Handler Handler; struct Frame { Inst* lr; /* REGLINK isa.h */ uchar* fp; /* REGFP */ Modlink* mr; /* REGMOD */ Type* t; /* REGTYPE */ }; union Stkext { uchar stack[1]; struct { Type* TR; uchar* SP; uchar* TS; uchar* EX; union { uchar fu[1]; Frame fr[1]; } tos; } reg; }; struct Array { WORD len; Type* t; Array* root; uchar* data; }; struct List { List* tail; Type* t; WORD data[1]; }; struct Channel { Array* buf; /* For buffered channels - must be first */ Progq* send; /* Queue of progs ready to send */ Progq* recv; /* Queue of progs ready to receive */ void* aux; /* Rock for devsrv */ void (*mover)(void); /* Data mover */ union { WORD w; Type* t; } mid; int front; /* Front of buffered queue */ int size; /* Number of data items in buffered queue */ }; struct Progq { Prog* prog; Progq* next; }; struct String { int len; /* string length */ int max; /* maximum length in representation */ char* tmp; union { #define Sascii data.ascii #define Srune data.runes char ascii[STRUCTALIGN]; /* string.c relies on having extra space (eg, in string2c) */ Rune runes[1]; }data; }; union Linkpc { void (*runt)(void*); Inst* pc; }; struct Link { int sig; Type* frame; Linkpc u; char *name; }; typedef union Adr Adr; union Adr { WORD imm; WORD ind; Inst* ins; struct { ushort f; /* First indirection */ ushort s; /* Second indirection */ } i; }; struct Inst { uchar op; uchar add; ushort reg; Adr s; Adr d; }; struct Altc { Channel* c; void* ptr; }; struct Alt { int nsend; int nrecv; Altc ac[1]; }; struct Type { int ref; void (*free)(Heap*, int); void (*mark)(Type*, void*); int size; int np; void* destroy; void* initialize; uchar map[STRUCTALIGN]; }; struct REG { Inst* PC; /* Program counter */ uchar* MP; /* Module data */ uchar* FP; /* Frame pointer */ uchar* SP; /* Stack pointer */ uchar* TS; /* Top of allocated stack */ uchar* EX; /* Extent register */ Modlink* M; /* Module */ int IC; /* Instruction count for this quanta */ Inst* xpc; /* Saved program counter */ void* s; /* Source */ void* d; /* Destination */ void* m; /* Middle */ WORD t; /* Middle temporary */ WORD st; /* Source temporary */ WORD dt; /* Destination temporary */ }; struct Progs { int id; int flags; Progs* parent; Progs* child; Progs* sib; Prog* head; /* live group leader is at head */ Prog* tail; }; struct Prog { REG R; /* Register set */ Prog* link; /* Run queue */ Channel* chan; /* Channel pointer */ void* ptr; /* Channel data pointer */ enum ProgState state; /* Scheduler state */ char* kill; /* Set if prog should error */ char* killstr; /* kill string buffer when needed */ int pid; /* unique Prog id */ int quanta; /* time slice */ ulong ticks; /* time used */ int flags; /* error recovery flags */ Prog* prev; Prog* next; Prog* pidlink; /* next in pid hash chain */ Progs* group; /* process group */ Prog* grpprev; /* previous group member */ Prog* grpnext; /* next group member */ void* exval; /* current exception */ char* exstr; /* last exception */ void (*addrun)(Prog*); void (*xec)(Prog*); void* osenv; }; struct Module { int ref; /* Use count */ int compiled; /* Compiled into native assembler */ ulong ss; /* Stack size */ ulong rt; /* Runtime flags */ ulong mtime; /* Modtime of dis file */ Qid qid; /* Qid of dis file */ ushort dtype; /* type of dis file's server*/ uint dev; /* subtype of dis file's server */ int nprog; /* number of instructions */ Inst* prog; /* text segment */ uchar* origmp; /* unpolluted Module data */ int ntype; /* Number of type descriptors */ Type** type; /* Type descriptors */ Inst* entry; /* Entry PC */ Type* entryt; /* Entry frame */ char* name; /* Implements type */ char* path; /* File module loaded from */ Module* link; /* Links */ Link* ext; /* External dynamic links */ Import** ldt; /* Internal linkage descriptor tables */ Handler* htab; /* Exception handler table */ ulong* pctab; /* dis pc to code pc when compiled */ void* dlm; /* dynamic C module */ }; struct Modl { Linkpc u; /* PC of Dynamic link */ Type* frame; /* Frame type for this entry */ }; struct Modlink { uchar* MP; /* Module data for this instance */ Module* m; /* The real module */ int compiled; /* Compiled into native assembler */ Inst* prog; /* text segment */ Type** type; /* Type descriptors */ uchar* data; /* for dynamic C modules */ int nlinks; /* ?apparently required by Java */ Modl links[1]; }; /* must be a multiple of 8 bytes */ struct Heap { int color; /* Allocation color */ ulong ref; Type* t; ulong hprof; /* heap profiling */ }; struct Atidle { int (*fn)(void*); void* arg; Atidle* link; }; struct Import { int sig; char* name; }; struct Except { char* s; ulong pc; }; struct Handler { ulong pc1; ulong pc2; ulong eoff; ulong ne; Type* t; Except* etab; }; #define H2D(t, x) ((t)(((uchar*)(x))+sizeof(Heap))) #define D2H(x) ((Heap*)(((uchar*)(x))-sizeof(Heap))) #define H ((void*)(-1)) #define SEXTYPE(f) ((Stkext*)((uchar*)(f)-OA(Stkext, reg.tos.fu))) #define Setmark(h) if((h)->color!=mutator) { (h)->color = propagator; nprop=1; } #define gclock() gchalt++ #define gcunlock() gchalt-- #define gcruns() (gchalt == 0) extern int bflag; extern int cflag; extern int nproc; extern Type Tarray; extern Type Tstring; extern Type Tchannel; extern Type Tlist; extern Type Tmodlink; extern Type* TImage; extern Type Tptr; extern Type Tbyte; extern Type Tword; extern Type Tlong; extern Type Treal; extern REG R; extern String snil; extern void (*optab[256])(void); extern void (*comvec)(void); extern void (*dec[])(void); extern Module* modules; extern int mutator; extern int nprop; extern int gchalt; extern int gccolor; extern int minvalid; extern int Dconv(Fmt*); extern void acquire(void); extern void addrun(Prog*); extern void altdone(Alt*, Prog*, Channel*, int); extern void altgone(Prog*); extern Array* allocimgarray(Heap*, Heap*); extern Module* builtinmod(char*, void*, int); extern void cblock(Prog*); extern void cmovw(void*, void*); extern Channel* cnewc(Type*, void (*)(void), int); extern int compile(Module*, int, Modlink*); extern void cqadd(Progq**, Prog*); extern void cqdel(Progq**); extern void cqdelp(Progq**, Prog*); extern void crecv(Channel*, void*); extern void csend(Channel*, void*); extern int csendalt(Channel*, void*, Type *, int); extern Prog* currun(void); extern void dbgexit(Prog*, int, char*); extern void dbgxec(Prog*); extern void delprog(Prog*, char*); extern Prog* delrun(int); extern void delrunq(Prog*); extern Prog* delruntail(int); extern void destroy(void*); extern void destroyimage(ulong); extern void destroylinks(Module*); extern void destroystack(REG*); extern void drawmodinit(void); extern int dynldable(int); extern void loadermodinit(void); extern Type* dtype(void (*)(Heap*, int), int, uchar*, int); extern Module* dupmod(Module*); extern void error(char*); extern void errorf(char*, ...); extern void extend(void); extern void freedyncode(Module*); extern void freedyndata(Modlink*); extern void freemod(Module*); extern void freeheap(Heap*, int); extern void freeptrs(void*, Type*); extern void freestring(Heap*, int); extern void freetype(Type*); extern void freetypemodinit(void); extern long getdbreg(); extern int gfltconv(Fmt*); extern void go(Module*); extern int handler(char*); extern Heap* heap(Type*); extern Heap* heaparray(Type*, int); extern void (*heapmonitor)(int, void*, ulong); extern int heapref(void*); extern Heap* heapz(Type*); extern int hmsize(void*); extern void incmem(void*, Type*); extern void initarray(Type*, Array*); extern void initmem(Type*, void*); extern void irestore(Prog*); extern Prog* isave(void); extern void keyringmodinit(void); extern void killcomm(Progq **p); extern int killprog(Prog*, char*); extern int killgrp(Prog*, char*); extern Modlink* linkmod(Module*, Import*, int); extern Modlink* mklinkmod(Module*, int); extern Module* load(char*); extern Module* lookmod(char*); extern long magic(void); extern void markarray(Type*, void*); extern void markchan(Type*, void*); extern void markheap(Type*, void*); extern void marklist(Type*, void*); extern void markmodl(Type*, void*); extern void mathmodinit(void); extern Array* mem2array(void*, int); extern void mlink(Module*, Link*, uchar*, int, int, Type*); extern void modinit(void); extern WORD modstatus(REG*, char*, int); extern void movp(void); extern void movtmp(void); extern void movtmpsafe(void); extern int mustbesigned(char*, uchar*, ulong, Dir*); extern Module* newmod(char*); extern Module* newdyncode(int, char*, Dir*); extern void newdyndata(Modlink*); extern void newgrp(Prog*); extern void newmp(void*, void*, Type*); extern Prog* newprog(Prog*, Modlink*); extern void newstack(Prog*); extern Heap* nheap(int); extern void noptrs(Type*, void*); extern int nprog(void); extern void opinit(void); extern Module* parsemod(char*, uchar*, ulong, Dir*); extern Module* parsedmod(char*, int, ulong, Qid); extern void prefabmodinit(void); extern Prog* progn(int); extern Prog* progpid(int); extern void ptradd(Heap*); extern void ptrdel(Heap*); extern void pushrun(Prog*); extern Module* readmod(char*, Module*, int); extern void irecv(void); extern void release(void); extern void releasex(void); extern void retnstr(char*, int, String**); extern void retstr(char*, String**); extern void rungc(Prog*); extern void runtime(Module*, Link*, char*, int, void(*)(void*), Type*); extern void safemem(void*, Type*, void (*)(void*)); extern int segflush(void *, ulong); extern void isend(void); extern void setdbreg(uchar*); extern uchar* setdbloc(uchar*); extern void seterror(char*, ...); extern void sethints(String*, int); extern String* splitc(String**, int); extern uchar* stack(Frame*); extern int stringblen(String*); extern int stringcmp(String*, String*); extern String* stringdup(String*); extern String* stringheap(int, int, int, int); extern char* syserr(char*, char*, Prog*); extern void sysinit(void); extern void sysmodinit(void); extern void tellsomeone(Prog*, char*); extern void tkmodinit(void); extern void unextend(Frame*); extern void unframe(void); extern void unload(Module*); extern int verifysigner(uchar*, int, uchar*, ulong); extern void xec(Prog*); extern void xecalt(int); extern int xprint(Prog*, void*, void*, String*, char*, int); extern int bigxprint(Prog*, void*, void*, String*, char**, int); extern void iyield(void); extern String* newrunes(int); extern String* newstring(int); extern int runeslen(Rune*, int); extern String* c2string(char*, int); extern char* string2c(String*); extern List* cons(ulong, List**); extern String* slicer(ulong, ulong, String*); extern String* addstring(String*, String*, int); extern int brpatch(Inst*, Module*); extern void readimagemodinit(void); #define O(t,e) ((long)(&((t*)0)->e)) #define OA(t,e) ((long)(((t*)0)->e)) #pragma varargck type "D" Inst* #pragma varargck argpos errorf 1 presentation */ char* tmp; union { #define Sascii data.ascii #define Srune data.runes char ascii[STRUCTALIGN]; /* string.c relies on having extra space (eg, in string2c) */ Rune runes[1]; }data; }; union Linkpc { void (*runt)(void*); Inst* pc; }; struct Link { int sig; Type* frame; Linkpc u; char *name; }; typedef union Adr Adr; union Adr { WORD imm; WORD ind; Inst* ins; struct { ushortold_contrib//root/sys/src/cmd/limbo/include/isa.h��������������������������������������������������� 664 � 0 � 0 � 5325 10135206651 21102�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * VM instruction set */ enum { INOP, IALT, INBALT, IGOTO, ICALL, IFRAME, ISPAWN, IRUNT, ILOAD, IMCALL, IMSPAWN, IMFRAME, IRET, IJMP, ICASE, IEXIT, INEW, INEWA, INEWCB, INEWCW, INEWCF, INEWCP, INEWCM, INEWCMP, ISEND, IRECV, ICONSB, ICONSW, ICONSP, ICONSF, ICONSM, ICONSMP, IHEADB, IHEADW, IHEADP, IHEADF, IHEADM, IHEADMP, ITAIL, ILEA, IINDX, IMOVP, IMOVM, IMOVMP, IMOVB, IMOVW, IMOVF, ICVTBW, ICVTWB, ICVTFW, ICVTWF, ICVTCA, ICVTAC, ICVTWC, ICVTCW, ICVTFC, ICVTCF, IADDB, IADDW, IADDF, ISUBB, ISUBW, ISUBF, IMULB, IMULW, IMULF, IDIVB, IDIVW, IDIVF, IMODW, IMODB, IANDB, IANDW, IORB, IORW, IXORB, IXORW, ISHLB, ISHLW, ISHRB, ISHRW, IINSC, IINDC, IADDC, ILENC, ILENA, ILENL, IBEQB, IBNEB, IBLTB, IBLEB, IBGTB, IBGEB, IBEQW, IBNEW, IBLTW, IBLEW, IBGTW, IBGEW, IBEQF, IBNEF, IBLTF, IBLEF, IBGTF, IBGEF, IBEQC, IBNEC, IBLTC, IBLEC, IBGTC, IBGEC, ISLICEA, ISLICELA, ISLICEC, IINDW, IINDF, IINDB, INEGF, IMOVL, IADDL, ISUBL, IDIVL, IMODL, IMULL, IANDL, IORL, IXORL, ISHLL, ISHRL, IBNEL, IBLTL, IBLEL, IBGTL, IBGEL, IBEQL, ICVTLF, ICVTFL, ICVTLW, ICVTWL, ICVTLC, ICVTCL, IHEADL, ICONSL, INEWCL, ICASEC, IINDL, IMOVPC, ITCMP, IMNEWZ, ICVTRF, ICVTFR, ICVTWS, ICVTSW, ILSRW, ILSRL, IECLR, INEWZ, INEWAZ, IRAISE, ICASEL, IMULX, IDIVX, ICVTXX, IMULX0, IDIVX0, ICVTXX0, IMULX1, IDIVX1, ICVTXX1, ICVTFX, ICVTXF, IEXPW, IEXPL, IEXPF, ISELF, /* Fix MAXDIS if you add opcodes */ }; enum { MAXDIS = ISELF+1, XMAGIC = 819248, /* Normal magic */ SMAGIC = 923426, /* Signed module */ AMP = 0x00, /* Src/Dst op addressing */ AFP = 0x01, AIMM = 0x02, AXXX = 0x03, AIND = 0x04, AMASK = 0x07, AOFF = 0x08, AVAL = 0x10, ARM = 0xC0, /* Middle op addressing */ AXNON = 0x00, AXIMM = 0x40, AXINF = 0x80, AXINM = 0xC0, DEFZ = 0, DEFB = 1, /* Byte */ DEFW = 2, /* Word */ DEFS = 3, /* Utf-string */ DEFF = 4, /* Real value */ DEFA = 5, /* Array */ DIND = 6, /* Set index */ DAPOP = 7, /* Restore address register */ DEFL = 8, /* BIG */ DEFSS = 9, /* String share - not used yet */ DADEPTH = 4, /* Array address stack size */ REGLINK = 0, REGFRAME= 1, REGMOD = 2, REGTYP = 3, REGRET = 4, NREG = 5, IBY2WD = 4, IBY2FT = 8, IBY2LG = 8, MUSTCOMPILE = (1<<0), DONTCOMPILE = (1<<1), SHAREMP = (1<<2), DYNMOD = (1<<3), HASLDT0 = (1<<4), HASEXCEPT = (1<<5), HASLDT = (1<<6), }; #define DTYPE(x) (x>>4) #define DBYTE(x, l) ((x<<4)|l) #define DMAX (1<<4) #define DLEN(x) (x& (DMAX-1)) #define SRC(x) ((x)<<3) #define DST(x) ((x)<<0) #define USRC(x) (((x)>>3)&AMASK) #define UDST(x) ((x)&AMASK) #define UXSRC(x) ((x)&(AMASK<<3)) #define UXDST(x) ((x)&(AMASK<<0)) { int color; /* Allocation color */ ulong ref; Type* t; ulong hprof; /* heap profiling */ }; struct Atidle { int (*fn)(void*); void* arg; Atidle* link; }; struct Import { int sig; char* name; }; struct Except { char* s; ulong pc; }; struct Handler { ulong pc1; ulong pc2; ulong eoold_contrib//root/sys/src/cmd/limbo/include/kern.h�������������������������������������������������� 664 � 0 � 0 � 41372 10372645454 21322�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������typedef unsigned long size_t; #define nelem(x) (sizeof(x)/sizeof((x)[0])) #define offsetof(s, m) (ulong)(&(((s*)0)->m)) #define assert(x) if(x){}else _assert("x") /* * mem routines */ extern void* memccpy(void*, void*, int, ulong); extern void* memset(void*, int, ulong); extern int memcmp(void*, void*, ulong); extern void* memcpy(void*, void*, ulong); extern void* memmove(void*, void*, ulong); extern void* memchr(void*, int, ulong); /* * string routines */ extern char* strcat(char*, char*); extern char* strchr(char*, int); extern int strcmp(char*, char*); extern char* strcpy(char*, char*); extern char* strecpy(char*, char*, char*); extern char* strdup(char*); extern char* strncat(char*, char*, long); extern char* strncpy(char*, char*, long); extern int strncmp(char*, char*, long); extern char* strpbrk(char*, char*); extern char* strrchr(char*, int); extern char* strtok(char*, char*); extern long strlen(char*); extern long strspn(char*, char*); extern long strcspn(char*, char*); extern char* strstr(char*, char*); extern int cistrncmp(char*, char*, int); extern int cistrcmp(char*, char*); extern char* cistrstr(char*, char*); extern int tokenize(char*, char**, int); enum { UTFmax = 3, /* maximum bytes per rune */ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ Runeself = 0x80, /* rune and UTF sequences are the same (<) */ Runeerror = 0x80, /* decoding error in UTF */ }; /* * rune routines */ extern int runetochar(char*, Rune*); extern int chartorune(Rune*, char*); extern int runelen(long); extern int runenlen(Rune*, int); extern int fullrune(char*, int); extern int utflen(char*); extern int utfnlen(char*, long); extern char* utfrune(char*, long); extern char* utfrrune(char*, long); extern char* utfutf(char*, char*); extern char* utfecpy(char*, char*, char*); extern Rune* runestrcat(Rune*, Rune*); extern Rune* runestrchr(Rune*, Rune); extern int runestrcmp(Rune*, Rune*); extern Rune* runestrcpy(Rune*, Rune*); extern Rune* runestrncpy(Rune*, Rune*, long); extern Rune* runestrecpy(Rune*, Rune*, Rune*); extern Rune* runestrdup(Rune*); extern Rune* runestrncat(Rune*, Rune*, long); extern int runestrncmp(Rune*, Rune*, long); extern Rune* runestrrchr(Rune*, Rune); extern long runestrlen(Rune*); extern Rune* runestrstr(Rune*, Rune*); extern Rune tolowerrune(Rune); extern Rune totitlerune(Rune); extern Rune toupperrune(Rune); extern int isalpharune(Rune); extern int islowerrune(Rune); extern int isspacerune(Rune); extern int istitlerune(Rune); extern int isupperrune(Rune); /* * malloc */ extern void* malloc(ulong); extern void* mallocz(ulong, int); extern void free(void*); extern ulong msize(void*); extern void* calloc(ulong, ulong); extern void* realloc(void*, ulong); extern void setmalloctag(void*, ulong); extern void setrealloctag(void*, ulong); extern ulong getmalloctag(void*); extern ulong getrealloctag(void*); extern void* malloctopoolblock(void*); /* * print routines */ typedef struct Fmt Fmt; struct Fmt{ uchar runes; /* output buffer is runes or chars? */ void *start; /* of buffer */ void *to; /* current place in the buffer */ void *stop; /* end of the buffer; overwritten if flush fails */ int (*flush)(Fmt *); /* called when to == stop */ void *farg; /* to make flush a closure */ int nfmt; /* num chars formatted so far */ va_list args; /* args passed to dofmt */ int r; /* % format Rune */ int width; int prec; ulong flags; }; enum{ FmtWidth = 1, FmtLeft = FmtWidth << 1, FmtPrec = FmtLeft << 1, FmtSharp = FmtPrec << 1, FmtSpace = FmtSharp << 1, FmtSign = FmtSpace << 1, FmtZero = FmtSign << 1, FmtUnsigned = FmtZero << 1, FmtShort = FmtUnsigned << 1, FmtLong = FmtShort << 1, FmtVLong = FmtLong << 1, FmtComma = FmtVLong << 1, FmtByte = FmtComma << 1, FmtFlag = FmtByte << 1 }; extern int print(char*, ...); extern char* seprint(char*, char*, char*, ...); extern char* vseprint(char*, char*, char*, va_list); extern int snprint(char*, int, char*, ...); extern int vsnprint(char*, int, char*, va_list); extern char* smprint(char*, ...); extern char* vsmprint(char*, va_list); extern int sprint(char*, char*, ...); extern int fprint(int, char*, ...); extern int vfprint(int, char*, va_list); extern int runesprint(Rune*, char*, ...); extern int runesnprint(Rune*, int, char*, ...); extern int runevsnprint(Rune*, int, char*, va_list); extern Rune* runeseprint(Rune*, Rune*, char*, ...); extern Rune* runevseprint(Rune*, Rune*, char*, va_list); extern Rune* runesmprint(char*, ...); extern Rune* runevsmprint(char*, va_list); extern int fmtfdinit(Fmt*, int, char*, int); extern int fmtfdflush(Fmt*); extern int fmtstrinit(Fmt*); extern char* fmtstrflush(Fmt*); extern int runefmtstrinit(Fmt*); extern Rune* runefmtstrflush(Fmt*); #pragma varargck argpos fmtprint 2 #pragma varargck argpos fprint 2 #pragma varargck argpos print 1 #pragma varargck argpos runeseprint 3 #pragma varargck argpos runesmprint 1 #pragma varargck argpos runesnprint 3 #pragma varargck argpos runesprint 2 #pragma varargck argpos seprint 3 #pragma varargck argpos smprint 1 #pragma varargck argpos snprint 3 #pragma varargck argpos sprint 2 #pragma varargck argpos vseprint 3 #pragma varargck argpos vsnprint 3 #pragma varargck type "lld" vlong #pragma varargck type "llx" vlong #pragma varargck type "lld" uvlong #pragma varargck type "llx" uvlong #pragma varargck type "ld" long #pragma varargck type "lx" long #pragma varargck type "ld" ulong #pragma varargck type "lx" ulong #pragma varargck type "d" int #pragma varargck type "x" int #pragma varargck type "c" int #pragma varargck type "C" int #pragma varargck type "d" uint #pragma varargck type "x" uint #pragma varargck type "c" uint #pragma varargck type "C" uint #pragma varargck type "f" double #pragma varargck type "e" double #pragma varargck type "g" double #pragma varargck type "s" char* #pragma varargck type "q" char* #pragma varargck type "S" Rune* #pragma varargck type "Q" Rune* #pragma varargck type "r" void #pragma varargck type "%" void #pragma varargck type "n" int* #pragma varargck type "p" void* #pragma varargck flag ',' #pragma varargck type "<" void* #pragma varargck type "[" void* #pragma varargck type "H" void* extern int fmtinstall(int, int (*)(Fmt*)); extern int dofmt(Fmt*, char*); extern int dorfmt(Fmt*, Rune*); extern int fmtprint(Fmt*, char*, ...); extern int fmtvprint(Fmt*, char*, va_list); extern int fmtrune(Fmt*, int); extern int fmtstrcpy(Fmt*, char*); extern int fmtrunestrcpy(Fmt*, Rune*); /* * error string for %r * supplied on per os basis, not part of fmt library */ extern int errfmt(Fmt *f); /* * quoted strings */ extern char *unquotestrdup(char*); extern Rune *unquoterunestrdup(Rune*); extern char *quotestrdup(char*); extern Rune *quoterunestrdup(Rune*); extern int quotestrfmt(Fmt*); extern int quoterunestrfmt(Fmt*); extern void quotefmtinstall(void); extern int (*doquote)(int); /* * random number */ extern void srand(long); extern int rand(void); extern int nrand(int); extern long lrand(void); extern long lnrand(long); extern double frand(void); extern ulong truerand(void); extern ulong ntruerand(ulong); /* * math */ extern ulong getfcr(void); extern void setfsr(ulong); extern ulong getfsr(void); extern void setfcr(ulong); extern double NaN(void); extern double Inf(int); extern int isNaN(double); extern int isInf(double, int); extern double pow(double, double); extern double atan2(double, double); extern double fabs(double); extern double atan(double); extern double log(double); extern double log10(double); extern double exp(double); extern double floor(double); extern double ceil(double); extern double hypot(double, double); extern double sin(double); extern double cos(double); extern double tan(double); extern double asin(double); extern double acos(double); extern double sinh(double); extern double cosh(double); extern double tanh(double); extern double sqrt(double); extern double fmod(double, double); #define HUGE 3.4028234e38 #define PIO2 1.570796326794896619231e0 #define PI (PIO2+PIO2) /* * Time-of-day */ typedef struct Tm { int sec; int min; int hour; int mday; int mon; int year; int wday; int yday; char zone[4]; int tzoff; } Tm; extern Tm* gmtime(long); extern Tm* localtime(long); extern char* asctime(Tm*); extern char* ctime(long); extern double cputime(void); extern long times(long*); extern long tm2sec(Tm*); extern vlong nsec(void); /* * one-of-a-kind */ enum { PNPROC = 1, PNGROUP = 2, }; extern vlong nsec(void); extern void _assert(char*); extern int abs(int); extern int atexit(void(*)(void)); extern void atexitdont(void(*)(void)); extern int atnotify(int(*)(void*, char*), int); extern double atof(char*); extern int atoi(char*); extern long atol(char*); extern double charstod(int(*)(void*), void*); extern char* cleanname(char*); extern int decrypt(void*, void*, int); extern int encrypt(void*, void*, int); extern int dec64(uchar*, int, char*, int); extern int enc64(char*, int, uchar*, int); extern int dec32(uchar*, int, char*, int); extern int enc32(char*, int, uchar*, int); extern int dec16(uchar*, int, char*, int); extern int enc16(char*, int, uchar*, int); extern int encodefmt(Fmt*); extern void exits(char*); extern double frexp(double, int*); extern ulong getcallerpc(void*); extern char* getenv(char*); extern int getfields(char*, char**, int, int, char*); extern char* getuser(void); extern char* getwd(char*, int); extern long labs(long); extern double ldexp(double, int); /*extern void longjmp(jmp_buf, int);*/ extern char* mktemp(char*); extern double modf(double, double*); extern int netcrypt(void*, void*); /*extern void notejmp(void*, jmp_buf, int);*/ extern void perror(char*); extern int postnote(int, int, char *); extern double pow10(int); extern double ipow10(int); extern int putenv(char*, char*); extern void qsort(void*, long, long, int (*)(void*, void*)); /*extern int setjmp(jmp_buf);*/ extern double strtod(char*, char**); extern long strtol(char*, char**, int); extern ulong strtoul(char*, char**, int); extern vlong strtoll(char*, char**, int); extern uvlong strtoull(char*, char**, int); extern void sysfatal(char*, ...); #pragma varargck argpos sysfatal 1 extern void syslog(int, char*, char*, ...); #pragma varargck argpos syslog 3 extern ulong _tas(ulong*); extern long time(long*); extern int tolower(int); extern int toupper(int); /* * network dialing */ #define NETPATHLEN 40 extern int accept(int, char*); extern int announce(char*, char*); extern int dial(char*, char*, char*, int*); extern void setnetmtpt(char*, int, char*); extern int hangup(int); extern int listen(char*, char*); extern char* netmkaddr(char*, char*, char*); extern int reject(int, char*, char*); /* * system calls * */ #define STATMAX 65535U /* max length of machine-independent stat structure */ #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ #define ERRMAX 128 /* max length of error string */ #define MORDER 0x0003 /* mask for bits defining order of mounting */ #define MREPL 0x0000 /* mount replaces object */ #define MBEFORE 0x0001 /* mount goes before others in union directory */ #define MAFTER 0x0002 /* mount goes after others in union directory */ #define MCREATE 0x0004 /* permit creation in mounted directory */ #define MCACHE 0x0010 /* cache some data */ #define MMASK 0x0017 /* all bits on */ #define OREAD 0 /* open for read */ #define OWRITE 1 /* write */ #define ORDWR 2 /* read and write */ #define OEXEC 3 /* execute, == read but check execute permission */ #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ #define OCEXEC 32 /* or'ed in, close on exec */ #define ORCLOSE 64 /* or'ed in, remove on close */ #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ #define AEXIST 0 /* accessible: exists */ #define AEXEC 1 /* execute access */ #define AWRITE 2 /* write access */ #define AREAD 4 /* read access */ /* Segattch */ #define SG_RONLY 0040 /* read only */ #define SG_CEXEC 0100 /* detach on exec */ #define NCONT 0 /* continue after note */ #define NDFLT 1 /* terminate after note */ #define NSAVE 2 /* clear note but hold state */ #define NRSTR 3 /* restore saved state */ /* rfork */ enum { RFNAMEG = (1<<0), RFENVG = (1<<1), RFFDG = (1<<2), RFNOTEG = (1<<3), RFPROC = (1<<4), RFMEM = (1<<5), RFNOWAIT = (1<<6), RFCNAMEG = (1<<10), RFCENVG = (1<<11), RFCFDG = (1<<12), RFREND = (1<<13), RFNOMNT = (1<<14) }; /* bits in Qid.type */ #define QTDIR 0x80 /* type bit for directories */ #define QTAPPEND 0x40 /* type bit for append only files */ #define QTEXCL 0x20 /* type bit for exclusive use files */ #define QTMOUNT 0x10 /* type bit for mounted channel */ #define QTAUTH 0x08 /* type bit for authentication file */ #define QTFILE 0x00 /* plain file */ /* bits in Dir.mode */ #define DMDIR 0x80000000 /* mode bit for directories */ #define DMAPPEND 0x40000000 /* mode bit for append only files */ #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ #define DMAUTH 0x08000000 /* mode bit for authentication file */ #define DMREAD 0x4 /* mode bit for read permission */ #define DMWRITE 0x2 /* mode bit for write permission */ #define DMEXEC 0x1 /* mode bit for execute permission */ typedef struct Qid { uvlong path; ulong vers; uchar type; } Qid; typedef struct Dir { /* system-modified data */ ushort type; /* server type */ uint dev; /* server subtype */ /* file data */ Qid qid; /* unique id from server */ ulong mode; /* permissions */ ulong atime; /* last read time */ ulong mtime; /* last write time */ vlong length; /* file length */ char *name; /* last element of path */ char *uid; /* owner name */ char *gid; /* group name */ char *muid; /* last modifier name */ } Dir; extern Dir* dirstat(char*); extern Dir* dirfstat(int); extern int dirwstat(char*, Dir*); extern int dirfwstat(int, Dir*); extern long dirread(int, Dir**); extern void nulldir(Dir*); extern long dirreadall(int, Dir**); #define CHDIR 0x80000000 /* mode bit for directories */ #define CHAPPEND 0x40000000 /* mode bit for append only files */ #define CHEXCL 0x20000000 /* mode bit for exclusive use files */ #define CHMOUNT 0x10000000 /* mode bit for mounted channel */ #define CHREAD 0x4 /* mode bit for read permission */ #define CHWRITE 0x2 /* mode bit for write permission */ #define CHEXEC 0x1 /* mode bit for execute permission */ typedef struct Waitmsg { char pid[12]; /* of loved one */ char time[3*12]; /* of loved one & descendants */ char *msg; } Waitmsg; typedef struct IOchunk { void *addr; ulong len; } IOchunk; extern void _exits(char*); extern void abort(void); extern int access(char*, int); extern long alarm(ulong); extern int await(char*, int); extern int bind(char*, char*, int); extern int brk(void*); extern int chdir(char*); extern int close(int); extern int create(char*, int, ulong); extern int dup(int, int); extern int errstr(char*, uint); extern int exec(char*, char*[]); extern int execl(char*, ...); extern int filsys(int, int, char*); extern int fork(void); extern int rfork(int); extern int fauth(int, char*); extern int fstat(int, uchar*, int); extern int fwstat(int, uchar*, int); extern int fversion(int, int, char*, int); extern int mount(int, int, char*, int, char*); extern int unmount(char*, char*); extern int noted(int); extern int notify(void(*)(void*, char*)); extern int open(char*, int); extern int fd2path(int, char*, int); extern int pipe(int*); extern long pread(int, void*, long, vlong); extern long pwrite(int, void*, long, vlong); extern long read(int, void*, long); extern long readn(int, void*, long); extern int remove(char*); extern void* sbrk(ulong); extern vlong seek(int, vlong, int); extern long segattach(int, char*, void*, ulong); extern int segbrk(void*, void*); extern int segdetach(void*); extern int segflush(void*, ulong); extern int segfree(void*, ulong); extern int sleep(long); extern int stat(char*, uchar*, int); extern Waitmsg* wait(void); extern int waitpid(void); extern long write(int, void*, long); extern long write9p(int, void*, long); extern int wstat(char*, char*); extern ulong rendezvous(ulong, ulong); extern int getpid(void); extern int getppid(void); extern void rerrstr(char*, uint); extern char* sysname(void); extern void werrstr(char*, ...); #pragma varargck argpos werrstr 1 extern char *argv0; #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ argv[0] && argv[0][0]=='-' && argv[0][1];\ argc--, argv++) {\ char *_args, *_argt;\ Rune _argc;\ _args = &argv[0][1];\ if(_args[0]=='-' && _args[1]==0){\ argc--; argv++; break;\ }\ _argc = 0;\ while(*_args && (_args += chartorune(&_argc, _args)))\ switch(_argc) #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); #define ARGF() (_argt=_args, _args="",\ (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) #define EARGF(x) (_argt=_args, _args="",\ (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) #define ARGC() _argc xtern int (*doquote)(int); /* * random number */ extern void srand(long); extern int rand(void); extern int nrand(int); extern long lrand(void); extern long lnrand(long); extern double frand(void); extern ulong truerand(void); extern ulong ntruerand(ulong); old_contrib//root/sys/src/cmd/limbo/include/kernel.h������������������������������������������������ 664 � 0 � 0 � 3302 7732341364 21571�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������extern vlong libseek(int, vlong, int); extern int libread(int, void*, int); extern int libreadn(int, void*, long); extern int libwrite(int, void*, int); extern int libopen(char*, int); extern int libclose(int); extern Dir* libdirfstat(int); extern int libbind(char*, char*, int); extern void* libqlalloc(void); extern void libqlfree(void*); extern void libqlock(void*); extern void libqunlock(void*); extern void* libqlowner(void*); extern void* libfdtochan(int, int); extern void libchanclose(void*); extern int kbind(char*, char*, int); extern int kchdir(char*); extern int kclose(int); extern int kcreate(char*, int, ulong); extern Dir* kdirfstat(int); extern int kdirfwstat(int, Dir*); extern long kdirread(int, Dir**); extern Dir* kdirstat(char*); extern int kdirwstat(char*, Dir*); extern int kdup(int, int); extern int kfauth(int, char*); extern char* kfd2path(int); extern int kfstat(int, uchar*, int); extern int kfversion(int, uint, char*, uint); extern int kfwstat(int, uchar*, int); extern int kmount(int, int, char*, int, char*); extern int kopen(char*, int); extern int kpipe(int[2]); extern long kpread(int, void*, long, vlong); extern long kread(int, void*, long); extern int kremove(char*); extern vlong kseek(int, vlong, int); extern int kstat(char*, uchar*, int); extern int kunmount(char*, char*); extern long kpwrite(int, void*, long, vlong); extern long kwrite(int, void*, long); extern int kwstat(char*, uchar*, int); extern int klisten(char*, char*); extern int kannounce(char*, char*); extern int kdial(char*, char*, char*, int*); extern void kerrstr(char*, uint); extern int kiounit(int); extern void kwerrstr(char *, ...); extern void kgerrstr(char*, uint); extern long kchanio(void*, void*, int, int); char* getuser(void); extern char* getwd(char*, int); extern long labs(long); extern double ldexp(double, int); /*extern void longjmp(jmp_buf, int);*/ extern char* mktemp(char*); extern double modf(double, double*); extern int netcrypt(void*, void*); /*extern void notejmp(void*, jmp_buf, int);*/ extern void perror(chold_contrib//root/sys/src/cmd/limbo/include/keyboard.h���������������������������������������������� 664 � 0 � 0 � 2230 7732341364 22110�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************** Inferno Generic Scan Conversions ************/ /* this file needs to be kept in sync with module/keyboard.m */ enum { Esc= 0x1b, Spec= 0xe000, /* Special Function Keys, mapped to Unicode reserved range (E000-F8FF) */ Shift= Spec|0x0, /* Shifter (Held and Toggle) Keys */ View= Spec|0x10, /* View Keys */ PF= Spec|0x20, /* num pad */ KF= Spec|0x40, /* function keys */ LShift= Shift|0, RShift= Shift|1, LCtrl= Shift|2, RCtrl= Shift|3, Caps= Shift|4, Num= Shift|5, Meta= Shift|6, LAlt= Shift|7, RAlt= Shift|8, NShifts= 9, Home= View|0, End= View|1, Up= View|2, Down= View|3, Left= View|4, Right= View|5, Pgup= View|6, Pgdown= View|7, BackTab= View|8, Scroll= Spec|0x62, Ins= Spec|0x63, Del= Spec|0x64, Print= Spec|0x65, Pause= Spec|0x66, Middle= Spec|0x67, Break= Spec|0x66, SysRq= Spec|0x69, PwrOn= Spec|0x6c, PwrOff= Spec|0x6d, PwrLow= Spec|0x6e, Latin= Spec|0x6f, /* for German keyboard */ German= Spec|0xf00, Grave= German|0x1, Acute= German|0x2, Circumflex= German|0x3, APP= Spec|0x200, /* for ALT application keys */ No= -1, /* peter */ }; r read */ #define OWRITE 1 /* write */ #define ORDWR 2 /* read and write */ #define OEXEC 3 /* execute, == read but check execute permission */ #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ #define OCEXEC 32 /* or'ed in, close on exec */ #define ORCLOSE 64 /* or'ed in, remove on close */ #define OEXCL 0x1000 /* or'ed in, exclusive uold_contrib//root/sys/src/cmd/limbo/include/libsec.h������������������������������������������������ 664 � 0 � 0 � 23060 10300632344 21577�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/libsec" #ifndef _MPINT typedef struct mpint mpint; #endif /*/////////////////////////////////////////////////////// */ /* AES definitions */ /*/////////////////////////////////////////////////////// */ enum { AESbsize= 16, AESmaxkey= 32, AESmaxrounds= 14 }; typedef struct AESstate AESstate; struct AESstate { ulong setup; int rounds; int keybytes; uchar key[AESmaxkey]; /* unexpanded key */ u32int ekey[4*(AESmaxrounds + 1)]; /* encryption key */ u32int dkey[4*(AESmaxrounds + 1)]; /* decryption key */ uchar ivec[AESbsize]; /* initialization vector */ }; void setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec); void aesCBCencrypt(uchar *p, int len, AESstate *s); void aesCBCdecrypt(uchar *p, int len, AESstate *s); /*/////////////////////////////////////////////////////// */ /* Blowfish Definitions */ /*/////////////////////////////////////////////////////// */ enum { BFbsize = 8, BFrounds = 16 }; /* 16-round Blowfish */ typedef struct BFstate BFstate; struct BFstate { ulong setup; uchar key[56]; uchar ivec[8]; u32int pbox[BFrounds+2]; u32int sbox[1024]; }; void setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec); void bfCBCencrypt(uchar*, int, BFstate*); void bfCBCdecrypt(uchar*, int, BFstate*); void bfECBencrypt(uchar*, int, BFstate*); void bfECBdecrypt(uchar*, int, BFstate*); /*/////////////////////////////////////////////////////// */ /* DES definitions */ /*/////////////////////////////////////////////////////// */ enum { DESbsize= 8 }; /* single des */ typedef struct DESstate DESstate; struct DESstate { ulong setup; uchar key[8]; /* unexpanded key */ ulong expanded[32]; /* expanded key */ uchar ivec[8]; /* initialization vector */ }; void setupDESstate(DESstate *s, uchar key[8], uchar *ivec); void des_key_setup(uchar[8], ulong[32]); void block_cipher(ulong*, uchar*, int); void desCBCencrypt(uchar*, int, DESstate*); void desCBCdecrypt(uchar*, int, DESstate*); void desECBencrypt(uchar*, int, DESstate*); void desECBdecrypt(uchar*, int, DESstate*); /* for backward compatibility with 7 byte DES key format */ void des56to64(uchar *k56, uchar *k64); void des64to56(uchar *k64, uchar *k56); void key_setup(uchar[7], ulong[32]); /* triple des encrypt/decrypt orderings */ enum { DES3E= 0, DES3D= 1, DES3EEE= 0, DES3EDE= 2, DES3DED= 5, DES3DDD= 7 }; typedef struct DES3state DES3state; struct DES3state { ulong setup; uchar key[3][8]; /* unexpanded key */ ulong expanded[3][32]; /* expanded key */ uchar ivec[8]; /* initialization vector */ }; void setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec); void triple_block_cipher(ulong keys[3][32], uchar*, int); void des3CBCencrypt(uchar*, int, DES3state*); void des3CBCdecrypt(uchar*, int, DES3state*); void des3ECBencrypt(uchar*, int, DES3state*); void des3ECBdecrypt(uchar*, int, DES3state*); /* IDEA */ typedef struct IDEAstate IDEAstate; struct IDEAstate { uchar key[16]; ushort edkey[104]; uchar ivec[8]; }; void setupIDEAstate(IDEAstate*, uchar*, uchar*); void idea_key_setup(uchar*, ushort*); void idea_cipher(ushort*, uchar*, int); /*/////////////////////////////////////////////////////// */ /* digests */ /*/////////////////////////////////////////////////////// */ enum { SHA1dlen= 20, /* SHA digest length */ MD4dlen= 16, /* MD4 digest length */ MD5dlen= 16 /* MD5 digest length */ }; typedef struct DigestState DigestState; struct DigestState { uvlong len; u32int state[5]; uchar buf[128]; int blen; char malloced; char seeded; }; typedef struct DigestState SHAstate; /* obsolete name */ typedef struct DigestState SHA1state; typedef struct DigestState MD5state; typedef struct DigestState MD4state; DigestState* md4(uchar*, ulong, uchar*, DigestState*); DigestState* md5(uchar*, ulong, uchar*, DigestState*); DigestState* sha1(uchar*, ulong, uchar*, DigestState*); DigestState* hmac_md5(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); DigestState* hmac_sha1(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); char* md5pickle(MD5state*); MD5state* md5unpickle(char*); char* sha1pickle(SHA1state*); SHA1state* sha1unpickle(char*); /*/////////////////////////////////////////////////////// */ /* random number generation */ /*/////////////////////////////////////////////////////// */ void genrandom(uchar *buf, int nbytes); void _genrandomqlock(void); void _genrandomqunlock(void); void prng(uchar *buf, int nbytes); ulong fastrand(void); ulong nfastrand(ulong); /*/////////////////////////////////////////////////////// */ /* primes */ /*/////////////////////////////////////////////////////// */ void genprime(mpint *p, int n, int accuracy); /* generate an n bit probable prime */ void gensafeprime(mpint *p, mpint *alpha, int n, int accuracy); /* prime and generator */ void genstrongprime(mpint *p, int n, int accuracy); /* generate an n bit strong prime */ void DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]); int probably_prime(mpint *n, int nrep); /* miller-rabin test */ int smallprimetest(mpint *p); /* returns -1 if not prime, 0 otherwise */ /*/////////////////////////////////////////////////////// */ /* rc4 */ /*/////////////////////////////////////////////////////// */ typedef struct RC4state RC4state; struct RC4state { uchar state[256]; uchar x; uchar y; }; void setupRC4state(RC4state*, uchar*, int); void rc4(RC4state*, uchar*, int); void rc4skip(RC4state*, int); void rc4back(RC4state*, int); /*/////////////////////////////////////////////////////// */ /* rsa */ /*/////////////////////////////////////////////////////// */ typedef struct RSApub RSApub; typedef struct RSApriv RSApriv; typedef struct PEMChain PEMChain; /* public/encryption key */ struct RSApub { mpint *n; /* modulus */ mpint *ek; /* exp (encryption key) */ }; /* private/decryption key */ struct RSApriv { RSApub pub; mpint *dk; /* exp (decryption key) */ /* precomputed values to help with chinese remainder theorem calc */ mpint *p; mpint *q; mpint *kp; /* dk mod p-1 */ mpint *kq; /* dk mod q-1 */ mpint *c2; /* (inv p) mod q */ }; struct PEMChain{ PEMChain *next; uchar *pem; int pemlen; }; RSApriv* rsagen(int nlen, int elen, int rounds); RSApriv* rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q); mpint* rsaencrypt(RSApub *k, mpint *in, mpint *out); mpint* rsadecrypt(RSApriv *k, mpint *in, mpint *out); RSApub* rsapuballoc(void); void rsapubfree(RSApub*); RSApriv* rsaprivalloc(void); void rsaprivfree(RSApriv*); RSApub* rsaprivtopub(RSApriv*); RSApub* X509toRSApub(uchar*, int, char*, int); RSApriv* asn1toRSApriv(uchar*, int); void asn1dump(uchar *der, int len); uchar* decodePEM(char *s, char *type, int *len, char **new_s); PEMChain* decodepemchain(char *s, char *type); uchar* X509gen(RSApriv *priv, char *subj, ulong valid[2], int *certlen); uchar* X509req(RSApriv *priv, char *subj, int *certlen); char* X509verify(uchar *cert, int ncert, RSApub *pk); void X509dump(uchar *cert, int ncert); /*/////////////////////////////////////////////////////// */ /* elgamal */ /*/////////////////////////////////////////////////////// */ typedef struct EGpub EGpub; typedef struct EGpriv EGpriv; typedef struct EGsig EGsig; /* public/encryption key */ struct EGpub { mpint *p; /* modulus */ mpint *alpha; /* generator */ mpint *key; /* (encryption key) alpha**secret mod p */ }; /* private/decryption key */ struct EGpriv { EGpub pub; mpint *secret; /* (decryption key) */ }; /* signature */ struct EGsig { mpint *r, *s; }; EGpriv* eggen(int nlen, int rounds); mpint* egencrypt(EGpub *k, mpint *in, mpint *out); /* deprecated */ mpint* egdecrypt(EGpriv *k, mpint *in, mpint *out); EGsig* egsign(EGpriv *k, mpint *m); int egverify(EGpub *k, EGsig *sig, mpint *m); EGpub* egpuballoc(void); void egpubfree(EGpub*); EGpriv* egprivalloc(void); void egprivfree(EGpriv*); EGsig* egsigalloc(void); void egsigfree(EGsig*); EGpub* egprivtopub(EGpriv*); /*/////////////////////////////////////////////////////// */ /* dsa */ /*/////////////////////////////////////////////////////// */ typedef struct DSApub DSApub; typedef struct DSApriv DSApriv; typedef struct DSAsig DSAsig; /* public/encryption key */ struct DSApub { mpint *p; /* modulus */ mpint *q; /* group order, q divides p-1 */ mpint *alpha; /* group generator */ mpint *key; /* (encryption key) alpha**secret mod p */ }; /* private/decryption key */ struct DSApriv { DSApub pub; mpint *secret; /* (decryption key) */ }; /* signature */ struct DSAsig { mpint *r, *s; }; DSApriv* dsagen(DSApub *opub); /* opub not checked for consistency! */ DSAsig* dsasign(DSApriv *k, mpint *m); int dsaverify(DSApub *k, DSAsig *sig, mpint *m); DSApub* dsapuballoc(void); void dsapubfree(DSApub*); DSApriv* dsaprivalloc(void); void dsaprivfree(DSApriv*); DSAsig* dsasigalloc(void); void dsasigfree(DSAsig*); DSApub* dsaprivtopub(DSApriv*); /*/////////////////////////////////////////////////////// */ /* TLS */ /*/////////////////////////////////////////////////////// */ typedef struct Thumbprint{ struct Thumbprint *next; uchar sha1[SHA1dlen]; } Thumbprint; typedef struct TLSconn{ char dir[40]; /* connection directory */ uchar *cert; /* certificate (local on input, remote on output) */ uchar *sessionID; int certlen, sessionIDlen; int (*trace)(char*fmt, ...); PEMChain *chain; /* optional extra certificate evidence for servers to present */ } TLSconn; /* tlshand.c */ int tlsClient(int fd, TLSconn *c); int tlsServer(int fd, TLSconn *c); /* thumb.c */ Thumbprint* initThumbprints(char *ok, char *crl); void freeThumbprints(Thumbprint *ok); int okThumbprint(uchar *sha1, Thumbprint *ok); /* readcert.c */ uchar *readcert(char *filename, int *pcertlen); PEMChain *readcertchain(char *filename); ec.h������������������������������������������������ 664 � 0 � 0 � 23060 10300632344 21577�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/logfs.h������������������������������������������������� 775 � 0 � 0 � 15731 7732341364 21457�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/liblogfs" enum { LogfsTnone = 0xff, LogfsTboot = 0x01, LogfsTlog = 0x06, LogfsTdata = 0x18, LogfsTbad = -1, LogfsTworse = -2, LogfsMagic = 'V', }; enum { LogfsLogTstart = 's', LogfsLogTcreate = 'c', LogfsLogTtrunc = 't', LogfsLogTremove = 'r', LogfsLogTwrite = 'w', LogfsLogTwstat = 'W', LogfsLogTend = 'e', }; enum { LogfsOpenFlagNoPerm = 1, LogfsOpenFlagWstatAllow = 2, }; typedef struct LogfsLowLevel LogfsLowLevel; typedef enum LogfsLowLevelFettleAction { LogfsLowLevelFettleActionMarkBad, LogfsLowLevelFettleActionErase, LogfsLowLevelFettleActionFormat, LogfsLowLevelFettleActionEraseAndFormat, } LogfsLowLevelFettleAction; typedef enum LogfsLowLevelReadResult { LogfsLowLevelReadResultOk, LogfsLowLevelReadResultSoftError, LogfsLowLevelReadResultHardError, LogfsLowLevelReadResultBad, LogfsLowLevelReadResultAllOnes, } LogfsLowLevelReadResult; typedef short LOGFSGETBLOCKTAGFN(LogfsLowLevel *ll, long block); typedef void LOGFSSETBLOCKTAGFN(LogfsLowLevel *ll, long block, short tag); typedef ulong LOGFSGETBLOCKPATHFN(LogfsLowLevel *ll, long block); typedef void LOGFSSETBLOCKPATHFN(LogfsLowLevel *ll, long block, ulong path); typedef long LOGFSFINDFREEBLOCKFN(LogfsLowLevel *ll, long *freeblocks); typedef char *LOGFSREADBLOCKFN(LogfsLowLevel *ll, void *buf, long block, LogfsLowLevelReadResult *blocke); typedef char *LOGFSWRITEBLOCKFN(LogfsLowLevel *ll, void *buf, uchar tag, ulong path, int xcount, long *xdata, long block); typedef char *LOGFSERASEBLOCKFN(LogfsLowLevel *ll, long block, void **llsave, int *markedbad); typedef char *LOGFSFORMATBLOCKFN(LogfsLowLevel *ll, long block, uchar tag, long path, long baseblock, long sizeinblocks, int xcount, long *xdata, void *llsave, int *markedbad); typedef char *LOGFSREFORMATBLOCKFN(LogfsLowLevel *ll, long block, uchar tag, long path, int xcount, long *xdata, void *llsave, int *markedbad); typedef void LOGFSMARKBLOCKBADFN(LogfsLowLevel *ll, long block); typedef int LOGFSGETBLOCKSFN(LogfsLowLevel *ll); typedef long LOGFSGETBASEBLOCKFN(LogfsLowLevel *ll); typedef int LOGFSGETBLOCKSIZEFN(LogfsLowLevel *ll); typedef int LOGFSGETBLOCKPARTIALFORMATSTATUSFN(LogfsLowLevel *ll, long block); typedef ulong LOGFSCALCRAWADDRESSFN(LogfsLowLevel *ll, long pblock, int dataoffset); typedef char *LOGFSOPENFN(LogfsLowLevel *ll, long base, long limit, int trace, int xcount, long *xdata); typedef char *LOGFSGETBLOCKSTATUSFN(LogfsLowLevel *ll, long block, int *magicfound, void **llsave, LogfsLowLevelReadResult *result); typedef int LOGFSCALCFORMATFN(LogfsLowLevel *ll, long base, long limit, long bootsize, long *baseblock, long *limitblock, long *bootblocks); typedef int LOGFSGETOPENSTATUSFN(LogfsLowLevel *ll); typedef void LOGFSFREEFN(LogfsLowLevel *ll); typedef char *LOGFSREADPAGERANGEFN(LogfsLowLevel *ll, uchar *data, long block, int page, int offset, int count, LogfsLowLevelReadResult *result); typedef char *LOGFSWRITEPAGEFN(LogfsLowLevel *ll, uchar *data, long block, int page); typedef char *LOGFSSYNCFN(LogfsLowLevel *ll); struct LogfsLowLevel { int l2pagesize; int l2pagesperblock; long blocks; int pathbits; LOGFSOPENFN *open; LOGFSGETBLOCKTAGFN *getblocktag; LOGFSSETBLOCKTAGFN *setblocktag; LOGFSGETBLOCKPATHFN *getblockpath; LOGFSSETBLOCKPATHFN *setblockpath; LOGFSREADPAGERANGEFN *readpagerange; LOGFSWRITEPAGEFN *writepage; LOGFSFINDFREEBLOCKFN *findfreeblock; LOGFSREADBLOCKFN *readblock; LOGFSWRITEBLOCKFN *writeblock; LOGFSERASEBLOCKFN *eraseblock; LOGFSFORMATBLOCKFN *formatblock; LOGFSREFORMATBLOCKFN *reformatblock; LOGFSMARKBLOCKBADFN *markblockbad; LOGFSGETBASEBLOCKFN *getbaseblock; LOGFSGETBLOCKSIZEFN *getblocksize; LOGFSGETBLOCKPARTIALFORMATSTATUSFN *getblockpartialformatstatus; LOGFSCALCRAWADDRESSFN *calcrawaddress; LOGFSGETBLOCKSTATUSFN *getblockstatus; LOGFSCALCFORMATFN *calcformat; LOGFSGETOPENSTATUSFN *getopenstatus; LOGFSFREEFN *free; LOGFSSYNCFN *sync; }; extern char Eio[]; extern char Ebadarg[]; extern char Eperm[]; char *logfstagname(uchar tag); typedef struct LogfsIdentityStore LogfsIdentityStore; char *logfsisnew(LogfsIdentityStore **isp); void logfsisfree(LogfsIdentityStore **isp); char *logfsisgroupcreate(LogfsIdentityStore *is, char *groupname, char *groupid); char *logfsisgrouprename(LogfsIdentityStore *is, char *oldgroupname, char *newgroupname); char *logfsisgroupsetleader(LogfsIdentityStore *is, char *groupname, char *leadername); char *logfsisgroupaddmember(LogfsIdentityStore *is, char *groupname, char *membername); char *logfsisgroupremovemember(LogfsIdentityStore *is, char *groupname, char *nonmembername); char *logfsisusersread(LogfsIdentityStore *is, void *buf, long n, ulong offset, long *nr); typedef struct LogfsBoot LogfsBoot; typedef struct Logfs Logfs; typedef struct LogfsServer LogfsServer; char *logfsformat(LogfsLowLevel *ll, long base, long limit, long bootsize, int trace); char *logfsbootopen(LogfsLowLevel *ll, long base, long limit, int trace, int printbad, LogfsBoot **lbp); void logfsbootfree(LogfsBoot *lb); char *logfsbootread(LogfsBoot *lb, void *buf, long n, ulong offset); char *logfsbootwrite(LogfsBoot *lb, void *buf, long n, ulong offset); char *logfsbootio(LogfsBoot *lb, void *buf, long n, ulong offset, int write); char *logfsbootmap(LogfsBoot *lb, ulong laddress, ulong *lblockp, int *lboffsetp, int *lpagep, int *lpageoffsetp, ulong *pblockp, ulong *paddressp); long logfsbootgetiosize(LogfsBoot *lb); long logfsbootgetsize(LogfsBoot *lb); void logfsboottrace(LogfsBoot *lb, int level); char *logfsserverattach(LogfsServer *s, u32int fid, char *uname, Qid *qid); char *logfsserverclunk(LogfsServer *s, u32int fid); char *logfsservercreate(LogfsServer *server, u32int fid, char *name, u32int perm, uchar mode, Qid *qid); char *logfsserverflush(LogfsServer *server); char *logfsservernew(LogfsBoot *lb, LogfsLowLevel *ll, LogfsIdentityStore *is, ulong openflags, int trace, LogfsServer **sp); char *logfsserveropen(LogfsServer *s, u32int fid, uchar mode, Qid *qid); char *logfsserverread(LogfsServer *s, u32int fid, u32int offset, u32int count, uchar *buf, u32int buflen, u32int *rcount); char *logfsserverremove(LogfsServer *server, u32int fid); char *logfsserverstat(LogfsServer *s, u32int fid, uchar *buf, u32int bufsize, ushort *count); char *logfsserverwalk(LogfsServer *s, u32int fid, u32int newfid, ushort nwname, char **wname, ushort *nwqid, Qid *wqid); char *logfsserverwrite(LogfsServer *server, u32int fid, u32int offset, u32int count, uchar *buf, u32int *rcount); char *logfsserverwstat(LogfsServer *server, u32int fid, uchar *stat, ushort nstat); void logfsserverfree(LogfsServer **sp); char *logfsserverlogsweep(LogfsServer *server, int justone, int *didsomething); char *logfsserverreadpathextent(LogfsServer *server, u32int path, int nth, u32int *flashaddrp, u32int *lengthp, long *blockp, int *pagep, int *offsetp); char *logfsservertestcmd(LogfsServer *s, int argc, char **argv); void logfsservertrace(LogfsServer *s, int level); /* * implemented by the environment */ ulong logfsnow(void); void *logfsrealloc(void *p, ulong size); void logfsfreemem(void *p); t(EGpriv *k, mpint *in, mpint *out); EGold_contrib//root/sys/src/cmd/limbo/include/mathi.h������������������������������������������������� 664 � 0 � 0 � 4650 7744737204 21427�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * floating point control and status register masks */ enum { INVAL = 0x0001, ZDIV = 0x0002, OVFL = 0x0004, UNFL = 0x0008, INEX = 0x0010, RND_NR = 0x0000, RND_NINF = 0x0100, RND_PINF = 0x0200, RND_Z = 0x0300, RND_MASK = 0x0300 }; extern double ipow10(int); extern void FPinit(void); extern double dot(int, double*, double*); extern ulong FPcontrol(ulong, ulong); extern ulong FPstatus(ulong, ulong); extern void gemm(int, int, int, int, int, double, double*, int, double*, int, double, double*, int); extern ulong getFPstatus(void); extern ulong getFPcontrol(void); extern char* g_fmt(char *, double, int); extern int iamax(int, double*); extern double fdim(double, double); extern double fmax(double, double); extern double fmin(double, double); extern double norm2(int, double*); extern double norm1(int, double*); extern double strtod(const char *, char **); /* fdlibm */ extern double __ieee754_acos(double); extern double __ieee754_acosh(double); extern double __ieee754_asin(double); extern double asinh(double); extern double atan(double); extern double __ieee754_atan2(double, double); extern double __ieee754_atanh(double); extern double cbrt(double); extern double ceil(double); extern double copysign(double, double); extern double cos(double); extern double __ieee754_cosh(double); extern double erf(double); extern double erfc(double); extern double __ieee754_exp(double); extern double expm1(double); extern double fabs(double); extern int finite(double); extern double floor(double); extern double __ieee754_fmod(double, double); extern double __ieee754_hypot(double, double); extern int ilogb(double); extern int isnan(double); extern double __ieee754_j0(double); extern double __ieee754_j1(double); extern double __ieee754_jn(int, double); extern double __ieee754_lgamma_r(double,int*); extern double __ieee754_log(double); extern double __ieee754_log10(double); extern double log1p(double); extern double logb(double); extern double modf(double, double *); extern double nextafter(double, double); extern double __ieee754_pow(double, double); extern double __ieee754_remainder(double, double); extern double rint(double); extern double scalbn(double, int); extern double sin(double); extern double __ieee754_sinh(double); extern double __ieee754_sqrt(double); extern double tan(double); extern double tanh(double); extern double __ieee754_y0(double); extern double __ieee754_y1(double); extern double __ieee754_yn(int, double); ����������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/memdraw.h����������������������������������������������� 664 � 0 � 0 � 13061 7737016442 21771�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/libmemdraw" typedef struct Memimage Memimage; typedef struct Memdata Memdata; typedef struct Memsubfont Memsubfont; typedef struct Memlayer Memlayer; typedef struct Memcmap Memcmap; typedef struct Memdrawparam Memdrawparam; #pragma incomplete Memlayer /* * Memdata is allocated from main pool, but .data from the image pool. * Memdata is allocated separately to permit patching its pointer after * compaction when windows share the image data. * The first word of data is a back pointer to the Memdata, to find * The word to patch. */ struct Memdata { ulong *base; /* allocated data pointer */ uchar *bdata; /* pointer to first byte of actual data; word-aligned */ int ref; /* number of Memimages using this data */ void* imref; int allocd; /* is this malloc'd? */ }; enum { Frepl = 1<<0, /* is replicated */ Fsimple = 1<<1, /* is 1x1 */ Fgrey = 1<<2, /* is grey */ Falpha = 1<<3, /* has explicit alpha */ Fcmap = 1<<4, /* has cmap channel */ Fbytes = 1<<5, /* has only 8-bit channels */ }; struct Memimage { Rectangle r; /* rectangle in data area, local coords */ Rectangle clipr; /* clipping region */ int depth; /* number of bits of storage per pixel */ int nchan; /* number of channels */ ulong chan; /* channel descriptions */ Memcmap *cmap; Memdata *data; /* pointer to data; shared by windows in this image */ int zero; /* data->bdata+zero==&byte containing (0,0) */ ulong width; /* width in words of a single scan line */ Memlayer *layer; /* nil if not a layer*/ ulong flags; int shift[NChan]; int mask[NChan]; int nbits[NChan]; }; struct Memcmap { uchar cmap2rgb[3*256]; uchar rgb2cmap[16*16*16]; }; /* * Subfonts * * given char c, Subfont *f, Fontchar *i, and Point p, one says * i = f->info+c; * draw(b, Rect(p.x+i->left, p.y+i->top, * p.x+i->left+((i+1)->x-i->x), p.y+i->bottom), * color, f->bits, Pt(i->x, i->top)); * p.x += i->width; * to draw characters in the specified color (itself a Memimage) in Memimage b. */ struct Memsubfont { char *name; short n; /* number of chars in font */ uchar height; /* height of bitmap */ char ascent; /* top of bitmap to baseline */ Fontchar *info; /* n+1 character descriptors */ Memimage *bits; /* of font */ }; /* * Encapsulated parameters and information for sub-draw routines. */ enum { Simplesrc=1<<0, Simplemask=1<<1, Replsrc=1<<2, Replmask=1<<3, Fullmask=1<<4, }; struct Memdrawparam { Memimage *dst; Rectangle r; Memimage *src; Rectangle sr; Memimage *mask; Rectangle mr; int op; ulong state; ulong mval; /* if Simplemask, the mask pixel in mask format */ ulong mrgba; /* mval in rgba */ ulong sval; /* if Simplesrc, the source pixel in src format */ ulong srgba; /* sval in rgba */ ulong sdval; /* sval in dst format */ }; /* * Memimage management */ extern Memimage* allocmemimage(Rectangle, ulong); extern Memimage* allocmemimaged(Rectangle, ulong, Memdata*); extern Memimage* readmemimage(int); extern Memimage* creadmemimage(int); extern int writememimage(int, Memimage*); extern void freememimage(Memimage*); extern int loadmemimage(Memimage*, Rectangle, uchar*, int); extern int cloadmemimage(Memimage*, Rectangle, uchar*, int); extern int unloadmemimage(Memimage*, Rectangle, uchar*, int); extern ulong* wordaddr(Memimage*, Point); extern uchar* byteaddr(Memimage*, Point); extern int drawclip(Memimage*, Rectangle*, Memimage*, Point*, Memimage*, Point*, Rectangle*, Rectangle*); extern void memfillcolor(Memimage*, ulong); extern int memsetchan(Memimage*, ulong); /* * Graphics */ extern void memdraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); extern void memline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); extern void mempoly(Memimage*, Point*, int, int, int, int, Memimage*, Point, int); extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int); extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int); extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, int); extern int hwdraw(Memdrawparam*); extern void memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, int); extern void _memimageline(Memimage*, Point, Point, int, int, int, Memimage*, Point, Rectangle, int); extern Point memimagestring(Memimage*, Point, Memimage*, Point, Memsubfont*, char*); extern void memellipse(Memimage*, Point, int, int, int, Memimage*, Point, int); extern void memarc(Memimage*, Point, int, int, int, Memimage*, Point, int, int, int); extern Rectangle memlinebbox(Point, Point, int, int, int); extern int memlineendsize(int); extern void _memmkcmap(void); extern void memimageinit(void); /* * Subfont management */ extern Memsubfont* allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*); extern Memsubfont* openmemsubfont(char*); extern void freememsubfont(Memsubfont*); extern Point memsubfontwidth(Memsubfont*, char*); extern Memsubfont* getmemdefont(void); /* * Predefined */ extern Memimage* memwhite; extern Memimage* memblack; extern Memimage* memopaque; extern Memimage* memtransparent; extern Memcmap *memdefcmap; /* * Kernel interface */ uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); void memimagemove(void*, void*); /* * Kernel cruft */ extern void rdb(void); extern int iprint(char*, ...); #pragma varargck argpos iprint 1 extern int drawdebug; /* * doprint interface: numbconv bit strings */ #pragma varargck type "llb" vlong #pragma varargck type "llb" uvlong #pragma varargck type "lb" long #pragma varargck type "lb" ulong #pragma varargck type "b" int #pragma varargck type "b" uint char *logfsserverstat(LogfsServer *s, u32int fid, uchar *buf, u32int bufsize, ushort *count); char *logfsserverwalk(LogfsServer *s, u32int fid, u32int newfid, ushort nwname, char **wname, ushort *nwqid, Qid *wqid); char *logfsserverwrite(LogfsServer *server, u32int fid, u32int offset, u32int count, uchar *buf, u32int *rcount); char *logfsserverwstat(LogfsServer *server, u32int fid, uchar *stat, ushort nstat); void logfsserverfree(LogfsServer **sp); char *logfold_contrib//root/sys/src/cmd/limbo/include/memlayer.h���������������������������������������������� 664 � 0 � 0 � 3443 7732341364 22132�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/libmemlayer" typedef struct Memscreen Memscreen; typedef void (*Refreshfn)(Memimage*, Rectangle, void*); struct Memscreen { Memimage *frontmost; /* frontmost layer on screen */ Memimage *rearmost; /* rearmost layer on screen */ Memimage *image; /* upon which all layers are drawn */ Memimage *fill; /* if non-zero, picture to use when repainting */ }; struct Memlayer { Rectangle screenr; /* true position of layer on screen */ Point delta; /* add delta to go from image coords to screen */ Memscreen *screen; /* screen this layer belongs to */ Memimage *front; /* window in front of this one */ Memimage *rear; /* window behind this one*/ int clear; /* layer is fully visible */ Memimage *save; /* save area for obscured parts */ Refreshfn refreshfn; /* function to call to refresh obscured parts if save==nil */ void *refreshptr; /* argument to refreshfn */ }; /* * These functions accept local coordinates */ int memload(Memimage*, Rectangle, uchar*, int, int); int memunload(Memimage*, Rectangle, uchar*, int); /* * All these functions accept screen coordinates, not local ones. */ void _memlayerop(void (*fn)(Memimage*, Rectangle, Rectangle, void*, int), Memimage*, Rectangle, Rectangle, void*); Memimage* memlalloc(Memscreen*, Rectangle, Refreshfn, void*, ulong); void memldelete(Memimage*); void memlfree(Memimage*); void memltofront(Memimage*); void memltofrontn(Memimage**, int); void _memltofrontfill(Memimage*, int); void memltorear(Memimage*); void memltorearn(Memimage**, int); int memlsetrefresh(Memimage*, Refreshfn, void*); void memlhide(Memimage*, Rectangle); void memlexpose(Memimage*, Rectangle); void _memlsetclear(Memscreen*); int memlorigin(Memimage*, Point, Point); void memlnorefresh(Memimage*, Rectangle, void*); le); extern double erf(double); extern double erfc(double); extern double __ieee754_exp(double); extern double expm1(double); extern double fabs(double); extern int finite(double); extern double floor(double); extern doubold_contrib//root/sys/src/cmd/limbo/include/mp.h���������������������������������������������������� 664 � 0 � 0 � 11360 10234227502 20754�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/src/libmp" #define _MPINT 1 /* the code assumes mpdigit to be at least an int */ /* mpdigit must be an atomic type. mpdigit is defined */ /* in the architecture specific u.h */ typedef struct mpint mpint; struct mpint { int sign; /* +1 or -1 */ int size; /* allocated digits */ int top; /* significant digits */ mpdigit *p; char flags; }; enum { MPstatic= 0x01, Dbytes= sizeof(mpdigit), /* bytes per digit */ Dbits= Dbytes*8 /* bits per digit */ }; /* allocation */ void mpsetminbits(int n); /* newly created mpint's get at least n bits */ mpint* mpnew(int n); /* create a new mpint with at least n bits */ void mpfree(mpint *b); void mpbits(mpint *b, int n); /* ensure that b has at least n bits */ void mpnorm(mpint *b); /* dump leading zeros */ mpint* mpcopy(mpint *b); void mpassign(mpint *old, mpint *new); /* random bits */ mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b); /* conversion */ mpint* strtomp(char*, char**, int, mpint*); /* ascii */ int mpfmt(Fmt*); char* mptoa(mpint*, int, char*, int); mpint* letomp(uchar*, uint, mpint*); /* byte array, little-endian */ int mptole(mpint*, uchar*, uint, uchar**); mpint* betomp(uchar*, uint, mpint*); /* byte array, little-endian */ int mptobe(mpint*, uchar*, uint, uchar**); uint mptoui(mpint*); /* unsigned int */ mpint* uitomp(uint, mpint*); int mptoi(mpint*); /* int */ mpint* itomp(int, mpint*); uvlong mptouv(mpint*); /* unsigned vlong */ mpint* uvtomp(uvlong, mpint*); vlong mptov(mpint*); /* vlong */ mpint* vtomp(vlong, mpint*); /* divide 2 digits by one */ void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient); /* in the following, the result mpint may be */ /* the same as one of the inputs. */ void mpadd(mpint *b1, mpint *b2, mpint *sum); /* sum = b1+b2 */ void mpsub(mpint *b1, mpint *b2, mpint *diff); /* diff = b1-b2 */ void mpleft(mpint *b, int shift, mpint *res); /* res = b<<shift */ void mpright(mpint *b, int shift, mpint *res); /* res = b>>shift */ void mpmul(mpint *b1, mpint *b2, mpint *prod); /* prod = b1*b2 */ void mpexp(mpint *b, mpint *e, mpint *m, mpint *res); /* res = b**e mod m */ void mpmod(mpint *b, mpint *m, mpint *remainder); /* remainder = b mod m */ /* quotient = dividend/divisor, remainder = dividend % divisor */ void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder); /* return neg, 0, pos as b1-b2 is neg, 0, pos */ int mpcmp(mpint *b1, mpint *b2); /* extended gcd return d, x, and y, s.t. d = gcd(a,b) and ax+by = d */ void mpextendedgcd(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y); /* res = b**-1 mod m */ void mpinvert(mpint *b, mpint *m, mpint *res); /* bit counting */ int mpsignif(mpint*); /* number of sigificant bits in mantissa */ int mplowbits0(mpint*); /* k, where n = 2**k * q for odd q */ /* well known constants */ extern mpint *mpzero, *mpone, *mptwo; /* sum[0:alen] = a[0:alen-1] + b[0:blen-1] */ /* prereq: alen >= blen, sum has room for alen+1 digits */ void mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum); /* diff[0:alen-1] = a[0:alen-1] - b[0:blen-1] */ /* prereq: alen >= blen, diff has room for alen digits */ void mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff); /* p[0:n] += m * b[0:n-1] */ /* prereq: p has room for n+1 digits */ void mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p); /* p[0:n] -= m * b[0:n-1] */ /* prereq: p has room for n+1 digits */ int mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p); /* p[0:alen*blen-1] = a[0:alen-1] * b[0:blen-1] */ /* prereq: alen >= blen, p has room for m*n digits */ void mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p); /* sign of a - b or zero if the same */ int mpveccmp(mpdigit *a, int alen, mpdigit *b, int blen); /* divide the 2 digit dividend by the one digit divisor and stick in quotient */ /* we assume that the result is one digit - overflow is all 1's */ void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient); /* playing with magnitudes */ int mpmagcmp(mpint *b1, mpint *b2); void mpmagadd(mpint *b1, mpint *b2, mpint *sum); /* sum = b1+b2 */ void mpmagsub(mpint *b1, mpint *b2, mpint *sum); /* sum = b1+b2 */ /* chinese remainder theorem */ typedef struct CRTpre CRTpre; /* precomputed values for converting */ /* twixt residues and mpint */ typedef struct CRTres CRTres; /* residue form of an mpint */ struct CRTres { int n; /* number of residues */ mpint *r[1]; /* residues */ }; CRTpre* crtpre(int, mpint**); /* precompute conversion values */ CRTres* crtin(CRTpre*, mpint*); /* convert mpint to residues */ void crtout(CRTpre*, CRTres*, mpint*); /* convert residues to mpint */ void crtprefree(CRTpre*); void crtresfree(CRTres*); #pragma varargck type "B" mpint* #pragma varargck type "U" mpint* typedef mpint *BigInt; e*, Point, int); extern void memfillpoly(Memimage*, Point*, int, int, Memimage*, Point, int); extern void _memfillpolysc(Memimage*, Point*, int, int, Memimage*, Point, int, int, int, int); extern void memimagedraw(Memimage*, Rectangle, Memimage*, Point, Memimage*, Point, old_contrib//root/sys/src/cmd/limbo/include/nandecc.h����������������������������������������������� 664 � 0 � 0 � 444 7732341364 21670�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/libnandfs" typedef enum NandEccError { NandEccErrorBad, NandEccErrorGood, NandEccErrorOneBit, NandEccErrorOneBitInEcc, } NandEccError; ulong nandecc(uchar buf[256]); NandEccError nandecccorrect(uchar buf[256], ulong calcecc, ulong *storedecc, int reportbad); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/nandfs.h������������������������������������������������ 664 � 0 � 0 � 7026 7732341364 21571�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/libnandfs" enum { NandfsL2PageSize = 9, NandfsPageSize = 1 << NandfsL2PageSize, NandfsAuxiliarySize = 16, NandfsFullSize = NandfsPageSize + NandfsAuxiliarySize, NandfsPathBits = 26, NandfsPathMask = ((1 << NandfsPathBits) - 1), NandfsNeraseBits = 18, NandfsNeraseMask = ((1 << NandfsNeraseBits) - 1), }; typedef struct Nandfs Nandfs; typedef struct NandfsTags { ulong path; // 26 bits ulong nerase; // 18 bits uchar tag; // 8 bits uchar magic; // 8 bits } NandfsTags; char *nandfsinit(void *magic, long rawsize, long rawblocksize, char *(*read)(void *magic, void *buf, long nbytes, ulong offset), char *(*write)(void *magic, void *buf, long nbytes, ulong offset), char *(*erase)(void *magic, long blockaddr), char *(*sync)(void *magic), LogfsLowLevel **llp); void nandfsfree(Nandfs *nandfs); char *nandfsreadpageauxiliary(Nandfs *nandfs, NandfsTags *tags, long block, int page, int correct, LogfsLowLevelReadResult *result); void nandfssetmagic(Nandfs *nandfs, void *magic); char *nandfswritepageauxiliary(Nandfs *nandfs, NandfsTags *tags, long absblock, int page); char *nandfsreadpage(Nandfs *nandfs, void *buf, NandfsTags *tags, long block, int page, int reportbad, LogfsLowLevelReadResult *result); char *nandfsreadpagerange(Nandfs *nandfs, void *buf, long block, int page, int offset, int count, LogfsLowLevelReadResult *result); char *nandfsupdatepage(Nandfs *nandfs, void *buf, ulong path, uchar tag, long block, int page); long nandfsgetnerase(Nandfs *nandfs, long block); void nandfssetnerase(Nandfs *nandfs, long block, ulong nerase); void nandfssetpartial(Nandfs *nandfs, long block, int partial); char *nandfsmarkabsblockbad(Nandfs *nandfs, long absblock); /* low level interface functions */ char *nandfsopen(Nandfs *nandfs, long base, long limit, int trace, int xcount, long *data); short nandfsgettag(Nandfs *nandfs, long block); void nandfssettag(Nandfs *nandfs, long block, short tag); long nandfsgetpath(Nandfs *nandfs, long block); void nandfssetpath(Nandfs *nandfs, long block, ulong path); int nandfsgetblockpartialformatstatus(Nandfs *nandfs, long block); long nandfsfindfreeblock(Nandfs *nandfs, long *freeblocksp); char *nandfsreadblock(Nandfs *nandfs, void *buf, long block, LogfsLowLevelReadResult *blocke); char *nandfswriteblock(Nandfs *nandfs, void *buf, uchar tag, ulong path, int xcount, long *data, long block); char *nandfswritepage(Nandfs *nandfs, void *buf, long block, int page); char *nandfseraseblock(Nandfs *nandfs, long block, void **llsavep, int *markedbad); char *nandfsformatblock(Nandfs *nandfs, long block, uchar tag, ulong path, long baseblock, long sizeinblocks, int xcount, long *xdata, void *llsave, int *markedbad); char *nandfsreformatblock(Nandfs *nandfs, long block, uchar tag, ulong path, int xcount, long *xdata, void *llsave, int *markedbad); char *nandfsmarkblockbad(Nandfs *nandfs, long block); int nandfsgetpagesize(Nandfs *nandfs); int nandfsgetpagesperblock(Nandfs *nandfs); long nandfsgetblocks(Nandfs *nandfs); long nandfsgetbaseblock(Nandfs *nandfs); int nandfsgetblocksize(Nandfs *nandfs); ulong nandfscalcrawaddress(Nandfs *nandfs, long pblock, int dataoffset); char *nandfsgetblockstatus(Nandfs *nandfs, long block, int *magicfound, void **llsave, LogfsLowLevelReadResult *result); int nandfscalcformat(Nandfs *nandfs, long base, long limit, long bootsize, long *baseblock, long *limitblock, long *bootblocks); int nandfsgetopenstatus(Nandfs *nandfs); char *nandfssync(Nandfs *nandfs); /* defined in environment */ void *nandfsrealloc(void *p, ulong size); void nandfsfreemem(void *p); rno/src/libmp" #define _MPINT 1 /* the code assumes mpdigit to be at least an int */ /* mpdigit must be an atomic type. mpdigit is defined */ /* in the architecture specific u.h */ typedef struct mpint mpint; struct mpint { int sign; /* +1 or -1 */ int size; /* allocated digits */ int top; /* significant digits */ mpdigit *p; char flags; }; enum { MPstatic= 0x01, Dbytes= sizeof(mpdigit), /* bytes per digit */ Dbits= Dbytes*8 /* bits per digit */ }; /* allocation */ voold_contrib//root/sys/src/cmd/limbo/include/pool.h�������������������������������������������������� 664 � 0 � 0 � 3343 7737016457 21276�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Inferno tree allocator */ typedef struct Pool Pool; typedef struct Bhdr Bhdr; typedef struct Btail Btail; #pragma incomplete Pool enum { MAGIC_A = 0xa110c, /* Allocated block */ MAGIC_F = 0xbadc0c0a, /* Free block */ MAGIC_E = 0xdeadbabe, /* End of arena */ MAGIC_I = 0xabba /* Block is immutable (hidden from gc) */ }; struct Bhdr { ulong magic; ulong size; union { uchar data[1]; struct { Bhdr* bhl; Bhdr* bhr; Bhdr* bhp; Bhdr* bhv; Bhdr* bhf; } s; #define clink u.l.link #define csize u.l.size struct { Bhdr* link; int size; } l; } u; }; struct Btail { /* ulong pad; */ Bhdr* hdr; }; #define B2D(bp) ((void*)bp->u.data) #define D2B(b, dp) b = ((Bhdr*)(((uchar*)dp)-(((Bhdr*)0)->u.data))); \ if(b->magic != MAGIC_A && b->magic != MAGIC_I)\ poolfault(dp, "alloc:D2B", getcallerpc(&dp)); #define B2NB(b) ((Bhdr*)((uchar*)b + b->size)) #define B2PT(b) ((Btail*)((uchar*)b - sizeof(Btail))) #define B2T(b) ((Btail*)(((uchar*)b)+b->size-sizeof(Btail))) #define B2LIMIT(b) ((Bhdr*)((uchar*)b + b->csize)) #define BHDRSIZE ((int)(((Bhdr*)0)->u.data)+sizeof(Btail)) extern void (*poolfault)(void *, char *, ulong); extern void poolinit(void); extern void* poolalloc(Pool*, ulong); extern void poolfree(Pool*, void*); extern Bhdr* poolchain(Pool*); extern int poolcompact(Pool*); extern void poolimmutable(void*); extern ulong poolmsize(Pool*, void*); extern void poolmutable(void*); extern char* poolname(Pool*); extern int poolread(char*, int, ulong); extern void* poolrealloc(Pool*, void*, ulong); extern int poolsetsize(char*, int); extern void poolsetcompact(Pool*, void (*)(void*, void*)); extern char* poolaudit(char*(*)(int, Bhdr *)); extern void (*poolmonitor)(int, ulong, Bhdr*, ulong); * k, where n = 2**k * q for odd q */ /* well known constants */ extern mpint *mpzero, *mpone, *mptwo; /* sum[0:alen] = a[0:alen-1] + b[0:blen-1] */ /* prereq: alen >= blen, sum has room for alen+1 digits */ void mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum); /*old_contrib//root/sys/src/cmd/limbo/include/pooldefs.h���������������������������������������������� 664 � 0 � 0 � 170 7732341364 22104�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define left u.s.bhl #define right u.s.bhr #define fwd u.s.bhf #define prev u.s.bhv #define parent u.s.bhp ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/prefab.h������������������������������������������������ 664 � 0 � 0 � 5622 7732341364 21557�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/libprefab" typedef struct PElement PElement; typedef struct PCompound PCompound; typedef struct Memimage Memimage; enum { Dirty, Clean }; enum Elementtype /* same as in prefab.m */ { EIcon, EText, ETitle, EHorizontal, EVertical, ESeparator, NEtypes }; enum Adjust /* same as in prefab.m */ { /* first arg: size of elements */ Adjpack = 10, /* leave alone, pack tightly */ Adjequal = 11, /* make equal */ Adjfill = 12, /* make equal, filling available space */ /* second arg: position of element within space */ Adjleft = 20, Adjup = 20, Adjcenter = 21, Adjright = 22, Adjdown = 22 }; enum { Maxchars = 128 /* maximum # chars in a word */ }; struct PElement { Prefab_Element e; Point drawpt; Prefab_Compound*highlight; List* first; List* last; List* vfirst; List* vlast; int nkids; int newline; int pkind; /* for error check against e.kind */ }; struct PCompound { Prefab_Compound c; Display* display; }; extern Type* TLayout; extern Type* TElement; extern Type* TCompound; PCompound* iconbox(Prefab_Environ*, Draw_Point, String*, Draw_Image*, Draw_Image*); PCompound* textbox(Prefab_Environ*, Draw_Rect, String*, String*); PCompound* layoutbox(Prefab_Environ*, Draw_Rect, String*, List*); PCompound* box(Prefab_Environ*, Draw_Point, Prefab_Element*, Prefab_Element*); PElement* separatorelement(Prefab_Environ*, Draw_Rect, Draw_Image*, Draw_Image*); PElement* iconelement(Prefab_Environ*, Draw_Rect, Draw_Image*, Draw_Image*); PElement* textelement(Prefab_Environ*, String*, Draw_Rect, enum Elementtype); PElement* layoutelement(Prefab_Environ*, List*, Draw_Rect, enum Elementtype); PElement* elistelement(Prefab_Environ*, Prefab_Element*, enum Elementtype); PElement* appendelist(Prefab_Element*, Prefab_Element*); void drawcompound(Prefab_Compound*); void redrawcompound(Image*, Rectangle, Prefab_Compound*); void refreshcompound(Image*, Rectangle, void*); void drawelement(Prefab_Element*, Image*, Rectangle, int, int); void translateelement(Prefab_Element*, Point); void adjustelement(Prefab_Element*, int, int); void highlightelement(Prefab_Element*, Image*, Prefab_Compound*, int); void clipelement(Prefab_Element*, Rectangle); void scrollelement(Prefab_Element*, Point, int*); int showelement(Prefab_Element*, Prefab_Element*); void edge(Prefab_Environ*, Image*, Draw_Rect, Draw_Rect); int fitrect(Rectangle*, Rectangle); Draw_Rect edgerect(Prefab_Environ*, Draw_Point, Draw_Rect*); List* prefabwrap(void*); List* listoflayout(Prefab_Style*, String*, int); extern PElement* lookupelement(Prefab_Element*); extern PCompound* lookupcompound(Prefab_Compound*); extern PElement* checkelement(Prefab_Element*); extern PCompound* checkcompound(Prefab_Compound*); extern int badenviron(Prefab_Environ*, int); extern PElement* mkelement(Prefab_Environ*, enum Elementtype); extern Point iconsize(Image*); extern void localrefreshcompound(Memimage*, Rectangle, void*); , int page, int correct, LogfsLowLevelReadResult *result); void nandfssetmagic(Nandfs *nandfs, void *magic); cold_contrib//root/sys/src/cmd/limbo/include/raise.h������������������������������������������������� 664 � 0 � 0 � 2235 7732341364 21420�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Exceptions thrown by the interpreter */ extern char exAlt[]; /* alt send/recv on same chan */ extern char exBusy[]; /* channel busy */ extern char exModule[]; /* module not loaded */ extern char exCompile[]; /* compile failed */ extern char exCrange[]; /* constant range */ extern char exCctovflw[]; /* constant table overflow */ extern char exCphase[]; /* compiler phase error */ extern char exType[]; /* type not constructed correctly */ extern char exZdiv[]; /* zero divide */ extern char exHeap[]; /* out of memory: heap */ extern char exImage[]; /* out of memory: image */ extern char exItype[]; /* inconsistent type */ extern char exMathia[]; /* invalid math argument */ extern char exBounds[]; /* array bounds error */ extern char exNegsize[]; /* negative array size */ extern char exNomem[]; /* out of memory: main */ extern char exSpawn[]; /* spawn a builtin module */ extern char exOp[]; /* illegal dis instruction */ extern char exTcheck[]; /* type check */ extern char exInval[]; /* invalid argument */ extern char exNilref[]; /* dereference of nil */ extern char exRange[]; /* value out of range */ extern char exLoadedmod[]; /* need newmod */ char *nandfsreformatblock(Nandfs *nandfs, long block, uchar tag, ulong path, int xcount, long *xdata, void *llsave, int *markedbad); char *nandfsmarkblockbad(Nandfs *nandfs, long block); int nandfsgetpagesize(Nandfs *nandfs); int nandfsgetpagesperblock(Nandfs *nandfs); long nandfsgetblocks(Nandfs *nandfs); long nandfsgetbaseblock(Nandfs *nandfs); int nold_contrib//root/sys/src/cmd/limbo/include/rdbg.h�������������������������������������������������� 664 � 0 � 0 � 601 10047743257 21226�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Remote kernel debug protocol */ enum { Terr='0', /* not sent */ Rerr, Tmget, Rmget, Tmput, Rmput, Tspid, /* obsolete */ Rspid, /* obsolete */ Tproc, Rproc, Tstatus, Rstatus, Trnote, Rrnote, Tstartstop, Rstartstop, Twaitstop, Rwaitstop, Tstart, Rstart, Tstop, Rstop, Tkill, Rkill, Tcondbreak, Rcondbreak, RDBMSGLEN = 10 /* tag byte, 9 data bytes */ }; �������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/styx.h�������������������������������������������������� 664 � 0 � 0 � 6204 7732341364 21324�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#pragma src "/usr/inferno/lib9" #pragma lib "libc.a" #define VERSION9P "9P2000" #define MAXWELEM 16 typedef struct Fcall { uchar type; u32int fid; ushort tag; /* union { */ /* struct { */ u32int msize; /* Tversion, Rversion */ char *version; /* Tversion, Rversion */ /* }; */ /* struct { */ ushort oldtag; /* Tflush */ /* }; */ /* struct { */ char *ename; /* Rerror */ /* }; */ /* struct { */ Qid qid; /* Rattach, Ropen, Rcreate */ u32int iounit; /* Ropen, Rcreate */ /* }; */ /* struct { */ Qid aqid; /* Rauth */ /* }; */ /* struct { */ u32int afid; /* Tauth, Tattach */ char *uname; /* Tauth, Tattach */ char *aname; /* Tauth, Tattach */ /* }; */ /* struct { */ u32int perm; /* Tcreate */ char *name; /* Tcreate */ uchar mode; /* Tcreate, Topen */ /* }; */ /* struct { */ u32int newfid; /* Twalk */ ushort nwname; /* Twalk */ char *wname[MAXWELEM]; /* Twalk */ /* }; */ /* struct { */ ushort nwqid; /* Rwalk */ Qid wqid[MAXWELEM]; /* Rwalk */ /* }; */ /* struct { */ vlong offset; /* Tread, Twrite */ u32int count; /* Tread, Twrite, Rread */ char *data; /* Twrite, Rread */ /* }; */ /* struct { */ ushort nstat; /* Twstat, Rstat */ uchar *stat; /* Twstat, Rstat */ /* }; */ /* }; */ } Fcall; #define GBIT8(p) ((p)[0]) #define GBIT16(p) ((p)[0]|((p)[1]<<8)) #define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) #define GBIT64(p) ((vlong)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32)) #define PBIT8(p,v) (p)[0]=(v) #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8 #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 #define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\ (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56 #define BIT8SZ 1 #define BIT16SZ 2 #define BIT32SZ 4 #define BIT64SZ 8 #define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ) /* STATFIXLEN includes leading 16-bit count */ /* The count, however, excludes itself; total size is BIT16SZ+count */ #define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */ #define NOTAG (ushort)~0U /* Dummy tag */ #define NOFID (u32int)~0U /* Dummy fid */ #define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */ enum { Tversion = 100, Rversion, Tauth = 102, Rauth, Tattach = 104, Rattach, Terror = 106, /* illegal */ Rerror, Tflush = 108, Rflush, Twalk = 110, Rwalk, Topen = 112, Ropen, Tcreate = 114, Rcreate, Tread = 116, Rread, Twrite = 118, Rwrite, Tclunk = 120, Rclunk, Tremove = 122, Rremove, Tstat = 124, Rstat, Twstat = 126, Rwstat, Tmax, }; uint convM2S(uchar*, uint, Fcall*); uint convS2M(Fcall*, uchar*, uint); uint sizeS2M(Fcall*); int statcheck(uchar *abuf, uint nbuf); uint convM2D(uchar*, uint, Dir*, char*); uint convD2M(Dir*, uchar*, uint); uint sizeD2M(Dir*); int fcallfmt(Fmt*); int dirfmt(Fmt*); int dirmodefmt(Fmt*); int read9pmsg(int, void*, uint); #pragma varargck type "F" Fcall* #pragma varargck type "M" ulong #pragma varargck type "D" Dir* 622 7732341364 21557�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/tk.h���������������������������������������������������� 664 � 0 � 0 � 51033 10374350624 20766�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Here are some conventions about our Tk widgets. * * When a widget is packed, its act geom record is * set so that act.{x,y} is the vector from the containing * widget's origin to the position of this widget. The position * is the place just outside the top-left border. The origin * is the place just inside the top-left border. * act.{width,height} gives the allocated dimensions inside * the border --- it will be the requested width or height * plus ipad{x,y} plus any filling done by the packer. * * The tkposn function returns the origin of its argument * widget, expressed in absolute screen coordinates. * * The actual drawing contents of the widget should be * drawn at an internal origin that is the widget's origin * plus the ipad vector. */ /* * event printing */ #pragma varargck type "v" int #pragma varargck argpos tkwreq 2 enum { TKframe, /* Widget type */ TKlabel, TKcheckbutton, TKbutton, TKmenubutton, TKmenu, TKseparator, TKcascade, TKlistbox, TKscrollbar, TKtext, TKcanvas, TKentry, TKradiobutton, TKscale, TKpanel, TKchoicebutton, TKwidgets, TKsingle = 0, /* Select mode */ TKbrowse, TKmultiple, TKextended, TKraised, /* Relief */ TKsunken, TKflat, TKgroove, TKridge, TkArepl = 0, /* Bind options */ TkAadd, TkAsub, Tkvertical = 0, /* Scroll bar orientation */ Tkhorizontal, Tkwrapnone = 0, /* Wrap mode */ Tkwrapword, Tkwrapchar, TkDdelivered = 0, /* Event Delivery results */ TkDbreak, TkDnone, TkLt = 0, /* Comparison operators */ TkLte, TkEq, TkGte, TkGt, TkNeq, OPTdist = 0, /* Distance; aux is offset of TkEnv* */ OPTstab, /* String->Constant table; aux is TkStab array */ OPTtext, /* Text string */ OPTwinp, /* Window Path to Tk ptr */ OPTflag, /* Option sets bitmask; aux is TkStab array*/ OPTbmap, /* Option specifies bitmap file */ OPTbool, /* Set to one if option present */ OPTfont, /* Env font */ OPTfrac, /* list of fixed point distances (count in aux) */ OPTnnfrac, /* non-negative fixed point distance */ OPTctag, /* Tag list for canvas item */ OPTtabs, /* Tab stops; aux is offset of TkEnv* */ OPTcolr, /* Colors; aux is index into colour table */ OPTimag, /* Image */ OPTsize, /* width/height; aux is offset of TkEnv* */ OPTnndist, /* Non-negative distance */ OPTact, /* actx or acty */ OPTignore, /* ignore this option */ OPTsticky, /* sticky (any comb. of chars n, s, e, w) */ OPTlist, /* list of text values */ BoolX = 0, BoolT, BoolF, Tkmaxitem = 128, Tkminitem = 32, Tkcvstextins = 1024, Tkmaxdump = 1024, Tkentryins = 128, TkMaxmsgs = 100, Tkshdelta = 0x40, /* color intensity delta for shading */ Tkfpscalar = 10000, /* Fixed point scale factor */ Tkdpi = 100, /* pixels per inch on an average display */ Tksweep = 64, /* binds before a sweep */ TkColcachesize = 128, /* colours cached per context (display) */ TkStatic = 0, TkDynamic = 1, TkRptclick = 100, /* granularity */ TkRptpause = 300, /* autorepeat inital delay */ TkRptinterval = 100, /* autorepeat interval */ TkBlinkinterval = 500 }; #define TKSTRUCTALIGN 4 #define TKI2F(i) ((i)*Tkfpscalar) extern int TKF2I(int); /*#define TKF2I(f) (((f) + Tkfpscalar/2)/Tkfpscalar)*/ #define IAUX(i) ((void*)i) #define AUXI(i) ((int)i) #define TKKEY(i) ((i)&0xFFFF) typedef struct Tk Tk; typedef struct TkCol TkCol; typedef struct TkCtxt TkCtxt; typedef struct TkEnv TkEnv; typedef struct TkName TkName; typedef struct TkTtabstop TkTtabstop; typedef struct TkOptab TkOptab; typedef struct TkOption TkOption; typedef struct TkStab TkStab; typedef struct TkTop TkTop; typedef struct TkGeom TkGeom; typedef struct TkMethod TkMethod; typedef struct TkAction TkAction; typedef struct TkWin TkWin; typedef struct TkCmdtab TkCmdtab; typedef struct TkMouse TkMouse; typedef struct TkVar TkVar; typedef struct TkMsg TkMsg; typedef struct TkEbind TkEbind; typedef struct TkImg TkImg; typedef struct TkPanelimage TkPanelimage; typedef struct TkWinfo TkWinfo; typedef struct TkCursor TkCursor; typedef struct TkGrid TkGrid; typedef struct TkGridbeam TkGridbeam; typedef struct TkGridcell TkGridcell; struct TkImg { TkTop* top; int ref; int type; int w; int h; TkEnv* env; Image* img; TkImg* link; TkName* name; char *cursor; }; struct TkCursor { int def; Point p; Image* bit; TkImg* img; }; struct TkEbind { int event; char* cmd; }; struct TkMsg { TkVar* var; TkMsg* link; char msg[TKSTRUCTALIGN]; }; enum { TkVchan = 1, TkVstring, }; struct TkVar { int type; TkVar* link; void* value; char name[TKSTRUCTALIGN]; }; struct TkPanelimage { void* image; /* really Draw_Image */ int ref; TkPanelimage* link; }; struct TkMouse { int x; int y; int b; }; struct TkCmdtab { char* name; char* (*fn)(Tk*, char*, char**); }; struct TkWinfo { Tk* w; Rectangle r; }; struct TkAction { int event; int type; char* arg; TkAction* link; }; struct TkStab { char* val; int con; }; struct TkOption { char* o; int type; int offset; void* aux; }; struct TkOptab { void* ptr; TkOption* optab; }; enum { /* Widget Control Bits */ Tktop = (1<<0), Tkbottom = (1<<1), Tkleft = (1<<2), Tkright = (1<<3), Tkside = Tktop|Tkbottom|Tkleft|Tkright, Tkfillx = (1<<4), Tkfilly = (1<<5), Tkfill = Tkfillx|Tkfilly, Tkexpand = (1<<6), Tkrefresh = (1<<7), Tknoprop = (1<<8), Tkbaseline = (1<<10), Tknumeric = (1<<11), Tknorth = (1<<10), Tkeast = (1<<11), Tksouth = (1<<12), Tkwest = (1<<13), Tkcenter = 0, Tkanchor = Tknorth|Tkeast|Tksouth|Tkwest, Tksuspended = (1<<14), /* window suspended pending resize */ Tkgridpack = (1<<17), /* temporary flag marking addition to grid */ Tkgridremove = (1<<18), /* marked for removal from grid */ Tktakefocus = (1<<19), Tktransparent = (1<<20), /* Doesn't entirely obscure its background */ Tkwindow = (1<<21), /* Top level window */ Tkactive = (1<<22), /* Pointer is over active object */ Tkactivated = (1<<23), /* Button pressed etc.. */ Tkdisabled = (1<<24), /* Button is not accepting events */ Tkmapped = (1<<25), /* Mapped onto display */ Tknograb = (1<<26), Tkdestroy = (1<<27), /* Marked for death */ Tksetwidth = (1<<28), Tksetheight = (1<<29), Tksubsub = (1<<30), Tkswept = (1<<31), /* Supported Event Types */ /* * Bits 0-15 are keyboard characters * but duplicated by other events, as we can distinguish * key events from others with the TkKey bit. * N.B. make sure that this distinction *is* made; * i.e. * if (event & TkButton1P) * is no longer sufficient to test for button1 down. * * if (!(event & TkKey) && (event & TkButton1P)) * would be better. */ TkButton1P = (1<<0), TkButton1R = (1<<1), TkButton2P = (1<<2), TkButton2R = (1<<3), TkButton3P = (1<<4), TkButton3R = (1<<5), TkButton4P = (1<<6), TkButton4R = (1<<7), TkButton5P = (1<<8), TkButton5R = (1<<9), TkButton6P = (1<<10), TkButton6R = (1<<11), /* * 12-15 reserved for more buttons. */ TkExtn1 = (1<<16), TkExtn2 = (1<<17), TkTakefocus = (1<<18), /* * 19-20 currently free */ TkDestroy = (1<< 21), TkEnter = (1<<22), TkLeave = (1<<23), TkMotion = (1<<24), TkMap = (1<<25), TkUnmap = (1<<26), TkKey = (1<<27), TkFocusin = (1<<28), TkFocusout = (1<<29), TkConfigure = (1<<30), TkDouble = (1<<31), TkEmouse = TkButton1P|TkButton1R|TkButton2P|TkButton2R| TkButton3P|TkButton3R| TkButton4P|TkButton4R| TkButton5P|TkButton5R| TkButton6P|TkButton6R|TkMotion, TkEpress = TkButton1P|TkButton2P|TkButton3P| TkButton4P|TkButton5P|TkButton6P, TkErelease = TkButton1R|TkButton2R|TkButton3R| TkButton4R|TkButton5R|TkButton6R, TkExtns = TkExtn1|TkExtn2, TkAllEvents = ~0, TkCforegnd = 0, TkCbackgnd, /* group of 3 */ TkCbackgndlght, TkCbackgnddark, TkCselect, TkCselectbgnd, /* group of 3 */ TkCselectbgndlght, TkCselectbgnddark, TkCselectfgnd, TkCactivebgnd, /* group of 3 */ TkCactivebgndlght, TkCactivebgnddark, TkCactivefgnd, TkCdisablefgnd, TkChighlightfgnd, TkCfill, TkCtransparent, TkNcolor, TkSameshade = 0, /* relative shade for tkgshade() and tkrgbashade()*/ TkLightshade, TkDarkshade }; struct TkEnv { int ref; TkTop* top; /* Owner */ ulong set; ulong colors[TkNcolor]; /* OPTcolr */ Font* font; /* Font description */ int wzero; /* Width of "0" in pixel */ }; struct TkGeom { int x; int y; int width; int height; }; struct TkGridbeam { int equalise; int minsize; int maxsize; int weight; int pad; int act; char* name; }; struct TkGridcell { Tk* tk; Point span; }; struct TkGrid { TkGridcell** cells; /* 2D array of cells, y major, x minor */ Point dim; /* dimensions of table */ TkGridbeam* rows; TkGridbeam* cols; Point origin; /* top left point grid was rendered at */ }; struct Tk { int type; /* Widget type */ TkName* name; /* Hierarchy name */ Tk* siblings; /* Link to descendents */ Tk* master; /* Pack owner */ Tk* slave; /* Packer slaves */ Tk* next; /* Link for packer slaves */ Tk* parent; /* Window is sub of canvas or text */ Tk* depth; /* Window depth when mapped */ void (*geom)(Tk*, int, int, int, int); /* Geometry change notify function */ void (*destroyed)(Tk*); /* Destroy notify function */ int flag; /* Misc flags. */ TkEnv* env; /* Colors & fonts */ TkAction* binds; /* Binding of current events */ TkGeom req; /* Requested size and position */ TkGeom act; /* Actual size and position */ int relief; /* 3D border type */ int borderwidth; /* 3D border size */ int highlightwidth; Point pad; /* outside frame padding */ Point ipad; /* inside frame padding */ Rectangle dirty; /* dirty rectangle, relative to widget */ TkGrid* grid; /* children are packed in a grid */ // char obj[TKSTRUCTALIGN]; }; struct TkWin { Image* image; Tk* next; Point act; Point req; void* di; /* !=H if it's been set externally */ int changed; /* requested rect has changed since request sent */ int reqid; /* id of request most recently sent out; replies to earlier requests are ignored */ /* menu specific members */ Tk* slave; char* postcmd; char* cascade; int freeonunmap; char *cbname; /* name of choicebutton that posted this */ Point delta; int speed; int waiting; }; struct TkMethod { char* name; TkCmdtab* cmd; void (*free)(Tk*); char* (*draw)(Tk*, Point); void (*geom)(Tk*); void (*getimgs)(Tk*, Image**, Image**); void (*focusorder)(Tk*); /* add any focusable descendants to the focus order */ void (*dirtychild)(Tk*); /* Child notifies parent to redraw */ Point (*relpos)(Tk*); Tk* (*deliver)(Tk*, int, void*); void (*see)(Tk*, Rectangle*, Point*); Tk* (*inwindow)(Tk*, Point*); void (*varchanged)(Tk*, char*, char*); int ncmd; }; struct TkName { TkName* link; void* obj; /* Name for ... */ union { TkAction* binds; }prop; /* Properties for ... */ int ref; char name[TKSTRUCTALIGN]; }; struct TkTtabstop { int pos; int justify; TkTtabstop* next; }; struct TkCol { ulong rgba; Image* i; TkCol* forw; }; struct TkCtxt { void* lock; Display* display; int ncol; TkCol* chead; TkCol* ctail; Image* i; /* temporary image for drawing buttons, etc */ Image* ia; /* as above, but with an alpha channel */ Tk* tkkeygrab; int focused; Tk* mfocus; Tk* mgrab; Tk* entered; TkMouse mstate; Tk* tkmenu; void* extn; }; struct TkTop { void* dd; /* really Draw_Display */ void* wreq; /* really chan of string */ void* di; /* really Draw_Image* */ void* wmctxt; /* really Draw_Wmcontext */ Rectangle screenr; /* XXX sleazy equiv to Draw_Rect, but what else? */ /* Private from here on */ TkCtxt* ctxt; Display* display; Tk* root; /* list of all objects, linked by siblings; first object is "." */ Tk* windows; Tk** focusorder; int nfocus; TkEnv* env; TkTop* link; TkVar* vars; TkImg* imgs; TkPanelimage* panelimages; TkAction* binds[TKwidgets]; int debug; int execdepth; char focused; char dirty; char noupdate; char* err; char errcmd[32]; char errx[32]; }; #define TKobj(t, p) ((t*)((p)+1)) //#define TKobj(t, p) ((t*)(p->obj)) #define OPTION(p, t, o) (*(t*)((char*)p + o)) /* Command entry points */ extern char* tkbind(TkTop*, char*, char**); extern char* tkbutton(TkTop*, char*, char**); extern char* tkcanvas(TkTop*, char*, char**); extern char* tkcheckbutton(TkTop*, char*, char**); extern char* tkchoicebutton(TkTop*, char*, char**); extern char* tkcursorcmd(TkTop*, char*, char**); extern char* tkdestroy(TkTop*, char*, char**); extern char* tkentry(TkTop*, char*, char**); extern char* tkfocus(TkTop*, char*, char**); extern char* tkframe(TkTop*, char*, char**); extern char* tkgrab(TkTop*, char*, char**); extern char* tkgrid(TkTop*, char*, char**); extern char* tkimage(TkTop*, char*, char**); extern char* tklabel(TkTop*, char*, char**); extern char* tklistbox(TkTop*, char*, char**); extern char* tklower(TkTop*, char*, char**); extern char* tkmenu(TkTop*, char*, char**); extern char* tkmenubutton(TkTop*, char*, char**); extern char* tkpack(TkTop*, char*, char**); extern char* tkpanel(TkTop*, char*, char**); extern char* tkputs(TkTop*, char*, char**); extern char* tkradiobutton(TkTop*, char*, char**); extern char* tkraise(TkTop*, char*, char**); extern char* tkscale(TkTop*, char*, char**); extern char* tkscrollbar(TkTop*, char*, char**); extern char* tksend(TkTop*, char*, char**); extern char* tktext(TkTop*, char*, char**); extern char* tkupdatecmd(TkTop*, char*, char**); extern char* tkvariable(TkTop*, char*, char**); extern char* tkwinfo(TkTop*, char*, char**); extern TkMethod *tkmethod[]; /* Errors - xdata.c*/ extern char TkNomem[]; extern char TkBadop[]; extern char TkOparg[]; extern char TkBadvl[]; extern char TkBadwp[]; extern char TkNotop[]; extern char TkDupli[]; extern char TkNotpk[]; extern char TkBadcm[]; extern char TkIstop[]; extern char TkBadbm[]; extern char TkBadft[]; extern char TkBadit[]; extern char TkBadtg[]; extern char TkFewpt[]; extern char TkBadsq[]; extern char TkBadix[]; extern char TkNotwm[]; extern char TkWpack[]; extern char TkBadvr[]; extern char TkNotvt[]; extern char TkMovfw[]; extern char TkBadsl[]; extern char TkSyntx[]; extern char TkRecur[]; extern char TkDepth[]; extern char TkNomaster[]; extern char TkNotgrid[]; extern char TkIsgrid[]; extern char TkBadgridcell[]; extern char TkBadspan[]; extern char TkBadcursor[]; /* Option tables - xdata.c */ extern TkStab tkanchor[]; extern TkStab tkbool[]; extern TkStab tkcolortab[]; extern TkStab tkjustify[]; extern TkStab tkorient[]; extern TkStab tkrelief[]; extern TkStab tktabjust[]; extern TkStab tkwrap[]; extern TkOption tkgeneric[]; extern TkOption tktop[]; extern TkOption tktopdbg[]; /* panel.c */ extern void tkgetpanelimage(Tk*, Image**, Image**); extern void tksetpanelimage(Tk *tk, Image*, Image*); /* General - colrs.c */ extern void tksetenvcolours(TkEnv*); /* General - ebind.c */ extern void tkcmdbind(Tk*, int, char*, void*); extern TkCtxt* tkdeldepth(Tk*); extern char* tkdestroy(TkTop*, char*, char**); extern char* tkbindings(TkTop*, Tk*, TkEbind*, int); extern int tkseqparse(char*); extern void tksetkeyfocus(TkTop*, Tk*, int); extern void tksetglobalfocus(TkTop*, int); /* General - image.c */ extern TkImg* tkname2img(TkTop*, char*); extern void tkimgput(TkImg*); extern void tksizeimage(Tk*, TkImg*); extern TkImg* tkauximage(TkTop*, char*, uchar*, int, int, Rectangle, int); /* choicebuttons - menus.c */ extern Tk* tkfindchoicemenu(Tk*); /* General - packr.c */ extern void tkdelpack(Tk*); extern void tkappendpack(Tk*, Tk*, int); extern void tkpackqit(Tk*); extern void tkrunpack(TkTop*); extern void tksetslavereq(Tk*, TkGeom); extern int tkisslave(Tk*, Tk*); /* General - grids.c */ extern int tkgridder(Tk*); extern void tkgriddelslave(Tk*); extern char* tkpropagate(TkTop*, char*); extern void tkfreegrid(TkGrid*); /* General - parse.c */ extern char* tkconflist(TkOptab*, char**); extern char* tkskip(char*, char*); extern char* tkword(TkTop*, char*, char*, char*, int*); extern char* tkxyparse(Tk*, char**, Point*); extern char* tkparse(TkTop*, char*, TkOptab*, TkName**); extern TkName* tkmkname(char*); extern char* tkgencget(TkOptab*, char*, char**, TkTop*); extern char* tkparsecolor(char*, ulong*); /* General - utils.c */ extern Image* tkgc(TkEnv*, int); extern Image* tkgshade(TkEnv*, int, int); extern Image* tkcolor(TkCtxt*, ulong); extern void tkclear(Image*, Rectangle); extern TkEnv* tknewenv(TkTop*); extern TkEnv* tkdefaultenv(TkTop*); extern void tkputenv(TkEnv*); extern TkEnv* tkdupenv(TkEnv**); extern Tk* tknewobj(TkTop*, int, int); extern void tkfreebind(TkAction*); extern void tkfreename(TkName*); extern void tkfreeobj(Tk*); extern char* tkaddchild(TkTop*, Tk*, TkName**); extern Tk* tklook(TkTop*, char*, int); extern void tktextsdraw(Image*, Rectangle, TkEnv*, int); extern void tkbox(Image*, Rectangle, int, Image*); extern void tkbevel(Image*, Point, int, int, int, Image*, Image*); extern void tkdrawrelief(Image*, Tk*, Point, int, int); extern Point tkstringsize(Tk*, char*); extern char* tkdrawstring(Tk*, Image*, Point, char*, int, Image *, int); extern int tkeventfmt(Fmt*); extern Tk* tkdeliver(Tk*, int, void*); extern int tksubdeliver(Tk*, TkAction*, int, void*, int); extern void tkcancel(TkAction**, int); extern char* tkaction(TkAction**, int, int, char*, int); extern char* tkitem(char*, char*); extern int tkismapped(Tk*); extern Point tkposn(Tk*); extern Point tkscrn2local(Tk*, Point); extern int tkvisiblerect(Tk *tk, Rectangle *rr); extern Point tkanchorpoint(Rectangle, Point, int); extern char* tkfrac(char**, int*, TkEnv*); extern char* tkfracword(TkTop*, char**, int*, TkEnv*); extern char* tkfprint(char*, int); extern char* tkvalue(char**, char*, ...); extern void tkdirty(Tk *); extern void tksorttable(void); extern char* tkexec(TkTop*, char*, char**); extern int tkeventfmt(Fmt*); extern void tkerr(TkTop*, char*); extern char* tkerrstr(TkTop*, char*); extern char* tkcursorswitch(TkTop*, Image*, TkImg*); extern void tkcursorset(TkTop*, Point); extern char* tksetmgrab(TkTop*, Tk*); extern int tkinsidepoly(Point*, int, int, Point); extern int tklinehit(Point*, int, int, Point); extern int tkiswordchar(int); extern int tkhaskeyfocus(Tk*); extern Rectangle tkrect(Tk*, int); extern int tkchanhastype(ulong, int); extern int tkhasalpha(TkEnv*, int); extern void tksettransparent(Tk*, int); extern ulong tkrgba(int, int, int, int); extern ulong tkrgbashade(ulong, int); extern void tkrgbavals(ulong, int*, int*, int*, int*); extern void tkrepeat(Tk*, void(*)(Tk*, void*, int), void*, int, int); extern void tkcancelrepeat(Tk*); extern void tkblink(Tk*, void(*)(Tk*, int)); extern void tkblinkreset(Tk*); extern char* tkname(Tk*); /* General - windw.c */ extern TkCtxt* tknewctxt(Display*); extern void tkfreectxt(TkCtxt*); extern void tkfreecolcache(TkCtxt*); extern Image* tkitmp(TkEnv*, Point, int); extern void tkgeomchg(Tk*, TkGeom*, int); extern Tk* tkinwindow(Tk*, Point, int); extern Tk* tkfindfocus(TkTop*, int, int, int); extern char* tkdrawslaves(Tk*, Point, int*); extern char* tkupdate(TkTop*); extern int tkischild(Tk*, Tk*); extern void tksetbits(Tk*, int); extern char* tkmap(Tk*); extern void tkunmap(Tk*); extern void tkmoveresize(Tk*, int, int, int, int); extern int tkupdatewinsize(Tk*); extern void tkmovewin(Tk*, Point); extern Image* tkimageof(Tk*); extern void tktopopt(Tk*, char*); extern void tkdirtyfocusorder(TkTop*); extern void tkbuildfocusorder(TkTop*); extern void tksortfocusorder(TkWinfo*, int); extern void tkappendfocusorder(Tk*); extern void tksee(Tk*, Rectangle, Point); extern char* tkseecmd(TkTop*, char*, char**); /* Style specific extensions - extns.c */ extern int tkextndeliver(Tk*, TkAction*, int, void*); extern void tkextnfreeobj(Tk*); extern int tkextnnewctxt(TkCtxt*); extern void tkextnfreectxt(TkCtxt*); extern char* tkextnparseseq(char*, char*, int*); /* External to libtk */ extern void tkenterleave(TkTop*); extern void tksetwinimage(Tk*, Image*); extern void tkdestroywinimage(Tk*); extern void tkfreevar(TkTop*, char*, int); extern TkVar* tkmkvar(TkTop*, char*, int); extern int tktolimbo(void*, char*); extern void tkwreq(TkTop*, char*, ...); extern void tkdelpanelimage(TkTop*, Image*); extern TkMethod framemethod; extern TkMethod labelmethod; extern TkMethod checkbuttonmethod; extern TkMethod buttonmethod; extern TkMethod menubuttonmethod; extern TkMethod menumethod; extern TkMethod separatormethod; extern TkMethod cascademethod; extern TkMethod listboxmethod; extern TkMethod scrollbarmethod; extern TkMethod textmethod; extern TkMethod canvasmethod; extern TkMethod entrymethod; extern TkMethod radiobuttonmethod; extern TkMethod scalemethod; extern TkMethod panelmethod; extern TkMethod choicebuttonmethod; hanged)(Tk*, char*, char*); int ncmd; }; struct TkName { TkName* link; void* obj; /* Name for ... */ union { TkAction* binds; }prop; /* Properties for ... */ int ref; char name[TKSTRUCTALIGN]; }; struct TkTtabstop { int pos; int justify; TkTtabstop* next; }; struct TkCol { ulong rgba; Image* i; TkCol* forw; }; struct TkCtxt { void* lock; Display* display; int ncol; TkCol* chead; TkCol* ctail; Image* i; /* temporary image for drawing buttons, old_contrib//root/sys/src/cmd/limbo/include/trace.h������������������������������������������������� 664 � 0 � 0 � 1202 10126762305 21415�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������typedef enum Tevent { SAdmit = 0, /* Edf admit */ SRelease, /* Edf release, waiting to be scheduled */ SEdf, /* running under EDF */ SRun, /* running best effort */ SReady, /* runnable but not running */ SSleep, /* blocked */ SYield, /* blocked waiting for release */ SSlice, /* slice exhausted */ SDeadline, /* proc's deadline */ SExpel, /* Edf expel */ SDead, /* proc dies */ SInts, /* Interrupt start */ SInte, /* Interrupt end */ SUser, /* user event */ Nevent, } Tevent; typedef struct Traceevent Traceevent; struct Traceevent { ulong pid; ulong etype; /* Event type */ vlong time; /* time stamp */ }; ern char* tkcheckbutton(TkTop*, char*, char**); extern char* tkchoicebutton(TkTop*, char*, char**); extern char* tkcursorcmd(TkTop*, char*, char**); extern char* tkdestroy(TkTop*, char*, char**); extern char* tkentry(TkTop*, char*, char**); extern char* tkfocus(TkTop*, char*, char**); extern char* tkframe(TkTop*, char*, char**); extern char* tkgrab(TkTop*, char*, char**); extern old_contrib//root/sys/src/cmd/limbo/include/version.h����������������������������������������������� 664 � 0 � 0 � 54 10700555552 21752�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define VERSION "Fourth Edition (20071003)" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/include/vm.h���������������������������������������������������� 664 � 0 � 0 � 322 10166251420 20716�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * All the virtual machine interfaces */ #include "/usr/inferno/include/interp.h" #include "/usr/inferno/include/isa.h" #include "/usr/inferno/libinterp/runt.h" int srvf2c(char*, char*, int, Sys_FileIO*); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/�������������������������������������������������������� 775 � 0 � 0 � 0 11411737773 20161��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/FPcontrol-Inferno.c������������������������������������� 664 � 0 � 0 � 3126 10745502436 23626�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "lib9.h" #include "mathi.h" void FPinit(void) { ulong fcr9 = FPPDBL|FPRNR|FPINVAL|FPZDIV|FPUNFL|FPOVFL; setfcr(fcr9); } ulong getFPstatus(void) { ulong fsr = 0, fsr9 = getfsr(); /* on specific machines, could be table lookup */ if(fsr9&FPAINEX) fsr |= INEX; if(fsr9&FPAOVFL) fsr |= OVFL; if(fsr9&FPAUNFL) fsr |= UNFL; if(fsr9&FPAZDIV) fsr |= ZDIV; if(fsr9&FPAINVAL) fsr |= INVAL; return fsr; } ulong FPstatus(ulong fsr, ulong mask) { ulong fsr9 = 0; ulong old = getFPstatus(); fsr = (fsr&mask) | (old&~mask); if(fsr&INEX) fsr9 |= FPAINEX; if(fsr&OVFL) fsr9 |= FPAOVFL; if(fsr&UNFL) fsr9 |= FPAUNFL; if(fsr&ZDIV) fsr9 |= FPAZDIV; if(fsr&INVAL) fsr9 |= FPAINVAL; setfsr(fsr9); return(old&mask); } ulong getFPcontrol(void) { ulong fcr = 0, fcr9 = getfcr(); switch(fcr9&FPRMASK){ case FPRNR: fcr = RND_NR; break; case FPRNINF: fcr = RND_NINF; break; case FPRPINF: fcr = RND_PINF; break; case FPRZ: fcr = RND_Z; break; } if(fcr9&FPINEX) fcr |= INEX; if(fcr9&FPOVFL) fcr |= OVFL; if(fcr9&FPUNFL) fcr |= UNFL; if(fcr9&FPZDIV) fcr |= ZDIV; if(fcr9&FPINVAL) fcr |= INVAL; return fcr; } ulong FPcontrol(ulong fcr, ulong mask) { ulong fcr9 = FPPDBL; ulong old = getFPcontrol(); fcr = (fcr&mask) | (old&~mask); if(fcr&INEX) fcr9 |= FPINEX; if(fcr&OVFL) fcr9 |= FPOVFL; if(fcr&UNFL) fcr9 |= FPUNFL; if(fcr&ZDIV) fcr9 |= FPZDIV; if(fcr&INVAL) fcr9 |= FPINVAL; switch(fcr&RND_MASK){ case RND_NR: fcr9 |= FPRNR; break; case RND_NINF: fcr9 |= FPRNINF; break; case RND_PINF: fcr9 |= FPRPINF; break; case RND_Z: fcr9 |= FPRZ; break; } setfcr(fcr9); return(old&mask); } char*, int); extern char* tkitem(char*, char*); extern int tkismapped(Tk*); extern Point tkposn(Tk*); extern Point tkscrn2local(Tk*, Point); extern int tkvisiblerect(Tk *tk, Rectangle *rr); extern Point tkanchorpoint(Rectangle, Point, int); extern char* tkfrac(char**, int*, TkEnv*); extern char* tkfracword(TkTop*, char**, int*, TkEnv*); extern char* tkfprint(char*, int); extern char* tkvalue(char**, char*, ...);old_contrib//root/sys/src/cmd/limbo/libmath/FPcontrol-Plan9.c��������������������������������������� 664 � 0 � 0 � 37 10206413401 23130�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "FPcontrol-Inferno.c" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/NOTICE�������������������������������������������������� 664 � 0 � 0 � 3172 10560641716 21063�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This copyright NOTICE applies to all files in this directory and subdirectories, unless another copyright notice appears in a given file or subdirectory. If you take substantial code from this software to use in other programs, you must somehow include with it an appropriate copyright notice that includes the copyright notice and the other notices below. It is fine (and often tidier) to do that in a separate file such as NOTICE, LICENCE or COPYING. Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. me for ... */ union { TkAction* binds; }prop; /* Properties for ... */ int ref; char name[TKSTRUCTALIGN]; }; struct TkTtabstop { int pos; int justify; TkTtabstop* next; }; struct TkCol { ulong rgba; Image* i; TkCol* forw; }; struct TkCtxt { void* lock; Display* display; int ncol; TkCol* chead; TkCol* ctail; Image* i; /* temporary image for drawing buttons, old_contrib//root/sys/src/cmd/limbo/libmath/bin/���������������������������������������������������� 775 � 0 � 0 � 0 11411737761 20726��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/bin/fdlibm-stubs���������������������������������������� 664 � 0 � 0 � 3366 6622405623 23231�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo '#include "real.h"' > real.c for(i in getFPcontrol getFPstatus){ echo 'void' echo 'Real_'$i'(void *fp)' echo '{' echo ' F_Real_'$i' *f;' echo '' echo ' f = fp;' echo '' echo ' *f->ret = '$i'(f->x);' echo '}' echo '' } >> real.c for(i in finite ilogb isnan acos acosh asin asinh atan atanh cbrt ceil cos cosh erf erfc exp expm1 fabs floor j0 j1 log log10 log1p rint sin sinh sqrt tan tanh y0 y1){ echo 'void' echo 'Real_'$i'(void *fp)' echo '{' echo ' F_Real_'$i' *f;' echo '' echo ' f = fp;' echo '' echo ' *f->ret = '$i'(f->x);' echo '}' echo '' } >> real.c for(i in fdim fmax fmin fmod hypot nextafter pow){ echo 'void' echo 'Real_'$i'(void *fp)' echo '{' echo ' F_Real_'$i' *f;' echo '' echo ' f = fp;' echo '' echo ' *f->ret = '$i'(f->x, f->x);' echo '}' echo '' } >> real.c FPcontrol fn(r, mask: int) of int; FPstatus fn(r, mask: int) of int; atan2 fn(y, x: real) of real; copysign fn(x, s: real) of real; jn fn(n: int; x: real) of real; lgamma fn(x: real) of (int,real); modf fn(x: real) of (int,real); pow10 fn(p: int) of real; remainder fn(x, p: real) of real; scalbn fn(x: real; n: int) of real; yn fn(n: int; x: real) of real; dot fn(x, y: array of real) of real; iamax fn(x: array of real) of int; norm1, norm2 fn(x: array of real) of real; gemm fn(transa, transb: byte; m, n, k: int; alpha: real; a: array of real; ai0, aj0, lda: int; b: array of real; bi0, bj0, ldb: int; beta: real; c: array of real; ci0, cj0, ldc: int); for(i in FPcontrol FPstatus atan2 copysign jn lgamma modf pow10 remainder scalbn yn dot iamax norm1, norm2 gemm){ echo 'void' echo 'Real_'$i'(void *fp)' echo '{' echo ' F_Real_'$i' *f;' echo '' echo ' f = fp;' echo '' echo ' *f->ret = '$i'(f->x, f->x);' echo '}' echo '' } >> real.c �����������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/bin/unif_dtoa������������������������������������������� 664 � 0 � 0 � 2305 6622405623 22576�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/rc test -d /netlib/fp || 9fs netlib test -d /n/hati/usr/ehg || 9fs hati echo '/* derived from /netlib/fp/dtoa.c assuming IEEE, Standard C */' > dtoa.c echo '/* kudos to dmg@research.att.com, gripes to ehg@research.att.com */' >> dtoa.c echo '#include "lib9.h"' >> dtoa.c sed 's/^#if defined.IEEE_8087. . defined.IEEE_MC68k.*!= 1/#ifndef IEEE_Arith/ s/^#if defined.IEEE_8087. . defined.IEEE_MC68k.*/#ifdef IEEE_Arith/' \ /netlib/fp/dtoa.c > /n/hati/usr/ehg/xxx.c # undefine __STDC__ because we can't depend on HUGE_VAL rx hati 'unifdef -UIBM -UVAX -UKR_headers -U__cplusplus -U__STDC__ -UDEBUG \ -UBad_float_h -UJust_16 -UInaccurate_Divide -UROUND_BIASED \ -URND_PRODQUOT -DNo_leftright -UCheck_FLT_ROUNDS -D__MATH_H__ \ -DUnsigned_Shifts -DMALLOC=Malloc -DCONST=const \ -DPack_32 -DIEEE_Arith xxx.c | cb -s' > xxx.c sam -d >> dtoa.c >[2] err <<! e xxx.c 1,/include "float\.h"\n/d /The following definition of Storeinc/+-;/^#endif\n/d /^#define IEEE_Arith\n/+-d /When Pack_32 is not defined/+-;/^\n/d ,s/\n\n\n+/\n\n/g ,s/\n\(/(/g ,s/\\\(/\\\n(/g ,x/IEEE_8087/ c/__LITTLE_ENDIAN/ ,x/^#if / c/#ifdef / ,x g/errno/d ,x/MALLOC/ c/malloc/ ,x/Long/ c/long/ ,x/CONST/ c/const/ w q ! cat xxx.c >> dtoa.c rm xxx.c ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/bin/unif_fdlibm����������������������������������������� 664 � 0 � 0 � 734 6622405623 23070�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/rc test -d /netlib/fdlibm || 9fs netlib test -d /n/hati/usr/ehg || 9fs hati echo '/* derived from /netlib/fdlibm */' > $1 if (~ $1 fdlibm.h) echo '#include "lib9.h"' >> $1 cp /netlib/fdlibm/$1 /n/hati/usr/ehg/xxx.c rx hati 'unifdef -D__STDC__ -D_IEEE_LIBM -D_SCALB_INT -U__NEWVALID xxx.c' > xxx.c > /n/hati/usr/ehg/xxx.c sam -d >> $1 >[2] err <<! e xxx.c /extern int signgam;/,/#define PLOSS/+d ,x/HUGE_VAL/ c/DBL_MAX/ ,x/huge/ c/Huge/ w q ! cat xxx.c >> $1 rm xxx.c ������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/blas.c�������������������������������������������������� 664 � 0 � 0 � 1220 10206413401 21215�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "lib9.h" #include "mathi.h" double dot(int n, double *x, double *y) { double sum = 0; if (n <= 0) return 0; while (n--) { sum += *x++ * *y++; } return sum; } int iamax(int n, double *x) { int i, m; double xm, a; if (n <= 0) return 0; m = 0; xm = fabs(*x); for (i = 1; i < n; i++) { a = fabs(*++x); if (xm < a) { m = i; xm = a; } } return m; } double norm1(int n, double *x) { double sum = 0; if (n <= 0) return 0; while (n--) { sum += fabs(*x++); } return sum; } double norm2(int n, double *x) { double sum = 0; if (n <= 0) return 0; while (n--) { sum += *x * *x; x++; } return sum; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/dtoa.c�������������������������������������������������� 664 � 0 � 0 � 104004 10206413401 21267�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fp/dtoa.c assuming IEEE, Standard C */ /* kudos to dmg@bell-labs.com, gripes to ehg@bell-labs.com */ #include "lib9.h" #define ACQUIRE_DTOA_LOCK(n) /*nothing*/ #define FREE_DTOA_LOCK(n) /*nothing*/ /* let's provide reasonable defaults for usual implementation of IEEE f.p. */ #ifndef DBL_DIG #define DBL_DIG 15 #endif #ifndef DBL_MAX_10_EXP #define DBL_MAX_10_EXP 308 #endif #ifndef DBL_MAX_EXP #define DBL_MAX_EXP 1024 #endif #ifndef FLT_RADIX #define FLT_RADIX 2 #endif #ifndef FLT_ROUNDS #define FLT_ROUNDS 1 #endif #ifndef Storeinc #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) #endif #define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000; #ifdef __LITTLE_ENDIAN #define word0(x) ((unsigned long *)&x)[1] #define word1(x) ((unsigned long *)&x)[0] #else #define word0(x) ((unsigned long *)&x)[0] #define word1(x) ((unsigned long *)&x)[1] #endif /* #define P DBL_MANT_DIG */ /* Ten_pmax = floor(P*log(2)/log(5)) */ /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ #define Exp_shift 20 #define Exp_shift1 20 #define Exp_msk1 0x100000 #define Exp_msk11 0x100000 #define Exp_mask 0x7ff00000 #define P 53 #define Bias 1023 #define Emin (-1022) #define Exp_1 0x3ff00000 #define Exp_11 0x3ff00000 #define Ebits 11 #define Frac_mask 0xfffff #define Frac_mask1 0xfffff #define Ten_pmax 22 #define Bletch 0x10 #define Bndry_mask 0xfffff #define Bndry_mask1 0xfffff #define LSB 1 #define Sign_bit 0x80000000 #define Log2P 1 #define Tiny0 0 #define Tiny1 1 #define Quick_max 14 #define Int_max 14 #define Infinite(x) (word0(x) == 0x7ff00000) /* sufficient test for here */ #define Avoid_Underflow #define rounded_product(a,b) a *= b #define rounded_quotient(a,b) a /= b #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) #define Big1 0xffffffff #define Kmax 15 struct Bigint { struct Bigint *next; int k, maxwds, sign, wds; unsigned long x[1]; }; typedef struct Bigint Bigint; static Bigint *freelist[Kmax+1]; static Bigint * Balloc(int k) { int x; Bigint * rv; ACQUIRE_DTOA_LOCK(0); if (rv = freelist[k]) { freelist[k] = rv->next; } else { x = 1 << k; rv = (Bigint * )malloc(sizeof(Bigint) + (x - 1) * sizeof(unsigned long)); if(rv == nil) return nil; rv->k = k; rv->maxwds = x; } FREE_DTOA_LOCK(0); rv->sign = rv->wds = 0; return rv; } static void Bfree(Bigint *v) { if (v) { ACQUIRE_DTOA_LOCK(0); v->next = freelist[v->k]; freelist[v->k] = v; FREE_DTOA_LOCK(0); } } #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \ y->wds*sizeof(long) + 2*sizeof(int)) static Bigint * multadd(Bigint *b, int m, int a) /* multiply by m and add a */ { int i, wds; unsigned long * x, y; unsigned long xi, z; Bigint * b1; wds = b->wds; x = b->x; i = 0; do { xi = *x; y = (xi & 0xffff) * m + a; z = (xi >> 16) * m + (y >> 16); a = (int)(z >> 16); *x++ = (z << 16) + (y & 0xffff); } while (++i < wds); if (a) { if (wds >= b->maxwds) { b1 = Balloc(b->k + 1); Bcopy(b1, b); Bfree(b); b = b1; } b->x[wds++] = a; b->wds = wds; } return b; } static Bigint * s2b(const char *s, int nd0, int nd, unsigned long y9) { Bigint * b; int i, k; long x, y; x = (nd + 8) / 9; for (k = 0, y = 1; x > y; y <<= 1, k++) ; b = Balloc(k); b->x[0] = y9; b->wds = 1; i = 9; if (9 < nd0) { s += 9; do b = multadd(b, 10, *s++ - '0'); while (++i < nd0); s++; } else s += 10; for (; i < nd; i++) b = multadd(b, 10, *s++ - '0'); return b; } static int hi0bits(register unsigned long x) { register int k = 0; if (!(x & 0xffff0000)) { k = 16; x <<= 16; } if (!(x & 0xff000000)) { k += 8; x <<= 8; } if (!(x & 0xf0000000)) { k += 4; x <<= 4; } if (!(x & 0xc0000000)) { k += 2; x <<= 2; } if (!(x & 0x80000000)) { k++; if (!(x & 0x40000000)) return 32; } return k; } static int lo0bits(unsigned long *y) { register int k; register unsigned long x = *y; if (x & 7) { if (x & 1) return 0; if (x & 2) { *y = x >> 1; return 1; } *y = x >> 2; return 2; } k = 0; if (!(x & 0xffff)) { k = 16; x >>= 16; } if (!(x & 0xff)) { k += 8; x >>= 8; } if (!(x & 0xf)) { k += 4; x >>= 4; } if (!(x & 0x3)) { k += 2; x >>= 2; } if (!(x & 1)) { k++; x >>= 1; if (!x & 1) return 32; } *y = x; return k; } static Bigint * i2b(int i) { Bigint * b; b = Balloc(1); b->x[0] = i; b->wds = 1; return b; } static Bigint * mult(Bigint *a, Bigint *b) { Bigint * c; int k, wa, wb, wc; unsigned long carry, y, z; unsigned long * x, *xa, *xae, *xb, *xbe, *xc, *xc0; unsigned long z2; if (a->wds < b->wds) { c = a; a = b; b = c; } k = a->k; wa = a->wds; wb = b->wds; wc = wa + wb; if (wc > a->maxwds) k++; c = Balloc(k); for (x = c->x, xa = x + wc; x < xa; x++) *x = 0; xa = a->x; xae = xa + wa; xb = b->x; xbe = xb + wb; xc0 = c->x; for (; xb < xbe; xb++, xc0++) { if (y = *xb & 0xffff) { x = xa; xc = xc0; carry = 0; do { z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; carry = z >> 16; z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; carry = z2 >> 16; Storeinc(xc, z2, z); } while (x < xae); *xc = carry; } if (y = *xb >> 16) { x = xa; xc = xc0; carry = 0; z2 = *xc; do { z = (*x & 0xffff) * y + (*xc >> 16) + carry; carry = z >> 16; Storeinc(xc, z, z2); z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; carry = z2 >> 16; } while (x < xae); *xc = z2; } } for (xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; c->wds = wc; return c; } static Bigint *p5s; static Bigint * pow5mult(Bigint *b, int k) { Bigint * b1, *p5, *p51; int i; static int p05[3] = { 5, 25, 125 }; if (i = k & 3) b = multadd(b, p05[i-1], 0); if (!(k >>= 2)) return b; if (!(p5 = p5s)) { /* first time */ ACQUIRE_DTOA_LOCK(1); if (!(p5 = p5s)) { p5 = p5s = i2b(625); p5->next = 0; } FREE_DTOA_LOCK(1); } for (; ; ) { if (k & 1) { b1 = mult(b, p5); Bfree(b); b = b1; } if (!(k >>= 1)) break; if (!(p51 = p5->next)) { ACQUIRE_DTOA_LOCK(1); if (!(p51 = p5->next)) { p51 = p5->next = mult(p5, p5); p51->next = 0; } FREE_DTOA_LOCK(1); } p5 = p51; } return b; } static Bigint * lshift(Bigint *b, int k) { int i, k1, n, n1; Bigint * b1; unsigned long * x, *x1, *xe, z; n = k >> 5; k1 = b->k; n1 = n + b->wds + 1; for (i = b->maxwds; n1 > i; i <<= 1) k1++; b1 = Balloc(k1); x1 = b1->x; for (i = 0; i < n; i++) *x1++ = 0; x = b->x; xe = x + b->wds; if (k &= 0x1f) { k1 = 32 - k; z = 0; do { *x1++ = *x << k | z; z = *x++ >> k1; } while (x < xe); if (*x1 = z) ++n1; } else do *x1++ = *x++; while (x < xe); b1->wds = n1 - 1; Bfree(b); return b1; } static int cmp(Bigint *a, Bigint *b) { unsigned long * xa, *xa0, *xb, *xb0; int i, j; i = a->wds; j = b->wds; if (i -= j) return i; xa0 = a->x; xa = xa0 + j; xb0 = b->x; xb = xb0 + j; for (; ; ) { if (*--xa != *--xb) return * xa < *xb ? -1 : 1; if (xa <= xa0) break; } return 0; } static Bigint * diff(Bigint *a, Bigint *b) { Bigint * c; int i, wa, wb; long borrow, y; /* We need signed shifts here. */ unsigned long * xa, *xae, *xb, *xbe, *xc; long z; i = cmp(a, b); if (!i) { c = Balloc(0); c->wds = 1; c->x[0] = 0; return c; } if (i < 0) { c = a; a = b; b = c; i = 1; } else i = 0; c = Balloc(a->k); c->sign = i; wa = a->wds; xa = a->x; xae = xa + wa; wb = b->wds; xb = b->x; xbe = xb + wb; xc = c->x; borrow = 0; do { y = (*xa & 0xffff) - (*xb & 0xffff) + borrow; borrow = y >> 16; Sign_Extend(borrow, y); z = (*xa++ >> 16) - (*xb++ >> 16) + borrow; borrow = z >> 16; Sign_Extend(borrow, z); Storeinc(xc, z, y); } while (xb < xbe); while (xa < xae) { y = (*xa & 0xffff) + borrow; borrow = y >> 16; Sign_Extend(borrow, y); z = (*xa++ >> 16) + borrow; borrow = z >> 16; Sign_Extend(borrow, z); Storeinc(xc, z, y); } while (!*--xc) wa--; c->wds = wa; return c; } static double ulp(double x) { register long L; double a; L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1; #ifndef Sudden_Underflow if (L > 0) { #endif word0(a) = L; word1(a) = 0; #ifndef Sudden_Underflow } else { L = -L >> Exp_shift; if (L < Exp_shift) { word0(a) = 0x80000 >> L; word1(a) = 0; } else { word0(a) = 0; L -= Exp_shift; word1(a) = L >= 31 ? 1 : 1 << 31 - L; } } #endif return a; } static double b2d(Bigint *a, int *e) { unsigned long * xa, *xa0, w, y, z; int k; double d; #define d0 word0(d) #define d1 word1(d) xa0 = a->x; xa = xa0 + a->wds; y = *--xa; k = hi0bits(y); *e = 32 - k; if (k < Ebits) { d0 = Exp_1 | y >> Ebits - k; w = xa > xa0 ? *--xa : 0; d1 = y << (32 - Ebits) + k | w >> Ebits - k; goto ret_d; } z = xa > xa0 ? *--xa : 0; if (k -= Ebits) { d0 = Exp_1 | y << k | z >> 32 - k; y = xa > xa0 ? *--xa : 0; d1 = z << k | y >> 32 - k; } else { d0 = Exp_1 | y; d1 = z; } ret_d: #undef d0 #undef d1 return d; } static Bigint * d2b(double d, int *e, int *bits) { Bigint * b; int de, i, k; unsigned long * x, y, z; #define d0 word0(d) #define d1 word1(d) b = Balloc(1); x = b->x; z = d0 & Frac_mask; d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ #ifdef Sudden_Underflow de = (int)(d0 >> Exp_shift); z |= Exp_msk11; #else if (de = (int)(d0 >> Exp_shift)) z |= Exp_msk1; #endif if (y = d1) { if (k = lo0bits(&y)) { x[0] = y | z << 32 - k; z >>= k; } else x[0] = y; i = b->wds = (x[1] = z) ? 2 : 1; } else { k = lo0bits(&z); x[0] = z; i = b->wds = 1; k += 32; } #ifndef Sudden_Underflow if (de) { #endif *e = de - Bias - (P - 1) + k; *bits = P - k; #ifndef Sudden_Underflow } else { *e = de - Bias - (P - 1) + 1 + k; *bits = 32 * i - hi0bits(x[i-1]); } #endif return b; } #undef d0 #undef d1 static double ratio(Bigint *a, Bigint *b) { double da, db; int k, ka, kb; da = b2d(a, &ka); db = b2d(b, &kb); k = ka - kb + 32 * (a->wds - b->wds); if (k > 0) word0(da) += k * Exp_msk1; else { k = -k; word0(db) += k * Exp_msk1; } return da / db; } static const double tens[] = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22 }; static const double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 9007199254740992.e-256 }; /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ /* flag unnecessarily. It leads to a song and dance at the end of strtod. */ #define Scale_Bit 0x10 #define n_bigtens 5 #define NAN_WORD0 0x7ff80000 #define NAN_WORD1 0 static int match(const char **sp, char *t) { int c, d; const char * s = *sp; while (d = *t++) { if ((c = *++s) >= 'A' && c <= 'Z') c += 'a' - 'A'; if (c != d) return 0; } *sp = s + 1; return 1; } double strtod(const char *s00, char **se) { int scale; int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; const char * s, *s0, *s1; double aadj, aadj1, adj, rv, rv0; long L; unsigned long y, z; Bigint * bb, *bb1, *bd, *bd0, *bs, *delta; sign = nz0 = nz = 0; rv = 0.; for (s = s00; ; s++) switch (*s) { case '-': sign = 1; /* no break */ case '+': if (*++s) goto break2; /* no break */ case 0: s = s00; goto ret; case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': continue; default: goto break2; } break2: if (*s == '0') { nz0 = 1; while (*++s == '0') ; if (!*s) goto ret; } s0 = s; y = z = 0; for (nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) if (nd < 9) y = 10 * y + c - '0'; else if (nd < 16) z = 10 * z + c - '0'; nd0 = nd; if (c == '.') { c = *++s; if (!nd) { for (; c == '0'; c = *++s) nz++; if (c > '0' && c <= '9') { s0 = s; nf += nz; nz = 0; goto have_dig; } goto dig_done; } for (; c >= '0' && c <= '9'; c = *++s) { have_dig: nz++; if (c -= '0') { nf += nz; for (i = 1; i < nz; i++) if (nd++ < 9) y *= 10; else if (nd <= DBL_DIG + 1) z *= 10; if (nd++ < 9) y = 10 * y + c; else if (nd <= DBL_DIG + 1) z = 10 * z + c; nz = 0; } } } dig_done: e = 0; if (c == 'e' || c == 'E') { if (!nd && !nz && !nz0) { s = s00; goto ret; } s00 = s; esign = 0; switch (c = *++s) { case '-': esign = 1; case '+': c = *++s; } if (c >= '0' && c <= '9') { while (c == '0') c = *++s; if (c > '0' && c <= '9') { L = c - '0'; s1 = s; while ((c = *++s) >= '0' && c <= '9') L = 10 * L + c - '0'; if (s - s1 > 8 || L > 19999) /* Avoid confusion from exponents * so large that e might overflow. */ e = 19999; /* safe for 16 bit ints */ else e = (int)L; if (esign) e = -e; } else e = 0; } else s = s00; } if (!nd) { if (!nz && !nz0) { /* Check for Nan and Infinity */ switch (c) { case 'i': case 'I': if (match(&s, "nfinity")) { word0(rv) = 0x7ff00000; word1(rv) = 0; goto ret; } break; case 'n': case 'N': if (match(&s, "an")) { word0(rv) = NAN_WORD0; word1(rv) = NAN_WORD1; goto ret; } } s = s00; } goto ret; } e1 = e -= nf; /* Now we have nd0 digits, starting at s0, followed by a * decimal point, followed by nd-nd0 digits. The number we're * after is the integer represented by those digits times * 10**e */ if (!nd0) nd0 = nd; k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; rv = y; if (k > 9) rv = tens[k - 9] * rv + z; bd0 = 0; if (nd <= DBL_DIG && FLT_ROUNDS == 1 ) { if (!e) goto ret; if (e > 0) { if (e <= Ten_pmax) { /* rv = */ rounded_product(rv, tens[e]); goto ret; } i = DBL_DIG - nd; if (e <= Ten_pmax + i) { /* A fancier test would sometimes let us do * this for larger i values. */ e -= i; rv *= tens[i]; /* rv = */ rounded_product(rv, tens[e]); goto ret; } } else if (e >= -Ten_pmax) { /* rv = */ rounded_quotient(rv, tens[-e]); goto ret; } } e1 += nd - k; scale = 0; /* Get starting approximation = rv * 10**e1 */ if (e1 > 0) { if (i = e1 & 15) rv *= tens[i]; if (e1 &= ~15) { if (e1 > DBL_MAX_10_EXP) { ovfl: /* Can't trust HUGE_VAL */ word0(rv) = Exp_mask; word1(rv) = 0; if (bd0) goto retfree; goto ret; } if (e1 >>= 4) { for (j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) rv *= bigtens[j]; /* The last multiplication could overflow. */ word0(rv) -= P * Exp_msk1; rv *= bigtens[j]; if ((z = word0(rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P)) goto ovfl; if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) { /* set to largest number */ /* (Can't trust DBL_MAX) */ word0(rv) = Big0; word1(rv) = Big1; } else word0(rv) += P * Exp_msk1; } } } else if (e1 < 0) { e1 = -e1; if (i = e1 & 15) rv /= tens[i]; if (e1 &= ~15) { e1 >>= 4; if (e1 >= 1 << n_bigtens) goto undfl; if (e1 & Scale_Bit) scale = P; for (j = 0; e1 > 0; j++, e1 >>= 1) if (e1 & 1) rv *= tinytens[j]; if (!rv) { undfl: rv = 0.; if (bd0) goto retfree; goto ret; } } } /* Now the hard part -- adjusting rv to the correct value.*/ /* Put digits into bd: true value = bd * 10^e */ bd0 = s2b(s0, nd0, nd, y); for (; ; ) { bd = Balloc(bd0->k); Bcopy(bd, bd0); bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ bs = i2b(1); if (e >= 0) { bb2 = bb5 = 0; bd2 = bd5 = e; } else { bb2 = bb5 = -e; bd2 = bd5 = 0; } if (bbe >= 0) bb2 += bbe; else bd2 -= bbe; bs2 = bb2; #ifdef Sudden_Underflow j = P + 1 - bbbits; #else i = bbe + bbbits - 1; /* logb(rv) */ if (i < Emin) /* denormal */ j = bbe + (P - Emin); else j = P + 1 - bbbits; #endif bb2 += j; bd2 += j; bd2 += scale; i = bb2 < bd2 ? bb2 : bd2; if (i > bs2) i = bs2; if (i > 0) { bb2 -= i; bd2 -= i; bs2 -= i; } if (bb5 > 0) { bs = pow5mult(bs, bb5); bb1 = mult(bs, bb); Bfree(bb); bb = bb1; } if (bb2 > 0) bb = lshift(bb, bb2); if (bd5 > 0) bd = pow5mult(bd, bd5); if (bd2 > 0) bd = lshift(bd, bd2); if (bs2 > 0) bs = lshift(bs, bs2); delta = diff(bb, bd); dsign = delta->sign; delta->sign = 0; i = cmp(delta, bs); if (i < 0) { /* Error is less than half an ulp -- check for * special case of mantissa a power of two. */ if (dsign || word1(rv) || word0(rv) & Bndry_mask || (word0(rv) & Exp_mask) <= Exp_msk1 ) { if (!delta->x[0] && delta->wds == 1) dsign = 2; break; } delta = lshift(delta, Log2P); if (cmp(delta, bs) > 0) goto drop_down; break; } if (i == 0) { /* exactly half-way between */ if (dsign) { if ((word0(rv) & Bndry_mask1) == Bndry_mask1 && word1(rv) == 0xffffffff) { /*boundary case -- increment exponent*/ word0(rv) = (word0(rv) & Exp_mask) + Exp_msk1 ; word1(rv) = 0; dsign = 0; break; } } else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { dsign = 2; drop_down: /* boundary case -- decrement exponent */ #ifdef Sudden_Underflow L = word0(rv) & Exp_mask; if (L <= Exp_msk1) goto undfl; L -= Exp_msk1; #else L = (word0(rv) & Exp_mask) - Exp_msk1; #endif word0(rv) = L | Bndry_mask1; word1(rv) = 0xffffffff; break; } if (!(word1(rv) & LSB)) break; if (dsign) rv += ulp(rv); else { rv -= ulp(rv); #ifndef Sudden_Underflow if (!rv) goto undfl; #endif } dsign = 1 - dsign; break; } if ((aadj = ratio(delta, bs)) <= 2.) { if (dsign) aadj = aadj1 = 1.; else if (word1(rv) || word0(rv) & Bndry_mask) { #ifndef Sudden_Underflow if (word1(rv) == Tiny1 && !word0(rv)) goto undfl; #endif aadj = 1.; aadj1 = -1.; } else { /* special case -- power of FLT_RADIX to be */ /* rounded down... */ if (aadj < 2. / FLT_RADIX) aadj = 1. / FLT_RADIX; else aadj *= 0.5; aadj1 = -aadj; } } else { aadj *= 0.5; aadj1 = dsign ? aadj : -aadj; if (FLT_ROUNDS == 0) aadj1 += 0.5; } y = word0(rv) & Exp_mask; /* Check for overflow */ if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) { rv0 = rv; word0(rv) -= P * Exp_msk1; adj = aadj1 * ulp(rv); rv += adj; if ((word0(rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) { if (word0(rv0) == Big0 && word1(rv0) == Big1) goto ovfl; word0(rv) = Big0; word1(rv) = Big1; goto cont; } else word0(rv) += P * Exp_msk1; } else { #ifdef Sudden_Underflow if ((word0(rv) & Exp_mask) <= P * Exp_msk1) { rv0 = rv; word0(rv) += P * Exp_msk1; adj = aadj1 * ulp(rv); rv += adj; if ((word0(rv) & Exp_mask) <= P * Exp_msk1) { if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1) goto undfl; word0(rv) = Tiny0; word1(rv) = Tiny1; goto cont; } else word0(rv) -= P * Exp_msk1; } else { adj = aadj1 * ulp(rv); rv += adj; } #else /* Compute adj so that the IEEE rounding rules will * correctly round rv + adj in some half-way cases. * If rv * ulp(rv) is denormalized (i.e., * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid * trouble from bits lost to denormalization; * example: 1.2e-307 . */ if (y <= (P - 1) * Exp_msk1 && aadj >= 1.) { aadj1 = (double)(int)(aadj + 0.5); if (!dsign) aadj1 = -aadj1; } adj = aadj1 * ulp(rv); rv += adj; #endif } z = word0(rv) & Exp_mask; if (!scale) if (y == z) { /* Can we stop now? */ L = aadj; aadj -= L; /* The tolerances below are conservative. */ if (dsign || word1(rv) || word0(rv) & Bndry_mask) { if (aadj < .4999999 || aadj > .5000001) break; } else if (aadj < .4999999 / FLT_RADIX) break; } cont: Bfree(bb); Bfree(bd); Bfree(bs); Bfree(delta); } if (scale) { if ((word0(rv) & Exp_mask) <= P * Exp_msk1 && word1(rv) & 1 && dsign != 2) if (dsign) rv += ulp(rv); else word1(rv) &= ~1; word0(rv0) = Exp_1 - P * Exp_msk1; word1(rv0) = 0; rv *= rv0; } retfree: Bfree(bb); Bfree(bd); Bfree(bs); Bfree(bd0); Bfree(delta); ret: if (se) *se = (char *)s; return sign ? -rv : rv; } static int quorem(Bigint *b, Bigint *S) { int n; long borrow, y; unsigned long carry, q, ys; unsigned long * bx, *bxe, *sx, *sxe; long z; unsigned long si, zs; n = S->wds; if (b->wds < n) return 0; sx = S->x; sxe = sx + --n; bx = b->x; bxe = bx + n; q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ if (q) { borrow = 0; carry = 0; do { si = *sx++; ys = (si & 0xffff) * q + carry; zs = (si >> 16) * q + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) + borrow; borrow = y >> 16; Sign_Extend(borrow, y); z = (*bx >> 16) - (zs & 0xffff) + borrow; borrow = z >> 16; Sign_Extend(borrow, z); Storeinc(bx, z, y); } while (sx <= sxe); if (!*bxe) { bx = b->x; while (--bxe > bx && !*bxe) --n; b->wds = n; } } if (cmp(b, S) >= 0) { q++; borrow = 0; carry = 0; bx = b->x; sx = S->x; do { si = *sx++; ys = (si & 0xffff) + carry; zs = (si >> 16) + (ys >> 16); carry = zs >> 16; y = (*bx & 0xffff) - (ys & 0xffff) + borrow; borrow = y >> 16; Sign_Extend(borrow, y); z = (*bx >> 16) - (zs & 0xffff) + borrow; borrow = z >> 16; Sign_Extend(borrow, z); Storeinc(bx, z, y); } while (sx <= sxe); bx = b->x; bxe = bx + n; if (!*bxe) { while (--bxe > bx && !*bxe) --n; b->wds = n; } } return q; } static char * rv_alloc(int i) { int j, k, *r; j = sizeof(unsigned long); for (k = 0; sizeof(Bigint) - sizeof(unsigned long) - sizeof(int) + j <= i; j <<= 1) k++; r = (int * )Balloc(k); *r = k; return (char *)(r + 1); } static char * nrv_alloc(char *s, char **rve, int n) { char *rv, *t; t = rv = rv_alloc(n); while (*t = *s++) t++; if (rve) *rve = t; return rv; } /* freedtoa(s) must be used to free values s returned by dtoa * when MULTIPLE_THREADS is #defined. It should be used in all cases, * but for consistency with earlier versions of dtoa, it is optional * when MULTIPLE_THREADS is not defined. */ void freedtoa(char *s) { Bigint * b = (Bigint * )((int *)s - 1); b->maxwds = 1 << (b->k = *(int * )b); Bfree(b); } /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. * * Inspired by "How to Print Floating-Point Numbers Accurately" by * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101]. * * Modifications: * 1. Rather than iterating, we use a simple numeric overestimate * to determine k = floor(log10(d)). We scale relevant * quantities using O(log2(k)) rather than O(k) multiplications. * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't * try to generate digits strictly left to right. Instead, we * compute with fewer bits and propagate the carry if necessary * when rounding the final digit up. This is often faster. * 3. Under the assumption that input will be rounded nearest, * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. * That is, we allow equality in stopping tests when the * round-nearest rule will give the same floating-point value * as would satisfaction of the stopping test with strict * inequality. * 4. We remove common factors of powers of 2 from relevant * quantities. * 5. When converting floating-point integers less than 1e16, * we use floating-point arithmetic rather than resorting * to multiple-precision integers. * 6. When asked to produce fewer than 15 digits, we first try * to get by with floating-point arithmetic; we resort to * multiple-precision integer arithmetic only if we cannot * guarantee that the floating-point calculation has given * the correctly rounded result. For k requested digits and * "uniformly" distributed input, the probability is * something like 10^(k-15) that we must resort to the long * calculation. */ char * dtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve) { /* Arguments ndigits, decpt, sign are similar to those of ecvt and fcvt; trailing zeros are suppressed from the returned string. If not null, *rve is set to point to the end of the return value. If d is +-Infinity or NaN, then *decpt is set to 9999. mode: 0 ==> shortest string that yields d when read in and rounded to nearest. 1 ==> like 0, but with Steele & White stopping rule; e.g. with IEEE P754 arithmetic , mode 0 gives 1e23 whereas mode 1 gives 9.999999999999999e22. 2 ==> max(1,ndigits) significant digits. This gives a return value similar to that of ecvt, except that trailing zeros are suppressed. 3 ==> through ndigits past the decimal point. This gives a return value similar to that from fcvt, except that trailing zeros are suppressed, and ndigits can be negative. 4-9 should give the same return values as 2-3, i.e., 4 <= mode <= 9 ==> same return as mode 2 + (mode & 1). These modes are mainly for debugging; often they run slower but sometimes faster than modes 2-3. 4,5,8,9 ==> left-to-right digit generation. 6-9 ==> don't try fast floating-point estimate (if applicable). Values of mode other than 0-9 are treated as mode 0. Sufficient space is allocated to the return value to hold the suppressed trailing zeros. */ int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, spec_case, try_quick; long L; #ifndef Sudden_Underflow int denorm; unsigned long x; #endif Bigint * b, *b1, *delta, *mlo, *mhi, *S; double d2, ds, eps; char *s, *s0; if (word0(d) & Sign_bit) { /* set sign for everything, including 0's and NaNs */ *sign = 1; word0(d) &= ~Sign_bit; /* clear sign bit */ } else *sign = 0; if ((word0(d) & Exp_mask) == Exp_mask) { /* Infinity or NaN */ *decpt = 9999; if (!word1(d) && !(word0(d) & 0xfffff)) return nrv_alloc("Infinity", rve, 8); return nrv_alloc("NaN", rve, 3); } if (!d) { *decpt = 1; return nrv_alloc("0", rve, 1); } b = d2b(d, &be, &bbits); #ifdef Sudden_Underflow i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)); #else if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1))) { #endif d2 = d; word0(d2) &= Frac_mask1; word0(d2) |= Exp_11; /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 * log10(x) = log(x) / log(10) * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) * * This suggests computing an approximation k to log10(d) by * * k = (i - Bias)*0.301029995663981 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); * * We want k to be too large rather than too small. * The error in the first-order Taylor series approximation * is in our favor, so we just round up the constant enough * to compensate for any error in the multiplication of * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, * adding 1e-13 to the constant term more than suffices. * Hence we adjust the constant term to 0.1760912590558. * (We could get a more accurate k by invoking log10, * but this is probably not worthwhile.) */ i -= Bias; #ifndef Sudden_Underflow denorm = 0; } else { /* d is denormalized */ i = bbits + be + (Bias + (P - 1) - 1); x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32 : word1(d) << 32 - i; d2 = x; word0(d2) -= 31 * Exp_msk1; /* adjust exponent */ i -= (Bias + (P - 1) - 1) + 1; denorm = 1; } #endif ds = (d2 - 1.5) * 0.289529654602168 + 0.1760912590558 + i * 0.301029995663981; k = (int)ds; if (ds < 0. && ds != k) k--; /* want k = floor(ds) */ k_check = 1; if (k >= 0 && k <= Ten_pmax) { if (d < tens[k]) k--; k_check = 0; } j = bbits - i - 1; if (j >= 0) { b2 = 0; s2 = j; } else { b2 = -j; s2 = 0; } if (k >= 0) { b5 = 0; s5 = k; s2 += k; } else { b2 -= k; b5 = -k; s5 = 0; } if (mode < 0 || mode > 9) mode = 0; try_quick = 1; if (mode > 5) { mode -= 4; try_quick = 0; } leftright = 1; switch (mode) { case 0: case 1: ilim = ilim1 = -1; i = 18; ndigits = 0; break; case 2: leftright = 0; /* no break */ case 4: if (ndigits <= 0) ndigits = 1; ilim = ilim1 = i = ndigits; break; case 3: leftright = 0; /* no break */ case 5: i = ndigits + k + 1; ilim = i; ilim1 = i - 1; if (i <= 0) i = 1; } s = s0 = rv_alloc(i); if (ilim >= 0 && ilim <= Quick_max && try_quick) { /* Try to get by with floating-point arithmetic. */ i = 0; d2 = d; k0 = k; ilim0 = ilim; ieps = 2; /* conservative */ if (k > 0) { ds = tens[k&0xf]; j = k >> 4; if (j & Bletch) { /* prevent overflows */ j &= Bletch - 1; d /= bigtens[n_bigtens-1]; ieps++; } for (; j; j >>= 1, i++) if (j & 1) { ieps++; ds *= bigtens[i]; } d /= ds; } else if (j1 = -k) { d *= tens[j1 & 0xf]; for (j = j1 >> 4; j; j >>= 1, i++) if (j & 1) { ieps++; d *= bigtens[i]; } } if (k_check && d < 1. && ilim > 0) { if (ilim1 <= 0) goto fast_failed; ilim = ilim1; k--; d *= 10.; ieps++; } eps = ieps * d + 7.; word0(eps) -= (P - 1) * Exp_msk1; if (ilim == 0) { S = mhi = 0; d -= 5.; if (d > eps) goto one_digit; if (d < -eps) goto no_digits; goto fast_failed; } /* Generate ilim digits, then fix them up. */ eps *= tens[ilim-1]; for (i = 1; ; i++, d *= 10.) { L = d; d -= L; *s++ = '0' + (int)L; if (i == ilim) { if (d > 0.5 + eps) goto bump_up; else if (d < 0.5 - eps) { while (*--s == '0') ; s++; goto ret1; } break; } } fast_failed: s = s0; d = d2; k = k0; ilim = ilim0; } /* Do we have a "small" integer? */ if (be >= 0 && k <= Int_max) { /* Yes. */ ds = tens[k]; if (ndigits < 0 && ilim <= 0) { S = mhi = 0; if (ilim < 0 || d <= 5 * ds) goto no_digits; goto one_digit; } for (i = 1; ; i++) { L = d / ds; d -= L * ds; *s++ = '0' + (int)L; if (i == ilim) { d += d; if (d > ds || d == ds && L & 1) { bump_up: while (*--s == '9') if (s == s0) { k++; *s = '0'; break; } ++ * s++; } break; } if (!(d *= 10.)) break; } goto ret1; } m2 = b2; m5 = b5; mhi = mlo = 0; if (leftright) { if (mode < 2) { i = #ifndef Sudden_Underflow denorm ? be + (Bias + (P - 1) - 1 + 1) : #endif 1 + P - bbits; } else { j = ilim - 1; if (m5 >= j) m5 -= j; else { s5 += j -= m5; b5 += j; m5 = 0; } if ((i = ilim) < 0) { m2 -= i; i = 0; } } b2 += i; s2 += i; mhi = i2b(1); } if (m2 > 0 && s2 > 0) { i = m2 < s2 ? m2 : s2; b2 -= i; m2 -= i; s2 -= i; } if (b5 > 0) { if (leftright) { if (m5 > 0) { mhi = pow5mult(mhi, m5); b1 = mult(mhi, b); Bfree(b); b = b1; } if (j = b5 - m5) b = pow5mult(b, j); } else b = pow5mult(b, b5); } S = i2b(1); if (s5 > 0) S = pow5mult(S, s5); /* Check for special case that d is a normalized power of 2. */ spec_case = 0; if (mode < 2) { if (!word1(d) && !(word0(d) & Bndry_mask) #ifndef Sudden_Underflow && word0(d) & Exp_mask #endif ) { /* The special case */ b2 += Log2P; s2 += Log2P; spec_case = 1; } } /* Arrange for convenient computation of quotients: * shift left if necessary so divisor has 4 leading 0 bits. * * Perhaps we should just compute leading 28 bits of S once * and for all and pass them and a shift to quorem, so it * can do shifts and ors to compute the numerator for q. */ if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) i = 32 - i; if (i > 4) { i -= 4; b2 += i; m2 += i; s2 += i; } else if (i < 4) { i += 28; b2 += i; m2 += i; s2 += i; } if (b2 > 0) b = lshift(b, b2); if (s2 > 0) S = lshift(S, s2); if (k_check) { if (cmp(b, S) < 0) { k--; b = multadd(b, 10, 0); /* we botched the k estimate */ if (leftright) mhi = multadd(mhi, 10, 0); ilim = ilim1; } } if (ilim <= 0 && mode > 2) { if (ilim < 0 || cmp(b, S = multadd(S, 5, 0)) <= 0) { /* no digits, fcvt style */ no_digits: k = -1 - ndigits; goto ret; } one_digit: *s++ = '1'; k++; goto ret; } if (leftright) { if (m2 > 0) mhi = lshift(mhi, m2); /* Compute mlo -- check for special case * that d is a normalized power of 2. */ mlo = mhi; if (spec_case) { mhi = Balloc(mhi->k); Bcopy(mhi, mlo); mhi = lshift(mhi, Log2P); } for (i = 1; ; i++) { dig = quorem(b, S) + '0'; /* Do we yet have the shortest decimal string * that will round to d? */ j = cmp(b, mlo); delta = diff(S, mhi); j1 = delta->sign ? 1 : cmp(b, delta); Bfree(delta); if (j1 == 0 && !mode && !(word1(d) & 1)) { if (dig == '9') goto round_9_up; if (j > 0) dig++; *s++ = dig; goto ret; } if (j < 0 || j == 0 && !mode && !(word1(d) & 1) ) { if (j1 > 0) { b = lshift(b, 1); j1 = cmp(b, S); if ((j1 > 0 || j1 == 0 && dig & 1) && dig++ == '9') goto round_9_up; } *s++ = dig; goto ret; } if (j1 > 0) { if (dig == '9') { /* possible if i == 1 */ round_9_up: *s++ = '9'; goto roundoff; } *s++ = dig + 1; goto ret; } *s++ = dig; if (i == ilim) break; b = multadd(b, 10, 0); if (mlo == mhi) mlo = mhi = multadd(mhi, 10, 0); else { mlo = multadd(mlo, 10, 0); mhi = multadd(mhi, 10, 0); } } } else for (i = 1; ; i++) { *s++ = dig = quorem(b, S) + '0'; if (i >= ilim) break; b = multadd(b, 10, 0); } /* Round off last digit */ b = lshift(b, 1); j = cmp(b, S); if (j > 0 || j == 0 && dig & 1) { roundoff: while (*--s == '9') if (s == s0) { k++; *s++ = '1'; goto ret; } ++ * s++; } else { while (*--s == '0') ; s++; } ret: Bfree(S); if (mhi) { if (mlo && mlo != mhi) Bfree(mlo); Bfree(mhi); } ret1: Bfree(b); *s = 0; *decpt = k + 1; if (rve) *rve = s; return s0; } int mode, int ndigits, int *decpt, int *sign, char **rve) { /* Arguments ndigits, decpt, sign are similar to those of ecvt and fcvt; trailing zeros are suppressed from the returned string. If not null, *rve is set to point to the end of the return value. If d is +-Infinity or NaN, then *decpt is set to 9999. mode: 0 ==> shortest string that yields d when read in and rounded to nearest. 1 ==> like 0, but with Steele & White stopping rule; e.g. with IEEE P754 arithmetic , mode 0 gives old_contrib//root/sys/src/cmd/limbo/libmath/fdim.c�������������������������������������������������� 664 � 0 � 0 � 414 10206413402 21200�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "lib9.h" #include "mathi.h" double fdim(double x, double y) { if(x>y) return x-y; else return 0; } double fmax(double x, double y) { if(x>y) return x; else return y; } double fmin(double x, double y) { if(x<y) return x; else return y; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/������������������������������������������������� 775 � 0 � 0 � 0 11411737771 21414��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_acos.c����������������������������������������� 664 � 0 � 0 � 6253 6622405623 22773�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_acos.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_acos(x) * Method : * acos(x) = pi/2 - asin(x) * acos(-x) = pi/2 + asin(x) * For |x|<=0.5 * acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c) * For x>0.5 * acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2))) * = 2asin(sqrt((1-x)/2)) * = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z) * = 2f + (2c + 2s*z*R(z)) * where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term * for f so that f+c ~ sqrt(z). * For x<-0.5 * acos(x) = pi - 2asin(sqrt((1-|x|)/2)) * = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z) * * Special cases: * if x is NaN, return x itself; * if |x|>1, return NaN with invalid signal. * * Function needed: sqrt */ #include "fdlibm.h" static const double one= 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ double __ieee754_acos(double x) { double z,p,q,r,w,s,c,df; int hx,ix; hx = __HI(x); ix = hx&0x7fffffff; if(ix>=0x3ff00000) { /* |x| >= 1 */ if(((ix-0x3ff00000)|__LO(x))==0) { /* |x|==1 */ if(hx>0) return 0.0; /* acos(1) = 0 */ else return pi+2.0*pio2_lo; /* acos(-1)= pi */ } return (x-x)/(x-x); /* acos(|x|>1) is NaN */ } if(ix<0x3fe00000) { /* |x| < 0.5 */ if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/ z = x*x; p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); r = p/q; return pio2_hi - (x - (pio2_lo-x*r)); } else if (hx<0) { /* x < -0.5 */ z = (one+x)*0.5; p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); s = sqrt(z); r = p/q; w = r*s-pio2_lo; return pi - 2.0*(s+w); } else { /* x > 0.5 */ z = (one-x)*0.5; s = sqrt(z); df = s; __LO(df) = 0; c = (z-df*df)/(s+df); p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); r = p/q; w = r*s+c; return 2.0*(df+w); } } s0; d = d2; k = k0; ilim = ilim0; } /* Do we have a "small" integer? */ if (be >= 0 && k <= Int_max) { /* Yes. */ ds = tens[k]; if (ndigits < 0 && ilim <= 0) { S = mhi = 0; if (ilim < 0 || d <= 5 * ds) goto no_digits; goto one_digit; } for (i = 1; ; i++) { L = d / ds; d -= L * ds; *s++ = '0' + (inold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_acosh.c���������������������������������������� 664 � 0 � 0 � 2767 6622405623 23151�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_acosh.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* __ieee754_acosh(x) * Method : * Based on * acosh(x) = log [ x + sqrt(x*x-1) ] * we have * acosh(x) := log(x)+ln2, if x is large; else * acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else * acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1. * * Special cases: * acosh(x) is NaN with signal if x<1. * acosh(NaN) is NaN without signal. */ #include "fdlibm.h" static const double one = 1.0, ln2 = 6.93147180559945286227e-01; /* 0x3FE62E42, 0xFEFA39EF */ double __ieee754_acosh(double x) { double t; int hx; hx = __HI(x); if(hx<0x3ff00000) { /* x < 1 */ return (x-x)/(x-x); } else if(hx >=0x41b00000) { /* x > 2**28 */ if(hx >=0x7ff00000) { /* x is inf of NaN */ return x+x; } else return __ieee754_log(x)+ln2; /* acosh(Huge)=log(2x) */ } else if(((hx-0x3ff00000)|__LO(x))==0) { return 0.0; /* acosh(1) = 0 */ } else if (hx > 0x40000000) { /* 2**28 > x > 2 */ t=x*x; return __ieee754_log(2.0*x-one/(x+sqrt(t-one))); } else { /* 1<x<2 */ t = x-one; return log1p(t+sqrt(2.0*t+t*t)); } } 0); ilold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_asin.c����������������������������������������� 664 � 0 � 0 � 6576 6622405623 23010�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_asin.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_asin(x) * Method : * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ... * we approximate asin(x) on [0,0.5] by * asin(x) = x + x*x^2*R(x^2) * where * R(x^2) is a rational approximation of (asin(x)-x)/x^3 * and its remez error is bounded by * |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75) * * For x in [0.5,1] * asin(x) = pi/2-2*asin(sqrt((1-x)/2)) * Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2; * then for x>0.98 * asin(x) = pi/2 - 2*(s+s*z*R(z)) * = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo) * For x<=0.98, let pio4_hi = pio2_hi/2, then * f = hi part of s; * c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z) * and * asin(x) = pi/2 - 2*(s+s*z*R(z)) * = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo) * = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c)) * * Special cases: * if x is NaN, return x itself; * if |x|>1, return NaN with invalid signal. * */ #include "fdlibm.h" static const double one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ Huge = 1.000e+300, pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ pio4_hi = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */ /* coefficient for R(x^2) */ pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ double __ieee754_asin(double x) { double t,w,p,q,c,r,s; int hx,ix; hx = __HI(x); ix = hx&0x7fffffff; if(ix>= 0x3ff00000) { /* |x|>= 1 */ if(((ix-0x3ff00000)|__LO(x))==0) /* asin(1)=+-pi/2 with inexact */ return x*pio2_hi+x*pio2_lo; return (x-x)/(x-x); /* asin(|x|>1) is NaN */ } else if (ix<0x3fe00000) { /* |x|<0.5 */ if(ix<0x3e400000) { /* if |x| < 2**-27 */ if(Huge+x>one) return x;/* return x with inexact if x!=0*/ } else t = x*x; p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); w = p/q; return x+x*w; } /* 1> |x|>= 0.5 */ w = one-fabs(x); t = w*0.5; p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); s = sqrt(t); if(ix>=0x3FEF3333) { /* if |x| > 0.975 */ w = p/q; t = pio2_hi-(2.0*(s+s*w)-pio2_lo); } else { w = s; __LO(w) = 0; c = (t-w*w)/(s+w); r = p/q; p = 2.0*s*r-(pio2_lo-2.0*c); q = pio4_hi-2.0*w; t = pio4_hi-(p-q); } if(hx>0) return t; else return -t; } ����������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_atan2.c���������������������������������������� 664 � 0 � 0 � 7106 6622405623 23051�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_atan2.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* __ieee754_atan2(y,x) * Method : * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x). * 2. Reduce x to positive by (if x and y are unexceptional): * ARG (x+iy) = arctan(y/x) ... if x > 0, * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0, * * Special cases: * * ATAN2((anything), NaN ) is NaN; * ATAN2(NAN , (anything) ) is NaN; * ATAN2(+-0, +(anything but NaN)) is +-0 ; * ATAN2(+-0, -(anything but NaN)) is +-pi ; * ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2; * ATAN2(+-(anything but INF and NaN), +INF) is +-0 ; * ATAN2(+-(anything but INF and NaN), -INF) is +-pi; * ATAN2(+-INF,+INF ) is +-pi/4 ; * ATAN2(+-INF,-INF ) is +-3pi/4; * ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2; * * Constants: * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include "fdlibm.h" static const double tiny = 1.0e-300, zero = 0.0, pi_o_4 = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */ pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */ pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */ pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ double __ieee754_atan2(double y, double x) { double z; int k,m,hx,hy,ix,iy; unsigned lx,ly; hx = __HI(x); ix = hx&0x7fffffff; lx = __LO(x); hy = __HI(y); iy = hy&0x7fffffff; ly = __LO(y); if(((ix|((lx|-lx)>>31))>0x7ff00000)|| ((iy|((ly|-ly)>>31))>0x7ff00000)) /* x or y is NaN */ return x+y; if((hx-0x3ff00000|lx)==0) return atan(y); /* x=1.0 */ m = ((hy>>31)&1)|((hx>>30)&2); /* 2*sign(x)+sign(y) */ /* when y = 0 */ if((iy|ly)==0) { switch(m) { case 0: case 1: return y; /* atan(+-0,+anything)=+-0 */ case 2: return pi+tiny;/* atan(+0,-anything) = pi */ case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */ } } /* when x = 0 */ if((ix|lx)==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; /* when x is INF */ if(ix==0x7ff00000) { if(iy==0x7ff00000) { switch(m) { case 0: return pi_o_4+tiny;/* atan(+INF,+INF) */ case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */ case 2: return 3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/ case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/ } } else { switch(m) { case 0: return zero ; /* atan(+...,+INF) */ case 1: return -zero ; /* atan(-...,+INF) */ case 2: return pi+tiny ; /* atan(+...,-INF) */ case 3: return -pi-tiny ; /* atan(-...,-INF) */ } } } /* when y is INF */ if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; /* compute y/x */ k = (iy-ix)>>20; if(k > 60) z=pi_o_2+0.5*pi_lo; /* |y/x| > 2**60 */ else if(hx<0&&k<-60) z=0.0; /* |y|/x < -2**60 */ else z=atan(fabs(y/x)); /* safe to do y/x */ switch (m) { case 0: return z ; /* atan(+,+) */ case 1: __HI(z) ^= 0x80000000; return z ; /* atan(-,+) */ case 2: return pi-(z-pi_lo);/* atan(+,-) */ default: /* case 3 */ return (z-pi_lo)-pi;/* atan(-,-) */ } } ������������������������������ 664 � 0 � 0 � 2767 6622405623 23151�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_atanh.c���������������������������������������� 664 � 0 � 0 � 3070 6622405623 23133�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_atanh.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* __ieee754_atanh(x) * Method : * 1.Reduced x to positive by atanh(-x) = -atanh(x) * 2.For x>=0.5 * 1 2x x * atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * --------) * 2 1 - x 1 - x * * For x<0.5 * atanh(x) = 0.5*log1p(2x+2x*x/(1-x)) * * Special cases: * atanh(x) is NaN if |x| > 1 with signal; * atanh(NaN) is that NaN with no signal; * atanh(+-1) is +-INF with signal. * */ #include "fdlibm.h" static const double one = 1.0, Huge = 1e300; static double zero = 0.0; double __ieee754_atanh(double x) { double t; int hx,ix; unsigned lx; hx = __HI(x); /* high word */ lx = __LO(x); /* low word */ ix = hx&0x7fffffff; if ((ix|((lx|(-lx))>>31))>0x3ff00000) /* |x|>1 */ return (x-x)/(x-x); if(ix==0x3ff00000) return x/zero; if(ix<0x3e300000&&(Huge+x)>zero) return x; /* x<2**-28 */ __HI(x) = ix; /* x <- |x| */ if(ix<0x3fe00000) { /* x < 0.5 */ t = x+x; t = 0.5*log1p(t+t*x/(one-x)); } else t = 0.5*log1p((x+x)/(one-x)); if(hx>=0) return t; else return -t; } 5/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_asin(x) * Method : * Since aold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_cosh.c����������������������������������������� 664 � 0 � 0 � 4371 6622405623 23001�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_cosh.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_cosh(x) * Method : * mathematically cosh(x) if defined to be (exp(x)+exp(-x))/2 * 1. Replace x by |x| (cosh(x) = cosh(-x)). * 2. * [ exp(x) - 1 ]^2 * 0 <= x <= ln2/2 : cosh(x) := 1 + ------------------- * 2*exp(x) * * exp(x) + 1/exp(x) * ln2/2 <= x <= 22 : cosh(x) := ------------------- * 2 * 22 <= x <= lnovft : cosh(x) := exp(x)/2 * lnovft <= x <= ln2ovft: cosh(x) := exp(x/2)/2 * exp(x/2) * ln2ovft < x : cosh(x) := Huge*Huge (overflow) * * Special cases: * cosh(x) is |x| if x is +INF, -INF, or NaN. * only cosh(0)=1 is exact for finite x. */ #include "fdlibm.h" static const double one = 1.0, half=0.5, Huge = 1.0e300; double __ieee754_cosh(double x) { double t,w; int ix; unsigned lx; /* High word of |x|. */ ix = __HI(x); ix &= 0x7fffffff; /* x is INF or NaN */ if(ix>=0x7ff00000) return x*x; /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */ if(ix<0x3fd62e43) { t = expm1(fabs(x)); w = one+t; if (ix<0x3c800000) return w; /* cosh(tiny) = 1 */ return one+(t*t)/(w+w); } /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */ if (ix < 0x40360000) { t = __ieee754_exp(fabs(x)); return half*t+half/t; } /* |x| in [22, log(maxdouble)] return half*exp(|x|) */ if (ix < 0x40862E42) return half*__ieee754_exp(fabs(x)); /* |x| in [log(maxdouble), overflowthresold] */ lx = *( (((*(unsigned*)&one)>>29)) + (unsigned*)&x); if (ix<0x408633CE || (ix==0x408633ce)&&(lx<=(unsigned)0x8fb9f87d)) { w = __ieee754_exp(half*fabs(x)); t = half*w; return t*w; } /* |x| > overflowthresold, cosh(x) overflow */ return Huge*Huge; } p = 2.0*s*r-(pio2_lo-2.0*c); q = pio4_hi-2.0*w; t = pio4_hi-(p-q); } if(hx>0) return t; else return -t; } ����������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_exp.c������������������������������������������ 664 � 0 � 0 � 11526 6622405623 22661�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_exp.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_exp(x) * Returns the exponential of x. * * Method * 1. Argument reduction: * Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658. * Given x, find r and integer k such that * * x = k*ln2 + r, |r| <= 0.5*ln2. * * Here r will be represented as r = hi-lo for better * accuracy. * * 2. Approximation of exp(r) by a special rational function on * the interval [0,0.34658]: * Write * R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ... * We use a special Reme algorithm on [0,0.34658] to generate * a polynomial of degree 5 to approximate R. The maximum error * of this polynomial approximation is bounded by 2**-59. In * other words, * R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5 * (where z=r*r, and the values of P1 to P5 are listed below) * and * | 5 | -59 * | 2.0+P1*z+...+P5*z - R(z) | <= 2 * | | * The computation of exp(r) thus becomes * 2*r * exp(r) = 1 + ------- * R - r * r*R1(r) * = 1 + r + ----------- (for better accuracy) * 2 - R1(r) * where * 2 4 10 * R1(r) = r - (P1*r + P2*r + ... + P5*r ). * * 3. Scale back to obtain exp(x): * From step 1, we have * exp(x) = 2^k * exp(r) * * Special cases: * exp(INF) is INF, exp(NaN) is NaN; * exp(-INF) is 0, and * for finite argument, only exp(0)=1 is exact. * * Accuracy: * according to an error analysis, the error is always less than * 1 ulp (unit in the last place). * * Misc. info. * For IEEE double * if x > 7.09782712893383973096e+02 then exp(x) overflow * if x < -7.45133219101941108420e+02 then exp(x) underflow * * Constants: * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include "fdlibm.h" static const double one = 1.0, halF[2] = {0.5,-0.5,}, Huge = 1.0e+300, twom1000= 9.33263618503218878990e-302, /* 2**-1000=0x01700000,0*/ o_threshold= 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */ u_threshold= -7.45133219101941108420e+02, /* 0xc0874910, 0xD52D3051 */ ln2HI[2] ={ 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */ -6.93147180369123816490e-01,},/* 0xbfe62e42, 0xfee00000 */ ln2LO[2] ={ 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */ -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */ invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */ double __ieee754_exp(double x) /* default IEEE double exp */ { double y,hi,lo,c,t; int k,xsb; unsigned hx; hx = __HI(x); /* high word of x */ xsb = (hx>>31)&1; /* sign bit of x */ hx &= 0x7fffffff; /* high word of |x| */ /* filter out non-finite argument */ if(hx >= 0x40862E42) { /* if |x|>=709.78... */ if(hx>=0x7ff00000) { if(((hx&0xfffff)|__LO(x))!=0) return x+x; /* NaN */ else return (xsb==0)? x:0.0; /* exp(+-inf)={inf,0} */ } if(x > o_threshold) return Huge*Huge; /* overflow */ if(x < u_threshold) return twom1000*twom1000; /* underflow */ } /* argument reduction */ if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb; } else { k = invln2*x+halF[xsb]; t = k; hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */ lo = t*ln2LO[0]; } x = hi - lo; } else if(hx < 0x3e300000) { /* when |x|<2**-28 */ if(Huge+x>one) return one+x;/* trigger inexact */ } else k = 0; /* x is now in primary range */ t = x*x; c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); if(k==0) return one-((x*c)/(c-2.0)-x); else y = one-((lo-(x*c)/(2.0-c))-hi); if(k >= -1021) { __HI(y) += (k<<20); /* add k to y's exponent */ return y; } else { __HI(y) += ((k+1000)<<20);/* add k to y's exponent */ return y*twom1000; } } ed, provided that this notice * is preserved. * ==================================================== * */ /* __ieee754_atanh(x) * Method : * 1.Reduced x to posold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_fmod.c����������������������������������������� 664 � 0 � 0 � 6462 6622405623 22775�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_fmod.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * __ieee754_fmod(x,y) * Return x mod y in exact arithmetic * Method: shift and subtract */ #include "fdlibm.h" static const double one = 1.0, Zero[] = {0.0, -0.0,}; double __ieee754_fmod(double x, double y) { int n,hx,hy,hz,ix,iy,sx,i; unsigned lx,ly,lz; hx = __HI(x); /* high word of x */ lx = __LO(x); /* low word of x */ hy = __HI(y); /* high word of y */ ly = __LO(y); /* low word of y */ sx = hx&0x80000000; /* sign of x */ hx ^=sx; /* |x| */ hy &= 0x7fffffff; /* |y| */ /* purge off exception values */ if((hy|ly)==0||(hx>=0x7ff00000)|| /* y=0,or x not finite */ ((hy|((ly|-ly)>>31))>0x7ff00000)) /* or y is NaN */ return (x*y)/(x*y); if(hx<=hy) { if((hx<hy)||(lx<ly)) return x; /* |x|<|y| return x */ if(lx==ly) return Zero[(unsigned)sx>>31]; /* |x|=|y| return x*0*/ } /* determine ix = ilogb(x) */ if(hx<0x00100000) { /* subnormal x */ if(hx==0) { for (ix = -1043, i=lx; i>0; i<<=1) ix -=1; } else { for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1; } } else ix = (hx>>20)-1023; /* determine iy = ilogb(y) */ if(hy<0x00100000) { /* subnormal y */ if(hy==0) { for (iy = -1043, i=ly; i>0; i<<=1) iy -=1; } else { for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1; } } else iy = (hy>>20)-1023; /* set up {hx,lx}, {hy,ly} and align y to x */ if(ix >= -1022) hx = 0x00100000|(0x000fffff&hx); else { /* subnormal x, shift x to normal */ n = -1022-ix; if(n<=31) { hx = (hx<<n)|(lx>>(32-n)); lx <<= n; } else { hx = lx<<(n-32); lx = 0; } } if(iy >= -1022) hy = 0x00100000|(0x000fffff&hy); else { /* subnormal y, shift y to normal */ n = -1022-iy; if(n<=31) { hy = (hy<<n)|(ly>>(32-n)); ly <<= n; } else { hy = ly<<(n-32); ly = 0; } } /* fix point fmod */ n = ix - iy; while(n--) { hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1; if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;} else { if((hz|lz)==0) /* return sign(x)*0 */ return Zero[(unsigned)sx>>31]; hx = hz+hz+(lz>>31); lx = lz+lz; } } hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1; if(hz>=0) {hx=hz;lx=lz;} /* convert back to floating value and restore the sign */ if((hx|lx)==0) /* return sign(x)*0 */ return Zero[(unsigned)sx>>31]; while(hx<0x00100000) { /* normalize x */ hx = hx+hx+(lx>>31); lx = lx+lx; iy -= 1; } if(iy>= -1022) { /* normalize output */ hx = ((hx-0x00100000)|((iy+1023)<<20)); __HI(x) = hx|sx; __LO(x) = lx; } else { /* subnormal output */ n = -1022 - iy; if(n<=20) { lx = (lx>>n)|((unsigned)hx<<(32-n)); hx >>= n; } else if (n<=31) { lx = (hx<<(32-n))|(lx>>n); hx = sx; } else { lx = hx>>(n-32); hx = sx; } __HI(x) = hx|sx; __LO(x) = lx; x *= one; /* create necessary signal */ } return x; /* exact output */ } } /* |x| in [22, log(maxdouble)] return half*exp(|x|) */ if (ix < 0x40862E42) return half*__ieee754_exp(fabs(x)); /* |x| in [log(maxdouble), overflowthresold] */ lx = *( (((*(unsigned*)&one)>>old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_hypot.c���������������������������������������� 664 � 0 � 0 � 5641 6622405623 23211�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_hypot.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_hypot(x,y) * * Method : * If (assume round-to-nearest) z=x*x+y*y * has error less than sqrt(2)/2 ulp, than * sqrt(z) has error less than 1 ulp (exercise). * * So, compute sqrt(x*x+y*y) with some care as * follows to get the error below 1 ulp: * * Assume x>y>0; * (if possible, set rounding to round-to-nearest) * 1. if x > 2y use * x1*x1+(y*y+(x2*(x+x1))) for x*x+y*y * where x1 = x with lower 32 bits cleared, x2 = x-x1; else * 2. if x <= 2y use * t1*y1+((x-y)*(x-y)+(t1*y2+t2*y)) * where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1, * y1= y with lower 32 bits chopped, y2 = y-y1. * * NOTE: scaling may be necessary if some argument is too * large or too tiny * * Special cases: * hypot(x,y) is INF if x or y is +INF or -INF; else * hypot(x,y) is NAN if x or y is NAN. * * Accuracy: * hypot(x,y) returns sqrt(x^2+y^2) with error less * than 1 ulps (units in the last place) */ #include "fdlibm.h" double __ieee754_hypot(double x, double y) { double a=x,b=y,t1,t2,y1,y2,w; int j,k,ha,hb; ha = __HI(x)&0x7fffffff; /* high word of x */ hb = __HI(y)&0x7fffffff; /* high word of y */ if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;} __HI(a) = ha; /* a <- |a| */ __HI(b) = hb; /* b <- |b| */ if((ha-hb)>0x3c00000) {return a+b;} /* x/y > 2**60 */ k=0; if(ha > 0x5f300000) { /* a>2**500 */ if(ha >= 0x7ff00000) { /* Inf or NaN */ w = a+b; /* for sNaN */ if(((ha&0xfffff)|__LO(a))==0) w = a; if(((hb^0x7ff00000)|__LO(b))==0) w = b; return w; } /* scale a and b by 2**-600 */ ha -= 0x25800000; hb -= 0x25800000; k += 600; __HI(a) = ha; __HI(b) = hb; } if(hb < 0x20b00000) { /* b < 2**-500 */ if(hb <= 0x000fffff) { /* subnormal b or 0 */ if((hb|(__LO(b)))==0) return a; t1=0; __HI(t1) = 0x7fd00000; /* t1=2^1022 */ b *= t1; a *= t1; k -= 1022; } else { /* scale a and b by 2^600 */ ha += 0x25800000; /* a *= 2^600 */ hb += 0x25800000; /* b *= 2^600 */ k -= 600; __HI(a) = ha; __HI(b) = hb; } } /* medium size a and b */ w = a-b; if (w>b) { t1 = 0; __HI(t1) = ha; t2 = a-t1; w = sqrt(t1*t1-(b*(-b)-t2*(a+t1))); } else { a = a+a; y1 = 0; __HI(y1) = hb; y2 = b - y1; t1 = 0; __HI(t1) = ha+0x00100000; t2 = a - t1; w = sqrt(t1*y1-(w*(-w)-(t1*y2+t2*b))); } if(k!=0) { t1 = 1.0; __HI(t1) += (k<<20); return t1*w; } else return w; } decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_j0.c������������������������������������������� 664 � 0 � 0 � 34111 6622405623 22371�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_j0.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_j0(x), __ieee754_y0(x) * Bessel function of the first and second kinds of order zero. * Method -- j0(x): * 1. For tiny x, we use j0(x) = 1 - x^2/4 + x^4/64 - ... * 2. Reduce x to |x| since j0(x)=j0(-x), and * for x in (0,2) * j0(x) = 1-z/4+ z^2*R0/S0, where z = x*x; * (precision: |j0-1+z/4-z^2R0/S0 |<2**-63.67 ) * for x in (2,inf) * j0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)-q0(x)*sin(x0)) * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) * as follow: * cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) * = 1/sqrt(2) * (cos(x) + sin(x)) * sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4) * = 1/sqrt(2) * (sin(x) - cos(x)) * (To avoid cancellation, use * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) * to compute the worse one.) * * 3 Special cases * j0(nan)= nan * j0(0) = 1 * j0(inf) = 0 * * Method -- y0(x): * 1. For x<2. * Since * y0(x) = 2/pi*(j0(x)*(ln(x/2)+Euler) + x^2/4 - ...) * therefore y0(x)-2/pi*j0(x)*ln(x) is an even function. * We use the following function to approximate y0, * y0(x) = U(z)/V(z) + (2/pi)*(j0(x)*ln(x)), z= x^2 * where * U(z) = u00 + u01*z + ... + u06*z^6 * V(z) = 1 + v01*z + ... + v04*z^4 * with absolute approximation error bounded by 2**-72. * Note: For tiny x, U/V = u0 and j0(x)~1, hence * y0(tiny) = u0 + (2/pi)*ln(tiny), (choose tiny<2**-27) * 2. For x>=2. * y0(x) = sqrt(2/(pi*x))*(p0(x)*cos(x0)+q0(x)*sin(x0)) * where x0 = x-pi/4. It is better to compute sin(x0),cos(x0) * by the method mentioned above. * 3. Special cases: y0(0)=-inf, y0(x<0)=NaN, y0(inf)=0. */ #include "fdlibm.h" static double pzero(double), qzero(double); static const double Huge = 1e300, one = 1.0, invsqrtpi= 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */ tpi = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */ /* R0/S0 on [0, 2.00] */ R02 = 1.56249999999999947958e-02, /* 0x3F8FFFFF, 0xFFFFFFFD */ R03 = -1.89979294238854721751e-04, /* 0xBF28E6A5, 0xB61AC6E9 */ R04 = 1.82954049532700665670e-06, /* 0x3EBEB1D1, 0x0C503919 */ R05 = -4.61832688532103189199e-09, /* 0xBE33D5E7, 0x73D63FCE */ S01 = 1.56191029464890010492e-02, /* 0x3F8FFCE8, 0x82C8C2A4 */ S02 = 1.16926784663337450260e-04, /* 0x3F1EA6D2, 0xDD57DBF4 */ S03 = 5.13546550207318111446e-07, /* 0x3EA13B54, 0xCE84D5A9 */ S04 = 1.16614003333790000205e-09; /* 0x3E1408BC, 0xF4745D8F */ static double zero = 0.0; double __ieee754_j0(double x) { double z, s,c,ss,cc,r,u,v; int hx,ix; hx = __HI(x); ix = hx&0x7fffffff; if(ix>=0x7ff00000) return one/(x*x); x = fabs(x); if(ix >= 0x40000000) { /* |x| >= 2.0 */ s = sin(x); c = cos(x); ss = s-c; cc = s+c; if(ix<0x7fe00000) { /* make sure x+x not overflow */ z = -cos(x+x); if ((s*c)<zero) cc = z/ss; else ss = z/cc; } /* * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x) * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x) */ if(ix>0x48000000) z = (invsqrtpi*cc)/sqrt(x); else { u = pzero(x); v = qzero(x); z = invsqrtpi*(u*cc-v*ss)/sqrt(x); } return z; } if(ix<0x3f200000) { /* |x| < 2**-13 */ if(Huge+x>one) { /* raise inexact if x != 0 */ if(ix<0x3e400000) return one; /* |x|<2**-27 */ else return one - 0.25*x*x; } } z = x*x; r = z*(R02+z*(R03+z*(R04+z*R05))); s = one+z*(S01+z*(S02+z*(S03+z*S04))); if(ix < 0x3FF00000) { /* |x| < 1.00 */ return one + z*(-0.25+(r/s)); } else { u = 0.5*x; return((one+u)*(one-u)+z*(r/s)); } } static const double u00 = -7.38042951086872317523e-02, /* 0xBFB2E4D6, 0x99CBD01F */ u01 = 1.76666452509181115538e-01, /* 0x3FC69D01, 0x9DE9E3FC */ u02 = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */ u03 = 3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */ u04 = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */ u05 = 1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */ u06 = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */ v01 = 1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */ v02 = 7.60068627350353253702e-05, /* 0x3F13ECBB, 0xF578C6C1 */ v03 = 2.59150851840457805467e-07, /* 0x3E91642D, 0x7FF202FD */ v04 = 4.41110311332675467403e-10; /* 0x3DFE5018, 0x3BD6D9EF */ double __ieee754_y0(double x) { double z, s,c,ss,cc,u,v; int hx,ix,lx; hx = __HI(x); ix = 0x7fffffff&hx; lx = __LO(x); /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */ if(ix>=0x7ff00000) return one/(x+x*x); if((ix|lx)==0) return -one/zero; if(hx<0) return zero/zero; if(ix >= 0x40000000) { /* |x| >= 2.0 */ /* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0)) * where x0 = x-pi/4 * Better formula: * cos(x0) = cos(x)cos(pi/4)+sin(x)sin(pi/4) * = 1/sqrt(2) * (sin(x) + cos(x)) * sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) * = 1/sqrt(2) * (sin(x) - cos(x)) * To avoid cancellation, use * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) * to compute the worse one. */ s = sin(x); c = cos(x); ss = s-c; cc = s+c; /* * j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x) * y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x) */ if(ix<0x7fe00000) { /* make sure x+x not overflow */ z = -cos(x+x); if ((s*c)<zero) cc = z/ss; else ss = z/cc; } if(ix>0x48000000) z = (invsqrtpi*ss)/sqrt(x); else { u = pzero(x); v = qzero(x); z = invsqrtpi*(u*ss+v*cc)/sqrt(x); } return z; } if(ix<=0x3e400000) { /* x < 2**-27 */ return(u00 + tpi*__ieee754_log(x)); } z = x*x; u = u00+z*(u01+z*(u02+z*(u03+z*(u04+z*(u05+z*u06))))); v = one+z*(v01+z*(v02+z*(v03+z*v04))); return(u/v + tpi*(__ieee754_j0(x)*__ieee754_log(x))); } /* The asymptotic expansions of pzero is * 1 - 9/128 s^2 + 11025/98304 s^4 - ..., where s = 1/x. * For x >= 2, We approximate pzero by * pzero(x) = 1 + (R/S) * where R = pR0 + pR1*s^2 + pR2*s^4 + ... + pR5*s^10 * S = 1 + pS0*s^2 + ... + pS4*s^10 * and * | pzero(x)-1-R/S | <= 2 ** ( -60.26) */ static const double pR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ -7.03124999999900357484e-02, /* 0xBFB1FFFF, 0xFFFFFD32 */ -8.08167041275349795626e+00, /* 0xC02029D0, 0xB44FA779 */ -2.57063105679704847262e+02, /* 0xC0701102, 0x7B19E863 */ -2.48521641009428822144e+03, /* 0xC0A36A6E, 0xCD4DCAFC */ -5.25304380490729545272e+03, /* 0xC0B4850B, 0x36CC643D */ }; static const double pS8[5] = { 1.16534364619668181717e+02, /* 0x405D2233, 0x07A96751 */ 3.83374475364121826715e+03, /* 0x40ADF37D, 0x50596938 */ 4.05978572648472545552e+04, /* 0x40E3D2BB, 0x6EB6B05F */ 1.16752972564375915681e+05, /* 0x40FC810F, 0x8F9FA9BD */ 4.76277284146730962675e+04, /* 0x40E74177, 0x4F2C49DC */ }; static const double pR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ -1.14125464691894502584e-11, /* 0xBDA918B1, 0x47E495CC */ -7.03124940873599280078e-02, /* 0xBFB1FFFF, 0xE69AFBC6 */ -4.15961064470587782438e+00, /* 0xC010A370, 0xF90C6BBF */ -6.76747652265167261021e+01, /* 0xC050EB2F, 0x5A7D1783 */ -3.31231299649172967747e+02, /* 0xC074B3B3, 0x6742CC63 */ -3.46433388365604912451e+02, /* 0xC075A6EF, 0x28A38BD7 */ }; static const double pS5[5] = { 6.07539382692300335975e+01, /* 0x404E6081, 0x0C98C5DE */ 1.05125230595704579173e+03, /* 0x40906D02, 0x5C7E2864 */ 5.97897094333855784498e+03, /* 0x40B75AF8, 0x8FBE1D60 */ 9.62544514357774460223e+03, /* 0x40C2CCB8, 0xFA76FA38 */ 2.40605815922939109441e+03, /* 0x40A2CC1D, 0xC70BE864 */ }; static const double pR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ -2.54704601771951915620e-09, /* 0xBE25E103, 0x6FE1AA86 */ -7.03119616381481654654e-02, /* 0xBFB1FFF6, 0xF7C0E24B */ -2.40903221549529611423e+00, /* 0xC00345B2, 0xAEA48074 */ -2.19659774734883086467e+01, /* 0xC035F74A, 0x4CB94E14 */ -5.80791704701737572236e+01, /* 0xC04D0A22, 0x420A1A45 */ -3.14479470594888503854e+01, /* 0xC03F72AC, 0xA892D80F */ }; static const double pS3[5] = { 3.58560338055209726349e+01, /* 0x4041ED92, 0x84077DD3 */ 3.61513983050303863820e+02, /* 0x40769839, 0x464A7C0E */ 1.19360783792111533330e+03, /* 0x4092A66E, 0x6D1061D6 */ 1.12799679856907414432e+03, /* 0x40919FFC, 0xB8C39B7E */ 1.73580930813335754692e+02, /* 0x4065B296, 0xFC379081 */ }; static const double pR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ -8.87534333032526411254e-08, /* 0xBE77D316, 0xE927026D */ -7.03030995483624743247e-02, /* 0xBFB1FF62, 0x495E1E42 */ -1.45073846780952986357e+00, /* 0xBFF73639, 0x8A24A843 */ -7.63569613823527770791e+00, /* 0xC01E8AF3, 0xEDAFA7F3 */ -1.11931668860356747786e+01, /* 0xC02662E6, 0xC5246303 */ -3.23364579351335335033e+00, /* 0xC009DE81, 0xAF8FE70F */ }; static const double pS2[5] = { 2.22202997532088808441e+01, /* 0x40363865, 0x908B5959 */ 1.36206794218215208048e+02, /* 0x4061069E, 0x0EE8878F */ 2.70470278658083486789e+02, /* 0x4070E786, 0x42EA079B */ 1.53875394208320329881e+02, /* 0x40633C03, 0x3AB6FAFF */ 1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */ }; static double pzero(double x) { const double *p,*q; double z,r,s; int ix; ix = 0x7fffffff&__HI(x); if(ix>=0x40200000) {p = pR8; q= pS8;} else if(ix>=0x40122E8B){p = pR5; q= pS5;} else if(ix>=0x4006DB6D){p = pR3; q= pS3;} else if(ix>=0x40000000){p = pR2; q= pS2;} z = one/(x*x); r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); return one+ r/s; } /* For x >= 8, the asymptotic expansions of qzero is * -1/8 s + 75/1024 s^3 - ..., where s = 1/x. * We approximate pzero by * qzero(x) = s*(-1.25 + (R/S)) * where R = qR0 + qR1*s^2 + qR2*s^4 + ... + qR5*s^10 * S = 1 + qS0*s^2 + ... + qS5*s^12 * and * | qzero(x)/s +1.25-R/S | <= 2 ** ( -61.22) */ static const double qR8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ 7.32421874999935051953e-02, /* 0x3FB2BFFF, 0xFFFFFE2C */ 1.17682064682252693899e+01, /* 0x40278952, 0x5BB334D6 */ 5.57673380256401856059e+02, /* 0x40816D63, 0x15301825 */ 8.85919720756468632317e+03, /* 0x40C14D99, 0x3E18F46D */ 3.70146267776887834771e+04, /* 0x40E212D4, 0x0E901566 */ }; static const double qS8[6] = { 1.63776026895689824414e+02, /* 0x406478D5, 0x365B39BC */ 8.09834494656449805916e+03, /* 0x40BFA258, 0x4E6B0563 */ 1.42538291419120476348e+05, /* 0x41016652, 0x54D38C3F */ 8.03309257119514397345e+05, /* 0x412883DA, 0x83A52B43 */ 8.40501579819060512818e+05, /* 0x4129A66B, 0x28DE0B3D */ -3.43899293537866615225e+05, /* 0xC114FD6D, 0x2C9530C5 */ }; static const double qR5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ 1.84085963594515531381e-11, /* 0x3DB43D8F, 0x29CC8CD9 */ 7.32421766612684765896e-02, /* 0x3FB2BFFF, 0xD172B04C */ 5.83563508962056953777e+00, /* 0x401757B0, 0xB9953DD3 */ 1.35111577286449829671e+02, /* 0x4060E392, 0x0A8788E9 */ 1.02724376596164097464e+03, /* 0x40900CF9, 0x9DC8C481 */ 1.98997785864605384631e+03, /* 0x409F17E9, 0x53C6E3A6 */ }; static const double qS5[6] = { 8.27766102236537761883e+01, /* 0x4054B1B3, 0xFB5E1543 */ 2.07781416421392987104e+03, /* 0x40A03BA0, 0xDA21C0CE */ 1.88472887785718085070e+04, /* 0x40D267D2, 0x7B591E6D */ 5.67511122894947329769e+04, /* 0x40EBB5E3, 0x97E02372 */ 3.59767538425114471465e+04, /* 0x40E19118, 0x1F7A54A0 */ -5.35434275601944773371e+03, /* 0xC0B4EA57, 0xBEDBC609 */ }; static const double qR3[6] = {/* for x in [4.547,2.8571]=1/[0.2199,0.35001] */ 4.37741014089738620906e-09, /* 0x3E32CD03, 0x6ADECB82 */ 7.32411180042911447163e-02, /* 0x3FB2BFEE, 0x0E8D0842 */ 3.34423137516170720929e+00, /* 0x400AC0FC, 0x61149CF5 */ 4.26218440745412650017e+01, /* 0x40454F98, 0x962DAEDD */ 1.70808091340565596283e+02, /* 0x406559DB, 0xE25EFD1F */ 1.66733948696651168575e+02, /* 0x4064D77C, 0x81FA21E0 */ }; static const double qS3[6] = { 4.87588729724587182091e+01, /* 0x40486122, 0xBFE343A6 */ 7.09689221056606015736e+02, /* 0x40862D83, 0x86544EB3 */ 3.70414822620111362994e+03, /* 0x40ACF04B, 0xE44DFC63 */ 6.46042516752568917582e+03, /* 0x40B93C6C, 0xD7C76A28 */ 2.51633368920368957333e+03, /* 0x40A3A8AA, 0xD94FB1C0 */ -1.49247451836156386662e+02, /* 0xC062A7EB, 0x201CF40F */ }; static const double qR2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ 1.50444444886983272379e-07, /* 0x3E84313B, 0x54F76BDB */ 7.32234265963079278272e-02, /* 0x3FB2BEC5, 0x3E883E34 */ 1.99819174093815998816e+00, /* 0x3FFFF897, 0xE727779C */ 1.44956029347885735348e+01, /* 0x402CFDBF, 0xAAF96FE5 */ 3.16662317504781540833e+01, /* 0x403FAA8E, 0x29FBDC4A */ 1.62527075710929267416e+01, /* 0x403040B1, 0x71814BB4 */ }; static const double qS2[6] = { 3.03655848355219184498e+01, /* 0x403E5D96, 0xF7C07AED */ 2.69348118608049844624e+02, /* 0x4070D591, 0xE4D14B40 */ 8.44783757595320139444e+02, /* 0x408A6645, 0x22B3BF22 */ 8.82935845112488550512e+02, /* 0x408B977C, 0x9C5CC214 */ 2.12666388511798828631e+02, /* 0x406A9553, 0x0E001365 */ -5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */ }; static double qzero(double x) { const double *p,*q; double s,r,z; int ix; ix = 0x7fffffff&__HI(x); if(ix>=0x40200000) {p = qR8; q= qS8;} else if(ix>=0x40122E8B){p = qR5; q= qS5;} else if(ix>=0x4006DB6D){p = qR3; q= qS3;} else if(ix>=0x40000000){p = qR2; q= qS2;} z = one/(x*x); r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); return (-.125 + r/s)/x; } E3FC */ u02 = -1.38185671945596898896e-02, /* 0xBF8C4CE8, 0xB16CFA97 */ u03 = 3.47453432093683650238e-04, /* 0x3F36C54D, 0x20B29B6B */ u04 = -3.81407053724364161125e-06, /* 0xBECFFEA7, 0x73D25CAD */ u05 = 1.95590137035022920206e-08, /* 0x3E550057, 0x3B4EABD4 */ u06 = -3.98205194132103398453e-11, /* 0xBDC5E43D, 0x693FB3C8 */ v01 = 1.27304834834123699328e-02, /* 0x3F8A1270, 0x91C9C71A */ v02 = 7.60068627350353253702e-05, /* 0xold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_j1.c������������������������������������������� 664 � 0 � 0 � 33550 6622405623 22400�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_j1.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_j1(x), __ieee754_y1(x) * Bessel function of the first and second kinds of order zero. * Method -- j1(x): * 1. For tiny x, we use j1(x) = x/2 - x^3/16 + x^5/384 - ... * 2. Reduce x to |x| since j1(x)=-j1(-x), and * for x in (0,2) * j1(x) = x/2 + x*z*R0/S0, where z = x*x; * (precision: |j1/x - 1/2 - R0/S0 |<2**-61.51 ) * for x in (2,inf) * j1(x) = sqrt(2/(pi*x))*(p1(x)*cos(x1)-q1(x)*sin(x1)) * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) * as follow: * cos(x1) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4) * = 1/sqrt(2) * (sin(x) - cos(x)) * sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) * = -1/sqrt(2) * (sin(x) + cos(x)) * (To avoid cancellation, use * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) * to compute the worse one.) * * 3 Special cases * j1(nan)= nan * j1(0) = 0 * j1(inf) = 0 * * Method -- y1(x): * 1. screen out x<=0 cases: y1(0)=-inf, y1(x<0)=NaN * 2. For x<2. * Since * y1(x) = 2/pi*(j1(x)*(ln(x/2)+Euler)-1/x-x/2+5/64*x^3-...) * therefore y1(x)-2/pi*j1(x)*ln(x)-1/x is an odd function. * We use the following function to approximate y1, * y1(x) = x*U(z)/V(z) + (2/pi)*(j1(x)*ln(x)-1/x), z= x^2 * where for x in [0,2] (abs err less than 2**-65.89) * U(z) = U0[0] + U0[1]*z + ... + U0[4]*z^4 * V(z) = 1 + v0[0]*z + ... + v0[4]*z^5 * Note: For tiny x, 1/x dominate y1 and hence * y1(tiny) = -2/pi/tiny, (choose tiny<2**-54) * 3. For x>=2. * y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x1)+q1(x)*cos(x1)) * where x1 = x-3*pi/4. It is better to compute sin(x1),cos(x1) * by method mentioned above. */ #include "fdlibm.h" static double pone(double), qone(double); static const double Huge = 1e300, one = 1.0, invsqrtpi= 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */ tpi = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */ /* R0/S0 on [0,2] */ r00 = -6.25000000000000000000e-02, /* 0xBFB00000, 0x00000000 */ r01 = 1.40705666955189706048e-03, /* 0x3F570D9F, 0x98472C61 */ r02 = -1.59955631084035597520e-05, /* 0xBEF0C5C6, 0xBA169668 */ r03 = 4.96727999609584448412e-08, /* 0x3E6AAAFA, 0x46CA0BD9 */ s01 = 1.91537599538363460805e-02, /* 0x3F939D0B, 0x12637E53 */ s02 = 1.85946785588630915560e-04, /* 0x3F285F56, 0xB9CDF664 */ s03 = 1.17718464042623683263e-06, /* 0x3EB3BFF8, 0x333F8498 */ s04 = 5.04636257076217042715e-09, /* 0x3E35AC88, 0xC97DFF2C */ s05 = 1.23542274426137913908e-11; /* 0x3DAB2ACF, 0xCFB97ED8 */ static double zero = 0.0; double __ieee754_j1(double x) { double z, s,c,ss,cc,r,u,v,y; int hx,ix; hx = __HI(x); ix = hx&0x7fffffff; if(ix>=0x7ff00000) return one/x; y = fabs(x); if(ix >= 0x40000000) { /* |x| >= 2.0 */ s = sin(y); c = cos(y); ss = -s-c; cc = s-c; if(ix<0x7fe00000) { /* make sure y+y not overflow */ z = cos(y+y); if ((s*c)>zero) cc = z/ss; else ss = z/cc; } /* * j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x) * y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x) */ if(ix>0x48000000) z = (invsqrtpi*cc)/sqrt(y); else { u = pone(y); v = qone(y); z = invsqrtpi*(u*cc-v*ss)/sqrt(y); } if(hx<0) return -z; else return z; } if(ix<0x3e400000) { /* |x|<2**-27 */ if(Huge+x>one) return 0.5*x;/* inexact if x!=0 necessary */ } z = x*x; r = z*(r00+z*(r01+z*(r02+z*r03))); s = one+z*(s01+z*(s02+z*(s03+z*(s04+z*s05)))); r *= x; return(x*0.5+r/s); } static const double U0[5] = { -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */ 5.04438716639811282616e-02, /* 0x3FA9D3C7, 0x76292CD1 */ -1.91256895875763547298e-03, /* 0xBF5F55E5, 0x4844F50F */ 2.35252600561610495928e-05, /* 0x3EF8AB03, 0x8FA6B88E */ -9.19099158039878874504e-08, /* 0xBE78AC00, 0x569105B8 */ }; static const double V0[5] = { 1.99167318236649903973e-02, /* 0x3F94650D, 0x3F4DA9F0 */ 2.02552581025135171496e-04, /* 0x3F2A8C89, 0x6C257764 */ 1.35608801097516229404e-06, /* 0x3EB6C05A, 0x894E8CA6 */ 6.22741452364621501295e-09, /* 0x3E3ABF1D, 0x5BA69A86 */ 1.66559246207992079114e-11, /* 0x3DB25039, 0xDACA772A */ }; double __ieee754_y1(double x) { double z, s,c,ss,cc,u,v; int hx,ix,lx; hx = __HI(x); ix = 0x7fffffff&hx; lx = __LO(x); /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */ if(ix>=0x7ff00000) return one/(x+x*x); if((ix|lx)==0) return -one/zero; if(hx<0) return zero/zero; if(ix >= 0x40000000) { /* |x| >= 2.0 */ s = sin(x); c = cos(x); ss = -s-c; cc = s-c; if(ix<0x7fe00000) { /* make sure x+x not overflow */ z = cos(x+x); if ((s*c)>zero) cc = z/ss; else ss = z/cc; } /* y1(x) = sqrt(2/(pi*x))*(p1(x)*sin(x0)+q1(x)*cos(x0)) * where x0 = x-3pi/4 * Better formula: * cos(x0) = cos(x)cos(3pi/4)+sin(x)sin(3pi/4) * = 1/sqrt(2) * (sin(x) - cos(x)) * sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) * = -1/sqrt(2) * (cos(x) + sin(x)) * To avoid cancellation, use * sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) * to compute the worse one. */ if(ix>0x48000000) z = (invsqrtpi*ss)/sqrt(x); else { u = pone(x); v = qone(x); z = invsqrtpi*(u*ss+v*cc)/sqrt(x); } return z; } if(ix<=0x3c900000) { /* x < 2**-54 */ return(-tpi/x); } z = x*x; u = U0[0]+z*(U0[1]+z*(U0[2]+z*(U0[3]+z*U0[4]))); v = one+z*(V0[0]+z*(V0[1]+z*(V0[2]+z*(V0[3]+z*V0[4])))); return(x*(u/v) + tpi*(__ieee754_j1(x)*__ieee754_log(x)-one/x)); } /* For x >= 8, the asymptotic expansions of pone is * 1 + 15/128 s^2 - 4725/2^15 s^4 - ..., where s = 1/x. * We approximate pone by * pone(x) = 1 + (R/S) * where R = pr0 + pr1*s^2 + pr2*s^4 + ... + pr5*s^10 * S = 1 + ps0*s^2 + ... + ps4*s^10 * and * | pone(x)-1-R/S | <= 2 ** ( -60.06) */ static const double pr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ 1.17187499999988647970e-01, /* 0x3FBDFFFF, 0xFFFFFCCE */ 1.32394806593073575129e+01, /* 0x402A7A9D, 0x357F7FCE */ 4.12051854307378562225e+02, /* 0x4079C0D4, 0x652EA590 */ 3.87474538913960532227e+03, /* 0x40AE457D, 0xA3A532CC */ 7.91447954031891731574e+03, /* 0x40BEEA7A, 0xC32782DD */ }; static const double ps8[5] = { 1.14207370375678408436e+02, /* 0x405C8D45, 0x8E656CAC */ 3.65093083420853463394e+03, /* 0x40AC85DC, 0x964D274F */ 3.69562060269033463555e+04, /* 0x40E20B86, 0x97C5BB7F */ 9.76027935934950801311e+04, /* 0x40F7D42C, 0xB28F17BB */ 3.08042720627888811578e+04, /* 0x40DE1511, 0x697A0B2D */ }; static const double pr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ 1.31990519556243522749e-11, /* 0x3DAD0667, 0xDAE1CA7D */ 1.17187493190614097638e-01, /* 0x3FBDFFFF, 0xE2C10043 */ 6.80275127868432871736e+00, /* 0x401B3604, 0x6E6315E3 */ 1.08308182990189109773e+02, /* 0x405B13B9, 0x452602ED */ 5.17636139533199752805e+02, /* 0x40802D16, 0xD052D649 */ 5.28715201363337541807e+02, /* 0x408085B8, 0xBB7E0CB7 */ }; static const double ps5[5] = { 5.92805987221131331921e+01, /* 0x404DA3EA, 0xA8AF633D */ 9.91401418733614377743e+02, /* 0x408EFB36, 0x1B066701 */ 5.35326695291487976647e+03, /* 0x40B4E944, 0x5706B6FB */ 7.84469031749551231769e+03, /* 0x40BEA4B0, 0xB8A5BB15 */ 1.50404688810361062679e+03, /* 0x40978030, 0x036F5E51 */ }; static const double pr3[6] = { 3.02503916137373618024e-09, /* 0x3E29FC21, 0xA7AD9EDD */ 1.17186865567253592491e-01, /* 0x3FBDFFF5, 0x5B21D17B */ 3.93297750033315640650e+00, /* 0x400F76BC, 0xE85EAD8A */ 3.51194035591636932736e+01, /* 0x40418F48, 0x9DA6D129 */ 9.10550110750781271918e+01, /* 0x4056C385, 0x4D2C1837 */ 4.85590685197364919645e+01, /* 0x4048478F, 0x8EA83EE5 */ }; static const double ps3[5] = { 3.47913095001251519989e+01, /* 0x40416549, 0xA134069C */ 3.36762458747825746741e+02, /* 0x40750C33, 0x07F1A75F */ 1.04687139975775130551e+03, /* 0x40905B7C, 0x5037D523 */ 8.90811346398256432622e+02, /* 0x408BD67D, 0xA32E31E9 */ 1.03787932439639277504e+02, /* 0x4059F26D, 0x7C2EED53 */ }; static const double pr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ 1.07710830106873743082e-07, /* 0x3E7CE9D4, 0xF65544F4 */ 1.17176219462683348094e-01, /* 0x3FBDFF42, 0xBE760D83 */ 2.36851496667608785174e+00, /* 0x4002F2B7, 0xF98FAEC0 */ 1.22426109148261232917e+01, /* 0x40287C37, 0x7F71A964 */ 1.76939711271687727390e+01, /* 0x4031B1A8, 0x177F8EE2 */ 5.07352312588818499250e+00, /* 0x40144B49, 0xA574C1FE */ }; static const double ps2[5] = { 2.14364859363821409488e+01, /* 0x40356FBD, 0x8AD5ECDC */ 1.25290227168402751090e+02, /* 0x405F5293, 0x14F92CD5 */ 2.32276469057162813669e+02, /* 0x406D08D8, 0xD5A2DBD9 */ 1.17679373287147100768e+02, /* 0x405D6B7A, 0xDA1884A9 */ 8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */ }; static double pone(double x) { const double *p,*q; double z,r,s; int ix; ix = 0x7fffffff&__HI(x); if(ix>=0x40200000) {p = pr8; q= ps8;} else if(ix>=0x40122E8B){p = pr5; q= ps5;} else if(ix>=0x4006DB6D){p = pr3; q= ps3;} else if(ix>=0x40000000){p = pr2; q= ps2;} z = one/(x*x); r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4])))); return one+ r/s; } /* For x >= 8, the asymptotic expansions of qone is * 3/8 s - 105/1024 s^3 - ..., where s = 1/x. * We approximate pone by * qone(x) = s*(0.375 + (R/S)) * where R = qr1*s^2 + qr2*s^4 + ... + qr5*s^10 * S = 1 + qs1*s^2 + ... + qs6*s^12 * and * | qone(x)/s -0.375-R/S | <= 2 ** ( -61.13) */ static const double qr8[6] = { /* for x in [inf, 8]=1/[0,0.125] */ 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ -1.02539062499992714161e-01, /* 0xBFBA3FFF, 0xFFFFFDF3 */ -1.62717534544589987888e+01, /* 0xC0304591, 0xA26779F7 */ -7.59601722513950107896e+02, /* 0xC087BCD0, 0x53E4B576 */ -1.18498066702429587167e+04, /* 0xC0C724E7, 0x40F87415 */ -4.84385124285750353010e+04, /* 0xC0E7A6D0, 0x65D09C6A */ }; static const double qs8[6] = { 1.61395369700722909556e+02, /* 0x40642CA6, 0xDE5BCDE5 */ 7.82538599923348465381e+03, /* 0x40BE9162, 0xD0D88419 */ 1.33875336287249578163e+05, /* 0x4100579A, 0xB0B75E98 */ 7.19657723683240939863e+05, /* 0x4125F653, 0x72869C19 */ 6.66601232617776375264e+05, /* 0x412457D2, 0x7719AD5C */ -2.94490264303834643215e+05, /* 0xC111F969, 0x0EA5AA18 */ }; static const double qr5[6] = { /* for x in [8,4.5454]=1/[0.125,0.22001] */ -2.08979931141764104297e-11, /* 0xBDB6FA43, 0x1AA1A098 */ -1.02539050241375426231e-01, /* 0xBFBA3FFF, 0xCB597FEF */ -8.05644828123936029840e+00, /* 0xC0201CE6, 0xCA03AD4B */ -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */ -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */ -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */ }; static const double qs5[6] = { 8.12765501384335777857e+01, /* 0x405451B2, 0xFF5A11B2 */ 1.99179873460485964642e+03, /* 0x409F1F31, 0xE77BF839 */ 1.74684851924908907677e+04, /* 0x40D10F1F, 0x0D64CE29 */ 4.98514270910352279316e+04, /* 0x40E8576D, 0xAABAD197 */ 2.79480751638918118260e+04, /* 0x40DB4B04, 0xCF7C364B */ -4.71918354795128470869e+03, /* 0xC0B26F2E, 0xFCFFA004 */ }; static const double qr3[6] = { -5.07831226461766561369e-09, /* 0xBE35CFA9, 0xD38FC84F */ -1.02537829820837089745e-01, /* 0xBFBA3FEB, 0x51AEED54 */ -4.61011581139473403113e+00, /* 0xC01270C2, 0x3302D9FF */ -5.78472216562783643212e+01, /* 0xC04CEC71, 0xC25D16DA */ -2.28244540737631695038e+02, /* 0xC06C87D3, 0x4718D55F */ -2.19210128478909325622e+02, /* 0xC06B66B9, 0x5F5C1BF6 */ }; static const double qs3[6] = { 4.76651550323729509273e+01, /* 0x4047D523, 0xCCD367E4 */ 6.73865112676699709482e+02, /* 0x40850EEB, 0xC031EE3E */ 3.38015286679526343505e+03, /* 0x40AA684E, 0x448E7C9A */ 5.54772909720722782367e+03, /* 0x40B5ABBA, 0xA61D54A6 */ 1.90311919338810798763e+03, /* 0x409DBC7A, 0x0DD4DF4B */ -1.35201191444307340817e+02, /* 0xC060E670, 0x290A311F */ }; static const double qr2[6] = {/* for x in [2.8570,2]=1/[0.3499,0.5] */ -1.78381727510958865572e-07, /* 0xBE87F126, 0x44C626D2 */ -1.02517042607985553460e-01, /* 0xBFBA3E8E, 0x9148B010 */ -2.75220568278187460720e+00, /* 0xC0060484, 0x69BB4EDA */ -1.96636162643703720221e+01, /* 0xC033A9E2, 0xC168907F */ -4.23253133372830490089e+01, /* 0xC04529A3, 0xDE104AAA */ -2.13719211703704061733e+01, /* 0xC0355F36, 0x39CF6E52 */ }; static const double qs2[6] = { 2.95333629060523854548e+01, /* 0x403D888A, 0x78AE64FF */ 2.52981549982190529136e+02, /* 0x406F9F68, 0xDB821CBA */ 7.57502834868645436472e+02, /* 0x4087AC05, 0xCE49A0F7 */ 7.39393205320467245656e+02, /* 0x40871B25, 0x48D4C029 */ 1.55949003336666123687e+02, /* 0x40637E5E, 0x3C3ED8D4 */ -4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */ }; static double qone(double x) { const double *p,*q; double s,r,z; int ix; ix = 0x7fffffff&__HI(x); if(ix>=0x40200000) {p = qr8; q= qs8;} else if(ix>=0x40122E8B){p = qr5; q= qs5;} else if(ix>=0x4006DB6D){p = qr3; q= qs3;} else if(ix>=0x40000000){p = qr2; q= qs2;} z = one/(x*x); r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5])))); s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5]))))); return (.375 + r/s)/x; } )))); r *= x; return(x*0.5+r/s); } static const double U0[5] = { -1.96057090646238940668e-01, /* 0xBFC91866, 0x143CBC8A */ 5.04438716639811282616eold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_jn.c������������������������������������������� 664 � 0 � 0 � 15467 6622405623 22504�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_jn.c 1.4 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * __ieee754_jn(n, x), __ieee754_yn(n, x) * floating point Bessel's function of the 1st and 2nd kind * of order n * * Special cases: * y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal; * y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal. * Note 2. About jn(n,x), yn(n,x) * For n=0, j0(x) is called, * for n=1, j1(x) is called, * for n<x, forward recursion us used starting * from values of j0(x) and j1(x). * for n>x, a continued fraction approximation to * j(n,x)/j(n-1,x) is evaluated and then backward * recursion is used starting from a supposed value * for j(n,x). The resulting value of j(0,x) is * compared with the actual value to correct the * supposed value of j(n,x). * * yn(n,x) is similar in all respects, except * that forward recursion is used for all * values of n>1. * */ #include "fdlibm.h" static const double invsqrtpi= 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */ two = 2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */ one = 1.00000000000000000000e+00; /* 0x3FF00000, 0x00000000 */ static double zero = 0.00000000000000000000e+00; double __ieee754_jn(int n, double x) { int i,hx,ix,lx, sgn; double a, b, temp, di; double z, w; /* J(-n,x) = (-1)^n * J(n, x), J(n, -x) = (-1)^n * J(n, x) * Thus, J(-n,x) = J(n,-x) */ hx = __HI(x); ix = 0x7fffffff&hx; lx = __LO(x); /* if J(n,NaN) is NaN */ if((ix|((unsigned)(lx|-lx))>>31)>0x7ff00000) return x+x; if(n<0){ n = -n; x = -x; hx ^= 0x80000000; } if(n==0) return(__ieee754_j0(x)); if(n==1) return(__ieee754_j1(x)); sgn = (n&1)&(hx>>31); /* even n -- 0, odd n -- sign(x) */ x = fabs(x); if((ix|lx)==0||ix>=0x7ff00000) /* if x is 0 or inf */ b = zero; else if((double)n<=x) { /* Safe to use J(n+1,x)=2n/x *J(n,x)-J(n-1,x) */ if(ix>=0x52D00000) { /* x > 2**302 */ /* (x >> n**2) * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) * Let s=sin(x), c=cos(x), * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then * * n sin(xn)*sqt2 cos(xn)*sqt2 * ---------------------------------- * 0 s-c c+s * 1 -s-c -c+s * 2 -s+c -c-s * 3 s+c c-s */ switch(n&3) { case 0: temp = cos(x)+sin(x); break; case 1: temp = -cos(x)+sin(x); break; case 2: temp = -cos(x)-sin(x); break; case 3: temp = cos(x)-sin(x); break; } b = invsqrtpi*temp/sqrt(x); } else { a = __ieee754_j0(x); b = __ieee754_j1(x); for(i=1;i<n;i++){ temp = b; b = b*((double)(i+i)/x) - a; /* avoid underflow */ a = temp; } } } else { if(ix<0x3e100000) { /* x < 2**-29 */ /* x is tiny, return the first Taylor expansion of J(n,x) * J(n,x) = 1/n!*(x/2)^n - ... */ if(n>33) /* underflow */ b = zero; else { temp = x*0.5; b = temp; for (a=one,i=2;i<=n;i++) { a *= (double)i; /* a = n! */ b *= temp; /* b = (x/2)^n */ } b = b/a; } } else { /* use backward recurrence */ /* x x^2 x^2 * J(n,x)/J(n-1,x) = ---- ------ ------ ..... * 2n - 2(n+1) - 2(n+2) * * 1 1 1 * (for large x) = ---- ------ ------ ..... * 2n 2(n+1) 2(n+2) * -- - ------ - ------ - * x x x * * Let w = 2n/x and h=2/x, then the above quotient * is equal to the continued fraction: * 1 * = ----------------------- * 1 * w - ----------------- * 1 * w+h - --------- * w+2h - ... * * To determine how many terms needed, let * Q(0) = w, Q(1) = w(w+h) - 1, * Q(k) = (w+k*h)*Q(k-1) - Q(k-2), * When Q(k) > 1e4 good for single * When Q(k) > 1e9 good for double * When Q(k) > 1e17 good for quadruple */ /* determine k */ double t,v; double q0,q1,h,tmp; int k,m; w = (n+n)/(double)x; h = 2.0/(double)x; q0 = w; z = w+h; q1 = w*z - 1.0; k=1; while(q1<1.0e9) { k += 1; z += h; tmp = z*q1 - q0; q0 = q1; q1 = tmp; } m = n+n; for(t=zero, i = 2*(n+k); i>=m; i -= 2) t = one/(i/x-t); a = t; b = one; /* estimate log((2/x)^n*n!) = n*log(2/x)+n*ln(n) * Hence, if n*(log(2n/x)) > ... * single 8.8722839355e+01 * double 7.09782712893383973096e+02 * long double 1.1356523406294143949491931077970765006170e+04 * then recurrent value may overflow and the result is * likely underflow to zero */ tmp = n; v = two/x; tmp = tmp*__ieee754_log(fabs(v*tmp)); if(tmp<7.09782712893383973096e+02) { for(i=n-1,di=(double)(i+i);i>0;i--){ temp = b; b *= di; b = b/x - a; a = temp; di -= two; } } else { for(i=n-1,di=(double)(i+i);i>0;i--){ temp = b; b *= di; b = b/x - a; a = temp; di -= two; /* scale b to avoid spurious overflow */ if(b>1e100) { a /= b; t /= b; b = one; } } } b = (t*__ieee754_j0(x)/b); } } if(sgn==1) return -b; else return b; } double __ieee754_yn(int n, double x) { int i,hx,ix,lx; int sign; double a, b, temp; hx = __HI(x); ix = 0x7fffffff&hx; lx = __LO(x); /* if Y(n,NaN) is NaN */ if((ix|((unsigned)(lx|-lx))>>31)>0x7ff00000) return x+x; if((ix|lx)==0) return -one/zero; if(hx<0) return zero/zero; sign = 1; if(n<0){ n = -n; sign = 1 - ((n&1)<<1); } if(n==0) return(__ieee754_y0(x)); if(n==1) return(sign*__ieee754_y1(x)); if(ix==0x7ff00000) return zero; if(ix>=0x52D00000) { /* x > 2**302 */ /* (x >> n**2) * Jn(x) = cos(x-(2n+1)*pi/4)*sqrt(2/x*pi) * Yn(x) = sin(x-(2n+1)*pi/4)*sqrt(2/x*pi) * Let s=sin(x), c=cos(x), * xn=x-(2n+1)*pi/4, sqt2 = sqrt(2),then * * n sin(xn)*sqt2 cos(xn)*sqt2 * ---------------------------------- * 0 s-c c+s * 1 -s-c -c+s * 2 -s+c -c-s * 3 s+c c-s */ switch(n&3) { case 0: temp = sin(x)-cos(x); break; case 1: temp = -sin(x)-cos(x); break; case 2: temp = -sin(x)+cos(x); break; case 3: temp = sin(x)+cos(x); break; } b = invsqrtpi*temp/sqrt(x); } else { a = __ieee754_y0(x); b = __ieee754_y1(x); /* quit if b is -inf */ for(i=1;i<n&&(__HI(b) != 0xfff00000);i++){ temp = b; b = ((double)(i+i)/x)*b - a; a = temp; } } if(sign>0) return b; else return -b; } CA03AD4B */ -1.83669607474888380239e+02, /* 0xC066F56D, 0x6CA7B9B0 */ -1.37319376065508163265e+03, /* 0xC09574C6, 0x6931734F */ -2.61244440453215656817e+03, /* 0xC0A468E3, 0x88FDA79D */ }; static coold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_lgamma_r.c������������������������������������� 664 � 0 � 0 � 25164 7405112704 23642�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_lgamma_r.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* __ieee754_lgamma_r(x, signgamp) * Reentrant version of the logarithm of the Gamma function * with user provide pointer for the sign of Gamma(x). * * Method: * 1. Argument Reduction for 0 < x <= 8 * Since gamma(1+s)=s*gamma(s), for x in [0,8], we may * reduce x to a number in [1.5,2.5] by * lgamma(1+s) = log(s) + lgamma(s) * for example, * lgamma(7.3) = log(6.3) + lgamma(6.3) * = log(6.3*5.3) + lgamma(5.3) * = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3) * 2. Polynomial approximation of lgamma around its * minimun ymin=1.461632144968362245 to maintain monotonicity. * On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use * Let z = x-ymin; * lgamma(x) = -1.214862905358496078218 + z^2*poly(z) * where * poly(z) is a 14 degree polynomial. * 2. Rational approximation in the primary interval [2,3] * We use the following approximation: * s = x-2.0; * lgamma(x) = 0.5*s + s*P(s)/Q(s) * with accuracy * |P/Q - (lgamma(x)-0.5s)| < 2**-61.71 * Our algorithms are based on the following observation * * zeta(2)-1 2 zeta(3)-1 3 * lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ... * 2 3 * * where Euler = 0.5771... is the Euler constant, which is very * close to 0.5. * * 3. For x>=8, we have * lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+.... * (better formula: * lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...) * Let z = 1/x, then we approximation * f(z) = lgamma(x) - (x-0.5)(log(x)-1) * by * 3 5 11 * w = w0 + w1*z + w2*z + w3*z + ... + w6*z * where * |w - f(z)| < 2**-58.74 * * 4. For negative x, since (G is gamma function) * -x*G(-x)*G(x) = pi/sin(pi*x), * we have * G(x) = pi/(sin(pi*x)*(-x)*G(-x)) * since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0 * Hence, for x<0, signgam = sign(sin(pi*x)) and * lgamma(x) = log(|Gamma(x)|) * = log(pi/(|x*sin(pi*x)|)) - lgamma(-x); * Note: one should avoid compute pi*(-x) directly in the * computation of sin(pi*(-x)). * * 5. Special Cases * lgamma(2+s) ~ s*(1-Euler) for tiny s * lgamma(1)=lgamma(2)=0 * lgamma(x) ~ -log(x) for tiny x * lgamma(0) = lgamma(inf) = inf * lgamma(-integer) = +-inf * */ #include "fdlibm.h" static const double two52= 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ half= 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ a0 = 7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */ a1 = 3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */ a2 = 6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */ a3 = 2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */ a4 = 7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */ a5 = 2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */ a6 = 1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */ a7 = 5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */ a8 = 2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */ a9 = 1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */ a10 = 2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */ a11 = 4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */ tc = 1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */ tf = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */ /* tt = -(tail of tf) */ tt = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */ t0 = 4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */ t1 = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */ t2 = 6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */ t3 = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */ t4 = 1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */ t5 = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */ t6 = 6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */ t7 = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */ t8 = 2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */ t9 = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */ t10 = 8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */ t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */ t12 = 3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */ t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */ t14 = 3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */ u0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ u1 = 6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */ u2 = 1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */ u3 = 9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */ u4 = 2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */ u5 = 1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */ v1 = 2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */ v2 = 2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */ v3 = 7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */ v4 = 1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */ v5 = 3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */ s0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ s1 = 2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */ s2 = 3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */ s3 = 1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */ s4 = 2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */ s5 = 1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */ s6 = 3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */ r1 = 1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */ r2 = 7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */ r3 = 1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */ r4 = 1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */ r5 = 7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */ r6 = 7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */ w0 = 4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */ w1 = 8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */ w2 = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */ w3 = 7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */ w4 = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */ w5 = 8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */ w6 = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */ static double zero= 0.00000000000000000000e+00; static double sin_pi(double x) { double y,z; int n,ix; ix = 0x7fffffff&__HI(x); if(ix<0x3fd00000) return __kernel_sin(pi*x,zero,0); y = -x; /* x is assume negative */ /* * argument reduction, make sure inexact flag not raised if input * is an integer */ z = floor(y); if(z!=y) { /* inexact anyway */ y *= 0.5; y = 2.0*(y - floor(y)); /* y = |x| mod 2.0 */ n = (int) (y*4.0); } else { if(ix>=0x43400000) { y = zero; n = 0; /* y must be even */ } else { if(ix<0x43300000) z = y+two52; /* exact */ n = __LO(z)&1; /* lower word of z */ y = n; n<<= 2; } } switch (n) { case 0: y = __kernel_sin(pi*y,zero,0); break; case 1: case 2: y = __kernel_cos(pi*(0.5-y),zero); break; case 3: case 4: y = __kernel_sin(pi*(one-y),zero,0); break; case 5: case 6: y = -__kernel_cos(pi*(y-1.5),zero); break; default: y = __kernel_sin(pi*(y-2.0),zero,0); break; } return -y; } double __ieee754_lgamma_r(double x, int *signgamp) { double t,y,z,nadj,p,p1,p2,p3,q,r,w; int i,hx,lx,ix; hx = __HI(x); lx = __LO(x); /* purge off +-inf, NaN, +-0, and negative arguments */ *signgamp = 1; ix = hx&0x7fffffff; if(ix>=0x7ff00000) return x*x; if((ix|lx)==0) return one/zero; if(ix<0x3b900000) { /* |x|<2**-70, return -log(|x|) */ if(hx<0) { *signgamp = -1; return -__ieee754_log(-x); } else return -__ieee754_log(x); } if(hx<0) { if(ix>=0x43300000) /* |x|>=2**52, must be -integer */ return one/zero; t = sin_pi(x); if(t==zero) return one/zero; /* -integer */ nadj = __ieee754_log(pi/fabs(t*x)); if(t<zero) *signgamp = -1; x = -x; } /* purge off 1 and 2 */ if((((ix-0x3ff00000)|lx)==0)||(((ix-0x40000000)|lx)==0)) r = 0; /* for x < 2.0 */ else if(ix<0x40000000) { if(ix<=0x3feccccc) { /* lgamma(x) = lgamma(x+1)-log(x) */ r = -__ieee754_log(x); if(ix>=0x3FE76944) {y = one-x; i= 0;} else if(ix>=0x3FCDA661) {y= x-(tc-one); i=1;} else {y = x; i=2;} } else { r = zero; if(ix>=0x3FFBB4C3) {y=2.0-x;i=0;} /* [1.7316,2] */ else if(ix>=0x3FF3B4C4) {y=x-tc;i=1;} /* [1.23,1.73] */ else {y=x-one;i=2;} } switch(i) { case 0: z = y*y; p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); p = y*p1+p2; r += (p-0.5*y); break; case 1: z = y*y; w = z*y; p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */ p2 = t1+w*(t4+w*(t7+w*(t10+w*t13))); p3 = t2+w*(t5+w*(t8+w*(t11+w*t14))); p = z*p1-(tt-w*(p2+y*p3)); r += (tf + p); break; case 2: p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5))))); p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5)))); r += (-0.5*y + p1/p2); } } else if(ix<0x40200000) { /* x < 8.0 */ i = (int)x; t = zero; y = x-(double)i; p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6)))))); q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6))))); r = half*y+p/q; z = one; /* lgamma(1+s) = log(s) + lgamma(s) */ switch(i) { case 7: z *= (y+6.0); /* FALLTHRU */ case 6: z *= (y+5.0); /* FALLTHRU */ case 5: z *= (y+4.0); /* FALLTHRU */ case 4: z *= (y+3.0); /* FALLTHRU */ case 3: z *= (y+2.0); /* FALLTHRU */ r += __ieee754_log(z); break; } /* 8.0 <= x < 2**58 */ } else if (ix < 0x43900000) { t = __ieee754_log(x); z = one/x; y = z*z; w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6))))); r = (x-half)*(t-one)+w; } else /* 2**58 <= x <= inf */ r = x*(__ieee754_log(x)-one); if(hx<0) r = nadj - r; return r; } 1. Argument Reduction for 0 < x <= 8 * Since gamma(1+s)=s*gamma(s), for x in [0,8], we may * reduce x to a number in [1.5,2.5] by * lgamma(1+s) = log(s) + lgamma(s) * for example, * lgamma(7.3) = log(6.3) + lgamma(6.3) * = log(6.3*5.3) + lgamma(5.3) * = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3) * 2. Polynomial approximation of lgamma around its * minimun ymin=1.461632old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_log.c������������������������������������������ 664 � 0 � 0 � 10431 6622405624 22641�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_log.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_log(x) * Return the logrithm of x * * Method : * 1. Argument Reduction: find k and f such that * x = 2^k * (1+f), * where sqrt(2)/2 < 1+f < sqrt(2) . * * 2. Approximation of log(1+f). * Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s) * = 2s + 2/3 s**3 + 2/5 s**5 + ....., * = 2s + s*R * We use a special Reme algorithm on [0,0.1716] to generate * a polynomial of degree 14 to approximate R The maximum error * of this polynomial approximation is bounded by 2**-58.45. In * other words, * 2 4 6 8 10 12 14 * R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s * (the values of Lg1 to Lg7 are listed in the program) * and * | 2 14 | -58.45 * | Lg1*s +...+Lg7*s - R(z) | <= 2 * | | * Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2. * In order to guarantee error in log below 1ulp, we compute log * by * log(1+f) = f - s*(f - R) (if f is not too large) * log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy) * * 3. Finally, log(x) = k*ln2 + log(1+f). * = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo))) * Here ln2 is split into two floating point number: * ln2_hi + ln2_lo, * where n*ln2_hi is always exact for |n| < 2000. * * Special cases: * log(x) is NaN with signal if x < 0 (including -INF) ; * log(+INF) is +INF; log(0) is -INF with signal; * log(NaN) is that NaN with no signal. * * Accuracy: * according to an error analysis, the error is always less than * 1 ulp (unit in the last place). * * Constants: * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include "fdlibm.h" static const double ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */ ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */ two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */ Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ static double zero = 0.0; double __ieee754_log(double x) { double hfsq,f,s,z,R,w,t1,t2,dk; int k,hx,i,j; unsigned lx; hx = __HI(x); /* high word of x */ lx = __LO(x); /* low word of x */ k=0; if (hx < 0x00100000) { /* x < 2**-1022 */ if (((hx&0x7fffffff)|lx)==0) return -two54/zero; /* log(+-0)=-inf */ if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ k -= 54; x *= two54; /* subnormal number, scale up x */ hx = __HI(x); /* high word of x */ } if (hx >= 0x7ff00000) return x+x; k += (hx>>20)-1023; hx &= 0x000fffff; i = (hx+0x95f64)&0x100000; __HI(x) = hx|(i^0x3ff00000); /* normalize x or x/2 */ k += (i>>20); f = x-1.0; if((0x000fffff&(2+hx))<3) { /* |f| < 2**-20 */ if(f==zero) if(k==0) return zero; else {dk=(double)k; return dk*ln2_hi+dk*ln2_lo;} R = f*f*(0.5-0.33333333333333333*f); if(k==0) return f-R; else {dk=(double)k; return dk*ln2_hi-((R-dk*ln2_lo)-f);} } s = f/(2.0+f); dk = (double)k; z = s*s; i = hx-0x6147a; w = z*z; j = 0x6b851-hx; t1= w*(Lg2+w*(Lg4+w*Lg6)); t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); i |= j; R = t2+t1; if(i>0) { hfsq=0.5*f*f; if(k==0) return f-(hfsq-s*(hfsq+R)); else return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f); } else { if(k==0) return f-s*(f-R); else return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f); } } /* 0x3FD4D98F, 0x4F139F59 */ s3 = 1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */ s4 = 2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */ s5 = 1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */ s6 = 3.1old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_log10.c���������������������������������������� 664 � 0 � 0 � 5147 6622405624 22772�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_log10.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_log10(x) * Return the base 10 logarithm of x * * Method : * Let log10_2hi = leading 40 bits of log10(2) and * log10_2lo = log10(2) - log10_2hi, * ivln10 = 1/log(10) rounded. * Then * n = ilogb(x), * if(n<0) n = n+1; * x = scalbn(x,-n); * log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x)) * * Note 1: * To guarantee log10(10**n)=n, where 10**n is normal, the rounding * mode must set to Round-to-Nearest. * Note 2: * [1/log(10)] rounded to 53 bits has error .198 ulps; * log10 is monotonic at all binary break points. * * Special cases: * log10(x) is NaN with signal if x < 0; * log10(+INF) is +INF with no signal; log10(0) is -INF with signal; * log10(NaN) is that NaN with no signal; * log10(10**N) = N for N=0,1,...,22. * * Constants: * The hexadecimal values are the intended ones for the following constants. * The decimal values may be used, provided that the compiler will convert * from decimal to binary accurately enough to produce the hexadecimal values * shown. */ #include "fdlibm.h" static const double two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ ivln10 = 4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */ log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */ log10_2lo = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */ static double zero = 0.0; double __ieee754_log10(double x) { double y,z; int i,k,hx; unsigned lx; hx = __HI(x); /* high word of x */ lx = __LO(x); /* low word of x */ k=0; if (hx < 0x00100000) { /* x < 2**-1022 */ if (((hx&0x7fffffff)|lx)==0) return -two54/zero; /* log(+-0)=-inf */ if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ k -= 54; x *= two54; /* subnormal number, scale up x */ hx = __HI(x); /* high word of x */ } if (hx >= 0x7ff00000) return x+x; k += (hx>>20)-1023; i = ((unsigned)k&0x80000000)>>31; hx = (hx&0x000fffff)|((0x3ff-i)<<20); y = (double)(k+i); __HI(x) = hx; z = y*log10_2lo + ivln10*__ieee754_log(x); return z+y*log10_2hi; } =0x3FFBB4C3) {y=2.0-x;i=0;} /* [1.7316,2] */ else if(ix>=0x3FF3B4C4) {y=x-tc;i=1;} /* [1.23,1.73] */ else {y=x-one;i=2;} } switch(i) { case 0: z = y*y; p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); p = y*p1+p2; r += (p-0.5*y); break; case 1: z = y*y; w = z*y; p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_pow.c������������������������������������������ 664 � 0 � 0 � 22510 6622405624 22666�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_pow.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_pow(x,y) return x**y * * n * Method: Let x = 2 * (1+f) * 1. Compute and return log2(x) in two pieces: * log2(x) = w1 + w2, * where w1 has 53-24 = 29 bit trailing zeros. * 2. Perform y*log2(x) = n+y' by simulating muti-precision * arithmetic, where |y'|<=0.5. * 3. Return x**y = 2**n*exp(y'*log2) * * Special cases: * 1. (anything) ** 0 is 1 * 2. (anything) ** 1 is itself * 3. (anything) ** NAN is NAN * 4. NAN ** (anything except 0) is NAN * 5. +-(|x| > 1) ** +INF is +INF * 6. +-(|x| > 1) ** -INF is +0 * 7. +-(|x| < 1) ** +INF is +0 * 8. +-(|x| < 1) ** -INF is +INF * 9. +-1 ** +-INF is NAN * 10. +0 ** (+anything except 0, NAN) is +0 * 11. -0 ** (+anything except 0, NAN, odd integer) is +0 * 12. +0 ** (-anything except 0, NAN) is +INF * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF * 14. -0 ** (odd integer) = -( +0 ** (odd integer) ) * 15. +INF ** (+anything except 0,NAN) is +INF * 16. +INF ** (-anything except 0,NAN) is +0 * 17. -INF ** (anything) = -0 ** (-anything) * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer) * 19. (-anything except 0 and inf) ** (non-integer) is NAN * * Accuracy: * pow(x,y) returns x**y nearly rounded. In particular * pow(integer,integer) * always returns the correct integer provided it is * representable. * * Constants : * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include "fdlibm.h" static const double bp[] = {1.0, 1.5,}, dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */ dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */ zero = 0.0, one = 1.0, two = 2.0, two53 = 9007199254740992.0, /* 0x43400000, 0x00000000 */ Huge = 1.0e300, tiny = 1.0e-300, /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ L1 = 5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */ L2 = 4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */ L3 = 3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */ L4 = 2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */ L5 = 2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */ L6 = 2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */ P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ P5 = 4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */ lg2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */ lg2_h = 6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */ lg2_l = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */ ovt = 8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */ cp = 9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */ cp_h = 9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */ cp_l = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/ ivln2 = 1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */ ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/ ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/ double __ieee754_pow(double x, double y) { double z,ax,z_h,z_l,p_h,p_l; double y1,t1,t2,r,s,t,u,v,w; int i,j,k,yisint,n; int hx,hy,ix,iy; unsigned lx,ly; hx = __HI(x); lx = __LO(x); hy = __HI(y); ly = __LO(y); ix = hx&0x7fffffff; iy = hy&0x7fffffff; /* y==zero: x**0 = 1 */ if((iy|ly)==0) return one; /* +-NaN return x+y */ if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) || iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0))) return x+y; /* determine if y is an odd int when x < 0 * yisint = 0 ... y is not an integer * yisint = 1 ... y is an odd int * yisint = 2 ... y is an even int */ yisint = 0; if(hx<0) { if(iy>=0x43400000) yisint = 2; /* even integer y */ else if(iy>=0x3ff00000) { k = (iy>>20)-0x3ff; /* exponent */ if(k>20) { j = ly>>(52-k); if((j<<(52-k))==ly) yisint = 2-(j&1); } else if(ly==0) { j = iy>>(20-k); if((j<<(20-k))==iy) yisint = 2-(j&1); } } } /* special value of y */ if(ly==0) { if (iy==0x7ff00000) { /* y is +-inf */ if(((ix-0x3ff00000)|lx)==0) return y - y; /* inf**+-1 is NaN */ else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */ return (hy>=0)? y: zero; else /* (|x|<1)**-,+inf = inf,0 */ return (hy<0)?-y: zero; } if(iy==0x3ff00000) { /* y is +-1 */ if(hy<0) return one/x; else return x; } if(hy==0x40000000) return x*x; /* y is 2 */ if(hy==0x3fe00000) { /* y is 0.5 */ if(hx>=0) /* x >= +0 */ return sqrt(x); } } ax = fabs(x); /* special value of x */ if(lx==0) { if(ix==0x7ff00000||ix==0||ix==0x3ff00000){ z = ax; /*x is +-0,+-inf,+-1*/ if(hy<0) z = one/z; /* z = (1/|x|) */ if(hx<0) { if(((ix-0x3ff00000)|yisint)==0) { z = (z-z)/(z-z); /* (-1)**non-int is NaN */ } else if(yisint==1) z = -z; /* (x<0)**odd = -(|x|**odd) */ } return z; } } /* (x<0)**(non-int) is NaN */ if((((hx>>31)+1)|yisint)==0) return (x-x)/(x-x); /* |y| is Huge */ if(iy>0x41e00000) { /* if |y| > 2**31 */ if(iy>0x43f00000){ /* if |y| > 2**64, must o/uflow */ if(ix<=0x3fefffff) return (hy<0)? Huge*Huge:tiny*tiny; if(ix>=0x3ff00000) return (hy>0)? Huge*Huge:tiny*tiny; } /* over/underflow if x is not close to one */ if(ix<0x3fefffff) return (hy<0)? Huge*Huge:tiny*tiny; if(ix>0x3ff00000) return (hy>0)? Huge*Huge:tiny*tiny; /* now |1-x| is tiny <= 2**-20, suffice to compute log(x) by x-x^2/2+x^3/3-x^4/4 */ t = x-1; /* t has 20 trailing zeros */ w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25)); u = ivln2_h*t; /* ivln2_h has 21 sig. bits */ v = t*ivln2_l-w*ivln2; t1 = u+v; __LO(t1) = 0; t2 = v-(t1-u); } else { double s2,s_h,s_l,t_h,t_l; n = 0; /* take care subnormal number */ if(ix<0x00100000) {ax *= two53; n -= 53; ix = __HI(ax); } n += ((ix)>>20)-0x3ff; j = ix&0x000fffff; /* determine interval */ ix = j|0x3ff00000; /* normalize ix */ if(j<=0x3988E) k=0; /* |x|<sqrt(3/2) */ else if(j<0xBB67A) k=1; /* |x|<sqrt(3) */ else {k=0;n+=1;ix -= 0x00100000;} __HI(ax) = ix; /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */ u = ax-bp[k]; /* bp[0]=1.0, bp[1]=1.5 */ v = one/(ax+bp[k]); s = u*v; s_h = s; __LO(s_h) = 0; /* t_h=ax+bp[k] High */ t_h = zero; __HI(t_h)=((ix>>1)|0x20000000)+0x00080000+(k<<18); t_l = ax - (t_h-bp[k]); s_l = v*((u-s_h*t_h)-s_h*t_l); /* compute log(ax) */ s2 = s*s; r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6))))); r += s_l*(s_h+s); s2 = s_h*s_h; t_h = 3.0+s2+r; __LO(t_h) = 0; t_l = r-((t_h-3.0)-s2); /* u+v = s*(1+...) */ u = s_h*t_h; v = s_l*t_h+t_l*s; /* 2/(3log2)*(s+...) */ p_h = u+v; __LO(p_h) = 0; p_l = v-(p_h-u); z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */ z_l = cp_l*p_h+p_l*cp+dp_l[k]; /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ t = (double)n; t1 = (((z_h+z_l)+dp_h[k])+t); __LO(t1) = 0; t2 = z_l-(((t1-t)-dp_h[k])-z_h); } s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ if((((hx>>31)+1)|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */ /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ y1 = y; __LO(y1) = 0; p_l = (y-y1)*t1+y*t2; p_h = y1*t1; z = p_l+p_h; j = __HI(z); i = __LO(z); if (j>=0x40900000) { /* z >= 1024 */ if(((j-0x40900000)|i)!=0) /* if z > 1024 */ return s*Huge*Huge; /* overflow */ else { if(p_l+ovt>z-p_h) return s*Huge*Huge; /* overflow */ } } else if((j&0x7fffffff)>=0x4090cc00 ) { /* z <= -1075 */ if(((j-0xc090cc00)|i)!=0) /* z < -1075 */ return s*tiny*tiny; /* underflow */ else { if(p_l<=z-p_h) return s*tiny*tiny; /* underflow */ } } /* * compute 2**(p_h+p_l) */ i = j&0x7fffffff; k = (i>>20)-0x3ff; n = 0; if(i>0x3fe00000) { /* if |z| > 0.5, set n = [z+0.5] */ n = j+(0x00100000>>(k+1)); k = ((n&0x7fffffff)>>20)-0x3ff; /* new k for n */ t = zero; __HI(t) = (n&~(0x000fffff>>k)); n = ((n&0x000fffff)|0x00100000)>>(20-k); if(j<0) n = -n; p_h -= t; } t = p_l+p_h; __LO(t) = 0; u = t*lg2_h; v = (p_l-(t-p_h))*lg2+t*lg2_l; z = u+v; w = v-(z-u); t = z*z; t1 = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); r = (z*t1)/(t1-two)-(w+z*w); z = one-(r-z); j = __HI(z); j += (n<<20); if((j>>20)<=0) z = scalbn(z,n); /* subnormal output */ else __HI(z) += (n<<20); return s*z; } ; p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); p = y*p1+p2; r += (p-0.5*y); break; case 1: z = y*y; w = z*y; p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_rem_pio2.c������������������������������������� 664 � 0 � 0 � 12023 6622405624 23573�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_rem_pio2.c 1.4 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* __ieee754_rem_pio2(x,y) * * return the remainder of x rem pi/2 in y[0]+y[1] * use __kernel_rem_pio2() */ #include "fdlibm.h" /* * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi */ static const int two_over_pi[] = { 0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, 0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, 0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, 0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41, 0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, 0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF, 0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5, 0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, 0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, 0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, 0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B, }; static const int npio2_hw[] = { 0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C, 0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C, 0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A, 0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C, 0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB, 0x404858EB, 0x404921FB, }; /* * invpio2: 53 bits of 2/pi * pio2_1: first 33 bit of pi/2 * pio2_1t: pi/2 - pio2_1 * pio2_2: second 33 bit of pi/2 * pio2_2t: pi/2 - (pio2_1+pio2_2) * pio2_3: third 33 bit of pi/2 * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) */ static const double zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */ invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */ pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */ pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */ pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */ pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */ pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */ pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */ int __ieee754_rem_pio2(double x, double *y) { double z,w,t,r,fn; double tx[3]; int e0,i,j,nx,n,ix,hx; hx = __HI(x); /* high word of x */ ix = hx&0x7fffffff; if(ix<=0x3fe921fb) /* |x| ~<= pi/4 , no need for reduction */ {y[0] = x; y[1] = 0; return 0;} if(ix<0x4002d97c) { /* |x| < 3pi/4, special case with n=+-1 */ if(hx>0) { z = x - pio2_1; if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */ y[0] = z - pio2_1t; y[1] = (z-y[0])-pio2_1t; } else { /* near pi/2, use 33+33+53 bit pi */ z -= pio2_2; y[0] = z - pio2_2t; y[1] = (z-y[0])-pio2_2t; } return 1; } else { /* negative x */ z = x + pio2_1; if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */ y[0] = z + pio2_1t; y[1] = (z-y[0])+pio2_1t; } else { /* near pi/2, use 33+33+53 bit pi */ z += pio2_2; y[0] = z + pio2_2t; y[1] = (z-y[0])+pio2_2t; } return -1; } } if(ix<=0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */ t = fabs(x); n = (int) (t*invpio2+half); fn = (double)n; r = t-fn*pio2_1; w = fn*pio2_1t; /* 1st round good to 85 bit */ if(n<32&&ix!=npio2_hw[n-1]) { y[0] = r-w; /* quick check no cancellation */ } else { j = ix>>20; y[0] = r-w; i = j-(((__HI(y[0]))>>20)&0x7ff); if(i>16) { /* 2nd iteration needed, good to 118 */ t = r; w = fn*pio2_2; r = t-w; w = fn*pio2_2t-((t-r)-w); y[0] = r-w; i = j-(((__HI(y[0]))>>20)&0x7ff); if(i>49) { /* 3rd iteration need, 151 bits acc */ t = r; /* will cover all possible cases */ w = fn*pio2_3; r = t-w; w = fn*pio2_3t-((t-r)-w); y[0] = r-w; } } } y[1] = (r-y[0])-w; if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;} else return n; } /* * all other (large) arguments */ if(ix>=0x7ff00000) { /* x is inf or NaN */ y[0]=y[1]=x-x; return 0; } /* set z = scalbn(|x|,ilogb(x)-23) */ __LO(z) = __LO(x); e0 = (ix>>20)-1046; /* e0 = ilogb(z)-23; */ __HI(z) = ix - (e0<<20); for(i=0;i<2;i++) { tx[i] = (double)((int)(z)); z = (z-tx[i])*two24; } tx[2] = z; nx = 3; while(tx[nx-1]==zero) nx--; /* skip zero term */ n = __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi); if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;} return n; } f00000)/* (|x|>1)**+-inf = inf,0 */ return (hy>=0)? y: zero; else /* (|x|<1)**-,+inf = inf,0 */ return (hy<0)?-y: zero; } if(iy==0x3ff00000) { /* y is +-1 */ if(hy<0) return one/x; else return x; } if(hy==0x40000000) return x*x; /* y is 2 */ if(hy==0x3fe00000) { /* y is 0.5 */ if(hx>=0) /* x >= +0 */ return sqrt(x); } } ax = fabs(x); /* special value of x */ if(lx==0) { if(ix==0x7ff00000||ix==0||ix==0x3ff00000)old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_remainder.c������������������������������������ 664 � 0 � 0 � 3225 6622405624 24011�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_remainder.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_remainder(x,p) * Return : * returns x REM p = x - [x/p]*p as if in infinite * precise arithmetic, where [x/p] is the (infinite bit) * integer nearest x/p (in half way case choose the even one). * Method : * Based on fmod() return x-[x/p]chopped*p exactlp. */ #include "fdlibm.h" static const double zero = 0.0; double __ieee754_remainder(double x, double p) { int hx,hp; unsigned sx,lx,lp; double p_half; hx = __HI(x); /* high word of x */ lx = __LO(x); /* low word of x */ hp = __HI(p); /* high word of p */ lp = __LO(p); /* low word of p */ sx = hx&0x80000000; hp &= 0x7fffffff; hx &= 0x7fffffff; /* purge off exception values */ if((hp|lp)==0) return (x*p)/(x*p); /* p = 0 */ if((hx>=0x7ff00000)|| /* x not finite */ ((hp>=0x7ff00000)&& /* p is NaN */ (((hp-0x7ff00000)|lp)!=0))) return (x*p)/(x*p); if (hp<=0x7fdfffff) x = __ieee754_fmod(x,p+p); /* now x < 2p */ if (((hx-hp)|(lx-lp))==0) return zero*x; x = fabs(x); p = fabs(p); if (hp<0x00200000) { if(x+x>p) { x-=p; if(x+x>=p) x -= p; } } else { p_half = 0.5*p; if(x>p_half) { x-=p; if(x>=p_half) x -= p; } } __HI(x) ^= sx; return x; } _LO(p_h) = 0; p_l = v-(p_h-u); z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */ z_l = cp_l*p_h+p_l*cp+dp_l[k]; /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */ t = (double)n; t1 = (((z_h+z_l)+dp_h[k])+t); __LO(t1) = 0; t2 = z_l-(((t1-t)-dp_h[k])-z_h); } s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ if((((old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_sinh.c����������������������������������������� 664 � 0 � 0 � 4055 6622405624 23006�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_sinh.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_sinh(x) * Method : * mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2 * 1. Replace x by |x| (sinh(-x) = -sinh(x)). * 2. * E + E/(E+1) * 0 <= x <= 22 : sinh(x) := --------------, E=expm1(x) * 2 * * 22 <= x <= lnovft : sinh(x) := exp(x)/2 * lnovft <= x <= ln2ovft: sinh(x) := exp(x/2)/2 * exp(x/2) * ln2ovft < x : sinh(x) := x*sHuge (overflow) * * Special cases: * sinh(x) is |x| if x is +INF, -INF, or NaN. * only sinh(0)=0 is exact for finite x. */ #include "fdlibm.h" static const double one = 1.0, sHuge = 1.0e307; double __ieee754_sinh(double x) { double t,w,h; int ix,jx; unsigned lx; /* High word of |x|. */ jx = __HI(x); ix = jx&0x7fffffff; /* x is INF or NaN */ if(ix>=0x7ff00000) return x+x; h = 0.5; if (jx<0) h = -h; /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */ if (ix < 0x40360000) { /* |x|<22 */ if (ix<0x3e300000) /* |x|<2**-28 */ if(sHuge+x>one) return x;/* sinh(tiny) = tiny with inexact */ t = expm1(fabs(x)); if(ix<0x3ff00000) return h*(2.0*t-t*t/(t+one)); return h*(t+t/(t+one)); } /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */ if (ix < 0x40862E42) return h*__ieee754_exp(fabs(x)); /* |x| in [log(maxdouble), overflowthresold] */ lx = *( (((*(unsigned*)&one)>>29)) + (unsigned*)&x); if (ix<0x408633CE || (ix==0x408633ce)&&(lx<=(unsigned)0x8fb9f87d)) { w = __ieee754_exp(0.5*fabs(x)); t = h*w; return t*w; } /* |x| > overflowthresold, sinh(x) overflow */ return x*sHuge; } em_pio2() */ #include "fdlibm.h" /* * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi */ static const int two_over_pi[] = { 0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, 0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, 0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, 0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41, 0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, 0x97FFDE, 0x05old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/e_sqrt.c����������������������������������������� 664 � 0 � 0 � 34054 6622405624 23060�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)e_sqrt.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __ieee754_sqrt(x) * Return correctly rounded sqrt. * ------------------------------------------ * | Use the hardware sqrt if you have one | * ------------------------------------------ * Method: * Bit by bit method using integer arithmetic. (Slow, but portable) * 1. Normalization * Scale x to y in [1,4) with even powers of 2: * find an integer k such that 1 <= (y=x*2^(2k)) < 4, then * sqrt(x) = 2^k * sqrt(y) * 2. Bit by bit computation * Let q = sqrt(y) truncated to i bit after binary point (q = 1), * i 0 * i+1 2 * s = 2*q , and y = 2 * ( y - q ). (1) * i i i i * * To compute q from q , one checks whether * i+1 i * * -(i+1) 2 * (q + 2 ) <= y. (2) * i * -(i+1) * If (2) is false, then q = q ; otherwise q = q + 2 . * i+1 i i+1 i * * With some algebric manipulation, it is not difficult to see * that (2) is equivalent to * -(i+1) * s + 2 <= y (3) * i i * * The advantage of (3) is that s and y can be computed by * i i * the following recurrence formula: * if (3) is false * * s = s , y = y ; (4) * i+1 i i+1 i * * otherwise, * -i -(i+1) * s = s + 2 , y = y - s - 2 (5) * i+1 i i+1 i i * * One may easily use induction to prove (4) and (5). * Note. Since the left hand side of (3) contain only i+2 bits, * it does not necessary to do a full (53-bit) comparison * in (3). * 3. Final rounding * After generating the 53 bits result, we compute one more bit. * Together with the remainder, we can decide whether the * result is exact, bigger than 1/2ulp, or less than 1/2ulp * (it will never equal to 1/2ulp). * The rounding mode can be detected by checking whether * Huge + tiny is equal to Huge, and whether Huge - tiny is * equal to Huge for some floating point number "Huge" and "tiny". * * Special cases: * sqrt(+-0) = +-0 ... exact * sqrt(inf) = inf * sqrt(-ve) = NaN ... with invalid signal * sqrt(NaN) = NaN ... with invalid signal for signaling NaN * * Other methods : see the appended file at the end of the program below. *--------------- */ #include "fdlibm.h" static const double one = 1.0, tiny=1.0e-300; double __ieee754_sqrt(double x) { double z; int sign = (int)0x80000000; unsigned r,t1,s1,ix1,q1; int ix0,s0,q,m,t,i; ix0 = __HI(x); /* high word of x */ ix1 = __LO(x); /* low word of x */ /* take care of Inf and NaN */ if((ix0&0x7ff00000)==0x7ff00000) { return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf sqrt(-inf)=sNaN */ } /* take care of zero */ if(ix0<=0) { if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */ else if(ix0<0) return (x-x)/(x-x); /* sqrt(-ve) = sNaN */ } /* normalize x */ m = (ix0>>20); if(m==0) { /* subnormal x */ while(ix0==0) { m -= 21; ix0 |= (ix1>>11); ix1 <<= 21; } for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1; m -= i-1; ix0 |= (ix1>>(32-i)); ix1 <<= i; } m -= 1023; /* unbias exponent */ ix0 = (ix0&0x000fffff)|0x00100000; if(m&1){ /* odd m, double x to make it even */ ix0 += ix0 + ((ix1&sign)>>31); ix1 += ix1; } m >>= 1; /* m = [m/2] */ /* generate sqrt(x) bit by bit */ ix0 += ix0 + ((ix1&sign)>>31); ix1 += ix1; q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */ r = 0x00200000; /* r = moving bit from right to left */ while(r!=0) { t = s0+r; if(t<=ix0) { s0 = t+r; ix0 -= t; q += r; } ix0 += ix0 + ((ix1&sign)>>31); ix1 += ix1; r>>=1; } r = sign; while(r!=0) { t1 = s1+r; t = s0; if((t<ix0)||((t==ix0)&&(t1<=ix1))) { s1 = t1+r; if(((t1&sign)==sign)&&(s1&sign)==0) s0 += 1; ix0 -= t; if (ix1 < t1) ix0 -= 1; ix1 -= t1; q1 += r; } ix0 += ix0 + ((ix1&sign)>>31); ix1 += ix1; r>>=1; } /* use floating add to find out rounding direction */ if((ix0|ix1)!=0) { z = one-tiny; /* trigger inexact flag */ if (z>=one) { z = one+tiny; if (q1==(unsigned)0xffffffff) { q1=0; q += 1;} else if (z>one) { if (q1==(unsigned)0xfffffffe) q+=1; q1+=2; } else q1 += (q1&1); } } ix0 = (q>>1)+0x3fe00000; ix1 = q1>>1; if ((q&1)==1) ix1 |= sign; ix0 += (m <<20); __HI(z) = ix0; __LO(z) = ix1; return z; } /* Other methods (use floating-point arithmetic) ------------- (This is a copy of a drafted paper by Prof W. Kahan and K.C. Ng, written in May, 1986) Two algorithms are given here to implement sqrt(x) (IEEE double precision arithmetic) in software. Both supply sqrt(x) correctly rounded. The first algorithm (in Section A) uses newton iterations and involves four divisions. The second one uses reciproot iterations to avoid division, but requires more multiplications. Both algorithms need the ability to chop results of arithmetic operations instead of round them, and the INEXACT flag to indicate when an arithmetic operation is executed exactly with no roundoff error, all part of the standard (IEEE 754-1985). The ability to perform shift, add, subtract and logical AND operations upon 32-bit words is needed too, though not part of the standard. A. sqrt(x) by Newton Iteration (1) Initial approximation Let x0 and x1 be the leading and the trailing 32-bit words of a floating point number x (in IEEE double format) respectively 1 11 52 ...widths ------------------------------------------------------ x: |s| e | f | ------------------------------------------------------ msb lsb msb lsb ...order ------------------------ ------------------------ x0: |s| e | f1 | x1: | f2 | ------------------------ ------------------------ By performing shifts and subtracts on x0 and x1 (both regarded as integers), we obtain an 8-bit approximation of sqrt(x) as follows. k := (x0>>1) + 0x1ff80000; y0 := k - T1[31&(k>>15)]. ... y ~ sqrt(x) to 8 bits Here k is a 32-bit integer and T1[] is an integer array containing correction terms. Now magically the floating value of y (y's leading 32-bit word is y0, the value of its trailing word is 0) approximates sqrt(x) to almost 8-bit. Value of T1: static int T1[32]= { 0, 1024, 3062, 5746, 9193, 13348, 18162, 23592, 29598, 36145, 43202, 50740, 58733, 67158, 75992, 85215, 83599, 71378, 60428, 50647, 41945, 34246, 27478, 21581, 16499, 12183, 8588, 5674, 3403, 1742, 661, 130,}; (2) Iterative refinement Apply Heron's rule three times to y, we have y approximates sqrt(x) to within 1 ulp (Unit in the Last Place): y := (y+x/y)/2 ... almost 17 sig. bits y := (y+x/y)/2 ... almost 35 sig. bits y := y-(y-x/y)/2 ... within 1 ulp Remark 1. Another way to improve y to within 1 ulp is: y := (y+x/y) ... almost 17 sig. bits to 2*sqrt(x) y := y - 0x00100006 ... almost 18 sig. bits to sqrt(x) 2 (x-y )*y y := y + 2* ---------- ...within 1 ulp 2 3y + x This formula has one division fewer than the one above; however, it requires more multiplications and additions. Also x must be scaled in advance to avoid spurious overflow in evaluating the expression 3y*y+x. Hence it is not recommended uless division is slow. If division is very slow, then one should use the reciproot algorithm given in section B. (3) Final adjustment By twiddling y's last bit it is possible to force y to be correctly rounded according to the prevailing rounding mode as follows. Let r and i be copies of the rounding mode and inexact flag before entering the square root program. Also we use the expression y+-ulp for the next representable floating numbers (up and down) of y. Note that y+-ulp = either fixed point y+-1, or multiply y by nextafter(1,+-inf) in chopped mode. I := FALSE; ... reset INEXACT flag I R := RZ; ... set rounding mode to round-toward-zero z := x/y; ... chopped quotient, possibly inexact If(not I) then { ... if the quotient is exact if(z=y) { I := i; ... restore inexact flag R := r; ... restore rounded mode return sqrt(x):=y. } else { z := z - ulp; ... special rounding } } i := TRUE; ... sqrt(x) is inexact If (r=RN) then z=z+ulp ... rounded-to-nearest If (r=RP) then { ... round-toward-+inf y = y+ulp; z=z+ulp; } y := y+z; ... chopped sum y0:=y0-0x00100000; ... y := y/2 is correctly rounded. I := i; ... restore inexact flag R := r; ... restore rounded mode return sqrt(x):=y. (4) Special cases Square root of +inf, +-0, or NaN is itself; Square root of a negative number is NaN with invalid signal. B. sqrt(x) by Reciproot Iteration (1) Initial approximation Let x0 and x1 be the leading and the trailing 32-bit words of a floating point number x (in IEEE double format) respectively (see section A). By performing shifs and subtracts on x0 and y0, we obtain a 7.8-bit approximation of 1/sqrt(x) as follows. k := 0x5fe80000 - (x0>>1); y0:= k - T2[63&(k>>14)]. ... y ~ 1/sqrt(x) to 7.8 bits Here k is a 32-bit integer and T2[] is an integer array containing correction terms. Now magically the floating value of y (y's leading 32-bit word is y0, the value of its trailing word y1 is set to zero) approximates 1/sqrt(x) to almost 7.8-bit. Value of T2: static int T2[64]= { 0x1500, 0x2ef8, 0x4d67, 0x6b02, 0x87be, 0xa395, 0xbe7a, 0xd866, 0xf14a, 0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f, 0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d, 0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0, 0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989, 0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd, 0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e, 0x1527f,0x1334a,0x11051,0xe951, 0xbe01, 0x8e0d, 0x5924, 0x1edd,}; (2) Iterative refinement Apply Reciproot iteration three times to y and multiply the result by x to get an approximation z that matches sqrt(x) to about 1 ulp. To be exact, we will have -1ulp < sqrt(x)-z<1.0625ulp. ... set rounding mode to Round-to-nearest y := y*(1.5-0.5*x*y*y) ... almost 15 sig. bits to 1/sqrt(x) y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x) ... special arrangement for better accuracy z := x*y ... 29 bits to sqrt(x), with z*y<1 z := z + 0.5*z*(1-z*y) ... about 1 ulp to sqrt(x) Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that (a) the term z*y in the final iteration is always less than 1; (b) the error in the final result is biased upward so that -1 ulp < sqrt(x) - z < 1.0625 ulp instead of |sqrt(x)-z|<1.03125ulp. (3) Final adjustment By twiddling y's last bit it is possible to force y to be correctly rounded according to the prevailing rounding mode as follows. Let r and i be copies of the rounding mode and inexact flag before entering the square root program. Also we use the expression y+-ulp for the next representable floating numbers (up and down) of y. Note that y+-ulp = either fixed point y+-1, or multiply y by nextafter(1,+-inf) in chopped mode. R := RZ; ... set rounding mode to round-toward-zero switch(r) { case RN: ... round-to-nearest if(x<= z*(z-ulp)...chopped) z = z - ulp; else if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp; break; case RZ:case RM: ... round-to-zero or round-to--inf R:=RP; ... reset rounding mod to round-to-+inf if(x<z*z ... rounded up) z = z - ulp; else if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp; break; case RP: ... round-to-+inf if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else if(x>z*z ...chopped) z = z+ulp; break; } Remark 3. The above comparisons can be done in fixed point. For example, to compare x and w=z*z chopped, it suffices to compare x1 and w1 (the trailing parts of x and w), regarding them as two's complement integers. ...Is z an exact square root? To determine whether z is an exact square root of x, let z1 be the trailing part of z, and also let x0 and x1 be the leading and trailing parts of x. If ((z1&0x03ffffff)!=0) ... not exact if trailing 26 bits of z!=0 I := 1; ... Raise Inexact flag: z is not exact else { j := 1 - [(x0>>20)&1] ... j = logb(x) mod 2 k := z1 >> 26; ... get z's 25-th and 26-th fraction bits I := i or (k&j) or ((k&(j+j+1))!=(x1&3)); } R:= r ... restore rounded mode return sqrt(x):=z. If multiplication is cheaper then the foregoing red tape, the Inexact flag can be evaluated by I := i; I := (z*z!=x) or I. Note that z*z can overwrite I; this value must be sensed if it is True. Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be zero. -------------------- z1: | f2 | -------------------- bit 31 bit 0 Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd or even of logb(x) have the following relations: ------------------------------------------------- bit 27,26 of z1 bit 1,0 of x1 logb(x) ------------------------------------------------- 00 00 odd and even 01 01 even 10 10 odd 10 00 even 11 01 even ------------------------------------------------- (4) Special cases (see (4) of Section A). */ >31); ix1 += ix1; q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */ r = 0x00200000; /* r = moving bit from right to left */ while(r!=0) { t = s0+r; if(t<=ix0) { s0 = t+r; ix0 -= t; q += r; } ix0 += ix0 + ((ix1&sign)>>31); ix1 += ix1; r>>=1; } r = sign; while(r!=0) { t1 = s1+r; t = s0; if((t<ix0)||((t==ix0)&&(t1<=ix1))) { s1 = t1+r; if(((t1&sign)==sign)&&(s1&sign)==0) s0 += 1; ix0 -= t; iold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/fdlibm.h����������������������������������������� 664 � 0 � 0 � 11210 6622405624 23012�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ #include "lib9.h" /* @(#)fdlibm.h 1.5 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #ifdef __LITTLE_ENDIAN #define __HI(x) *(1+(int*)&x) #define __LO(x) *(int*)&x #define __HIp(x) *(1+(int*)x) #define __LOp(x) *(int*)x #else #define __HI(x) *(int*)&x #define __LO(x) *(1+(int*)&x) #define __HIp(x) *(int*)x #define __LOp(x) *(1+(int*)x) #endif /* Many GNU includes use the same define */ #ifndef __P #define __P(p) p #endif /* * ANSI/POSIX */ /* * ANSI/POSIX */ extern double acos __P((double)); extern double asin __P((double)); extern double atan __P((double)); extern double atan2 __P((double, double)); extern double cos __P((double)); extern double sin __P((double)); extern double tan __P((double)); extern double cosh __P((double)); extern double sinh __P((double)); extern double tanh __P((double)); extern double exp __P((double)); extern double frexp __P((double, int *)); extern double ldexp __P((double, int)); extern double log __P((double)); extern double log10 __P((double)); extern double modf __P((double, double *)); extern double pow __P((double, double)); extern double sqrt __P((double)); extern double ceil __P((double)); extern double fabs __P((double)); extern double floor __P((double)); extern double fmod __P((double, double)); extern double erf __P((double)); extern double erfc __P((double)); extern double gamma __P((double)); extern double hypot __P((double, double)); extern int isnan __P((double)); extern int finite __P((double)); extern double j0 __P((double)); extern double j1 __P((double)); extern double jn __P((int, double)); extern double lgamma __P((double)); extern double y0 __P((double)); extern double y1 __P((double)); extern double yn __P((int, double)); extern double acosh __P((double)); extern double asinh __P((double)); extern double atanh __P((double)); extern double cbrt __P((double)); extern double logb __P((double)); extern double nextafter __P((double, double)); extern double remainder __P((double, double)); extern double scalb __P((double, double)); /* * IEEE Test Vector */ extern double significand __P((double)); /* * Functions callable from C, intended to support IEEE arithmetic. */ extern double copysign __P((double, double)); extern int ilogb __P((double)); extern double rint __P((double)); extern double scalbn __P((double, int)); /* * BSD math library entry points */ extern double expm1 __P((double)); extern double log1p __P((double)); /* * Reentrant version of gamma & lgamma; passes signgam back by reference * as the second argument; user must allocate space for signgam. */ #ifdef _REENTRANT extern double gamma_r __P((double, int *)); extern double lgamma_r __P((double, int *)); #endif /* _REENTRANT */ /* ieee style elementary functions */ extern double __ieee754_sqrt __P((double)); extern double __ieee754_acos __P((double)); extern double __ieee754_acosh __P((double)); extern double __ieee754_log __P((double)); extern double __ieee754_atanh __P((double)); extern double __ieee754_asin __P((double)); extern double __ieee754_atan2 __P((double,double)); extern double __ieee754_exp __P((double)); extern double __ieee754_cosh __P((double)); extern double __ieee754_fmod __P((double,double)); extern double __ieee754_pow __P((double,double)); extern double __ieee754_lgamma_r __P((double,int *)); extern double __ieee754_gamma_r __P((double,int *)); extern double __ieee754_lgamma __P((double)); extern double __ieee754_gamma __P((double)); extern double __ieee754_log10 __P((double)); extern double __ieee754_sinh __P((double)); extern double __ieee754_hypot __P((double,double)); extern double __ieee754_j0 __P((double)); extern double __ieee754_j1 __P((double)); extern double __ieee754_y0 __P((double)); extern double __ieee754_y1 __P((double)); extern double __ieee754_jn __P((int,double)); extern double __ieee754_yn __P((int,double)); extern double __ieee754_remainder __P((double,double)); extern int __ieee754_rem_pio2 __P((double,double*)); extern double __ieee754_scalb __P((double,int)); /* fdlibm kernel function */ extern double __kernel_standard __P((double,double,int)); extern double __kernel_sin __P((double,double,int)); extern double __kernel_cos __P((double,double)); extern double __kernel_tan __P((double,double,int)); extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*)); ming shifs and subtracts on x0 and y0, we obtain a 7.8-bit approximation of 1/sqrt(x) as follows. k := 0x5fe80000 - (x0>>1); y0:= k - T2[63&(k>>14)]. ... y ~ 1/sqrt(x) to 7.8 bits Here k is a 32-bit integer and T2[] is an integer array containing correction terms. Now magically the floating value of y (y's leading 32-bit word is y0, the value of its trailiold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/k_cos.c������������������������������������������ 664 � 0 � 0 � 5555 6622405624 22645�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)k_cos.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * __kernel_cos( x, y ) * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164 * Input x is assumed to be bounded by ~pi/4 in magnitude. * Input y is the tail of x. * * Algorithm * 1. Since cos(-x) = cos(x), we need only to consider positive x. * 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0. * 3. cos(x) is approximated by a polynomial of degree 14 on * [0,pi/4] * 4 14 * cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x * where the remez error is * * | 2 4 6 8 10 12 14 | -58 * |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2 * | | * * 4 6 8 10 12 14 * 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then * cos(x) = 1 - x*x/2 + r * since cos(x+y) ~ cos(x) - sin(x)*y * ~ cos(x) - x*y, * a correction term is necessary in cos(x) and hence * cos(x+y) = 1 - (x*x/2 - (r - x*y)) * For better accuracy when x > 0.3, let qx = |x|/4 with * the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125. * Then * cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)). * Note that 1-qx and (x*x/2-qx) is EXACT here, and the * magnitude of the latter is at least a quarter of x*x/2, * thus, reducing the rounding error in the subtraction. */ #include "fdlibm.h" static const double one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */ C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */ C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */ C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */ C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */ C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */ double __kernel_cos(double x, double y) { double a,hz,z,r,qx; int ix; ix = __HI(x)&0x7fffffff; /* ix = |x|'s high word*/ if(ix<0x3e400000) { /* if x < 2**27 */ if(((int)x)==0) return one; /* generate inexact */ } z = x*x; r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6))))); if(ix < 0x3FD33333) /* if |x| < 0.3 */ return one - (0.5*z - (z*r - x*y)); else { if(ix > 0x3fe90000) { /* x > 0.78125 */ qx = 0.28125; } else { __HI(qx) = ix-0x00200000; /* x/4 */ __LO(qx) = 0; } hz = 0.5*z-qx; a = one-qx; return a - (hz - (z*r-x*y)); } } Note that z*z can overwrite I; this value must be sensed if it is True. Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be zeold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/k_rem_pio2.c������������������������������������� 664 � 0 � 0 � 20017 6622405624 23603�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)k_rem_pio2.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2) * double x[],y[]; int e0,nx,prec; int ipio2[]; * * __kernel_rem_pio2 return the last three digits of N with * y = x - N*pi/2 * so that |y| < pi/2. * * The method is to compute the integer (mod 8) and fraction parts of * (2/pi)*x without doing the full multiplication. In general we * skip the part of the product that are known to be a Huge integer ( * more accurately, = 0 mod 8 ). Thus the number of operations are * independent of the exponent of the input. * * (2/pi) is represented by an array of 24-bit integers in ipio2[]. * * Input parameters: * x[] The input value (must be positive) is broken into nx * pieces of 24-bit integers in double precision format. * x[i] will be the i-th 24 bit of x. The scaled exponent * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0 * match x's up to 24 bits. * * Example of breaking a double positive z into x[0]+x[1]+x[2]: * e0 = ilogb(z)-23 * z = scalbn(z,-e0) * for i = 0,1,2 * x[i] = floor(z) * z = (z-x[i])*2**24 * * * y[] ouput result in an array of double precision numbers. * The dimension of y[] is: * 24-bit precision 1 * 53-bit precision 2 * 64-bit precision 2 * 113-bit precision 3 * The actual value is the sum of them. Thus for 113-bit * precison, one may have to do something like: * * long double t,w,r_head, r_tail; * t = (long double)y[2] + (long double)y[1]; * w = (long double)y[0]; * r_head = t+w; * r_tail = w - (r_head - t); * * e0 The exponent of x[0] * * nx dimension of x[] * * prec an integer indicating the precision: * 0 24 bits (single) * 1 53 bits (double) * 2 64 bits (extended) * 3 113 bits (quad) * * ipio2[] * integer array, contains the (24*i)-th to (24*i+23)-th * bit of 2/pi after binary point. The corresponding * floating value is * * ipio2[i] * 2^(-24(i+1)). * * External function: * double scalbn(), floor(); * * * Here is the description of some local variables: * * jk jk+1 is the initial number of terms of ipio2[] needed * in the computation. The recommended value is 2,3,4, * 6 for single, double, extended,and quad. * * jz local integer variable indicating the number of * terms of ipio2[] used. * * jx nx - 1 * * jv index for pointing to the suitable ipio2[] for the * computation. In general, we want * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8 * is an integer. Thus * e0-3-24*jv >= 0 or (e0-3)/24 >= jv * Hence jv = max(0,(e0-3)/24). * * jp jp+1 is the number of terms in PIo2[] needed, jp = jk. * * q[] double array with integral value, representing the * 24-bits chunk of the product of x and 2/pi. * * q0 the corresponding exponent of q[0]. Note that the * exponent for q[i] would be q0-24*i. * * PIo2[] double precision array, obtained by cutting pi/2 * into 24 bits chunks. * * f[] ipio2[] in floating point * * iq[] integer array by breaking up q[] in 24-bits chunk. * * fq[] final product of x*(2/pi) in fq[0],..,fq[jk] * * ih integer. If >0 it indicates q[] is >= 0.5, hence * it also indicates the *sign* of the result. * */ /* * Constants: * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include "fdlibm.h" static const int init_jk[] = {2,3,4,6}; /* initial value for jk */ static const double PIo2[] = { 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */ 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */ 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */ 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */ 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */ 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */ 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */ 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */ }; static const double zero = 0.0, one = 1.0, two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */ twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */ int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int *ipio2) { int jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih; double z,fw,f[20],fq[20],q[20]; /* initialize jk*/ jk = init_jk[prec]; jp = jk; /* determine jx,jv,q0, note that 3>q0 */ jx = nx-1; jv = (e0-3)/24; if(jv<0) jv=0; q0 = e0-24*(jv+1); /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ j = jv-jx; m = jx+jk; for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j]; /* compute q[0],q[1],...q[jk] */ for (i=0;i<=jk;i++) { for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw; } jz = jk; recompute: /* distill q[] into iq[] reversingly */ for(i=0,j=jz,z=q[jz];j>0;i++,j--) { fw = (double)((int)(twon24* z)); iq[i] = (int)(z-two24*fw); z = q[j-1]+fw; } /* compute n */ z = scalbn(z,q0); /* actual value of z */ z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */ n = (int) z; z -= (double)n; ih = 0; if(q0>0) { /* need iq[jz-1] to determine n */ i = (iq[jz-1]>>(24-q0)); n += i; iq[jz-1] -= i<<(24-q0); ih = iq[jz-1]>>(23-q0); } else if(q0==0) ih = iq[jz-1]>>23; else if(z>=0.5) ih=2; if(ih>0) { /* q > 0.5 */ n += 1; carry = 0; for(i=0;i<jz ;i++) { /* compute 1-q */ j = iq[i]; if(carry==0) { if(j!=0) { carry = 1; iq[i] = 0x1000000- j; } } else iq[i] = 0xffffff - j; } if(q0>0) { /* rare case: chance is 1 in 12 */ switch(q0) { case 1: iq[jz-1] &= 0x7fffff; break; case 2: iq[jz-1] &= 0x3fffff; break; } } if(ih==2) { z = one - z; if(carry!=0) z -= scalbn(one,q0); } } /* check if recomputation is needed */ if(z==zero) { j = 0; for (i=jz-1;i>=jk;i--) j |= iq[i]; if(j==0) { /* need recomputation */ for(k=1;iq[jk-k]==0;k++); /* k = no. of terms needed */ for(i=jz+1;i<=jz+k;i++) { /* add q[jz+1] to q[jz+k] */ f[jx+i] = (double) ipio2[jv+i]; for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw; } jz += k; goto recompute; } } /* chop off zero terms */ if(z==0.0) { jz -= 1; q0 -= 24; while(iq[jz]==0) { jz--; q0-=24;} } else { /* break z into 24-bit if necessary */ z = scalbn(z,-q0); if(z>=two24) { fw = (double)((int)(twon24*z)); iq[jz] = (int)(z-two24*fw); jz += 1; q0 += 24; iq[jz] = (int) fw; } else iq[jz] = (int) z ; } /* convert integer "bit" chunk to floating-point value */ fw = scalbn(one,q0); for(i=jz;i>=0;i--) { q[i] = fw*(double)iq[i]; fw*=twon24; } /* compute PIo2[0,...,jp]*q[jz,...,0] */ for(i=jz;i>=0;i--) { for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k]; fq[jz-i] = fw; } /* compress fq[] into y[] */ switch(prec) { case 0: fw = 0.0; for (i=jz;i>=0;i--) fw += fq[i]; y[0] = (ih==0)? fw: -fw; break; case 1: case 2: fw = 0.0; for (i=jz;i>=0;i--) fw += fq[i]; y[0] = (ih==0)? fw: -fw; fw = fq[0]-fw; for (i=1;i<=jz;i++) fw += fq[i]; y[1] = (ih==0)? fw: -fw; break; case 3: /* painful */ for (i=jz;i>0;i--) { fw = fq[i-1]+fq[i]; fq[i] += fq[i-1]-fw; fq[i-1] = fw; } for (i=jz;i>1;i--) { fw = fq[i-1]+fq[i]; fq[i] += fq[i-1]-fw; fq[i-1] = fw; } for (fw=0.0,i=jz;i>=2;i--) fw += fq[i]; if(ih==0) { y[0] = fq[0]; y[1] = fq[1]; y[2] = fw; } else { y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw; } } return n&7; } x > 0.78125, let qx = 0.28125. * Then * cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)). * Note that 1-qx and (x*x/2-qx) is EXACT here, and the * magnitude of the latter is at least a quarter of x*x/2, * thus, reducing the rounding error in the subtraction. */ #include "fdlibm.h" static const double one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */ C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/k_sin.c������������������������������������������ 664 � 0 � 0 � 4344 6622405624 22645�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)k_sin.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __kernel_sin( x, y, iy) * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854 * Input x is assumed to be bounded by ~pi/4 in magnitude. * Input y is the tail of x. * Input iy indicates whether y is 0. (if iy=0, y assume to be 0). * * Algorithm * 1. Since sin(-x) = -sin(x), we need only to consider positive x. * 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0. * 3. sin(x) is approximated by a polynomial of degree 13 on * [0,pi/4] * 3 13 * sin(x) ~ x + S1*x + ... + S6*x * where * * |sin(x) 2 4 6 8 10 12 | -58 * |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 * | x | * * 4. sin(x+y) = sin(x) + sin'(x')*y * ~ sin(x) + (1-x*x/2)*y * For better accuracy, let * 3 2 2 2 2 * r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6)))) * then 3 2 * sin(x) = x + (S1*x + (x *(r-y/2)+y)) */ #include "fdlibm.h" static const double half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */ S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */ S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */ S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */ S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */ double __kernel_sin(double x, double y, int iy) { double z,r,v; int ix; ix = __HI(x)&0x7fffffff; /* high word of x */ if(ix<0x3e400000) /* |x| < 2**-27 */ {if((int)x==0) return x;} /* generate inexact */ z = x*x; v = z*x; r = S2+z*(S3+z*(S4+z*(S5+z*S6))); if(iy==0) return x+v*(S1+z*r); else return x-((z*(half*y-v*r)-y)-v*S1); } * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0 * match x's up to 24 bits. * * Example of breaking a double positive z into x[0]+x[1]+x[2]: * e0 = ilogb(z)-23 * z = scalbn(z,-e0) * for i = 0,1,2 * x[i] = floor(z) * z = (z-x[i])*2**24 * * * y[] ouold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/k_tan.c������������������������������������������ 664 � 0 � 0 � 7536 6622405624 22644�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)k_tan.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* __kernel_tan( x, y, k ) * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854 * Input x is assumed to be bounded by ~pi/4 in magnitude. * Input y is the tail of x. * Input k indicates whether tan (if k=1) or * -1/tan (if k= -1) is returned. * * Algorithm * 1. Since tan(-x) = -tan(x), we need only to consider positive x. * 2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0. * 3. tan(x) is approximated by a odd polynomial of degree 27 on * [0,0.67434] * 3 27 * tan(x) ~ x + T1*x + ... + T13*x * where * * |tan(x) 2 4 26 | -59.2 * |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2 * | x | * * Note: tan(x+y) = tan(x) + tan'(x)*y * ~ tan(x) + (1+x*x)*y * Therefore, for better accuracy in computing tan(x+y), let * 3 2 2 2 2 * r = x *(T2+x *(T3+x *(...+x *(T12+x *T13)))) * then * 3 2 * tan(x+y) = x + (T1*x + (x *(r+y)+y)) * * 4. For x in [0.67434,pi/4], let y = pi/4 - x, then * tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y)) * = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y))) */ #include "fdlibm.h" static const double one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ pio4 = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */ pio4lo= 3.06161699786838301793e-17, /* 0x3C81A626, 0x33145C07 */ T[] = { 3.33333333333334091986e-01, /* 0x3FD55555, 0x55555563 */ 1.33333333333201242699e-01, /* 0x3FC11111, 0x1110FE7A */ 5.39682539762260521377e-02, /* 0x3FABA1BA, 0x1BB341FE */ 2.18694882948595424599e-02, /* 0x3F9664F4, 0x8406D637 */ 8.86323982359930005737e-03, /* 0x3F8226E3, 0xE96E8493 */ 3.59207910759131235356e-03, /* 0x3F6D6D22, 0xC9560328 */ 1.45620945432529025516e-03, /* 0x3F57DBC8, 0xFEE08315 */ 5.88041240820264096874e-04, /* 0x3F4344D8, 0xF2F26501 */ 2.46463134818469906812e-04, /* 0x3F3026F7, 0x1A8D1068 */ 7.81794442939557092300e-05, /* 0x3F147E88, 0xA03792A6 */ 7.14072491382608190305e-05, /* 0x3F12B80F, 0x32F0A7E9 */ -1.85586374855275456654e-05, /* 0xBEF375CB, 0xDB605373 */ 2.59073051863633712884e-05, /* 0x3EFB2A70, 0x74BF7AD4 */ }; double __kernel_tan(double x, double y, int iy) { double z,r,v,w,s; int ix,hx; hx = __HI(x); /* high word of x */ ix = hx&0x7fffffff; /* high word of |x| */ if(ix<0x3e300000) /* x < 2**-28 */ {if((int)x==0) { /* generate inexact */ if(((ix|__LO(x))|(iy+1))==0) return one/fabs(x); else return (iy==1)? x: -one/x; } } if(ix>=0x3FE59428) { /* |x|>=0.6744 */ if(hx<0) {x = -x; y = -y;} z = pio4-x; w = pio4lo-y; x = z+w; y = 0.0; } z = x*x; w = z*z; /* Break x^5*(T[1]+x^2*T[2]+...) into * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) + * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12])) */ r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11])))); v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12]))))); s = z*x; r = y + z*(s*(r+v)+y); r += T[0]*s; w = x+r; if(ix>=0x3FE59428) { v = (double)iy; return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/(w+v)-r))); } if(iy==1) return w; else { /* if allow error up to 2 ulp, simply return -1.0/(x+r) here */ /* compute -1.0/(x+r) accurately */ double a,t; z = w; __LO(z) = 0; v = r-(z - x); /* z+v = r+x */ t = a = -1.0/w; /* a = -1.0/w */ __LO(t) = 0; s = 1.0+t*z; return t+a*(s+t*v); } } carry==0) { if(j!=0) { carry = 1; iq[i] = 0x1000000- j; } } else iq[i] = 0xffffff - j; } if(q0>0) { /* rare case: chance is 1 in 12 *old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/readme������������������������������������������� 664 � 0 � 0 � 21031 6622405624 22566�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ******************************** * Announcing FDLIBM Version 5 * ******************************** ============================================================ FDLIBM ============================================================ (developed at SunSoft, a Sun Microsystems, Inc. business.) What's new in FDLIBM 5.2? BUGS FIXED 1. Little endian bug in frexp (affect only little endian machine): in file s_frexp.c, last line of program frexp before exit *(int*)&x = hx; should read *(n0+(int*)&x) = hx; 2. jn(-1,x) is three times larger that the actual answer: in file e_jn.c, the line sign = 1 - ((n&1)<<2); should read sign = 1 - ((n&1)<<1); 3. Compiler failure on non-standard code J.T. Conklin found that gcc optimizing out the manipulation of doubles via pointer bashing of the form double x = 0; *(((int*)&x)+n0)=0x7fff0000; foo(x); C experts confirmed that the behavior of *(((int*)&x)+n0)=0x7fff0000 is undefined. By replacing n0 with a constant 0 or 1, the GCC "knows" that the assignment is modifying the double, and "does the right thing." Thus, in FDLIBM 5.2, we replace n0 with a constant and use a macro __HI() and __LO() with #ifdef __LITTLE_ENDIAN to avoid the above problem. 4. Performance issue on rem_pio2 An attempt to speed up the argument reduction in the trig function is the consider pi/4 < x < 3pi/4 a special case. This was done in the file e_rem_pio2.c FDLIBM (Freely Distributable LIBM) is a C math library for machines that support IEEE 754 floating-point arithmetic. In this release, only double precision is supported. FDLIBM is intended to provide a reasonably portable (see assumptions below), reference quality (below one ulp for major functions like sin,cos,exp,log) math library (libm.a). For a copy of FDLIBM, please send a message "send index from fdlibm" to netlib@research.att.com. -------------- 1. ASSUMPTIONS -------------- FDLIBM (double precision version) assumes: a. IEEE 754 style (if not precise compliance) arithmetic; b. 32 bit 2's complement integer arithmetic; c. Each double precision floating-point number must be in IEEE 754 double format, and that each number can be retrieved as two 32-bit integers through the using of pointer bashing as in the example below: Example: let y = 2.0 double fp number y: 2.0 IEEE double format: 0x4000000000000000 Referencing y as two integers: *(int*)&y,*(1+(int*)&y) = {0x40000000,0x0} (on sparc) {0x0,0x40000000} (on 386) Note: Four macros are defined in fdlibm.h to handle this kind of retrieving: __HI(x) the high part of a double x (sign,exponent,the first 21 significant bits) __LO(x) the least 32 significant bits of x __HIp(x) same as __HI except that the argument is a pointer to a double __LOp(x) same as __LO except that the argument is a pointer to a double To ensure obtaining correct ordering, one must define __LITTLE_ENDIAN during compilation for little endian machine (like 386,486). The default is big endian. If the behavior of pointer bashing is undefined, one may hack on the macro in fdlibm.h. d. IEEE exceptions may trigger "signals" as is common in Unix implementations. ------------------- 2. EXCEPTION CASES ------------------- All exception cases in the FDLIBM functions will be mapped to one of the following four exceptions: +-huge*huge, +-tiny*tiny, +-1.0/0.0, +-0.0/0.0 (overflow) (underflow) (divided-by-zero) (invalid) For example, log(0) is a singularity and is thus mapped to -1.0/0.0 = -infinity. That is, FDLIBM's log will compute -one/zero and return the computed value. On an IEEE machine, this will trigger the divided-by-zero exception and a negative infinity is returned by default. Similarly, exp(-huge) will be mapped to tiny*tiny to generate an underflow signal. -------------------------------- 3. STANDARD CONFORMANCE WRAPPER -------------------------------- The default FDLIBM functions (compiled with -D_IEEE_LIBM flag) are in "IEEE spirit" (i.e., return the most reasonable result in floating-point arithmetic). If one wants FDLIBM to comply with standards like SVID, X/OPEN, or POSIX/ANSI, then one can create a multi-standard compliant FDLIBM. In this case, each function in FDLIBM is actually a standard compliant wrapper function. File organization: 1. For FDLIBM's kernel (internal) function, File name Entry point --------------------------- k_sin.c __kernel_sin k_tan.c __kernel_tan --------------------------- 2. For functions that have no standards conflict File name Entry point --------------------------- s_sin.c sin s_erf.c erf --------------------------- 3. Ieee754 core functions File name Entry point --------------------------- e_exp.c __ieee754_exp e_sinh.c __ieee754_sinh --------------------------- 4. Wrapper functions File name Entry point --------------------------- w_exp.c exp w_sinh.c sinh --------------------------- Wrapper functions will twist the result of the ieee754 function to comply to the standard specified by the value of _LIB_VERSION if _LIB_VERSION = _IEEE_, return the ieee754 result; if _LIB_VERSION = _SVID_, return SVID result; if _LIB_VERSION = _XOPEN_, return XOPEN result; if _LIB_VERSION = _POSIX_, return POSIX/ANSI result. (These are macros, see fdlibm.h for their definition.) -------------------------------- 4. HOW TO CREATE FDLIBM's libm.a -------------------------------- There are two types of libm.a. One is IEEE only, and the other is multi-standard compliant (supports IEEE,XOPEN,POSIX/ANSI,SVID). To create the IEEE only libm.a, use make "CFLAGS = -D_IEEE_LIBM" This will create an IEEE libm.a, which is smaller in size, and somewhat faster. To create a multi-standard compliant libm, use make "CFLAGS = -D_IEEE_MODE" --- multi-standard fdlibm: default to IEEE make "CFLAGS = -D_XOPEN_MODE" --- multi-standard fdlibm: default to X/OPEN make "CFLAGS = -D_POSIX_MODE" --- multi-standard fdlibm: default to POSIX/ANSI make "CFLAGS = -D_SVID3_MODE" --- multi-standard fdlibm: default to SVID Here is how one makes a SVID compliant libm. Make the library by make "CFLAGS = -D_SVID3_MODE". The libm.a of FDLIBM will be multi-standard compliant and _LIB_VERSION is initialized to the value _SVID_ . example1: --------- main() { double y0(); printf("y0(1e300) = %1.20e\n",y0(1e300)); exit(0); } % cc example1.c libm.a % a.out y0: TLOSS error y0(1e300) = 0.00000000000000000000e+00 It is possible to change the default standard in multi-standard fdlibm. Here is an example of how to do it: example2: --------- #include "fdlibm.h" /* must include FDLIBM's fdlibm.h */ main() { double y0(); _LIB_VERSION = _IEEE_; printf("IEEE: y0(1e300) = %1.20e\n",y0(1e300)); _LIB_VERSION = _XOPEN_; printf("XOPEN y0(1e300) = %1.20e\n",y0(1e300)); _LIB_VERSION = _POSIX_; printf("POSIX y0(1e300) = %1.20e\n",y0(1e300)); _LIB_VERSION = _SVID_; printf("SVID y0(1e300) = %1.20e\n",y0(1e300)); exit(0); } % cc example2.c libm.a % a.out IEEE: y0(1e300) = -1.36813604503424810557e-151 XOPEN y0(1e300) = 0.00000000000000000000e+00 POSIX y0(1e300) = 0.00000000000000000000e+00 y0: TLOSS error SVID y0(1e300) = 0.00000000000000000000e+00 Note: Here _LIB_VERSION is a global variable. If global variables are forbidden, then one should modify fdlibm.h to change _LIB_VERSION to be a global constant. In this case, one may not change the value of _LIB_VERSION as in example2. --------------------------- 5. NOTES ON PORTING FDLIBM --------------------------- Care must be taken when installing FDLIBM over existing libm.a. All co-existing function prototypes must agree, otherwise users will encounter mysterious failures. So far, the only known likely conflict is the declaration of the IEEE recommended function scalb: double scalb(double,double) (1) SVID3 defined double scalb(double,int) (2) IBM,DEC,... FDLIBM follows Sun definition and use (1) as default. If one's existing libm.a uses (2), then one may raise the flags _SCALB_INT during the compilation of FDLIBM to get the correct function prototype. (E.g., make "CFLAGS = -D_IEEE_LIBM -D_SCALB_INT".) NOTE that if -D_SCALB_INT is raised, it won't be SVID3 conformant. -------------- 6. PROBLEMS ? -------------- Please send comments and bug report to: fdlibm-comments@sunpro.eng.sun.com io4-x; w = pio4lo-y; x = z+w; y = 0.0; } z = x*x; w = z*z; /* Break x^5*(T[1]+x^2*T[2]+...) into * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) + * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12])) */ r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11])))); v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12]))))); s = z*x; r = y + z*(s*(r+v)+y); r += T[0]*s; w = x+r; if(ix>=0x3FE59428) { v = (double)iy; return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_asinh.c���������������������������������������� 664 � 0 � 0 � 3003 6622405624 23155�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_asinh.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* asinh(x) * Method : * Based on * asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ] * we have * asinh(x) := x if 1+x*x=1, * := sign(x)*(log(x)+ln2)) for large |x|, else * := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else * := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2))) */ #include "fdlibm.h" static const double one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ ln2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */ Huge= 1.00000000000000000000e+300; double asinh(double x) { double t,w; int hx,ix; hx = __HI(x); ix = hx&0x7fffffff; if(ix>=0x7ff00000) return x+x; /* x is inf or NaN */ if(ix< 0x3e300000) { /* |x|<2**-28 */ if(Huge+x>one) return x; /* return x inexact except 0 */ } if(ix>0x41b00000) { /* |x| > 2**28 */ w = __ieee754_log(fabs(x))+ln2; } else if (ix>0x40000000) { /* 2**28 > |x| > 2.0 */ t = fabs(x); w = __ieee754_log(2.0*t+one/(sqrt(x*x+one)+t)); } else { /* 2.0 > |x| > 2**-28 */ t = x*x; w =log1p(fabs(x)+t/(one+sqrt(one+t))); } if(hx>0) return w; else return -w; } is undefined. By replacing n0 with a constant 0 or 1, the GCC "knows" that the assignment is modifying the double, and "does the right thing." Thus, in FDLIBM 5.2, we replace n0 with a constant and use a macro __HI() and __LO() with #ifdef __LITTLE_ENDIAN to avoid the above problem. 4. Performance issue on rem_pio2 An attempt to speed up the argument reduction in the trig function is the consider pi/4 < x < 3pi/4 a special case. This was done in the file old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_atan.c����������������������������������������� 664 � 0 � 0 � 7610 6622405624 23006�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_atan.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* atan(x) * Method * 1. Reduce x to positive by atan(x) = -atan(-x). * 2. According to the integer k=4t+0.25 chopped, t=x, the argument * is further reduced to one of the following intervals and the * arctangent of t is evaluated by the corresponding formula: * * [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...) * [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) ) * [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) ) * [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) ) * [39/16,INF] atan(x) = atan(INF) + atan( -1/t ) * * Constants: * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include "fdlibm.h" static const double atanhi[] = { 4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */ 7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */ 9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */ 1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */ }; static const double atanlo[] = { 2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */ 3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */ 1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */ 6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */ }; static const double aT[] = { 3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */ -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */ 1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */ -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */ 9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */ -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */ 6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */ -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */ 4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */ -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */ 1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */ }; static const double one = 1.0, Huge = 1.0e300; double atan(double x) { double w,s1,s2,z; int ix,hx,id; hx = __HI(x); ix = hx&0x7fffffff; if(ix>=0x44100000) { /* if |x| >= 2^66 */ if(ix>0x7ff00000|| (ix==0x7ff00000&&(__LO(x)!=0))) return x+x; /* NaN */ if(hx>0) return atanhi[3]+atanlo[3]; else return -atanhi[3]-atanlo[3]; } if (ix < 0x3fdc0000) { /* |x| < 0.4375 */ if (ix < 0x3e200000) { /* |x| < 2^-29 */ if(Huge+x>one) return x; /* raise inexact */ } id = -1; } else { x = fabs(x); if (ix < 0x3ff30000) { /* |x| < 1.1875 */ if (ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */ id = 0; x = (2.0*x-one)/(2.0+x); } else { /* 11/16<=|x|< 19/16 */ id = 1; x = (x-one)/(x+one); } } else { if (ix < 0x40038000) { /* |x| < 2.4375 */ id = 2; x = (x-1.5)/(one+1.5*x); } else { /* 2.4375 <= |x| < 2^66 */ id = 3; x = -1.0/x; } }} /* end of argument reduction */ z = x*x; w = z*z; /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10]))))); s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9])))); if (id<0) return x - x*(s1+s2); else { z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x); return (hx<0)? -z:z; } } -- multi-standard fdlibm: default to IEEE make "CFLAGS = -D_XOPEN_MODE" --- multi-standard fdlibm: default old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_cbrt.c����������������������������������������� 664 � 0 � 0 � 3702 6622405624 23013�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_cbrt.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ #include "fdlibm.h" /* cbrt(x) * Return cube root of x */ static const unsigned B1 = 715094163, /* B1 = (682-0.03306235651)*2**20 */ B2 = 696219795; /* B2 = (664-0.03306235651)*2**20 */ static const double C = 5.42857142857142815906e-01, /* 19/35 = 0x3FE15F15, 0xF15F15F1 */ D = -7.05306122448979611050e-01, /* -864/1225 = 0xBFE691DE, 0x2532C834 */ E = 1.41428571428571436819e+00, /* 99/70 = 0x3FF6A0EA, 0x0EA0EA0F */ F = 1.60714285714285720630e+00, /* 45/28 = 0x3FF9B6DB, 0x6DB6DB6E */ G = 3.57142857142857150787e-01; /* 5/14 = 0x3FD6DB6D, 0xB6DB6DB7 */ double cbrt(double x) { int hx; double r,s,t=0.0,w; unsigned sign; hx = __HI(x); /* high word of x */ sign=hx&0x80000000; /* sign= sign(x) */ hx ^=sign; if(hx>=0x7ff00000) return(x+x); /* cbrt(NaN,INF) is itself */ if((hx|__LO(x))==0) return(x); /* cbrt(0) is itself */ __HI(x) = hx; /* x <- |x| */ /* rough cbrt to 5 bits */ if(hx<0x00100000) /* subnormal number */ {__HI(t)=0x43500000; /* set t= 2**54 */ t*=x; __HI(t)=__HI(t)/3+B2; } else __HI(t)=hx/3+B1; /* new cbrt to 23 bits, may be implemented in single precision */ r=t*t/x; s=C+r*t; t*=G+F/(s+E+D/s); /* chopped to 20 bits and make it larger than cbrt(x) */ __LO(t)=0; __HI(t)+=0x00000001; /* one step newton iteration to 53 bits with error less than 0.667 ulps */ s=t*t; /* t*t is exact */ r=x/s; w=t+t; r=(r-t)/(w+r); /* r-s is exact */ t=t+t*r; /* retore the sign bit */ __HI(t) |= sign; return(t); } ��������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_ceil.c����������������������������������������� 664 � 0 � 0 � 3175 6622405624 23001�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_ceil.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * ceil(x) * Return x rounded toward -inf to integral value * Method: * Bit twiddling. * Exception: * Inexact flag raised if x not equal to ceil(x). */ #include "fdlibm.h" static const double Huge = 1.0e300; double ceil(double x) { int i0,i1,j0; unsigned i,j; i0 = __HI(x); i1 = __LO(x); j0 = ((i0>>20)&0x7ff)-0x3ff; if(j0<20) { if(j0<0) { /* raise inexact if x != 0 */ if(Huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ if(i0<0) {i0=0x80000000;i1=0;} else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;} } } else { i = (0x000fffff)>>j0; if(((i0&i)|i1)==0) return x; /* x is integral */ if(Huge+x>0.0) { /* raise inexact flag */ if(i0>0) i0 += (0x00100000)>>j0; i0 &= (~i); i1=0; } } } else if (j0>51) { if(j0==0x400) return x+x; /* inf or NaN */ else return x; /* x is integral */ } else { i = ((unsigned)(0xffffffff))>>(j0-20); if((i1&i)==0) return x; /* x is integral */ if(Huge+x>0.0) { /* raise inexact flag */ if(i0>0) { if(j0==20) i0+=1; else { j = i1 + (1<<(52-j0)); if(j<i1) i0+=1; /* got a carry */ i1 = j; } } i1 &= (~i); } } __HI(x) = i0; __LO(x) = i1; return x; } e+x>one) return x; /* return x inexact except 0 */ } if(ix>0x41b00000) { /* |x| > 2**28 */ w = __ieee754_log(fabs(x))+ln2; } else if (ix>0x40000000) { /* 2**28 > |x| > 2.0 */ t = fabs(x); w = __ieee754_log(2.0*t+one/(sqrt(x*x+one)+t)); } else { /* 2.0 > |x| > 2**-28 */ t = x*x; w =log1p(fabs(x)+t/(one+sqrt(one+t))); } if(hx>0) return w; else return -w;old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_copysign.c������������������������������������� 664 � 0 � 0 � 1314 6622405624 23711�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_copysign.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * copysign(double x, double y) * copysign(x,y) returns a value with the magnitude of x and * with the sign bit of y. */ #include "fdlibm.h" double copysign(double x, double y) { __HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000); return x; } eloped at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== * */ /* atan(x) * Method * 1. Reduce x to positive by atan(xold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_cos.c������������������������������������������ 664 � 0 � 0 � 3643 6622405624 22651�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_cos.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* cos(x) * Return cosine function of x. * * kernel function: * __kernel_sin ... sine function on [-pi/4,pi/4] * __kernel_cos ... cosine function on [-pi/4,pi/4] * __ieee754_rem_pio2 ... argument reduction routine * * Method. * Let S,C and T denote the sin, cos and tan respectively on * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 * in [-pi/4 , +pi/4], and let n = k mod 4. * We have * * n sin(x) cos(x) tan(x) * ---------------------------------------------------------- * 0 S C T * 1 C -S -1/T * 2 -S -C T * 3 -C S -1/T * ---------------------------------------------------------- * * Special cases: * Let trig be any of sin, cos, or tan. * trig(+-INF) is NaN, with signals; * trig(NaN) is that NaN; * * Accuracy: * TRIG(x) returns trig(x) nearly rounded */ #include "fdlibm.h" double cos(double x) { double y[2],z=0.0; int n, ix; /* High word of x. */ ix = __HI(x); /* |x| ~< pi/4 */ ix &= 0x7fffffff; if(ix <= 0x3fe921fb) return __kernel_cos(x,z); /* cos(Inf or NaN) is NaN */ else if (ix>=0x7ff00000) return x-x; /* argument reduction needed */ else { n = __ieee754_rem_pio2(x,y); switch(n&3) { case 0: return __kernel_cos(y[0],y[1]); case 1: return -__kernel_sin(y[0],y[1],1); case 2: return -__kernel_cos(y[0],y[1]); default: return __kernel_sin(y[0],y[1],1); } } } [3]+atanlo[3]; else return -atanhi[3]-atanlo[3]; } if (ix < 0x3fdc0000) { /* |x| < old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_erf.c������������������������������������������ 664 � 0 � 0 � 25425 7203776457 22676�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_erf.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* double erf(double x) * double erfc(double x) * x * 2 |\ * erf(x) = --------- | exp(-t*t)dt * sqrt(pi) \| * 0 * * erfc(x) = 1-erf(x) * Note that * erf(-x) = -erf(x) * erfc(-x) = 2 - erfc(x) * * Method: * 1. For |x| in [0, 0.84375] * erf(x) = x + x*R(x^2) * erfc(x) = 1 - erf(x) if x in [-.84375,0.25] * = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375] * where R = P/Q where P is an odd poly of degree 8 and * Q is an odd poly of degree 10. * -57.90 * | R - (erf(x)-x)/x | <= 2 * * * Remark. The formula is derived by noting * erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....) * and that * 2/sqrt(pi) = 1.128379167095512573896158903121545171688 * is close to one. The interval is chosen because the fix * point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is * near 0.6174), and by some experiment, 0.84375 is chosen to * guarantee the error is less than one ulp for erf. * * 2. For |x| in [0.84375,1.25], let s = |x| - 1, and * c = 0.84506291151 rounded to single (24 bits) * erf(x) = sign(x) * (c + P1(s)/Q1(s)) * erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0 * 1+(c+P1(s)/Q1(s)) if x < 0 * |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06 * Remark: here we use the taylor series expansion at x=1. * erf(1+s) = erf(1) + s*Poly(s) * = 0.845.. + P1(s)/Q1(s) * That is, we use rational approximation to approximate * erf(1+s) - (c = (single)0.84506291151) * Note that |P1/Q1|< 0.078 for x in [0.84375,1.25] * where * P1(s) = degree 6 poly in s * Q1(s) = degree 6 poly in s * * 3. For x in [1.25,1/0.35(~2.857143)], * erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1) * erf(x) = 1 - erfc(x) * where * R1(z) = degree 7 poly in z, (z=1/x^2) * S1(z) = degree 8 poly in z * * 4. For x in [1/0.35,28] * erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0 * = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0 * = 2.0 - tiny (if x <= -6) * erf(x) = sign(x)*(1.0 - erfc(x)) if x < 6, else * erf(x) = sign(x)*(1.0 - tiny) * where * R2(z) = degree 6 poly in z, (z=1/x^2) * S2(z) = degree 7 poly in z * * Note1: * To compute exp(-x*x-0.5625+R/S), let s be a single * precision number and s := x; then * -x*x = -s*s + (s-x)*(s+x) * exp(-x*x-0.5626+R/S) = * exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S); * Note2: * Here 4 and 5 make use of the asymptotic series * exp(-x*x) * erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) ) * x*sqrt(pi) * We use rational approximation to approximate * g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625 * Here is the error bound for R1/S1 and R2/S2 * |R1/S1 - f(x)| < 2**(-62.57) * |R2/S2 - f(x)| < 2**(-61.52) * * 5. For inf > x >= 28 * erf(x) = sign(x) *(1 - tiny) (raise inexact) * erfc(x) = tiny*tiny (raise underflow) if x > 0 * = 2 - tiny if x<0 * * 7. Special case: * erf(0) = 0, erf(inf) = 1, erf(-inf) = -1, * erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2, * erfc/erf(NaN) is NaN */ #include "fdlibm.h" static const double tiny = 1e-300, half= 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ two = 2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */ /* c = (float)0.84506291151 */ erx = 8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */ /* * Coefficients for approximation to erf on [0,0.84375] */ efx = 1.28379167095512586316e-01, /* 0x3FC06EBA, 0x8214DB69 */ efx8= 1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */ pp0 = 1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */ pp1 = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */ pp2 = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */ pp3 = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */ pp4 = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */ qq1 = 3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */ qq2 = 6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */ qq3 = 5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */ qq4 = 1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */ qq5 = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */ /* * Coefficients for approximation to erf in [0.84375,1.25] */ pa0 = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */ pa1 = 4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */ pa2 = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */ pa3 = 3.18346619901161753674e-01, /* 0x3FD45FCA, 0x805120E4 */ pa4 = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */ pa5 = 3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */ pa6 = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */ qa1 = 1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */ qa2 = 5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */ qa3 = 7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */ qa4 = 1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */ qa5 = 1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */ qa6 = 1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */ /* * Coefficients for approximation to erfc in [1.25,1/0.35] */ ra0 = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */ ra1 = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */ ra2 = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */ ra3 = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */ ra4 = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */ ra5 = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */ ra6 = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */ ra7 = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */ sa1 = 1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */ sa2 = 1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */ sa3 = 4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */ sa4 = 6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */ sa5 = 4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */ sa6 = 1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */ sa7 = 6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */ sa8 = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */ /* * Coefficients for approximation to erfc in [1/.35,28] */ rb0 = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */ rb1 = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */ rb2 = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */ rb3 = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */ rb4 = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */ rb5 = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */ rb6 = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */ sb1 = 3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */ sb2 = 3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */ sb3 = 1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */ sb4 = 3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */ sb5 = 2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */ sb6 = 4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */ sb7 = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */ double erf(double x) { int hx,ix,i; double R,S,P,Q,s,y,z,r; hx = __HI(x); ix = hx&0x7fffffff; if(ix>=0x7ff00000) { /* erf(nan)=nan */ i = ((unsigned)hx>>31)<<1; return (double)(1-i)+one/x; /* erf(+-inf)=+-1 */ } if(ix < 0x3feb0000) { /* |x|<0.84375 */ if(ix < 0x3e300000) { /* |x|<2**-28 */ if (ix < 0x00800000) return 0.125*(8.0*x+efx8*x); /*avoid underflow */ return x + efx*x; } z = x*x; r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); y = r/s; return x + x*y; } if(ix < 0x3ff40000) { /* 0.84375 <= |x| < 1.25 */ s = fabs(x)-one; P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); if(hx>=0) return erx + P/Q; else return -erx - P/Q; } if (ix >= 0x40180000) { /* inf>|x|>=6 */ if(hx>=0) return one-tiny; else return tiny-one; } x = fabs(x); s = one/(x*x); if(ix< 0x4006DB6E) { /* |x| < 1/0.35 */ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( ra5+s*(ra6+s*ra7)))))); S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( sa5+s*(sa6+s*(sa7+s*sa8))))))); } else { /* |x| >= 1/0.35 */ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( rb5+s*rb6))))); S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*( sb5+s*(sb6+s*sb7)))))); } z = x; __LO(z) = 0; r = __ieee754_exp(-z*z-0.5625)*__ieee754_exp((z-x)*(z+x)+R/S); if(hx>=0) return one-r/x; else return r/x-one; } double erfc(double x) { int hx,ix; double R,S,P,Q,s,y,z,r; hx = __HI(x); ix = hx&0x7fffffff; if(ix>=0x7ff00000) { /* erfc(nan)=nan */ /* erfc(+-inf)=0,2 */ return (double)(((unsigned)hx>>31)<<1)+one/x; } if(ix < 0x3feb0000) { /* |x|<0.84375 */ if(ix < 0x3c700000) /* |x|<2**-56 */ return one-x; z = x*x; r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4))); s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5)))); y = r/s; if(hx < 0x3fd00000) { /* x<1/4 */ return one-(x+x*y); } else { r = x*y; r += (x-half); return half - r ; } } if(ix < 0x3ff40000) { /* 0.84375 <= |x| < 1.25 */ s = fabs(x)-one; P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); if(hx>=0) { z = one-erx; return z - P/Q; } else { z = erx+P/Q; return one+z; } } if (ix < 0x403c0000) { /* |x|<28 */ x = fabs(x); s = one/(x*x); if(ix< 0x4006DB6D) { /* |x| < 1/.35 ~ 2.857143*/ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( ra5+s*(ra6+s*ra7)))))); S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( sa5+s*(sa6+s*(sa7+s*sa8))))))); } else { /* |x| >= 1/.35 ~ 2.857143 */ if(hx<0&&ix>=0x40180000) return two-tiny;/* x < -6 */ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( rb5+s*rb6))))); S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*( sb5+s*(sb6+s*sb7)))))); } z = x; __LO(z) = 0; r = __ieee754_exp(-z*z-0.5625)* __ieee754_exp((z-x)*(z+x)+R/S); if(hx>0) return r/x; else return two-r/x; } else { if(hx>0) return tiny*tiny; else return two-tiny; } } c(x) = 1 - erf(x) if x in [-.84375,0.25] * = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375] * where R = P/Q where P is an odd poly of degree 8 and * Q is an odd poly of degree 10. * -57.90 * |old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_expm1.c���������������������������������������� 664 � 0 � 0 � 16102 6622405624 23131�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_expm1.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* expm1(x) * Returns exp(x)-1, the exponential of x minus 1. * * Method * 1. Argument reduction: * Given x, find r and integer k such that * * x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658 * * Here a correction term c will be computed to compensate * the error in r when rounded to a floating-point number. * * 2. Approximating expm1(r) by a special rational function on * the interval [0,0.34658]: * Since * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ... * we define R1(r*r) by * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r) * That is, * R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r) * = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r)) * = 1 - r^2/60 + r^4/2520 - r^6/100800 + ... * We use a special Reme algorithm on [0,0.347] to generate * a polynomial of degree 5 in r*r to approximate R1. The * maximum error of this polynomial approximation is bounded * by 2**-61. In other words, * R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5 * where Q1 = -1.6666666666666567384E-2, * Q2 = 3.9682539681370365873E-4, * Q3 = -9.9206344733435987357E-6, * Q4 = 2.5051361420808517002E-7, * Q5 = -6.2843505682382617102E-9; * (where z=r*r, and the values of Q1 to Q5 are listed below) * with error bounded by * | 5 | -61 * | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2 * | | * * expm1(r) = exp(r)-1 is then computed by the following * specific way which minimize the accumulation rounding error: * 2 3 * r r [ 3 - (R1 + R1*r/2) ] * expm1(r) = r + --- + --- * [--------------------] * 2 2 [ 6 - r*(3 - R1*r/2) ] * * To compensate the error in the argument reduction, we use * expm1(r+c) = expm1(r) + c + expm1(r)*c * ~ expm1(r) + c + r*c * Thus c+r*c will be added in as the correction terms for * expm1(r+c). Now rearrange the term to avoid optimization * screw up: * ( 2 2 ) * ({ ( r [ R1 - (3 - R1*r/2) ] ) } r ) * expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- ) * ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 ) * ( ) * * = r - E * 3. Scale back to obtain expm1(x): * From step 1, we have * expm1(x) = either 2^k*[expm1(r)+1] - 1 * = or 2^k*[expm1(r) + (1-2^-k)] * 4. Implementation notes: * (A). To save one multiplication, we scale the coefficient Qi * to Qi*2^i, and replace z by (x^2)/2. * (B). To achieve maximum accuracy, we compute expm1(x) by * (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf) * (ii) if k=0, return r-E * (iii) if k=-1, return 0.5*(r-E)-0.5 * (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E) * else return 1.0+2.0*(r-E); * (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1) * (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else * (vii) return 2^k(1-((E+2^-k)-r)) * * Special cases: * expm1(INF) is INF, expm1(NaN) is NaN; * expm1(-INF) is -1, and * for finite argument, only expm1(0)=0 is exact. * * Accuracy: * according to an error analysis, the error is always less than * 1 ulp (unit in the last place). * * Misc. info. * For IEEE double * if x > 7.09782712893383973096e+02 then expm1(x) overflow * * Constants: * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. */ #include "fdlibm.h" static const double one = 1.0, Huge = 1.0e+300, tiny = 1.0e-300, o_threshold = 7.09782712893383973096e+02,/* 0x40862E42, 0xFEFA39EF */ ln2_hi = 6.93147180369123816490e-01,/* 0x3fe62e42, 0xfee00000 */ ln2_lo = 1.90821492927058770002e-10,/* 0x3dea39ef, 0x35793c76 */ invln2 = 1.44269504088896338700e+00,/* 0x3ff71547, 0x652b82fe */ /* scaled coefficients related to expm1 */ Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */ Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */ Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */ Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */ Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ double expm1(double x) { double y,hi,lo,c,t,e,hxs,hfx,r1; int k,xsb; unsigned hx; hx = __HI(x); /* high word of x */ xsb = hx&0x80000000; /* sign bit of x */ if(xsb==0) y=x; else y= -x; /* y = |x| */ hx &= 0x7fffffff; /* high word of |x| */ /* filter out Huge and non-finite argument */ if(hx >= 0x4043687A) { /* if |x|>=56*ln2 */ if(hx >= 0x40862E42) { /* if |x|>=709.78... */ if(hx>=0x7ff00000) { if(((hx&0xfffff)|__LO(x))!=0) return x+x; /* NaN */ else return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */ } if(x > o_threshold) return Huge*Huge; /* overflow */ } if(xsb!=0) { /* x < -56*ln2, return -1.0 with inexact */ if(x+tiny<0.0) /* raise inexact */ return tiny-one; /* return -1 */ } } /* argument reduction */ if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ if(xsb==0) {hi = x - ln2_hi; lo = ln2_lo; k = 1;} else {hi = x + ln2_hi; lo = -ln2_lo; k = -1;} } else { k = invln2*x+((xsb==0)?0.5:-0.5); t = k; hi = x - t*ln2_hi; /* t*ln2_hi is exact here */ lo = t*ln2_lo; } x = hi - lo; c = (hi-x)-lo; } else if(hx < 0x3c900000) { /* when |x|<2**-54, return x */ t = Huge+x; /* return x with inexact flags when x!=0 */ return x - (t-(Huge+x)); } else k = 0; /* x is now in primary range */ hfx = 0.5*x; hxs = x*hfx; r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5)))); t = 3.0-r1*hfx; e = hxs*((r1-t)/(6.0 - x*t)); if(k==0) return x - (x*e-hxs); /* c is 0 */ else { e = (x*(e-c)-c); e -= hxs; if(k== -1) return 0.5*(x-e)-0.5; if(k==1) if(x < -0.25) return -2.0*(e-(x+0.5)); else return one+2.0*(x-e); if (k <= -2 || k>56) { /* suffice to return exp(x)-1 */ y = one-(e-x); __HI(y) += (k<<20); /* add k to y's exponent */ return y-one; } t = one; if(k<20) { __HI(t) = 0x3ff00000 - (0x200000>>k); /* t=1-2^-k */ y = t-(e-x); __HI(y) += (k<<20); /* add k to y's exponent */ } else { __HI(t) = ((0x3ff-k)<<20); /* 2^-k */ y = x-(e+t); y += one; __HI(y) += (k<<20); /* add k to y's exponent */ } } return y; } |x|>=6 */ if(hx>=0) return one-tiny; else return tiny-one; } x = fabs(x); s = one/(x*x); if(ix< 0x4006DB6E) { /* |x| < 1/0.35 */ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( ra5+s*(ra6+s*ra7)))))); S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( sa5+s*(sa6+s*(sa7+s*sa8))))))); } else { /* |x| >= 1/0.35 */ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( rb5+s*rb6))))); S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*( sb5+s*(sb6+s*sb7)old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_fabs.c����������������������������������������� 664 � 0 � 0 � 1120 6622405624 22764�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_fabs.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * fabs(x) returns the absolute value of x. */ #include "fdlibm.h" double fabs(double x) { __HI(x) &= 0x7fffffff; return x; } ); s = one/(x*x); if(ix< 0x4006DB6D) { /* |x| < 1/.35 ~ 2.857143*/ R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*( ra5+s*(ra6+s*ra7)))))); S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*( sa5+s*(sa6+s*(sa7+s*sa8))))))); } else { /* |x| >= 1/.35 ~ 2.857143 */ if(hx<0&&ix>=0x40180000) return two-tiny;/* x < -6 */ R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*( rb5+s*rb6))))); S=one+s*(sb1+s*(sbold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_finite.c��������������������������������������� 664 � 0 � 0 � 1211 6622405624 23330�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_finite.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * finite(x) returns 1 is x is finite, else 0; * no branching! */ #include "fdlibm.h" int finite(double x) { int hx; hx = __HI(x); return (unsigned)((hx&0x7fffffff)-0x7ff00000)>>31; } ht (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* expm1(x) * Returns exp(x)-1, the exponential of x minus 1old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_floor.c���������������������������������������� 664 � 0 � 0 � 3206 6622405624 23201�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_floor.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * floor(x) * Return x rounded toward -inf to integral value * Method: * Bit twiddling. * Exception: * Inexact flag raised if x not equal to floor(x). */ #include "fdlibm.h" static const double Huge = 1.0e300; double floor(double x) { int i0,i1,j0; unsigned i,j; i0 = __HI(x); i1 = __LO(x); j0 = ((i0>>20)&0x7ff)-0x3ff; if(j0<20) { if(j0<0) { /* raise inexact if x != 0 */ if(Huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ if(i0>=0) {i0=i1=0;} else if(((i0&0x7fffffff)|i1)!=0) { i0=0xbff00000;i1=0;} } } else { i = (0x000fffff)>>j0; if(((i0&i)|i1)==0) return x; /* x is integral */ if(Huge+x>0.0) { /* raise inexact flag */ if(i0<0) i0 += (0x00100000)>>j0; i0 &= (~i); i1=0; } } } else if (j0>51) { if(j0==0x400) return x+x; /* inf or NaN */ else return x; /* x is integral */ } else { i = ((unsigned)(0xffffffff))>>(j0-20); if((i1&i)==0) return x; /* x is integral */ if(Huge+x>0.0) { /* raise inexact flag */ if(i0<0) { if(j0==20) i0+=1; else { j = i1+(1<<(52-j0)); if(j<i1) i0 +=1 ; /* got a carry */ i1=j; } } i1 &= (~i); } } __HI(x) = i0; __LO(x) = i1; return x; } [ 6 - r*(3 - R1*r/2) ] ) } 2 ) * ( ) * * = r - E * 3. Scale back to obtain expm1(x): * From step 1, we have * expm1(x) = either 2^k*[expm1(r)+1] - 1 * = or 2^k*[expm1(r) + (1-2^-k)] * 4. Implementation notes: * (A). To save one multiplication, we scale the coefficient Qi old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_ilogb.c���������������������������������������� 664 � 0 � 0 � 2053 6622405624 23153�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_ilogb.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* ilogb(double x) * return the binary exponent of non-zero x * ilogb(0) = 0x80000001 * ilogb(inf/NaN) = 0x7fffffff (no signal is raised) */ #include "fdlibm.h" int ilogb(double x) { int hx,lx,ix; hx = (__HI(x))&0x7fffffff; /* high word of x */ if(hx<0x00100000) { lx = __LO(x); if((hx|lx)==0) return 0x80000001; /* ilogb(0) = 0x80000001 */ else /* subnormal x */ if(hx==0) { for (ix = -1043; lx>0; lx<<=1) ix -=1; } else { for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1; } return ix; } else if (hx<0x7ff00000) return (hx>>20)-1023; else return 0x7fffffff; } 1 111110F4 */ Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */ Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */ Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */ Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ double expm1(double x) { double y,hi,lo,c,t,e,hxs,hfx,r1; int k,xsb; unsigned hx; hx = __HI(x); /* high word of x */ xsb = hx&0x80000000; /* sign bit of x */ if(xsb==0) y=x; else y= -x; /* y = |x| */ hx old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_isnan.c���������������������������������������� 664 � 0 � 0 � 1303 6622405624 23164�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_isnan.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * isnan(x) returns 1 is x is nan, else 0; * no branching! */ #include "fdlibm.h" int isnan(double x) { int hx,lx; hx = (__HI(x)&0x7fffffff); lx = __LO(x); hx |= (unsigned)(lx|(-lx))>>31; hx = 0x7ff00000 - hx; return ((unsigned)(hx))>>31; } fx = 0.5*x; hxs = x*hfx; r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5)))); t = 3.0-r1*hfx; e = hxs*((r1-t)/(6.0 - x*t)); if(k==0) return x - (x*e-hxs); /* c is 0 */ else { e = (x*(e-c)-c); e -= hxs; if(k== -1) return 0.5*(x-e)-0.5; if(k==1) if(x < -0.25) return -2.0*(e-(x+0old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_log1p.c���������������������������������������� 664 � 0 � 0 � 12160 6622405625 23122�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_log1p.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* double log1p(double x) * * Method : * 1. Argument Reduction: find k and f such that * 1+x = 2^k * (1+f), * where sqrt(2)/2 < 1+f < sqrt(2) . * * Note. If k=0, then f=x is exact. However, if k!=0, then f * may not be representable exactly. In that case, a correction * term is need. Let u=1+x rounded. Let c = (1+x)-u, then * log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u), * and add back the correction term c/u. * (Note: when x > 2**53, one can simply return log(x)) * * 2. Approximation of log1p(f). * Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s) * = 2s + 2/3 s**3 + 2/5 s**5 + ....., * = 2s + s*R * We use a special Reme algorithm on [0,0.1716] to generate * a polynomial of degree 14 to approximate R The maximum error * of this polynomial approximation is bounded by 2**-58.45. In * other words, * 2 4 6 8 10 12 14 * R(z) ~ Lp1*s +Lp2*s +Lp3*s +Lp4*s +Lp5*s +Lp6*s +Lp7*s * (the values of Lp1 to Lp7 are listed in the program) * and * | 2 14 | -58.45 * | Lp1*s +...+Lp7*s - R(z) | <= 2 * | | * Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2. * In order to guarantee error in log below 1ulp, we compute log * by * log1p(f) = f - (hfsq - s*(hfsq+R)). * * 3. Finally, log1p(x) = k*ln2 + log1p(f). * = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo))) * Here ln2 is split into two floating point number: * ln2_hi + ln2_lo, * where n*ln2_hi is always exact for |n| < 2000. * * Special cases: * log1p(x) is NaN with signal if x < -1 (including -INF) ; * log1p(+INF) is +INF; log1p(-1) is -INF with signal; * log1p(NaN) is that NaN with no signal. * * Accuracy: * according to an error analysis, the error is always less than * 1 ulp (unit in the last place). * * Constants: * The hexadecimal values are the intended ones for the following * constants. The decimal values may be used, provided that the * compiler will convert from decimal to binary accurately enough * to produce the hexadecimal values shown. * * Note: Assuming log() return accurate answer, the following * algorithm can be used to compute log1p(x) to within a few ULP: * * u = 1+x; * if(u==1.0) return x ; else * return log(u)*(x/(u-1.0)); * * See HP-15C Advanced Functions Handbook, p.193. */ #include "fdlibm.h" static const double ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */ ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */ two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */ Lp1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ Lp2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ Lp3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ Lp4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ Lp5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ Lp6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ Lp7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ static double zero = 0.0; double log1p(double x) { double hfsq,f,c,s,z,R,u; int k,hx,hu,ax; hx = __HI(x); /* high word of x */ ax = hx&0x7fffffff; k = 1; if (hx < 0x3FDA827A) { /* x < 0.41422 */ if(ax>=0x3ff00000) { /* x <= -1.0 */ if(x==-1.0) return -two54/zero; /* log1p(-1)=+inf */ else return (x-x)/(x-x); /* log1p(x<-1)=NaN */ } if(ax<0x3e200000) { /* |x| < 2**-29 */ if(two54+x>zero /* raise inexact */ &&ax<0x3c900000) /* |x| < 2**-54 */ return x; else return x - x*x*0.5; } if(hx>0||hx<=((int)0xbfd2bec3)) { k=0;f=x;hu=1;} /* -0.2929<x<0.41422 */ } if (hx >= 0x7ff00000) return x+x; if(k!=0) { if(hx<0x43400000) { u = 1.0+x; hu = __HI(u); /* high word of u */ k = (hu>>20)-1023; c = (k>0)? 1.0-(u-x):x-(u-1.0);/* correction term */ c /= u; } else { u = x; hu = __HI(u); /* high word of u */ k = (hu>>20)-1023; c = 0; } hu &= 0x000fffff; if(hu<0x6a09e) { __HI(u) = hu|0x3ff00000; /* normalize u */ } else { k += 1; __HI(u) = hu|0x3fe00000; /* normalize u/2 */ hu = (0x00100000-hu)>>2; } f = u-1.0; } hfsq=0.5*f*f; if(hu==0) { /* |f| < 2**-20 */ if(f==zero) if(k==0) return zero; else {c += k*ln2_lo; return k*ln2_hi+c;} R = hfsq*(1.0-0.66666666666666666*f); if(k==0) return f-R; else return k*ln2_hi-((R-(k*ln2_lo+c))-f); } s = f/(2.0+f); z = s*s; R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7)))))); if(k==0) return f-(hfsq-s*(hfsq+R)); else return k*ln2_hi-((hfsq-(s*(hfsq+R)+(k*ln2_lo+c)))-f); } if(i0<0) i0 += (0x00100000)>>j0; i0 &= (~i); i1=0; } } } else if (j0>51) { if(j0==0x400) return x+x; /* inf or NaN */ else return x; /* x is integral */ } else { i = ((unsigned)(0xffffffff))>>(j0-20); if((i1&i)==0) return x; /* x is integral */ if(Huge+x>0.0) { /* raise inexact flag */ if(i0<0) { if(j0==20) i0+=1; else { j = i1+(1<<(52-old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_modf.c����������������������������������������� 664 � 0 � 0 � 3305 6622405625 23006�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_modf.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * modf(double x, double *iptr) * return fraction part of x, and return x's integral part in *iptr. * Method: * Bit twiddling. * * Exception: * No exception. */ #include "fdlibm.h" static const double one = 1.0; double modf(double x, double *iptr) { int i0,i1,j0; unsigned i; i0 = __HI(x); /* high x */ i1 = __LO(x); /* low x */ j0 = ((i0>>20)&0x7ff)-0x3ff; /* exponent of x */ if(j0<20) { /* integer part in high x */ if(j0<0) { /* |x|<1 */ __HIp(iptr) = i0&0x80000000; __LOp(iptr) = 0; /* *iptr = +-0 */ return x; } else { i = (0x000fffff)>>j0; if(((i0&i)|i1)==0) { /* x is integral */ *iptr = x; __HI(x) &= 0x80000000; __LO(x) = 0; /* return +-0 */ return x; } else { __HIp(iptr) = i0&(~i); __LOp(iptr) = 0; return x - *iptr; } } } else if (j0>51) { /* no fraction part */ *iptr = x*one; __HI(x) &= 0x80000000; __LO(x) = 0; /* return +-0 */ return x; } else { /* fraction part in low x */ i = ((unsigned)(0xffffffff))>>(j0-20); if((i1&i)==0) { /* x is integral */ *iptr = x; __HI(x) &= 0x80000000; __LO(x) = 0; /* return +-0 */ return x; } else { __HIp(iptr) = i0; __LOp(iptr) = i1&(~i); return x - *iptr; } } } 2936239552e-06, /* 3ED0CFCA 86E65239 */ Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ double expm1(double x) { double y,hi,lo,c,t,e,hxs,hfx,r1; int k,xsb; unsigned hx; hx = __HI(x); /* high word of x */ xsb = hx&0x80000000; /* sign bit of x */ if(xsb==0) y=x; else y= -x; /* y = |x| */ hx old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_nextafter.c������������������������������������ 664 � 0 � 0 � 3652 6622405625 24066�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_nextafter.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* IEEE functions * nextafter(x,y) * return the next machine floating-point number of x in the * direction toward y. * Special cases: */ #include "fdlibm.h" double nextafter(double x, double y) { int hx,hy,ix,iy; unsigned lx,ly; hx = __HI(x); /* high word of x */ lx = __LO(x); /* low word of x */ hy = __HI(y); /* high word of y */ ly = __LO(y); /* low word of y */ ix = hx&0x7fffffff; /* |x| */ iy = hy&0x7fffffff; /* |y| */ if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || /* x is nan */ ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) /* y is nan */ return x+y; if(x==y) return x; /* x=y, return x */ if((ix|lx)==0) { /* x == 0 */ __HI(x) = hy&0x80000000; /* return +-minsubnormal */ __LO(x) = 1; y = x*x; if(y==x) return y; else return x; /* raise underflow flag */ } if(hx>=0) { /* x > 0 */ if(hx>hy||((hx==hy)&&(lx>ly))) { /* x > y, x -= ulp */ if(lx==0) hx -= 1; lx -= 1; } else { /* x < y, x += ulp */ lx += 1; if(lx==0) hx += 1; } } else { /* x < 0 */ if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){/* x < y, x -= ulp */ if(lx==0) hx -= 1; lx -= 1; } else { /* x > y, x += ulp */ lx += 1; if(lx==0) hx += 1; } } hy = hx&0x7ff00000; if(hy>=0x7ff00000) return x+x; /* overflow */ if(hy<0x00100000) { /* underflow */ y = x*x; if(y!=x) { /* raise underflow flag */ __HI(y) = hx; __LO(y) = lx; return y; } } __HI(x) = hx; __LO(x) = lx; return x; } =================== */ /* double log1p(double x) * * Method : *old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_rint.c����������������������������������������� 664 � 0 � 0 � 4055 7407414232 23034�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_rint.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* dummy routine to get around over-eager arm compiler optimization. * Calling this causes a store and reload of floating point numbers */ void dummy(void) { } /* * rint(x) * Return x rounded to integral value according to the prevailing * rounding mode. * Method: * Using floating addition. * Exception: * Inexact flag raised if x not equal to rint(x). */ #include "fdlibm.h" static const double TWO52[2]={ 4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */ -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */ }; double rint(double x) { int i0,j0,sx; unsigned i,i1; double w,t; i0 = __HI(x); sx = (i0>>31)&1; i1 = __LO(x); j0 = ((i0>>20)&0x7ff)-0x3ff; if(j0<20) { if(j0<0) { if(((i0&0x7fffffff)|i1)==0) return x; i1 |= (i0&0x0fffff); i0 &= 0xfffe0000; i0 |= ((i1|-i1)>>12)&0x80000; __HI(x)=i0; w = TWO52[sx]+x; dummy(); /* fix optimiser */ t = w-TWO52[sx]; i0 = __HI(t); __HI(t) = (i0&0x7fffffff)|(sx<<31); return t; } else { i = (0x000fffff)>>j0; if(((i0&i)|i1)==0) return x; /* x is integral */ i>>=1; if(((i0&i)|i1)!=0) { if(j0==19) i1 = 0x40000000; else i0 = (i0&(~i))|((0x20000)>>j0); } } } else if (j0>51) { if(j0==0x400) return x+x; /* inf or NaN */ else return x; /* x is integral */ } else { i = ((unsigned)(0xffffffff))>>(j0-20); if((i1&i)==0) return x; /* x is integral */ i>>=1; if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20)); } __HI(x) = i0; __LO(x) = i1; w = TWO52[sx]+x; dummy(); /* fix optimiser */ return w-TWO52[sx]; } 0000e+16, /* 43500000 00000000 */ Lp1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ Lp2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ Lp3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ Lp4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ Lp5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ Lp6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ Lp7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ static double zero = 0.0; doubold_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_scalbn.c��������������������������������������� 664 � 0 � 0 � 3356 6622405625 23331�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_scalbn.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* * scalbn (double x, int n) * scalbn(x,n) returns x* 2**n computed by exponent * manipulation rather than by actually performing an * exponentiation or a multiplication. */ #include "fdlibm.h" static const double two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */ Huge = 1.0e+300, tiny = 1.0e-300; double scalbn (double x, int n) { int k,hx,lx; hx = __HI(x); lx = __LO(x); k = (hx&0x7ff00000)>>20; /* extract exponent */ if (k==0) { /* 0 or subnormal x */ if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */ x *= two54; hx = __HI(x); k = ((hx&0x7ff00000)>>20) - 54; if (n< -50000) return tiny*x; /*underflow*/ } if (k==0x7ff) return x+x; /* NaN or Inf */ k = k+n; if (k > 0x7fe) return Huge*copysign(Huge,x); /* overflow */ if (k > 0) /* normal result */ {__HI(x) = (hx&0x800fffff)|(k<<20); return x;} if (k <= -54) if (n > 50000) /* in case integer overflow in n+k */ return Huge*copysign(Huge,x); /*overflow*/ else return tiny*copysign(tiny,x); /*underflow*/ k += 54; /* subnormal result */ __HI(x) = (hx&0x800fffff)|(k<<20); return x*twom54; } �������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_sin.c������������������������������������������ 664 � 0 � 0 � 3632 6622405625 22655�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_sin.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* sin(x) * Return sine function of x. * * kernel function: * __kernel_sin ... sine function on [-pi/4,pi/4] * __kernel_cos ... cose function on [-pi/4,pi/4] * __ieee754_rem_pio2 ... argument reduction routine * * Method. * Let S,C and T denote the sin, cos and tan respectively on * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 * in [-pi/4 , +pi/4], and let n = k mod 4. * We have * * n sin(x) cos(x) tan(x) * ---------------------------------------------------------- * 0 S C T * 1 C -S -1/T * 2 -S -C T * 3 -C S -1/T * ---------------------------------------------------------- * * Special cases: * Let trig be any of sin, cos, or tan. * trig(+-INF) is NaN, with signals; * trig(NaN) is that NaN; * * Accuracy: * TRIG(x) returns trig(x) nearly rounded */ #include "fdlibm.h" double sin(double x) { double y[2],z=0.0; int n, ix; /* High word of x. */ ix = __HI(x); /* |x| ~< pi/4 */ ix &= 0x7fffffff; if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0); /* sin(Inf or NaN) is NaN */ else if (ix>=0x7ff00000) return x-x; /* argument reduction needed */ else { n = __ieee754_rem_pio2(x,y); switch(n&3) { case 0: return __kernel_sin(y[0],y[1],1); case 1: return __kernel_cos(y[0],y[1]); case 2: return -__kernel_sin(y[0],y[1],1); default: return -__kernel_cos(y[0],y[1]); } } } ������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_tan.c������������������������������������������ 664 � 0 � 0 � 3403 6622405625 22642�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_tan.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* tan(x) * Return tangent function of x. * * kernel function: * __kernel_tan ... tangent function on [-pi/4,pi/4] * __ieee754_rem_pio2 ... argument reduction routine * * Method. * Let S,C and T denote the sin, cos and tan respectively on * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 * in [-pi/4 , +pi/4], and let n = k mod 4. * We have * * n sin(x) cos(x) tan(x) * ---------------------------------------------------------- * 0 S C T * 1 C -S -1/T * 2 -S -C T * 3 -C S -1/T * ---------------------------------------------------------- * * Special cases: * Let trig be any of sin, cos, or tan. * trig(+-INF) is NaN, with signals; * trig(NaN) is that NaN; * * Accuracy: * TRIG(x) returns trig(x) nearly rounded */ #include "fdlibm.h" double tan(double x) { double y[2],z=0.0; int n, ix; /* High word of x. */ ix = __HI(x); /* |x| ~< pi/4 */ ix &= 0x7fffffff; if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1); /* tan(Inf or NaN) is NaN */ else if (ix>=0x7ff00000) return x-x; /* NaN */ /* argument reduction needed */ else { n = __ieee754_rem_pio2(x,y); return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /* 1 -- n even -1 -- n odd */ } } tar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/fdlibm/s_tanh.c����������������������������������������� 664 � 0 � 0 � 3537 6622405625 23022�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* derived from /netlib/fdlibm */ /* @(#)s_tanh.c 1.3 95/01/18 */ /* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ /* Tanh(x) * Return the Hyperbolic Tangent of x * * Method : * x -x * e - e * 0. tanh(x) is defined to be ----------- * x -x * e + e * 1. reduce x to non-negative by tanh(-x) = -tanh(x). * 2. 0 <= x <= 2**-55 : tanh(x) := x*(one+x) * -t * 2**-55 < x <= 1 : tanh(x) := -----; t = expm1(-2x) * t + 2 * 2 * 1 <= x <= 22.0 : tanh(x) := 1- ----- ; t=expm1(2x) * t + 2 * 22.0 < x <= INF : tanh(x) := 1. * * Special cases: * tanh(NaN) is NaN; * only tanh(0)=0 is exact for finite argument. */ #include "fdlibm.h" static const double one=1.0, two=2.0, tiny = 1.0e-300; double tanh(double x) { double t,z; int jx,ix; /* High word of |x|. */ jx = __HI(x); ix = jx&0x7fffffff; /* x is INF or NaN */ if(ix>=0x7ff00000) { if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */ else return one/x-one; /* tanh(NaN) = NaN */ } /* |x| < 22 */ if (ix < 0x40360000) { /* |x|<22 */ if (ix<0x3c800000) /* |x|<2**-55 */ return x*(one+x); /* tanh(small) = small */ if (ix>=0x3ff00000) { /* |x|>=1 */ t = expm1(two*fabs(x)); z = one - two/(t+two); } else { t = expm1(-two*fabs(x)); z= -t/(t+two); } /* |x| > 22, return +-1 */ } else { z = one - tiny; /* raised inexact flag */ } return (jx>=0)? z: -z; } 4 96CB03DE */ Lp6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ Lp7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ static double zero = 0.0; doubold_contrib//root/sys/src/cmd/limbo/libmath/g_fmt.c������������������������������������������������� 664 � 0 � 0 � 4423 10206413402 21401�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**************************************************************** * * The author of this software is David M. Gay. * * Copyright (c) 1991, 1996 by Lucent Technologies. * * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. * ***************************************************************/ /* g_fmt(buf,x) stores the closest decimal approximation to x in buf; * it suffices to declare buf * char buf[32]; */ #ifdef __cplusplus extern "C" { #endif extern char *dtoa(double, int, int, int *, int *, char **); extern char *g_fmt(char *, double, int); extern void freedtoa(char*); #ifdef __cplusplus } #endif char * g_fmt(register char *b, double x, int echr) { register int i, k; register char *s; int decpt, j, sign; char *b0, *s0, *se; b0 = b; #ifdef IGNORE_ZERO_SIGN if (!x) { *b++ = '0'; *b = 0; goto done; } #endif s = s0 = dtoa(x, 0, 0, &decpt, &sign, &se); if (sign) *b++ = '-'; if (decpt == 9999) /* Infinity or Nan */ { while(*b++ = *s++); goto done0; } if (decpt <= -4 || decpt > se - s + 5) { *b++ = *s++; if (*s) { *b++ = '.'; while(*b = *s++) b++; } *b++ = echr; /* sprintf(b, "%+.2d", decpt - 1); */ if (--decpt < 0) { *b++ = '-'; decpt = -decpt; } else *b++ = '+'; for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10); for(;;) { i = decpt / k; *b++ = i + '0'; if (--j <= 0) break; decpt -= i*k; decpt *= 10; } *b = 0; } else if (decpt <= 0) { *b++ = '.'; for(; decpt < 0; decpt++) *b++ = '0'; while(*b++ = *s++); } else { while(*b = *s++) { b++; if (--decpt == 0 && *s) *b++ = '.'; } for(; decpt > 0; decpt--) *b++ = '0'; *b = 0; } done0: freedtoa(s0); #ifdef IGNORE_ZERO_SIGN done: #endif return b0; } ����������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/gemm.c�������������������������������������������������� 664 � 0 � 0 � 5732 10206413402 21236�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "lib9.h" #include "mathi.h" void gemm(int transa, int transb, int m, int n, int k, double alpha, double *a, int lda, double *b, int ldb, double beta, double *c, int ldc) { int i1, i2, i3, nota, notb, i, j, jb, jc, l, la; double temp; nota = transa=='N'; notb = transb=='N'; if(m == 0 || n == 0 || (alpha == 0. || k == 0) && beta == 1.){ return; } if(alpha == 0.){ if(beta == 0.){ i1 = n; for(j = 0; j < i1; ++j){ jc = j*ldc; i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = 0.; } } }else{ i1 = n; for(j = 0; j < i1; ++j){ jc = j*ldc; i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = beta * c[i + jc]; } } } return; } if(!a){ if(notb){ /* C := alpha*B + beta*C. */ i1 = n; for(j = 0; j < i1; ++j){ jb = j*ldb; jc = j*ldc; i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = alpha*b[i+jb] + beta*c[i+jc]; } } }else{ /* C := alpha*B' + beta*C. */ i1 = n; for(j = 0; j < i1; ++j){ jc = j*ldc; i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = alpha*b[j+i*ldb] + beta*c[i+jc]; } } } return; } if(notb){ if(nota){ /* Form C := alpha*A*B + beta*C. */ i1 = n; for(j = 0; j < i1; ++j){ jc = j*ldc; if(beta == 0.){ i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = 0.; } }else if(beta != 1.){ i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = beta * c[i + jc]; } } i2 = k; for(l = 0; l < i2; ++l){ la = l*lda; if(b[l + j*ldb] != 0.){ temp = alpha * b[l + j*ldb]; i3 = m; for(i = 0; i < i3; ++i){ c[i + jc] += temp * a[i + la]; } } } } }else{ /* Form C := alpha*A'*B + beta*C */ i1 = n; for(j = 0; j < i1; ++j){ jc = j*ldc; i2 = m; for(i = 0; i < i2; ++i){ temp = 0.; i3 = k; for(l = 0; l < i3; ++l){ temp += a[l + i*lda] * b[l + j*ldb]; } if(beta == 0.){ c[i + jc] = alpha * temp; }else{ c[i + jc] = alpha * temp + beta * c[i + jc]; } } } } }else{ if(nota){ /* Form C := alpha*A*B' + beta*C */ i1 = n; for(j = 0; j < i1; ++j){ jc = j*ldc; if(beta == 0.){ i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = 0.; } }else if(beta != 1.){ i2 = m; for(i = 0; i < i2; ++i){ c[i + jc] = beta * c[i + jc]; } } i2 = k; for(l = 0; l < i2; ++l){ if(b[j + l*ldb] != 0.){ temp = alpha * b[j + l*ldb]; i3 = m; for(i = 0; i < i3; ++i){ c[i + jc] += temp * a[i + l*lda]; } } } } }else{ /* Form C := alpha*A'*B' + beta*C */ i1 = n; for(j = 0; j < i1; ++j){ jc = j*ldc; i2 = m; for(i = 0; i < i2; ++i){ temp = 0.; i3 = k; for(l = 0; l < i3; ++l){ temp += a[l + i*lda] * b[j + l*ldb]; } if(beta == 0.){ c[i + jc] = alpha * temp; }else{ c[i + jc] = alpha * temp + beta * c[i + jc]; } } } } } } C -S -1/T * 2 -S -C old_contrib//root/sys/src/cmd/limbo/libmath/gfltconv.c���������������������������������������������� 664 � 0 � 0 � 5423 10206413402 22130�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "lib9.h" #include "mathi.h" extern char *dtoa(double, int, int, int *, int *, char **); extern void freedtoa(char*); extern int _fmtcpy(Fmt*, void*, int, int); enum { NONE = -1000, FDIGIT = 20, FDEFLT = 6, NSIGNIF = 17 }; int gfltconv(Fmt *f) { int flags = f->flags; int precision; int fmt = f->r; double d; int echr, exponent, sign, ndig, nout, i; char *digits, *edigits, ebuf[32], *eptr; char out[64], *pout; d = va_arg(f->args, double); echr = 'e'; precision = FDEFLT; if(f->flags & FmtPrec) precision = f->prec; if(precision > FDIGIT) precision = FDIGIT; switch(fmt){ case 'f': digits = dtoa(d, 3, precision, &exponent, &sign, &edigits); break; case 0x00c9: /* L'É' */ case 'E': echr = 'E'; fmt = 'e'; /* fall through */ case 'e': digits = dtoa(d, 2, 1+precision, &exponent, &sign, &edigits); break; case 'G': echr = 'E'; /* fall through */ default: case 'g': if((flags&(FmtWidth|FmtPrec)) == 0){ g_fmt(out, d, echr); f->flags &= FmtWidth|FmtLeft; return _fmtcpy(f, out, strlen(out), strlen(out)); } if (precision > 0) digits = dtoa(d, 2, precision, &exponent, &sign, &edigits); else { digits = dtoa(d, 0, precision, &exponent, &sign, &edigits); precision = edigits - digits; if (exponent > precision && exponent <= precision + 4) precision = exponent; } if(exponent >= -3 && exponent <= precision){ fmt = 'f'; precision -= exponent; }else{ fmt = 'e'; --precision; } break; } if (exponent == 9999) { /* Infinity or Nan */ precision = 0; exponent = edigits - digits; fmt = 'f'; } ndig = edigits-digits; if((f->r=='g' || f->r=='G') && !(flags&FmtSharp)){ /* knock off trailing zeros */ if(fmt == 'f'){ if(precision+exponent > ndig) { precision = ndig - exponent; if(precision < 0) precision = 0; } } else{ if(precision > ndig-1) precision = ndig-1; } } eptr = ebuf; if(fmt != 'f'){ /* exponent */ for(i=exponent<=0?1-exponent:exponent-1; i; i/=10) *eptr++ = '0' + i%10; while(eptr<ebuf+2) *eptr++ = '0'; } pout = out; if(sign) *pout++ = '-'; else if(flags&FmtSign) *pout++ = '+'; else if(flags&FmtSpace) *pout++ = ' '; if(fmt == 'f'){ for(i=0; i<exponent; i++) *pout++ = i<ndig?digits[i]:'0'; if(i == 0) *pout++ = '0'; if(precision>0 || flags&FmtSharp) *pout++ = '.'; for(i=0; i!=precision; i++) *pout++ = 0<=i+exponent && i+exponent<ndig?digits[i+exponent]:'0'; } else{ *pout++ = digits[0]; if(precision>0 || flags&FmtSharp) *pout++ = '.'; for(i=0; i!=precision; i++) *pout++ = i<ndig-1?digits[i+1]:'0'; } if(fmt != 'f'){ *pout++ = echr; *pout++ = exponent<=0?'-':'+'; while(eptr>ebuf) *pout++ = *--eptr; } *pout = 0; freedtoa(digits); f->flags &= FmtWidth|FmtLeft; nout = pout-out; return _fmtcpy(f, out, nout, nout); } z = one - tiny; /* raised inexact flag */ } return (jx>=0)? z: -z; } 4 96CB03DE */ Lp6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ Lp7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ static double zero = 0.0; doubold_contrib//root/sys/src/cmd/limbo/libmath/lib9.h�������������������������������������������������� 664 � 0 � 0 � 41 10745502317 21115�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <u.h> #include <libc.h> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmath/libmath.a����������������������������������������������� 664 � 0 � 0 � 670050 10745520600 21777�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!<arch> __.SYMDEF 1201054080 0 0 644 1008 ` T�j�tanh�Te�tan�Tr`�sin�TY�scalbn�TZQ�dummy�TZQ�rint�T~I�nextafter�T:�log1p�TH8�isnan�T4�ilogb�T,�floor�T*�finite�TN(�fabs�T�expm1�Tn�erfc�Tn�erf�T�cos�Tx�copysign�TR�ceil�T�cbrt�T<�atan�T�asinh�T�__kernel_tan�T�__kernel_sin�T�__kernel_rem_pio2�T�__kernel_cos�Tz�__ieee754_sqrt�T$s�__ieee754_sinh�T�k�__ieee754_remainder�TzQ�__ieee754_rem_pio2�T)�__ieee754_pow�T#�__ieee754_log10�Tv�__ieee754_log�T�__ieee754_lgamma_r�TD�__ieee754_jn�TD�__ieee754_yn�T^�__ieee754_j1�T^�__ieee754_y1�T�__ieee754_j0�T�__ieee754_y0�Tt�__ieee754_hypot�Tc�__ieee754_fmod�TW�__ieee754_exp�TO�__ieee754_cosh�TI�__ieee754_atanh�T=�__ieee754_atan2�T,0�__ieee754_asin�TV*�__ieee754_acosh�T<�__ieee754_acos�T�ipow10�T�gfltconv�T��g_fmt�T��gemm�T��getFPcontrol�T��getFPstatus�T��FPstatus�T��FPinit�T��FPcontrol�T��fdim�T��fmin�T��fmax�T. ��dtoa�T. ��strtod�T. ��freedtoa�T4��norm2�T4��norm1�T4��iamax�T4��dot��blas.8 1201054036 0 0 664 1982 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<blas.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�D�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�E�����~�E<libc.a�7�F����A7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<..�~�E<include�~�E<mathi.h�7�����7�a����7�����~�=dot��c��= ���A~�@x�p�c�����@ ~�@y�p�c�����@ ~�@n�p�c��@ 9e����~�?sum��e��?&�f�� AQ�f��� ���<9g�����g����W�h��� ���<W�h��� ���<W�h������<p�h�� /�h��� &�h��AO�h��� ���<p�i��  �i�����A �i��Op�i��  �i�����A �i��O i��i��?�i��?W�i��� ���<�k��?�k����9k�����k����~�=iamax��p��=(���A&�t��@AQ�t���$���<p�u��A�u����~�?m�p�v��A?p�w�����@�w��O�w��S~�=fabs��w���=~�? xm��w�� ?p�x�����A W�x���/���<W�x���.���<W�x���C���<C�x��� ~�? i�p�x��  ?&�x�� @P�x���-���< �y�����A���@p�y�����@�y��O�y��S�y���=p�y�� ? ~�? a��y�� ?�z�� ?�z�� ?�z����*z����z����L�z���B���<p�{�� ?�|�� ?�|�� ?W�|���,���<p���?����������~�= norm1���� =���A9�������?&���@AQ����M���<9���������W����P���<W����P���<W����\���<p���@/����@&���AO����O���<p������@ ������A���@���O���S����=��?���?W����N���<���?�����9���������~�= norm2���� = ���Ap���@ p������@ 9�������?&��� AQ����i���<9���������W����l���<W����l���<W����w���<p��� /���� &���AO����k���<���P���P ����?���? ������A W����j���<���?�����9���������I����dtoa.8 1201054037 0 0 664 47723 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<dtoa.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�F�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�G�����~�E<libc.a�7�H����A7�����7�����7� ����~�>Balloc��g��>���A~�@k�p�g��@ ~�>freelist�p�m�� > &�m�� AO�m������<p�n��Rp�n�� >W�n������<p�p��  p�p�����A�p�� p�q�� ~�?x�p�q��?�q�����A �q�����A p�q�� S~�=malloc��q���=p�q�� &�r��AX�r������<p�s��A�s����p�t��@ p�t�� ���Op�u��? p�u�� ���Op�x��A���Rp�x��A p�x��  ���Rp�y�� �y�����y����~�>Bfree��}��>A~�@v�p�}��@ &��� AO����)���<p������R p��� > p��� Rp������R p���  >�����~�>multadd����>0���A~�@ a�p������ @~�@ b�p��� @p������O~�? wds�p��� ?p��� @ ������A p���AW����8���<W����5���<W����P���<C����&��� ?P����4���<p���Rp��� �����A~�@ m�|������ @� ���p��� p��� ������A|������ @�p���  ������A ��� p��� ������Ap���p��� ������Ap���  �����A ��� p���  ������A p���PW����3���<&���Ap������ @O����v���<p��� @p������O&��� ?U����n���<p��� @ p������P C���� p��� S����>p��� @ ~�? b1�p��� ? ��� ���Ap���Sp���  ��� ���Ap������Sp������Q������A ������Ap������S~�=memcpy�����=p��� @p���S����>p������ @p��� ?p��� @p��� ?C���� ?p��� @ a���Qp������Op��� @p��� ? p��� ���Op��� @����������~�>s2b����>(���A~�@nd�p������@ ������A p���98A=��� �p��� ������A������A ��� p���  p���A p������A W�������<W�������<W�������<������A C���� &���  S�������<W�������<p��� S����>~�@s�p���@ p��� ~�@y9�p��� ���@ p��� ���Op������A���O~�?i�p��� ���A?~�@nd0�&������@ ���AS�������< ��� ���A W�������<W�������<W�������<C����?p���?&������@P�������<p��� Sp��� ���A p��� ���Sp���  C���� p��� @r���P ���A p��� ���S����>p���@ p��� W�������<C���� W�������< ��� ���A W�������<W�������<W�������<C����?p���?&������@P�������<p��� Sp��� ���A p��� ���Sp���  C���� p��� @r���P ���A p��� ���S����>p���@ p��� W�������<p��� ����������~�>hi0bits����>���A~�@x�p���@p���A p��� �����A&���AX�������<p������A ������A p���  ������A&���AX�������< ������A ������A p���  ������A&���AX�������< ������A ������A p���  ������A&���AX�������< ������A ������A p���  ������A&���AX�������<C���� p���  ������@A&���AX�������<p��� ���A�����p��� ����������~�>lo0bits����> ���A~�@y�p���@ p���T p���  ������A&���AO���� ��<p���  ������A&���AO�������<p���A�����p���  ������A&���AO������<p��� ������Ap���Tp������A�����p��� ������Ap���Tp������A�����p���A p���  �����A&���AX������<p������A ������A p���  ������A&���AX������< ������A ������A p���  ������A&���AX������< ������A ������A p���  ������A&���AX����#��< �������A ������A p���  ������A&���AX����3��<C���� ������A &��� AX����-��<p������AW����.��<p���A ������A&���AO����3��<p��� ���A�����p� �� Tp� �� � ����� ����~�>i2b����>���Ap������A p��� S����>~�@i�p���@ p��� ���Op������A���O����������~�>mult����>L���Ap������ @ p��� @ p�!�����Qp�!�����T &�!�� P�!���J��<p�"��  p�#��  p�$��  p�&�����Q p�'�����Qp�(�� ��� @p�(�����T ~�?wa�p�)��? �)�� ~�?wb�p�)�� ?p�)�� p�*��  @p�*�����Q&�*�� ~�?wc�p�*�� ?S�*���X��<C�+��� p�,�� S�,���>~�?c�p�,��?p�-��? �-�����A p�-��? a�-�� Rp�-�� W�-���d��<W�-���c��<W�-���h��< �-�����A &�-��  L�-���b��<p�.��ARW�.���a��<p�/�� @ �/�����A~�? xa�p�/�� ?p�0��? p�0�� ? a�0�� Q~�?!xae�p�0��!?p�1����� @ �1�����A~�?"xb�p�1��"?p�2��? p�2��"? a�2�� Q~�?#xbe�p�2��#?p�3��? �3�����A~�?$xc0�p�3��$?W�4���~��<W�4���|��<W�4�����< �4�����A"? �4�����A$?p�4��"?&�4��#?L�4���{��<p�5��"?p�5��O �5����A~�?%y�p�5��%?&�5��AO�5�����<p�6�� ? p�7��$? p�8��AW�?�����<W�?�����<W�?�����<&�?�� !?L�?�����<p�:��T �:����A|�:��%?� �:��p�:��R �:����A �:�� p�:���;�����Ap�;�� p�<��  �<�����A p�<��O�<�����A|�<��%?� �<�� p�<��R �<�����A �<�� p�<�� �=�����Ap�=��p�>�� �>�����Ap�>�� �>����A �>�� p�>��  �>�����A p�>��PW�>�����<p�@��Rp�B��"?p�B��O�B�����Ap�B��&�B��AO�B�����<p�C�� ? p�D��$? p�E��A p�F��RW�M�����<W�M�����<W�M�����<&�M�� !?L�M�����<p�H��T �H����A|�H��� �H�� p�H��R �H�����A �H�� p�H�� �I�����A~�?&carry�p�I��&?p�J�� �J�����Ap�J�� �J����A �J�� p�J��  �J�����A p�J��Pp�K��  �K�����A p�K��O�K�����A|�K��� �K��&?p�K��R �K����A �K�� p�K���L�����Ap�L�� W�L�����<p�N��RW�N���z��<p�Q��? �Q�����Ap�Q��? a�Q�� Op�Q�� W�Q�����<W�Q�����<W�Q�����</�Q���?&�Q��?AS�Q�����< �Q��A p�Q��P&�Q��AO�Q�����<W�Q�����<W�Q�����<p�S��?p�S��? p�S�� ���Op�T��?�T�����T����~�>'p05$39�-�_��;'>���A-�_��;���'>���A-�_��;���'>}���A~�>(pow5mult��Z��(>$���Ap�Z�� @ p�a�����@ �a�����A&�a��AO�a�����<p�b�� Sp�b��'> p�b�� ���Sp�b��A���S�b���>p�b�� p�b�� @�d�����A���@p�d�����@&�d��AX�d��� ��<p�e�� �e����~�>)p5s�p�f��)> &�f�� AX�f�����<p�i��)> &�i�� AX�i�����<p�j��q��A p�j�� S�j���>p�j�� @ p�j��)>p�j�� p�k��AOW������<W������<W����>��<p�p�����@ �p�����A&�p��AO�p���(��<p�q�� S~�?*p5�p�q�� *?p�q�� ���S�q���>p�q�� ?p�r�� @p�r��S�r���>p�r��*? p�s�� ? p�s��  @�u�����A���@p�u�����@&�u��AX�u���-��<W�v�����<p�w��Q &�w�� AX�w���<��<p�y��Q &�y�� AX�y���<��<p�z�� Sp�z�� *?p�z�� ���S�z���>p�z�� @ p�z��*? p�z��Pp�z�� p�{��AOp���  W������<p��� ����������~�>+lshift����+>0���Ap��� @ p������@������Ap��� p������P p������P ��� ~�?,n�p��� ,?C����p��� p������P W����Q��<W����P��<W����V��<������A ~�?-n1�p��� -?&���  S����O��<C���� W����N��<p��� S����>p���,? p������@p��� ?p��� ? ������A p���A W����b��<W����a��<W����h��<C���� &���  P����`��<p���  ������A p���AOW����_��<p��� @ ������A p��� @ p������P a��� Rp��� ������A&���AO������<p��� ���A���~�?.k1�p���.?p���AW����z��<W����x��<W������<&���  L����w��<p���Rp��� ��� ���p���  ������A p���Pp���  ������A p���Op���.? ��� p���W����v��<p���T&���AO������<C����-?W������<W������<W������<W������<&���  L������<p���  ������A p���  ������A p���P p��� OW������<p��� ?p���-? /���� p��� ���Op��� @p���S����>p��� ?����������~�>/cmp����/>���Ap��� @ p������ @p������Q p������V ���  &��� AO������<p��� �����p���  ������Aa��� Up��� p��� ������Aa��� Op��� W������<W������<W������< ���A p���R ���A p���T &��� O������<p���R p���T &���  L������<p���AW������<p������A�����&��� R������<W������<W������<p���A����������~�>0diff����0>@���Ap��� @ p��� Sp������ @ p��� ���S����/>p��� @ &���AX������<p���AS����>p������A���Op���A���O�����&���AP������<p���  p������ @ p��� ��� @~�?1i�p������A1?W������<p���A1?p���  @p������Q p��� S����>p��� @ p������ @p���?p���?p���1? p���  ���Op������Rp���? ������A p���? a��� Rp���!?p������U ������Aa��� Up���#?p���? ������A p���A W������<W������<W����$��<&���#?L������<p���R �����A ��� p���U �����A ��� p���������Ap��� &���AP���� ��<�����A p���  ������A p���O������A ��� p��� ������Ap���P ������A ��� p��� ������Ap��� &��� AP������<�����A p��� ������Ap��� �����A ��� p���  ������A p���PW������<W����'��<W����'��<W����F��<&��� !?L����&��<p���R �����A ��� p���������Ap��� &���AP����2��<�����A p���  ������A p���O������A ��� p��� ������Ap��� &��� AP����=��<�����A p��� ������Ap��� �����A ��� p���  ������A p���PW����%��<W����I��<W����I��<W����O��< ���A p���T&���AX����H��</����?W����G��<p���?p���? p��� ���Op���?����������~�>ulp����>���Ap���@ �����A �����A&����AS�����^��<~�?a�p���?p���A?W����t��<����������Ap��� &������AP����i��<p���  p������A��� p���?p� ��A?W� ���t��<p� ��A?� �����A &� �� ���AU� ���o��<p� �����AW� ���s��<p� �����A � ��  p� �����A� �� p� ��?���?�����9���������~�>b2d����>,���A~�@a�p���@ p���  ������Ap������Q ~�?xa0�p���?a��� Op��� ���A p���  ?p���Pp� ��%?p� ��S� ���>p� ��?p� ��%? p� �� ? p� �� ~�@e�p�!�����@p�!�� ���A �!��  p�!�� O&�"��  ���AP�"�����<p�#�� ���A �#��  p�#�� �#�� �#����?A~�?d�p�#��?&�$�� T�$�����< �$��A p�$��TW�$�����<p�$��Ap�$�� p�%��  �%�����A p�%�� �%�� p�%�� ���A �%��  p�%��  �%��  �%�� p�%��?W�&�����<&�(�� T�(�����< �(��A p�(��TW�(�����<p�(��Ap�(���)�� ���A &�)�� AO�)�����<p�*��  p�*�� �*�� �*����?Ap�*�� ���A �*��  p�*�� �*��  �*�� p�*��?&�+�� T�+�����< �+��A p�+��TW�+�����<p�+��Ap�+�� p�,��  p�,���,�� p�,�� ���A �,��  p�,��  �,��  �,�� p�,��?W�,�����<p�.�� �.����?Ap�.��?p�/��?W�&�����<�4��?�4����94�����4����~�>d2b��8��>(���Ap�@�����A p�@�� S~�> Balloc��@��� >~�? b�p�A�� ? �A�����A~�? x�p�A�� ?~�@ d�p�C�� @ �C���A~�? z�p�C�� ? �D��A @p�I�� @�I�����A~�?de�p�I��?&�I��AO�I�����<�J�����A ?p�L����� @p�L��%?&�L��AO�L��� ��<a�M��%? p�M�� S�M���>p�M��?p�M�� ?p�M�� &�M��AO�M�����<p�N�� ���A �N��  p�N�� ?�N�� p�N��%? �N�� p�N�� Up�O��  �O��  ?W�O�����<p�Q��%? p�Q�� Up�R�� ? p�R�� ���Up�R�� ? &�R�� AO�R�����<p�R�����AW�R�����<p�R�����Ap�R�� ? p�R�����Pp�R�� W�R�����<a�T�� ? p�T�� S�T���>p�T��?p�T�� ?p�T�� p�U�� ? p�U�� Up�V�� ? p�V�����A���Pp�V�����A �W�� ���A &�Z��AO�Z���#��<p�\�����@p�\��  �\�� �\��A p�\�� O~�@bits�p�]�� ���@p�]��5���A �]��  p�]�� OW�]���3��<p�`�����@p�`��  �`�� �`��A p�`�� Op�a�� 1?a�a�� U p�a��P p�a�� S�a���>p�a��1? �a�����A �a�� p�a�� p�a�� ���@ p�a��Pp�d�� ?�d�����d����~�>ratio��k��>,���Ap�p��@p�p��S~�?ka�a�p��?p�p�����S�p���>~�?da��p��?~�@b�p�q�����@p�q��S~�?kb�a�q��?p�q�����S�q���>~�?db��q��?p�r��@p�r�����Op�r�����@ p�r�����P �r�� �r�����A �r��?�r��?&�s��AS�s���P��<�t�����A �t��?W�t���S��<�v����w�����A �w��?�y��?y��?�y����9y�����y����~�>tens�-�~��;>������?-�~��;���>������$@-�~��;���>������Y@-�~��;���>�����@@-�~��; ���>�����@-�~��;(���>�����j@-�~��;0���>����.A-�~��;8���>����cA-�~��;@���>����חA-�~��;H���>����eA-���;P���>��� _B-���;X���>���vH7B-���;`���>���mB-���;h���>��@0B-���;p���>��ļB-���;x���>��4&k C-���;���>�7yAC-���;���>�؅W4vC-���;���>�NgmC-���;���>�=`XC-���;���>@xD-���;���>PKD-���;���>MD~�>bigtens�-���;>�7yAC-���;���>nF-���;���>?O8M-���;���>20HwZ-���; ���><sOu~�>tinytens�-���;>ؗҜ<-���;���>3#I9-���;���>=D2-���;���>[%-���; ���>Cod(~�>match����>���A~�@sp�p���@~�@t�p������@ p���U W����_��<W����_��<W����r��<p���  C���� r���R &��� AO����^��<C���� r���Qp��� &���A���AU����k��<&��� Z���AS����l��<W����m��< ��� ���A &���  O����q��<p���A�����W����]��<p���  C���� p��� Up������A����������~�=strtod����=���Ap���A~�?nz�p���?~�?nz0�p���?~�?sign�p���?9����~�? rv����| ?~�@!s00�p���!@~�?"s�p���"?W������<W������<W������<C����"?W������<W������<p������A?C����"?p���"?r���O%���AO������<W������<p���!@p���"?W������<W������<W������<p���"?r���O&��� ���AQ������<O������<&���AO������<&��� ���AO������<&��� ���AO������<&��� ���AO������<W������<&��� ���AO������<&��� ���AO������<&���+���AO������<&���-���AO������<W������<W������<p���"?r���O&���0���AX������<p������A?W������<W������<W������<C����"?p���"?r���O&���0���AX������<W������<p���"?r���O%���AX������<W����G��<p���"?~�?#s0�p���#?p���Ap���p���A ~�?$nf�p��� $?W������<W������<W������<C���� C����"?p���"? r���R &��� 0���AU������<&��� 9���AS������<W������<&���  ���AP������<p��� ���A|����p���  ��� ���AW������<&��� ���AP������<p��� ���A|����p���  ��� ���AW������<~�?%nd0�p��� %?&��� .���AX����6��<C����"?p���"? r���R &��� AX������<W������<W������<W������<C����"?p���"? r���R &��� 0���AX������<C����?W������<&��� 0���AS������<&��� 9���AS������<W������<p���"?p���#?p���? ���$?p���A?W���� ��<W����6��<W������<W������<W����6��<C����"?p���"? r���R &��� 0���AU������<&��� 9���AS���� ��<W�������<W���� ��<C����?���0���A &��� AO����5��<p���? ���$?p������A W������<W������<W����%��<C���� &��� ?P������<p��� C���� &��� ���AP������<a���U ���p���W����$��<&��� ���AQ����$��<a���V ���p���W������<p��� C���� &��� ���AP����.��<p��� ���A|���� ��� p���W����4��<&��� ���AQ����4��<p��� ���A|���� ��� p���p���A?W������<W����7��<p���A &��� e���AO����=��<&��� E���AO����=��<W������<&��� AX����A��<&���?AO����B��<W����D��<&���?AO����E��<W����H��<p���!@p���"?W������<p���"?p���!@~�?&esign�p���A&?W����R��<W����Z��<p������A&?C����"?p���"? r���R W����L��<C����"?p���"? r���R &��� +���AO����N��<&��� -���AO����M��<W����L��<&��� 0���AU����^��<&��� 9���AS����_��<W������<W����b��<W����b��<W����h��<&��� 0���AX����a��<C����"?p���"? r���R W����`��<&� �� 0���AS� ���l��<&� �� 9���AS� ���m��<W� �����<p� ��  � ��A p� ��"? W� ���s��<W� ���s��<W� �����<C� ���"?p� ��"? r� ��R &� �� 0���AU� ���z��<&� �� 9���AS� ���{��<W� ���r��<a� �� P � �� � ��  � ��Ap� �� W� ���q��<p���"?��� &������AQ������<&��� N��AQ������<W������<p���N��A W������<p���  &���&?AO������<���� W������<p���A W������<p���!@p���"?&��� AX������<&���?AX������<&���?AO������<W������<W�/�����<W�/�����<~�>'.string�-�"��;'> nfinity�a�"��"? p�"�� Sp�"��>�'D p�"�� ���S�"���>&�"��AO�"�����<p�#����A| ?p�$��A ?W�%�����<W�'�����<a�*��"? p�*�� Sp�*��>����'D p�*�� ���S�*���>&�*��AO�*�����<p�+����A| ?p�,��A ?W�-�����<W�-�����<&�-�� I���AO�-�����<&�-�� N���AO�-�����<&�-�� i���AO�-�����<&�-�� n���AO�-�����<W�-�����<p�0��!@p�0��"?W�2�����<p�4��$?�4�� ~�?(e�p�4�� (?p�4��  &�;��%?AX�;�����<p�<�� %?&�=�� ���AP�=�����<p�=�� W�=�����<p�=�����Ap�=�� ~�?).safe�p�>��H)?�>��H)?&�>��AP�>�����<>��������A�>��| ?&�?��  ���AS�?�����<�@�� > @��| ?p�@��H)?�@��H)?&�@��AP�@�����<@��������A@���@��| ?~�?*bd0�p�A��AX*?&�B�� ���AQ�B�����<W�B�����<W�B�����<&�E�� AX�E�����<W�F�����<&�G�� AS�G�����<&�H�� ���AQ�H�����<�I�� > I��| ?�I��| ?W�J�����<p�L�����A�L�� p�M�� �M�����A&�M�� Q�M�����<�Q�� �R��> R��| ?�R��| ?�S�� > S��| ?�S��| ?W�T�����<W�T�����<&�V�� AU�V�����<p�W�� �W�����Ap�W��>�D �W�� �W��P!W��| ?�W��| ?W�X�����<p�[�� �[��  �[�� ~�?+scale�p�]��A+?&�a�� AS�a���A��<p�b��  �b�����A&�b��AO�b�����<�c��> c��| ?�c��| ? �d��A &�d�� AO�d���@��<&�e�� 4��AS�e�����<W�f�����<p�h����A| ?p�i��A ?&�j��X*?AO�j�����<W�k���s��<W�l���t��<�n�����A &�n�� AO�n���@��<p�o��A W�o���'��<W�o���%��<W�o���1��<C�o��� �o�����A &�o�� ���AS�o���$��<p�p��  �p�����A&�p��AO�p���0��<�q�� > q��| ?�q��| ?W�q���#��<�s����PA| ?�t�� > t��| ?�t��| ?p�u��| ? �u����A&�u����|AT�u���:��<W�w�����<&�x����|AT�x���?��<p�{��A| ?p�|��A ?W�|���@��< �~����PA| ?W�~���u��<&��� AP����u��<���� p���  ������A&���AO����K��<���>!��| ?���| ? ���A &��� AO����u��<������A &���  ���AU����R��<W����n��<p���  ������A&���AO����W��<p���5���A+?p���A W����]��<W����[��<W����h��<C���� ������A &��� AS����Z��<p���  ������A&���AO����g��<p��� ��� > ��| ?���| ?W����Y��<9�������| ?�����*��������X����u��<W����o��<9�������| ?&���X*?AO����t��<W����[��<W����k��<p���#? p��� Sp���%? p��� ���Sp��� ���Sp��� ���S~�>,s2b�����,>p���X*?W�u�����<W�u�����<W�u���?��<p���X*? p������P p��� S���� >p���X*? ~�?-bd�p���\-? ��� ���Ap���Sp���  ��� ���Ap������Sp������Q������A ������Ap������S~�=.memcpy�����.=���| ?���S~�?/bbe�a���/? p��� ���S~�?0bbbits�a���0? p���  ���S����>~�?1bb�p���d1?p������A p��� S~�>i2b�����>p���(? ~�?bs�p���T?&��� AU������<p���A p���  ~�?bd5�p��� ?p���  W������<p���  ���� p���  p���A p��� ?&���/?AU������<p���/? ��� W������<p���/?��� ~�?bs2�p��� ?p���0? ���/?/����&���AP������<p���/? ���3��A W������<p���6���A ���0? ���  ���  p���+? ��� ~�?bb2�p��� ?&���  ~�?bd2�p��� ?P������<p��� W������<p��� p��� &���?S������<p���? &��� AS������<���  p��� ?���  p��� ?��� ?&��� AS������<p���T? p��� Sp��� ���S~�>pow5mult�����>p���T?p���Sp���d1? p��� ���S~�>mult�����>~�? bb1�p���` ?p���d1?p���S~�> Bfree����� >p���? p���? p���` ?p���d1?&��� AS������<p���d1? p��� Sp��� ���S~�> lshift����� >p���? p���d1?&���?AS������<p���\-? p��� Sp���? p��� ���S����>p���? p���\-?&��� AS������<p���\-? p��� Sp��� ���S���� >p���\-?&���?AS������<p���T? p��� Sp���? p��� ���S���� >p���T?p���d1? p��� Sp���\-? p��� ���S~�> diff����� >p��� p��� ���O~�? dsign�p��� ?p���A ���Q~�?delta�p��� P?p��� Sp���T? p��� ���S~�>cmp�����>p���P? p��� ? &���AP����<��<&��� AX������<&��� ?AO������<W������<p���| ? ����A&���AO���� ��<W����%��<p���| ? �����A&������AT����%��<W����.��<p������R&���AX����+��<p������R&������AO����,��<W����-��<p������A W������<p��� Sp������A p��� ���S���� >p���P?p���Sp���T? p��� ���S����>p��� ? &���AS����;��<W����W��<W������<&���AX����{��<&��� AO����O��<p���| ? ����A&����AX����F��<&��� ?AO����G��<W����N��<p���| ? �����A ������Ap���| ?p���A ?p���A W������<W����_��<p���| ? ����A&���AX����U��<&��� ?AO����V��<W����_��<p������A W����X��<p���| ? �����A �����A�����Ap����| ?p���A ?W������<p��� ? ������A&���AX����d��<W������<&��� AO����l��<���| ?���S~�>ulp�����>��| ?���| ?W����x��<� ��| ?� ��S� ���> ��| ?� ��| ?9 ����� ��| ?� ����* ���� ����X� ���x��<W� ���n��<p������A ��� ? W������<p��� Sp���T?p������S~�>ratio�����>p��� ? ���~�?aadj����?����������@�����*��������R������<&��� AO������<3�������~�?aadj1����?���?W������<&��� ?AX������<p���| ? ����A&���AX������<W������<&��� ?���AX������<&���| ?AO������<W������<W����n��<3�������?������������?W������<3 ����� ��?� ����* ���� ����T� �����<�!��������?�!��?W�!�����<�#��������? #��?�#��?9$����$��?�$��?W�$�����<�'��������? '��?�'��?&�(�� AO�(�����<�(��?W�(�����<9(����(��?�(��?p�,��| ? �,����Ap�,�� &�0����A~�?y�p�0��l?X�0�����<�1��| ?~�?rv0��1��t?�2����PA| ?�3��| ?�3��S�3���>p�3�� ? 3��?~�?adj��3��?�4��?4��| ?�4��| ?p�5��| ? �5����A&�5����|AM�5�����<&�7��t?AX�7�����<&�7��x?AO�7�����<W�7�����<W�8�����<p�9��A| ?p�:��A ?W�;���1��<W�;�����< �=����PA| ?W�=�����<&�Z����@AR�Z�����<3Z�����Z��?�Z����*Z����Z����T�Z�����<W�Z�����<�[��?[��������?([���D)?q�[����AF)?$[��F)?��[��H)?$[��D)?�p�[��H)? p�[�� H)?�[��H)?�[��?&�\�� AX�\�����<9]����]��?�]��?�_��| ?�_��S�_���>p�_�� ? _��?�_��?�`��?`��| ?�`��| ?p�c��| ? �c����A &�d��+?AX�d���1��<p�e��l?&�e�� X�e���1��<�g��?(g���D)?q�g����AF)?$g��F)?��g��H)?$g��D)?�p�g��H)? p�h�� p�h�� H)?�h��H)?h��?�h��?&�j�� AX�j�����<&�j�� ?AO�j�����<W�j�����<p�j��| ? �j���A&�j��AX�j�����<W�j���*��<�k��5?�k��?�k����*k����k����R�k���(��<�k��55��?�k��?�k����*k����k����M�k���(��<W�k���)��<W�l�����<W�l���1��<�m��5?�m��?�m����*m����m����T�m���1��<W�n�����<W�;���2��<p�q��d1?p�q��S�q��� >p�r��\-?p�r��S�r��� >p�s��T?p�s��S�s��� >p�t��P?p�t��S�t��� >W�t���~��<&�v��+?AO�v���[��<p�w��| ? �w����A&�w����PAR�w���I��<p�w�� ? �w�����A&�w��AX�w���J��<W�w���L��<&�w�� ���AX�w���M��<W�w���V��<&�z�� AO�z���U��<�{��| ?�{��S�{���>{��| ?�{��| ?W�{���V��< �}��A ?p�~����<At?p���Ax?���t? ��| ?���| ?W�k���\��<p���d1?p���S���� >p���\-?p���S���� >p���T?p���S���� >p���X*?p���S���� >p���P?p���S���� >W����l��<~�@se�&������@AO����q��<p������@p���"? p��� O&���?AO����v��<9������| ?W����w��<���| ?�����9���������~�>quorem����>D���A~�@S�p������@p������O~�?n�p���?~�@b�p���@p������O&���?P������<p���A�����p������@ ������A/����?p���? a��� U ~�?sxe�p��� ?p���@ ������A p���? a��� R p���Tp���A p���? p���P C���� p��� )?2���)?�~�?q�p���?&���?AO������<p���A~�?carry�p���A?W������<W������<W������<&���?R������<p��� ������Ap���O p���  �����A|���?� ���?~�?ys�p���?p��� ������A|���?�p���? ������A ��� ~�? zs�p��� ?p��� ?������Ap���?p���R �����A ��� p���? �����A ���  p��� ������Ap��� &��� AP������<�����A p���R������A ��� p��� ? �����A ��� p��� ������Ap���&��� AP������<�����Ap��� ������Ap���  �����A ��� p���  ������A p���PW������<p���T&���AX������<p���@ ������A W������<W������<W������< ���A &���  T������<p���T&���AO������<W������</����?W������<p���@p���? p��� ���Op���@ p��� Sp������@ p��� ���S����>&���AU����> ��<C����?p���A p���A?p���@ ������A p������@ ������AW������<W������<W����' ��<&���?R������<p��� ������Ap���Op��� �����A ���? ������Ap���  ������A ��� p���������Ap���?p���Q �����A ��� p���  �����A ��� p��� ������Ap��� &��� AP���� ��<�����A p���Q������A ��� p��� �����A ��� p��� ������Ap��� &��� AP���� ��<�����A p��� ������Ap���  �����A ��� p���  ������A p���PW������<p���@ ������A p���? a��� Rp��� p���O&���AX����> ��<W����2 ��<W����2 ��<W����; ��< ���A &���  T����8 ��<p���P&���AO����9 ��<W����1 ��</����?W����0 ��<p���@p���? p��� ���Op���?����������~�>!rv_alloc����!>���A~�@"i�p���"@ p������A p���A W����I ��<W����H ��<W����O ��<������A p���  ������A&��� Q����G ��<C���� W����F ��<~�?#k�p��� #?p��� S~�>$Balloc�����$>p���#? p��� O ������A����������~�>%nrv_alloc����%>���A~�@&n�p������&@ p��� S����!>~�@'rve�p������'@~�@(s�p���(@ p��� p��� W����b ��<W����b ��<W����j ��<p��� C���� r���Oo���Q%���AO����a ��<C���� W����` ��<&���AO����m ��<p��� Up��� ����������~�=)freedtoa����)=���Ap���(@ ���A p���R p��� ���Rp������A��� p������Rp��� S���� >�����~�=*dtoa��#��*=���A~�@+sign�p�#�����+@ ~�@,decpt�p�#�����,@ p�#�����'@ ~�@-d�p�S��-@ �S�����A&�S��AO�S��� ��<p�U�����AR �V��A-@W�V��� ��<p�X��ARp�Z��-@ �Z����A&�Z����AX�Z��� ��<p�\��'��AP&�]�����-@AX�]��� ��<p�]��-@ �]���A&�]��AO�]��� ��<W�]��� ��<~�>..string�-�^��;���.> an�Infinp�^��>� ���.D p�^�� Sp�^�� ���Sp�^�����A p�^�� ���S�^���%>�^����-�_��;���.> ity�NaN�p�_��>����.D p�_�� Sp�_�� ���Sp�_�����A p�_�� ���S�_���%>�_����9a�����a��-@�a����*a����a����X�a��� ��<p�b�����APp�c��>����.D p�c�� Sp�c�� ���Sp�c�����A p�c�� ���S�c���%>�c�����f��-@�f��S~�?/be�a�f��/? p�f�� ���S~�?0bbits�a�f��0? p�f��  ���S~�>1d2b��f���1>~�@ndigits�p�f�� ���@~�@mode�p�f�����@ ~�?b�p�f��?p�j��-@�j�����A �j����Ap�j�� &�j��AO�j��� ��<�l��-@~�?d2��l��|? �m���A|?�n����?A|?�����A ~�?denorm�p���A?W���� ��<p���/? ���0? ���2��A &���  ���AS���� ��<p���@���A ���  p���-@��� p���  ���A p������-@ ���  ��� W���� ��<p��� ���A ���  p������-@��� p��� ~�?.safe�p���\?���\?&���AP���� ��<��������A���|?�����A|?���3��A p������A?���|?�������� ��aCoc?��`(?p��� p��� \?���\? ��yPD?��~�?ds����t?���t?(���X?q�����AZ?$��Z?����\?$��X?�p���\? p��� 9�������t?�����*��������T���� ��<p��� p��� \?���\?���t?�����*��������X���� ��<W���� ��</���� ~�?k_check�p������A?&��� AU���� ��<&��� ���AS���� ��<W���� ��<���-@p��� ~�> tens����  >�����*��������L���� ��</���� p���A?p���0?��� /����&���AU���� ��<~�? b2�p���A ?~�? s2�p��� ?W���� ��<����p��� ?p���A ?&��� AU����& ��<~�? b5�p���A ?~�? s5�p���  ?p��� #? ���  ?W����, ��<���  ?p��� p��� #?����p��� ?p���A ?&��� AU����1 ��<&���  ���AQ����1 ��<W����2 ��<p���A ~�?try_quick�p������A?&��� ���AS����7 ��<������A p���A?~�?leftright�p������A?W����U ��<W����e ��<p���A~�?ilim1�p���?~�?ilim�p���?p������A p���A ���@W����9 ��<p���A?&���AQ����D ��<p������Ap��� ���@p��� p���?p���?W����9 ��<p���A?p���  ���C����p���?p��� /����p���?&��� AQ����T ��<p������A W����9 ��<p��� ���@&��� ���AQ����` ��<O����I ��<&��� AO����: ��<&��� ���AO����: ��<&��� ���AO����@ ��<W����9 ��<&��� ���AO����A ��<&��� ���AO����J ��<W����9 ��<p��� S����!>p���? p���~�?s0�p���d?p��� ~�?s�p���h?&��� AU����p ��<&��� ���AS����q ��<W����s ��<&���?AX����t ��<W����7 ��<p���A ���-@���|?p���#?~�?k0�p���?~�?ilim0�p��� ?p������A&���#?AS���� ��<p���#? ������A��� >���t?p���#?������Ap��� ������A&���AO���� ��< ������A ~�>bigtens���� ���>!��-@���-@C����W���� ��<W���� ��<W���� ��<������A C���� &��� AO���� ��<p���  ������A&���AO���� ��<C����p��� ��� > ��t?���t?W���� ��<���t?!��-@���-@W���� ��<p���#? ���� p��� &��� AO���� ��<p���  ������A��� > ��-@���-@p��� ������Ap��� W���� ��<W���� ��<W���� ��<������A C���� &��� AO���� ��<p���  ������A&���AO���� ��<C����p��� ��� > ��-@���-@W���� ��<&���?AO���� ��<3�������-@�����*��������R���� ��<W���� ��<&��� AQ���� ��<W���� ��<&���?AQ���� ��<W���� ��<p���? /����#?���������$@ ��-@���-@C����p���\?���\? ��-@��������@~�?eps����l?�����@Al?&��� AX���� ��<p���A~�?mhi�p���?~�?S�p���?���������@��-@���-@�� ��-@�� ��l?�� ����*� ����� ����T�� ��� ��<W� ���R ��<9 ���� ��l?� ��-@� ����* ���� ����T� ��� ��<W� ���Q ��<W� ���. ��<p� �� � ��  >  ��l?� ��l?p� �����AW� ��� ��<W� ��� ��<W� ���. ��<C� ���� ��������$@  ��-@� ��-@� ��-@( ���X?q� ����AZ?$ ��Z?�� ��\?$ ��X?�p� ��\? p� �� \?� ��\? ��-@� ��-@p� �� C� ��� p� ��  � ��0���A o� �� Op� ��&� �� X� ���- ��<� ��l? ��������?� ��-@� ����* ���� ����L� ��� ��<W� ��� ��<W� ���, ��<� ��������? ��l?� ��-@� ����* ���� ����T� ���, ��<W� ���$ ��<W� ���$ ��<W� ���) ��</� ��� r� ��Q&� ��0���AX� ���# ��<W� ���" ��<C� ��� p� �� h?W� ��� ��<W� ��� ��<W� ��� ��<W����/ ��<p� �� p� ��h?� ��|?� ��-@p� ��?p� ��#?p� ��? p� �� ?&�! ��/?AU�! ���; ��<&�! ��#?���AS�! ���< ��<W�! ��� ��<p�# ��#?�# �� >�# ��t?&�$ �� ���@AP�$ ���C ��<&�$ �� AS�$ ���D ��<W�$ ���S ��<p�% ��Ap�% ��?p�% ��?&�& �� AU�& ���Q ��<�& ��������@ & ��t?�& ��-@�& ����*& ����& ����L�& ���Q ��<W�& ���R ��<W�' ��� ��<W�( ��� ��<p�* �����AW�* ���X ��<W�* ���W ��<W�* ��� ��<C�* ����+ ��-@+ ��t?(+ ���X?q�+ ����AZ?$+ ��Z?��+ ��\?$+ ��X?�p�+ ��\? p�, �� \?�, ��\? , ��t?, ��-@�, ��-@p�- �� C�- ��� p�- �� h?p�- ��  �- ��0���A o�- �� Op�. ��&�. �� X�. ��� ��<�/ ��-@/ ��-@�/ ��-@�0 ��-@�0 ��t?�0 ����*0 ����0 ����R�0 ��� ��<�0 ��-@�0 ��t?�0 ����*0 ����0 ����X�0 ��� ��<p�0 ��  �0 �����A&�0 ��AO�0 ��� ��<W�0 ��� ��<W�0 ��� ��<W� ��� ��<W�2 ��� ��<W�2 ��� ��<W�2 ��� ��</�2 ��� r�2 ��Q&�2 ��9���AX�2 ��� ��<&�3 �� X�3 ��� ��<C�4 ���#?o�5 ��0���AQW�6 ��� ��<W�6 ��� ��<p�8 �� C�8 ��� p�8 �� h?�8 �����AOW�: ���V ��<�< ��������$@ < ��-@�< ���< ��-@9< �����< ���< ����*< ����< ����X�< ��� ��<W�= ���V ��<W�= ���U ��<W�? ��� ��<p�B �� ? ~�?m2�p�B �� ?p�C �� ? ~�?m5�p�C �� ?p�D ��A~�?mlo�p�D ��?p�D ��?&�E ��?AO�E ��� ��<&�F �����@���AP�F ��� ��<&�G ��?AO�G ��� ��<p�G ��/? �G ��3��AW�G ��� ��<p�G ��6���A�G ��0?p�G �� W�G ��� ��<p�M ��  /�M ��� &�N ��  U�N ��� ��<�O ��  p�O �� ?W�O ��� ��<�Q ��  �Q ��  ? �R ��  ?p�S ��A?p�U ��  &�U �� AP�U ��� ��<�V ��  p�V �� ?p�W ��A �Z ��  ? �[ ��  ?p�\ �����A p�\ �� S~�>i2b��\ ���>p�\ ��? p�\ ��? p�\ ��p�\ ��?&�^ �� AS�^ ��� ��<&�^ �� ?AQ�^ ��� ��<W�^ ��� ��<&�_ ��  ?P�_ ��� ��<p�_ �� W�_ ��� ��<p�_ �� ?�` �� ?�a �� p�a �� ?�b �� ?&�d �� ?AS�d ��� ��<&�e ��?AO�e ��� ��<&�f �� AS�f ��� ��<p�g ��Sp�g �� ���S~�>pow5mult��g ���>p�h ��?p�h ��Sp�h ��? p�h �� ���S~�>mult��h ���>~�? b1�p�h �� ?p�i ��?p�i ��S~�>!Bfree��i ���!>p�i ��? p�j �� ?p�j ��?p�l �� ?�l �� &�l ��AO�l ��� ��<p�m ��? p�m �� Sp�m �����S�m ���>p�m ��?W�m ��� ��<p�o ��? p�o �� Sp�o �� ? p�o �� ���S�o ���>p�o ��?p�q �����A p�q �� S�q ���>p�q �� ? p�q �� ? p�q ��?&�r �� AS�r ��� ��<p�s ��? p�s �� Sp�s �� ���S�s ���>p�s �� ? p�s �� ? p�s ��?~�?"spec_case�p�w ��A"?&�x �����@���AP�x ���& ��<&�y �����-@AX�y ��� ��<p�y ��-@ �y ���A&�y ��AO�y ��� ��<W�y ���! ��<p�y ��-@ �y ����A&�y ��AX�y ���" ��<W�y ���& ��<C� ��� p� ��  ?C� ��� ?p� �����A"?&� �� AO� ���4 ��<p� ��? p� �����Q p� ��? a� �� R p� �����P p� �� S~�>#hi0bits�� ���#>p� �� ? p� �� ���A � �� p� �� W� ���5 ��<p� �����A � �� ? � �����Ap� �� &� ��AO� ���= ��<p� �� ���A� �� p� �� &� �� ���AS� ���D ��<� �����A � ��  � �� ? � ��  ?W� ���J ��<&� �� ���AP� ���J ��< � �����A � ��  � �� ? � ��  ?&� �� AS� ���Q ��<p� ��? p� �� Sp� �� ���S~�>$lshift�� ���$>p� ��?&� �� ?AS� ���Y ��<p� ��? p� �� Sp� �� ? p� �� ���S� ���$>p� ��?&� ��?AO� ���u ��<p� ��? p� �� Sp� ��? p� �� ���S~�>%cmp�� ���%>&� ��AP� ���u ��<~�?&k�/� ���&?p� ��? p� �� Sp� �� ���A p� �� ���Sp� ��A���S~�>'multadd�� ���'>p� ��?&� ��?AO� ���s ��<p� ��? p� �� Sp� �� ���A p� �� ���Sp� ��A���S� ���'>p� ��?p� ��?p� ��?&� ��?AQ� ���y ��<&� �����@���AQ� ���z ��<W� ��� ��<&� ��?AU� ��� ��<p� ��? p� �� Sp� �����A p� �� ���Sp� ��A���S� ���'>p� ��?p� ��\?p� ��? p� �� Sp� ��\? p� �� ���S� ���%>p� ��h? &� ��AS� ��� ��<W� ��� ��<W� ��� ��<p� ��A� �� ���@p� ��&?W� ��� ��<W� ��� ��<p� �� C� ��� p� �� h?o� ��1���AOC� ���&?W� ��� ��<&� ��?AO� ���f ��<&� ��?AS� ��� ��<p� ��? p� �� Sp� ��? p� �� ���S� ���$>p� ��?p� ��?p� ��?&� ��"?AO� ��� ��<p� ��? p� �����P p� �� S~�>(Balloc�� ���(>p� ��? p� ��? � �� ���Ap� ��Sp� ��  � �� ���Ap� �����Sp� �����P� �����A � �����Ap� �����S~�=)memcpy�� ���)=p� ��? p� �� Sp� �����A p� �� ���S� ���$>p� ��?~�?*i�p� �����A*?W� ��� ��<W� ��� ��<W� ���e ��<C� ���*?p� ��? p� �� Sp� ��? p� �� ���S~�>+quorem�� ���+> � ��0���A~�?,dig�p� ��,?p� ��? p� �� Sp� ��? p� �� ���S� ���%>~�?-j�p� ��-?p� ��? p� �� Sp� ��? p� �� ���S~�>.diff�� ���.>p� �� p� �� ���O &� �� AO� ��� ��<p� �����AW� ��� ��<p� ��? p� �� S~�?/delta�p� ��/?p� �����S� ���%>p� ��/? ~�?0j1�p� ��0?p� �� S� ���!>p� ��?p� �����@p� ��-? p� ��0? p� ��,? p� ��h? &� �� AX� ��� ��<&� ��AO� ��� ��<W� ��� ��<~�@1d�p� �����1@ � �����A&� ��AO� ��� ��<W� ��� ��<&� �� 9���AX� ��� ��<W� ���' ��<&� �� AS� ��� ��<C� ��� p� �� C� ��� p� �� h?o� �� OW� ���, ��<&� �� AU� ��� ��<&� �� AX� ��� ��<&� ��AO� ��� ��<W� ��� ��<p� �����1@ � �����A&� ��AX� ��� ��<W� ��� ��<W� ���- ��<&� �� AS� ���( ��<p� ��Sp� �����A p� �� ���S� ���$>p� ��?p� ��Sp� ��? p� �� ���S� ���%>p� ��,? p� ��h? &� ��AQ� ���" ��<&� ��AX� ���! ��<p� ��  � �����A&� ��AO� ���! ��<W� ���" ��<W� ���& ��<p� �� C� ��� &� ��9���AO� ���' ��<W� ���( ��<W� ���1 ��<p� �� C� ��� p� �� h?o� �� OW� ���< ��<&� �� AS� ���= ��<&� �� 9���AX� ���6 ��<W� ���2 ��<p� �� C� ��� o� ��9���AOW� ��� ��<p� �� C� ��� p� �� h?p� ��  C� ��� o� �� OW� ��� ��<p� �� C� ��� p� �� h?o� �� Op� ��*?&� ��?X� ���E ��<W� ��� ��<p� ��Sp� �� ���A p� �� ���Sp� ��A���S� ���'>p� ��? p� ��? p� ��?&� ��  X� ���W ��<p� �� Sp� �� ���A p� �� ���Sp� ��A���S� ���'>p� ��?p� ��?W� ���d ��<p� �� Sp� �� ���A p� �� ���Sp� ��A���S� ���'>p� ��?p� ��? p� �� Sp� �� ���A p� �� ���Sp� ��A���S� ���'>p� ��?W� ��� ��<W� ��� ��<p� �����A*?W� ���k ��<W� ���j ��<W� ��� ��<C� ���*?p� ��? p� �� Sp� ��? p� �� ���S� ���+>p� ��? � ��0���Ap� ��,?p� ��h? C� ���h?o� ��Pp� ��*?&� ��?U� ���z ��<W� ���i ��<p� ��Sp� �� ���A p� �� ���Sp� ��A���S� ���'>p� ��?W� ���h ��<p� ��Sp� �����A p� �� ���S� ���$>p� ��?p� ��Sp� ��? p� �� ���S� ���%>p� ��h? &� ��AQ� ��� ��<&� ��AX� ��� ��<p� ��,? � �����A&� ��AO� ��� ��<W� ��� ��<W� ��� ��<W� ��� ��<W� ��� ��<W� ��� ��<W� ��� ��</� ��� r� ��P&� ��9���AX� ��� ��<&� �� d?X� ��� ��<C� ���&?p� �� C� ��� p� �� h?o� ��1���AOW� ��� ��<W� ��� ��<p� �� C� ��� p� �� h?� �����AOW� ��� ��<W� ��� ��<W� ��� ��<W� ��� ��</� ��� r� ��P&� ��0���AX� ��� ��<W� ��� ��<C� ��� p� �� h?W� ��� ��<p� ��?p� ��S� ���!>p� ��? p� ��? &� �� AO� ��� ��<&� �� AO� ��� ��<&� ��  X� ��� ��<W� ��� ��<p� �� S� ���!>p� ��? p� �� S� ���!>W� ��� ��<p� ��?p� ��S� ���!>~�@rve�p� �����@ p� ��h? o� ��AQ~�@decpt�p� �����@p� ��&? C� ��� p� �� O&� �� AO� ��� ��<p� �� Rp� ��d?� ����� ����~�>.string�-�#��;���> 0�������~�>freelist�5�#��>@���A5�#��>(���A~�>p5s�5�#��>���A~�>p05$39�5�#��> ���A5�#�� >���A~�>tinytens�5�#��>(���A5�#��> ���AI#����fdim.8 1201054037 0 0 664 909 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdim.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�D�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�E�����~�E<libc.a�7�F����A7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<..�~�E<include�~�E<mathi.h�7�����7�a����7�}����~�=fdim��c��=A~�@x��e��@~�@y��e�����@�e����*e����e����T�e��� ���<�f��@f�����@�f����W�f��� ���<9h�����h����9h�����h����~�=fmax��l��=A�n��@�n�����@�n����*n����n����T�n������<�o��@�o����W�o������<�q�����@�q����9q�����q����~�=fmin��u��=A�w��@�w�����@�w����*w����w����L�w���'���<�x��@�x����W�x���)���<�z�����@�z����9z�����z����Iz����FPcontrol-Infern1201054038 0 0 664 3026 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<FPcontrol-Inferno.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�D�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�E�����~�E<libc.a�7�F����A7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<..�~�E<include�~�E<mathi.h�7�����7�a����7�����~�=FPinit��c��=���Ap�e����A p�f�� S~�=setfcr��f���=�f����~�=getFPstatus��j��= ���A~�?fsr�p�l��A?~�=getfsr��l���=p�l��? p�l�� �n�� ���A&�n��AO�n������<�n�����A p�o��  �o�����A&�o��AO�o������<�o�����A p�p��  �p�����A&�p��AO�p������<�p�����A p�q��  �q�����A&�q��AO�q������<�q�����A p�r��  �r�����A&�r��AO�r���"���<�r�����A p�s�� �s�����s����~�=FPstatus��w��=���A~�?fsr9�p�y��A?�z���=~�@mask�p�z�����@ p�z��? p�z�� ~�@ fsr�p�{�� @ �{�� �{��� ~�? old�p�{��  ? �{��  �{�� p�{�� �|�����A&�|��AO�|���6���<�|�� ���A p�}��  �}�����A&�}��AO�}���;���<�}�����A p�~��  �~�����A&�~��AO�~���@���<�~�����A p���  ������A&���AO����E���<������A p���  ������A&���AO����J���<������A p��� S~�= setfsr����� =p��� ? ������@����������~�= getFPcontrol���� = ���A~�? fcr�p���A ?~�=getfcr�����=p��� ? p��� W����_���<W����i���<p���A W����V���<p������A W����V���<p������A W����V���<p������A W����V���< ���� ��A&���AO����W���<&������AO����Y���<&������AO����[���<&���� ��AO����]���<W����V���<p���  ��� ���A&���AO����n���<������A p���  ������A&���AO����s���<������A p���  ������A&���AO����x���<������A p���  ������A&���AO����}���<������A p���  ������A&���AO�������<������A p��� ����������~�=FPcontrol����=���A~�?fcr9�p������A?���� =p������@ p���? p��� ~�@fcr�p���@ ��� ���� p���  ? ���  ��� p��� ������A&���AO�������<��� ���A p���  ������A&���AO�������<������A p���  ������A&���AO�������<������A p���  ������A&���AO�������<������A p���  ������A&���AO�������<������A W�������<W�������<���A W�������<������A W�������<������A W�������<���� ��A W�������<p���  ������A&���AO�������<&������AO�������<&������AO�������<&������AO�������<W�������<p��� S����=p��� ? ������@����������I����gemm.8 1201054054 0 0 664 8869 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<gemm.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�D�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�E�����~�E<libc.a�7�F����A7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<..�~�E<include�~�E<mathi.h�7�����7�a����7�����~�=gemm��b��=8���A~�@n�p�b�� ���@ ~�@m�p�b�����@~�@ldb�p�b��(���@~�@b�p�b��$���@ ~�@c�p�b��4���@ ~�@transa�&�j��@N���AX�j��� ���<p�j�����AW�j��� ���<p�j��A~�?nota�p�j��?~�@ transb�&�k����� @N���AX�k������<p�k�����AW�k������<p�k��Ap�k�� &�m��AO�m������<&�m�� AX�m������<W�m���(���<9m����~�@ alpha��m����� @�m����*m����m����O�m��� ���<~�@ k�&�m����� @AO�m��� ���<W�m���'���<3m����~�@ beta��m��,��� @�m����*m����m����X�m���'���<W�m���(���<W�m���)���<�n����9p�����p����� @�p����*p����p����X�p���p���<9q�����q��,��� @�q����*q����q����X�q���Q���<~�? i1�p�r��  ?p�s��AW�s���;���<W�s���:���<W�s���P���<C�s���&�s�� ?P�s���9���<~�@ldc�p�t��8���@=�t��~�?jc�p�t��?~�?i2�p�u��?p�v��A W�v���F���<W�v���E���<W�v���O���<C�v��� &�v�� ?P�v���D���<9w����p�w��? p�w��  a�w�� Qa�w��R�w��OW�w���C���<W�w���8���<W�w���o���<p�{��  ?~�?j�p�|��A?W�|���W���<W�|���V���<W�|���o���<C�|���?p�|��?&�|�� ?P�|���U���<p�}��8���@=�}��?p�~��?p���A W����b���<W����a���<W����n���<C���� &��� ?P����`���<p���  a���Qa���R���O ��,��� @p���  a���Qa���R���OW����_���<W����T���<�����~�@a�&������@AX�������<&��� AO�������<p���  ?p���A?W����z���<W����y���<W�������<C����?p���?&��� ?P����x���<p���=���?~�?jb�p���?p���8���@=���?p���?p���?~�?i�p���A?W�������<W�������<W�������<C����?p���?&���?P�������<p���? p���? a��� Qp���  a���Q���O ����� @p���? p���? a��� Qa���R���O ��,��� @��p���? p���? a��� Qa���R���OW�������<W����w���<W�������<p���  ?p���A?W�������<W�������<W�������<C����?p���?&��� ?P�������<p���8���@=���?p���?p���?p���A?W�������<W�������<W�������<C����?p���?&���?P�������<p��� =���? p���? a��� Qp���  a���Q���O ����� @p���? p���? a��� Qa���R���O ��,��� @��p���? p���? a��� Qa���R���OW�������<W�������<�����&��� AO������<&���?AO����T��<p���  ?p���A?W�������<W�������<W����S��<C����?p���?&��� ?P�������<p���8���@=���?p���?9�������,��� @�����*��������X�������<p���?p���A?W�������<W�������<W�������<C����?p���?&���?P�������<9����p���? p���? a��� Qp��� p���  a���R���OW�������<W������<3�������,��� @�����*��������O������<p���?p���A?W������<W������<W������<C����?p���?&���?P������<p���? p���? a��� Qa���R���O ��,��� @p���? p���? a��� Qp��� p���  a���R���OW�������<p������ @p���?~�?l�p���A?W������<W������<W����R��<C����?p���?&���?P������<~�@lda�p��� ���@=���?~�?la�p���?p��� =���? p���? a��� Qp��� p���  a���Q���O����������������*��������O����Q��<p��� =���? p���? a��� Qp��� p���  a���Q���O ����� @~�?temp����?~�?i3�p���?p���A?W����>��<W����=��<W����Q��<C����?p���?&���?P����<��<p���? p���? a��� Qp������@ a���Q���O ��?p���? p���? a��� Qp��� p���  a���R��O���OW����;��<W������<W�������<W������<p���  ?p���A?W����Z��<W����Y��<W������<C����?p���?&��� ?P����X��<p���8���@=���?p���?p���?p���A?W����f��<W����e��<W������<C����?p���?&���?P����d��<9�������?p������ @p���?p���A?W����r��<W����q��<W������<C����?p���?&���?P����p��<p��� ���@ =���? p���? a��� Qp������@ a���Q���Op��� =���? p���? a��� Qp��� p���  a���Q���O ����?���?W����o��<9�������,��� @�����*��������X������<������ @ ��?p���? p���? a��� Qp��� p���  a���R���OW������<������ @ ��?p���? p���? a��� Qa���R���O ��,��� @��p���? p���? a��� Qp��� p���  a���R���OW����c��<W����W��<W������<&���?AO����-��<p���  ?p���A?W������<W������<W����,��<C����?p���?&��� ?P������<p���8���@=���?p���?9�������,��� @�����*��������X������<p���?p���A?W������<W������<W������<C����?p���?&���?P������<9����p���? p���? a��� Qp��� p���  a���R���OW������<W������<3�������,��� @�����*��������O������<p���?p���A?W������<W������<W������<C����?p���?&���?P������<p���? p���? a��� Qa���R���O ��,��� @p���? p���? a��� Qp��� p���  a���R���OW������<p������ @p���?p���A?W������<W������<W����+��<C����?p���?&���?P������<p��� =���? p���? a��� Qp��� p���  a���Q���O����������������*��������O����*��<p��� =���? p���? a��� Qp��� p���  a���Q���O ����� @���?p���?p���A?W������<W������<W����*��<C����?p���?&���?P������<p��� ���@ =���? p���? a��� Qp������@ a���Q���O ��?p���? p���? a��� Qp��� p���  a���R��O���OW������<W������<W������<W������<p���  ?p���A?W����3��<W����2��<W������<C����?p���?&��� ?P����1��<p���8���@=���?p���?p���?p���A?W����?��<W����>��<W������<C����?p���?&���?P����=��<9�������?p������ @p���?p���A?W����K��<W����J��<W����a��<C����?p���?&���?P����I��<p��� ���@ =���? p���? a��� Qp������@ a���Q���Op��� =���? p���? a��� Qp��� p���  a���Q���O ����?���?W����H��<9�������,��� @�����*��������X����q��<������ @ ��?p���? p���? a��� Qp��� p���  a���R���OW������<������ @ ��?p���? p���? a��� Qa���R���O ��,��� @��p���? p���? a��� Qp��� p���  a���R���OW����<��<W����0��<�����I����g_fmt.8 1201054054 0 0 664 2489 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<g_fmt.c�7������7�k�����~�=g_fmt��$���=H���A~�@b�p�+���@~�?b0�p�+���?~�@x��3������@�3���Sp�3���A���Sp�3���A ���S~�?decpt�a�3���? p�3��� ���S~�?sign�a�3���? p�3��� ���S~�?se�a�3���? p�3��� ���S~�=dtoa��3����=p�3���@ p�3���p�3��� &�4���?AO�4�������<p�5��� C�5���� o�5���-���AO&�6���?'��AX�6����%���<W�7�������<W�7�������<W�7����$���<p�7���  C�7���� p�7��� C�7���� r�7���Oo�7���P%�7���AO�7�������<W�7�������<W�8�������<&�:���?AS�:����-���<p�:���?�:���  �:������A&�:���?Q�:����-���<W�:�������<p�;��� C�;���� p�;���  C�;���� r�;���P o�;��� Or�<���Q%�<���AO�<����D���<p�=��� C�=���� o�=���.���AOW�>����<���<W�>����<���<W�>����D���<p�>��� C�>���� r�>���Oo�>���R%�>���AO�>����;���<C�?���� W�?����:���<p�A��� C�A���� ~�@ echr�p�A��� ��� @ o�A��� O/�C����?p�C���?&�C���AP�C����S���<p�D��� C�D���� o�D���-���AOp�E���?�E����p�E���?W�E����V���<p�H��� C�H���� o�H���+���AOp�I������Ap�I��� ���A W�I����`���<W�I����[���<W�I����e���<C�I����p�I��� a�I��� O �I���p�I��� p�I��� =�I��� ���A&�I���?Q�I����Z���<W�I����Y���<W�Q����h���<W�Q����h���<W�Q����}���<p�K���?�K�����:�K��� �p�K��� p�L��� C�L���� p�L���  �L���0���A o�L��� O/�M����&�M���AQ�M����u���<W�N����g���<p�O��� =�O��� �O���?p�P���?a�P���O �P���p�P���?W�P����f���<o�R���ARW�R�������<&�T���?AQ�T�������<p�U��� C�U���� o�U���.���AOW�V�������<W�V�������<W�V�������<C�V����?&�V���?AP�V�������<p�W��� C�W���� o�W���0���AOW�W�������<W�X�������<W�X�������<W�X�������<p�X���  C�X���� p�X��� C�X���� r�X���Oo�X���P%�X���AO�X�������<W�X�������<W�X�������<W�[�������<W�[�������<W�[�������<p�[��� C�[���� r�[���Oo�[���R%�[���AO�[�������<C�\���� /�]����?p�]���?&�]���AX�]�������<r�]���Q%�]���AX�]�������<W�]�������<p�^��� C�^���� o�^���.���AOW�^�������<W�`�������<W�`�������<W�`�������</�`����?&�`���?AS�`�������<p�a��� C�a���� o�a���0���AOW�a�������<o�b���ARW�8�������<p�e���S~�= freedtoa��e���� =p�i���?�i������i�����Ii�����gfltconv.8 1201054055 0 0 664 5869 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<gfltconv.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�D�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�E�����~�E<libc.a�7�F����A7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<..�~�E<include�~�E<mathi.h�7�����7�a����7�����~�=gfltconv��n��=���A~�@f�p�n��@ p�p��,���R~�?flags�p�p��?p�r�� ���R �x�����A���Rp�x�����R�x��O~�?d��x��?p�y��e���A ~�?echr�p�y�� ?p�z�����A p�{��,���R �{�����A&�{��AO�{������<p�|��(���R &�}�� ���AS�}������<p�~�����A W�������<W�������<���?���Sp������A p��� ���S~�?precision�p��� ?p���  ���S~�?exponent�a���? p��� ���S~�?sign�a���? p��� ���S~�? edigits�a��� ? p��� ���S~�= dtoa����� =p���W�������<p���E���A?~�? fmt�p���e���A ?���?���Sp������A p��� ���Sp���  p��� ?C���� p���  ���Sa���? p��� ���Sa���? p��� ���Sa��� ? p��� ���S���� =p���W�������<p���E���A p��� ?p��� ������A&���AX����X���<~�? out�a���h ?p���S���?������Sp���  ���S~�= g_fmt����� =p���@ ������A,���Oa���h ? p��� S~�=strlen�����=~�?.safe�p���\?a���h ? p��� S����=p���X?p���@ p��� Sa���h ? p��� ���Sp���\? p��� ���Sp���X? p���  ���S~�=_fmtcpy�����=�����&��� AS����i���<���?���Sp������A p��� ���Sp��� ?p���  ���Sa���? p��� ���Sa���? p��� ���Sa��� ? p��� ���S���� =p���W�������<���?���Sp���A���Sp���  ���Sa���? p��� ���Sa���? p��� ���Sa��� ? p��� ���S���� =p���p��� ?���p���?p���?&���?S�������<p���? ������A&���?S�������<W�������<p���?p���?&���?AU�������<p���?&���?S�������<W�������<p���f���A ?p���?���?W�������<p���e���A ?/����?W�������<p���  ?&��� f���AQ�������<O�������<&��� E���AO����%���<&��� G���AO����8���<&��� e���AO����'���<W����:���<&��� g���AO����:���<&��� ���AO����%���<W����:���<&���?'��AX�������<p���A?p��� ?���p���?p���f���A ?p��� ?���~�?ndig�p���?p���@p��� ���O&���g���AO�������<p���@p��� ���O&���G���AO�������<W�������<p���? ������A&���AO�������<W�������<&��� ?f���AX�������<p���? ���?&���?S�������<p���?���?p���?&���?AP�������<p���A?W�������<p���?/����&���?S�������<p���?/����p���?~�?ebuf�a���?p��� &��� ?f���AO�������<&���?AQ�������<p������A���?W�������<p���?/����p��� W�������<W�������<W�������<p���gfffA=��� �p��� ������A������A ��� p���  &��� AO�������<p��� �����p��� ���A\?:���\?�p���  ���0���Ap���  C���� o���PW�������<W�������<W�������<W�������<a���?&��� L�������<p��� C���� o���0���AOW�������<a���h ?p��� &���?AO�������<p��� C���� o���-���AOW������<p���? ��� ���A&���AO������<p��� C���� o���+���AOW������<p���? ������A&���AO������<p��� C���� o��� ���AO&��� ?f���AX����J��<p���AW������<W������<W���� ��<C����&���?P������<&���?P������<r���UW������<p���0���Ap���  C���� o���PW������<&���AX����%��<p��� C���� o���0���AO&���?AQ����,��<p���? ������A&���AX����,��<W����/��<p��� C���� o���.���AOp���AW����4��<W����3��<W����I��<C����&���?O����2��<p��� ���? &��� AU����>��<p��� ���? &��� ?U����?��<W����D��<p���? a���Q ���r���OW����E��<p���0���Ap���  C���� o���PW����1��<W����k��<p��� C���� r���V o��� O&���?AQ����U��<p���? ������A&���AX����U��<W����X��<p��� C���� o���.���AOp���AW����]��<W����\��<W����k��<C����&���?O����[��<p���? /���� &��� P����f��<a���Vr������OW����g��<p���0���Ap���  C���� o���PW����Z��<&��� ?f���AO������<p��� C���� p���? o��� O&���?AQ����u��<p���-���AW����v��<p���+���Ap���  C���� o���PW����|��<W����|��<W������<a���?&��� T����{��<p��� C���� /���� r���T o��� OW����z��<~�?pout�p��� d?o���ARp���S~�=freedtoa�����=p���@ ������A,���Ra���h ?p���d? ��� p��� Sa���h ? p��� ���Sp��� ���Sp���  ���S����=����������I����pow10.8 1201054055 0 0 664 591 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<pow10.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�D�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�E�����~�E<libc.a�7�F����A7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<..�~�E<include�~�E<mathi.h�7�����7�a����7�g����~�=ipow10��c��=���A�e��������$@�e��S~�@n�p�e��@~�?.safe�p�e��?�e��?�e�����S~�=pow��e���=�e����9e�����e����Ie����e_acos.8 1201054056 0 0 664 3293 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_acos.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�(�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�*�����~�E</�~�E<386�~�E<include�~�E<u.h�7�+�����7�l�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�m�����~�E<libc.a�7�n����A7�7����7�7����7�����7�����~�>one�-���;>������?~�>pi�-���;>-DT! @~�>pio2_hi�-���;>-DT!?~�>pio2_lo�-���;>\3&<~�>pS0�-���;>UUUUUU?~�>pS1�-���;>}oԿ~�>pS2�-���;>UDU?~�>pS3�-���;>;h(~�> pS4�-���; >uI?~�> pS5�-���; > =?~�> qS1�-���; >K-':~�> qS2�-���; >ȊY*�@~�> qS3�-���; >Yl~�>qS4�-���;>.Ÿ?~�=__ieee754_acos����=X���A~�@x�p���@ p���  ���A&�����?AU�������< �����A������@&���AX�������<&��� AS�������<9���������W�������<����������@ ��>��>��������@��@���@��@�������&�����?AP����D���<&�����`<AQ���� ���<���>��>��������@ ��@~�?z����?���? �� >�� > ��?��> ��?��> ��?��> ��?��> ��?~�?p����?���? ��>�� > ��?�� > ��?�� > ��?��>~�?q����?���?��?~�?r����?���@ ��?��>��@��>�����W�������<&��� AP����r���<���>��@ ��������?���?���? �� >�� > ��?��> ��?��> ��?��> ��?��> ��?���?���? ��>�� > ��?�� > ��?�� > ��?��>���?���?���S~�=sqrt�����=~�?s����?���?��?���?���? ��?��>~�?w����?���?��? ���������@��>�����W�������<���>��@ ��������?���?���?���S����=���?���?~�?df����?p���A?����? ���?���?����?���?���~�?c�����?���? �� >�� > ��?��> ��?��> ��?��> ��?��> ��?���?���? ��>�� > ��?�� > ��?�� > ��?��>���?���?��?���?���? ��?��?���?���?��? ���������@�����9���������5���>���A5���>���A5���>���A5���>���A5���>���A5��� >���A5��� >���A5��� >���A5��� >���A5��� >���A5���>���A5���>���A5���>���A5���>���AI����e_acosh.8 1201054056 0 0 664 1434 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_acosh.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�!�����~�E</�~�E<386�~�E<include�~�E<u.h�7�"�����7�c�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�d�����~�E<libc.a�7�e����A7�.����7�.����7�����7�����~�>one�-���;>������?~�>ln2�-���;>9B.?~�=__ieee754_acosh����=$���A~�@x�p���@ &��� ��?AP���� ���<���@��@���@��@�������W����E���<&��� ��AAU�������<&��� ��AU�������<���@��@�����W�������<���@���S~�=__ieee754_log�����=��>�����W����E���<p���  �����A������@&���AX����!���<9���������W����E���<&��� ���@AS����5���<���@ ��@~�?t����?���?��>���S~�=sqrt�����=��@!��>����������@ ��@��~�?.safe����?���?���S����=�����W����E���<���@��>���?����������@ ��?���? ��?�����S����=��?���?���?���S~�= log1p����� =�����9���������5���>���A5���>���AI����e_asin.8 1201054057 0 0 664 3252 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_asin.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�/�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�1�����~�E</�~�E<386�~�E<include�~�E<u.h�7�2�����7�s�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�t�����~�E<libc.a�7�u����A7�>����7�>����7�����7�����~�>one�-���;>������?~�>Huge�-���;>u�<7~~�>pio2_hi�-���;>-DT!?~�>pio2_lo�-���;>\3&<~�>pio4_hi�-���;>-DT!?~�>pS0�-���;>UUUUUU?~�>pS1�-���;>}oԿ~�>pS2�-���;>UDU?~�> pS3�-���; >;h(~�> pS4�-���; >uI?~�> pS5�-���; > =?~�> qS1�-���; >K-':~�> qS2�-���; >ȊY*�@~�>qS3�-���;>Yl~�>qS4�-���;>.Ÿ?~�=__ieee754_asin����=P���A~�@x�p���@~�?hx�p���? ���Ap��� &�����?AU�������<p���  �����A������@&���AX�������<���@ ��>���@ ��>����������@��@���@��@�������W����I���<&�����?A~�?ix�p���?P����I���<&�����@>AP����(���<���>��@���>�����*��������T����'���<���@�����W����+���<���@ ��@~�?t����?���? �� >�� > ��?�� > ��?��> ��?��> ��?��> ��?~�?p����?���? ��>��> ��?�� > ��?�� > ��?��>~�?q����?���?��?~�?w����?���@ ��?��@��������@���S~�=fabs�����=��>���?���? ��������?���?����? ��� >��� > ���?��� > ���?���> ���?���> ���?���> ���?����?���? ��>��> ��?�� > ��?�� > ��?��>���?���?���S~�=sqrt�����=~�?s����?&���?33?AU����y���<���?��?���?���? ��?��? ���������@��>��>���?W�������<���?���?p���A?� ��?  ��? ��?� ��? ��? ��~�?c�� ��?� ��? ��?~�?r�� ��?� ���������@  ��?  ��?� ���������@  ��? ��> ��� ��?� ���������@  ��? ��>� ��?� ��? ��? ��>� ��?&���?AS�������<���?�����W�������<9������?�����9���������5���>���A5���>���A5���>���A5���>���A5���>���A5��� >���A5��� >���A5��� >���A5��� >���A5��� >���A5���>���A5���>���A5���>���A5���>���A5���>���AI����e_atan2.8 1201054058 0 0 664 3219 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_atan2.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�,�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�.�����~�E</�~�E<386�~�E<include�~�E<u.h�7�/�����7�p�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�q�����~�E<libc.a�7�r����A7�;����7�;����7�����7�����~�>tiny�-���;>Yn~�>pi_o_4�-���;>-DT!?~�>pi_o_2�-���;>-DT!?~�>pi�-���;>-DT! @~�>pi_lo�-���;>\3&<~�=__ieee754_atan2����=@���A~�@x�p������@p��� ���Ap��� ���@ ~�@y�p���@ p���  ���A p������@~�? ly�p��� ?p��� ����p���  ��� p��� ������Ap��� ��� &��� ��AR�������<p��� ?����p��� ? ��� p��� ������Ap���  ��� &��� ��AR�������<W����"���<������@��@�����p��� �����A��� &���AX����+���<���@���S~�= atan����� =�����p��� ������A ������Ap��� ������A ������A ��� ~�? m�p��� ?p��� ��� ?&���AX����L���<W����B���<W����L���<���@��������>��>�����9������>��>�����p��� ?&���AO����9���<&������AO����9���<&������AO����;���<&������AO����>���<W����8���<p������ &���AX����Y���<&��� AP����V���<9������>��>W����X���<���>��>�����&�����AX�������<&��� ��AX����y���<W����n���<W����x���<���>��>�����9������>��>��������������@ ��>��>�������������� ��>��>�����p��� ?&���AO����_���<&������AO����b���<&������AO����f���<&������AO����j���<W����^���<W�������<W�������<W�������<~�> zero���� >�����9������ >��������>��>�����9������>��>�����p��� ?&���AO����{���<&������AO����}���<&������AO�������<&������AO�������<W����z���<&� �� ��AX� ������<&� �� AP� ������<9 ���� ��> ��>W� ������<� ��> ��>� ����p� �� � ��� �����A&���<���AS�������<���������? ��>��>~�? z���� ?W�������<&���AP�������<&���AU�������<W�������<9������� ?W�������<���@�����@���S~�=fabs�����=~�?.safe����?���?���S���� =��� ?W�������<W�������<��� ?�����������A ?��� ?�������� ?��>��>�������� ?��>��>�����p��� ?&���AO�������<&������AO�������<&������AO�������<W�������<9���������5���>���A5���>���A5��� >���A5���>���A5���>���A5���>���AI����e_atanh.8 1201054058 0 0 664 1460 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_atanh.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�#�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�%�����~�E</�~�E<386�~�E<include�~�E<u.h�7�&�����7�g�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�h�����~�E<libc.a�7�i����A7�2����7�2����7�����7�����~�>one�-���;>������?~�>Huge�-���;>u�<7~~�=__ieee754_atanh����=$���A~�@x�p���@ p������@ ~�?hx�p��� ? ���A p��� ����p���  ��� p��� ������Ap���  ��� p��� &��� ��?AT�������<���@��@���@��@�������&��� ��?AX�������<���@~�>zero���>�����&��� ��0>AP����$���<���>��@���>�����*��������R����%���<W����'���<���@�����p��� @&��� ��?AP����8���<���@��@~�?t����?���? ��@���>��@����?���S~�=log1p�����= ��������?���?W����A���<���@��@���>��@�����S����= ��������?���?&���?AU����F���<���?�����W����I���<9������?�����9���������5���>���A5���>���A5���>���AI����e_cosh.8 1201054059 0 0 664 1769 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_cosh.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�%�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�'�����~�E</�~�E<386�~�E<include�~�E<u.h�7�(�����7�i�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�j�����~�E<libc.a�7�k����A7�4����7�4����7�����7�����~�>one�-���;>������?~�>half�-���;>������?~�>Huge�-���;>u�<7~~�=__ieee754_cosh����=0���A~�@x�p���@ ���A &��� ��AU�������<���@ ��@�����&��� C.?A~�?ix�p��� ?P����!���<���@���S~�=fabs�����=~�?.safe����?���?���S~�= expm1����� =~�? t���� ?���>�� ?~�? w���� ?&���?��<AP�������<��� ?�������� ? �� ?��� ?�� ?����>�����&��� ��6@AP����1���<���@���S����=���?���?���S~�= __ieee754_exp����� =��� ?���> �� ?���>�� ?�������&��� B.@AP����<���<���@���S����=���?���?���S���� = ��>�����p���> ������A p��� @&��� 3@AU����G���<&��� 3@AX����F���<&���}AR����F���<W����G���<W����V���<���@���S����= ��>���?���?���S���� =��� ?���> �� ?��� ?��� ? �� ?��������> ��>�����9���������5���>���A5���>���A5���>���AI����e_exp.8 1201054059 0 0 664 3018 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_exp.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�O�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�Q�����~�E</�~�E<386�~�E<include�~�E<u.h�7�R�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�^����7�^����7�����7�<����~�>one�-���;>������?~�>halF�-���;>������?-���;���>������~�>Huge�-���;>u�<7~~�>twom1000�-���;>������p~�>o_threshold�-���;>9B.@~�>u_threshold�-���;>Q0-I~�>ln2HI�-���;>��B.?-���;���>��B.~�>ln2LO�-���;>v<y59=-����;���>v<y59~�> invln2�-���; >+eG?~�> P1�-���; >>UUUUU?~�> P2�-���; >lf~�> P3�-���; >,%jV?~�> P4�-���; >kA~�>P5�-���;>Фri7f>~�=__ieee754_exp�� ��=D���A~�?k�p� ��? ~�@x�p���@ p��� ������A ������Ap��� ���A &��� B.@AM����-���<&��� ��AM�������<p���  ����A������@&���AO�������<���@��@�����W�������<&��� AX�������<���@W�������<9������������@���>�����*��������T����$���<���> ��>��������@���>�����*��������L����-���<���> ��>�����&��� B.?AT����S���<&� �� ?AL� ���;���<�!��@!�� >~�?hi��!��?�!�� >~�?lo��!��?p�!��  �!�� p�!�����A �!�� W�!���O���<�#�� > #��@p�#��  #�� >~�?.safe�(#���?q�#����A?$#��?��#��?$#��?�p�#��? p�$�� ?�$��?~�?t��$��?�%��? %��>%��@�%��?�&��? &��>�&��?�(��?(��?�(��@W�(���a���<&�*�� ��0>AL�*���`���<�+��>+��@�+��>�+����*+����+����T�+���_���<�+��>+��@�+����W�+���a���<p�-��A �0��@ 0��@�0��?�1��? 1��>1�� > 1��?1�� > 1��?1�� > 1��?1�� > 1��?1��@~�?c��1��?&�2�� AX�2���{���<�2��@ 2��?�2��?2���������2��2��@2��>�2����W�2������<�3��@ 3��?�3���������@3��?3��3��?3��?3��>~�?y��3��?&�4�� AU�4������<p�5�� �5�����A �5��?�6��?�6����W�6������<p�8��  �8����A�8�����A �8��?�9��? 9��>�9����99�����9����5� �� >���A5� ��>���A5� ��>���A5� �� >���A5� �� >���A5� �� >���A5� �� >���A5� ��>���A5� ��>���A5� ��>���A5� ��>���A5� ��>���A5� ��>���A5� ��>���AI ����e_fmod.8 1201054060 0 0 664 4451 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_fmod.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�Z�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�[�����~�E<libc.a�7�\����A7�%����7�%����7�����7�+����~�>one�-���;>������?~�=__ieee754_fmod����=0���A~�@x�p���@ p������@ ~�@y�p������@~�?hy�p���?p��� ���@p���  ������A~�?sx�p���?p���?��� ���A?p���?���&���AO�������<&��� ��AU�������<W�������<p�������p��� ��� p��� ������Ap���? ��� &��� ��AR�������<W����$���<���@ �����@���@ �����@�������&��� ?Q����3���<&��� ?U����+���<&��� M����+���<W����-���<���@�����&��� X����3���<p���?������A~�>Zero����>�����&��� ���AP����O���<&��� AX����B���<~�?ix�p���A?p���  W����=���<W����<���<W����A���<������A &��� AS����;���</����?W����:���<W����N���<p���A?p��� ��� ���Ap��� W����J���<W����I���<W����N���<������A &��� AS����H���</����?W����G���<W����S���<p��� ������A ���Ap���?&���?���AP����o���<&���?AX����b���<p���Ap��� W����]���<W����\���<W����a���<������A &��� AS����[���</����W����Z���<W����n���<p���Ap���?��� ���Ap��� W����j���<W����i���<W����n���<������A &��� AS����h���</����W����g���<W����s���<p���?������A ���Ap���&���?AU����y���<p���  ����A ������A W�������<p���A���?~�? n�p��� ?&��� ?���AQ�������<p��� ? p��� ��� p��� ���A ��� ? p���  ���  ��� p��� p��� ? ���  W�������<p��� ? ���A p��� ��� p��� p���A &���AU�������<p���? ����A������Ap���?W�������<p���A���p��� ?&��� ?���AQ�������<p��� ? p���?��� p��� ���A ��� ? p��� ���  ��� p���?p��� ? ��� W�������<p��� ? ���A p������ p���?p���Ap���?���p��� ?W�������<W�������<W�������<p��� ?/���� ?&���AO�������<p���  ���? p��� ���~�? lz�p��� ?&��� L�������</���� &��� AP�������<p��� ������Ap���  ��� p���  ��� p��� p���  ��� p��� W�������<p��� ��� ?&���AX�������<p� ��?� �����A� ��>� ����p� �� ?� �����Ap� ��  � �� � ��  p� �� ? � �� ? W� ������<p� ��  � ��? p� ��  � �� &� �� L� ������</� ��� &��� AU�������<p���  p���  p��� ��� &���AX�������<p���?������A���>�����W�������<W�������<W������<&��� ���AP�������<p��� ������Ap���  ��� p���  ��� p��� p���  ��� p��� /����W�������<&���AU������<p��� �����A������Ap���  �����A ��� p��� ���?p���@p��� ���@W����9��<p���A���p���&������AQ������<p��� p��� ��� p��� ���A ��� p���  ���  ��� p��� p��� ���  W����2��<&� �����AQ� ���,��<p�!�� ���A �!�� p�!�� �!�� p�!�� p�!��  �!��  �!�� p�!�� p�!��? W�!���2��<p�#�� �#��A p�#�� �#�� p�#�� p�#��? p�%�� �%��?p�%��@p�&�� ���@�'��> '��@�'��@�)��@�)����9)�����)����5�)��>���A5�)��>���AI)����e_hypot.8 1201054060 0 0 664 2716 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_hypot.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�0�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�2�����~�E</�~�E<386�~�E<include�~�E<u.h�7�3�����7�t�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�u�����~�E<libc.a�7�v����A7�?����7�?����7�����7�����~�=__ieee754_hypot����=X���A~�@x����@~�?a����?~�@y�������@~�?b����?p���@ ���A p������@ ���A &���  S�������<������@���?���@���?p���  p���  p���  W�������<���@���?������@���?p��� ?p��� ?p��� ��� &�����AS���� ���<���?��?�����~�?k�p���A?&��� ��0_AS����>���<&��� ��AU����8���<���?��?~�?w����?p���  ����A���?&���AX����/���<���?���?p��� �����A���?&���AX����6���<���?���?���?����������%A �����%A ���X��A?p��� ?p��� p��� ?&��� �� AP����Y���<&��� �AQ����S���<p��� ���?&���AX����H���<���?�����9����~�?t1����?p�����A?���? ��?���?���? ��?���?�����A?W����Y���< �����%A �����%A ���X��A?p��� ?p��� p��� ?����?���?����?���?���?�����*��������T����v���<9�������?p��� ?���?��?~�? t2���� ?9������? ��?���?��? �� ?�����? ��?�����S~�= sqrt����� =���?W�������<���?��?���?9����~�? y1���� ?p� ��  ?� ��? �� ?~�? y2�� �� ?9 ����� ��?p� ��  � �����Ap� ��?� ��? ��?� �� ?���? �� ?��� ? ��?��9������? ��?�����? �� ?�����S���� =���?&���?AO�������<3�������?p���?������A ���?���? ��?�����W�������<���?�����9���������I����e_j0.8 1201054061 0 0 664 9633 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_j0.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�=�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�?�����~�E</�~�E<386�~�E<include�~�E<u.h�7�@�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�L����7�L����7�����7�����~�>Huge�-���;>u�<7~~�>one�-���;>������?~�>invsqrtpi�-���;>mBP ?~�>tpi�-���;>m0_?~�>R02�-���;>?~�>R03�-���;>(~�>R04�-���;>9P ѱ>~�>R05�-���;>?s3~�> S01�-���; >Ȃ?~�> S02�-���; >WҦ?~�> S03�-���; >ՄT;>~�> S04�-���; >]t>~�= __ieee754_j0���� =X���A~�@x�p���@ ���A&�����A~�?ix�p���?U���� ���<���@ ��@!��>��������@���S~�=fabs�����=p���? ���@&���� ���@AU�����T���<���@���S~�=sin�����=~�?s����?���@���S~�=cos�����=~�?c����?���?��?~�?ss����?���?��?~�?cc����?&���?��AP����5���<���@��@���S����=����������~�?z����?���? ��?~�>zero����>�����*��������L����2���<���?��?���?W����5���<���?��?���?&���?���HAS����?���<���@���S~�=sqrt�����=���> ��?�����?W����R���<���@���S~�>pzero�����>~�?u����?���@���S~�>qzero�����>~�?v����?���@���S����=���? ��?���? ��?�� ��>�����?���?�����&��� �� ?AP����g���<���>��@���>�����*��������T����g���<&��� ��@>AP����b���<���>�����W����g���<���������? ��@ ��@��>��������@ ��@���?���? ��>��> ��?��> ��?��> ��?~�?r����?���? �� >�� > ��?�� > ��?�� > ��?��>���?&��� ��?AP�������<���?��?��������п ��?��>�����W�������<�!��������? !��@�!��?�"��>"��?�"��>"��? "���"��?"��? "��?"���"����9"�����"����~�>u00�-�'��;>˙䲿~�> u01�-�(��; >?~�>!u02�-�)��;!>lL~�>"u03�-�*��;">k M6?~�>#u04�-�+��;#>\sϾ~�>$u05�-�,��;$>ԫN;W�U>~�>%u06�-�-��;%>ȳ?i=Ž~�>&v01�-�.��;&>ɑp?~�>'v02�-�/��;'>x?~�>(v03�-�0��;(>-d>~�>)v04�-�1��;)>;P=~�=*__ieee754_y0��3��*=\���Ap�8��@ p�9��  �9��A p�:�����@ &�<�� ��AU�<������<�<��@ <��@<��@!<��>�<����p�=�� �=�� &�=��AX�=������<9=����=��>=��>�=����&�>�� AP�>������<�>��>>��>�>����&�?�� ���@Ap�?�� ?U�?������<�K��@�K��S�K���=�K��?�L��@�L��S�L���=�L��?�M��?M��?�M��?�N��?N��?�N��?&�S��?��AP�S������<�T��@T��@�T��S�T���=T�����������T��?�U��? U��?�U��>�U����*U����U����L�U������<�U��?U��?�U��?W�U������<�V��?V��?�V��?&�X��?���HAS�X������<�X��@�X��S�X���=�X��> X��?X���X��?W�X������<�Z��@�Z��S�Z���>�Z��?�Z��@�Z��S�Z���>�Z��?�[��@�[��S�[���=�[��? [��?�[��? [��?[�� [��>[���[��?�]��?�]����&�_�� ��@>AQ�_������<�`��@�`��S~�=+__ieee754_log��`���+= `��>`��>�`�����b��@ b��@�b��?�c��? c��%>c��$> c��?c��#> c��?c��"> c��?c��!> c��?c�� > c��?c��>�c��?�d��? d��)>d��(> d��?d��'> d��?d��&> d��?d��>�d��?�e��@�e��S�e���+=~�?,.safe��e��,?�e��@�e��S�e��� = e��,? e��>�e��?e��?e���e����9e�����e����~�>-pR8�-�s��;���->2-�t��;���->yO) -�u��;���->c{p-�v��; ���->Mnj-�w��;(���->=d6 ~�>.pS8�-�z��;.>Qg3"]@-�{��;���.>8iYP}@-�|��;���.>_n@-�}��;���.>@-�~��; ���.>I,OwA@~�>/pR5�-���;/>̕G-���;���/>-���;���/>k p-���;���/>}Z/P-���; ���/>cBgt-���;(���/>׋(u~�>0pS5�-���;0>Ř `N@-���;���0>d(~\m@-���;���0>`Z@-���;���0>8v@-���; ���0>d ̢@~�>1pR3�-���;1>o%-���;���1>K-���;���1>tE-���;���1>NLJ5-���; ���1>E B" M-���;(���1>ؒr?~�>pS3�-���;>}A@-���;���>|JF9v@-���;���>amn@-���;���>~ø@-���; ���>7e@~�>pR2�-���;>m'w-���;���>B^Ib-���;���>C$96-���;���>-���; ���>c$b&-���;(���>珯 ~�>pS2�-���;>YYe86@-���;���>a@-���;���>Bp@-���;���>:<c@-���; ���> 9DP-@���>(���A~�?q�p���? ~�?p�p���? p���@ ���A&����� @AU����0��<p���>�-D p���>�.D W����>��<&���.@AU����5��<p���>�/D p���>�0D W����>��<&���m@AU����:��<p���>�1D p���>�D W����>��<&������@AU����>��<p���>�D p���>�D ���@ ��@~�>one�!��>���?���(���P ��?��� ���P�� ��?������P�� ��?������P�� ��?������P�� ��?���P�����?��� ���Q ��?������Q�� ��?������Q�� ��?������Q�� ��?���Q�� ��?��>���?���?��?��>�����9���������~�>qR8�-���;���>,?-���;���>4[R'@-���;���>%0cm@-���; ���>m>M@-���;(���>f@~�>qS8�-���;>9[6xd@-���;���>ckNX@-���;���>?TRfA-���;���>C+ڃ(A-���; ���>= (k)A-���;(���>0,m~�> qR5�-���; >ٌ)==-���;��� >Lr?-���;��� >=W@-���;��� >鈇 `@-���; ��� >ȝ @-���;(��� >S@~�> qS5�-���; >C^T@-���;��� >!ڠ;@-���;��� >mY{g@-���;��� >r#@-���; ��� >Tz@-���;(��� > ۾W~�> qR3�-���; >j2>-���;��� >B?-���;��� >a @-���;��� >ݮ-OE@-���; ��� >^Ye@-���;(��� >!|d@~�> qS3�-���; >C"aH@-���;��� >NT-@-���;��� >cMK@-���;��� >(jl<@-���; ��� >O٪@-���;(��� > b~�> qR2�-���; >kT;1>-����;��� >4>>ž?-���;��� >w'?-���;��� >o,@-���; ��� >J)?@-���;(��� >Kq@0@~�>qS2�-���;>z]>@-���;���>@Kp@-� ��;���>""Ef@-� ��;���>\|@-� ��; ���>e�Sj@-� ��;(���>1)j>���>(���Ap���? p���? ~�@x�p���@ ���A&����� @AU����s��<p���>�D p���>�D W������<&���.@AU����x��<p���>� D p���>� D W������<&���m@AU����}��<p���>� D p���>� D W������<&������@AU������<p���>� D p���>�D ���@ ��@!��>���?���(���Q ��?��� ���Q�� ��?������Q�� ��?������Q�� ��?������Q�� ��?���Q�����?���(���P ��?��� ���P�� ��?������P�� ��?������P�� ��?������P�� ��?���P�� ��?��>���?���?��?����������@�����9���������5���>���A5��� >���A5���!>���A5���">���A5���#>���A5���$>���A5���%>���A5���&>���A5���'>���A5���(>���A5���)>���A5���>0���A5���1>0���A5���>(���A5���/>0���A5���>(���A5���0>(���A5���->0���A5��� >0���A5���.>(���A5��� >0���A5���>0���A5��� >0���A5��� >0���A5��� >0���A5���>0���A5���>0���A~�>Huge�5���>���A~�>invsqrtpi�5���>���A5���>���A~�>tpi�5���>���A5���>���A~�>R02�5���>���A~�>R03�5���>���A~�>R04�5���>���A~�>R05�5���>���A~�>S01�5���>���A~�>S02�5���>���A~�>S03�5���>���A~�>S04�5���>���AI����e_j1.8 1201054061 0 0 664 9385 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_j1.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�=�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�?�����~�E</�~�E<386�~�E<include�~�E<u.h�7�@�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�L����7�L����7�����7�����~�>Huge�-���;>u�<7~~�>one�-���;>������?~�>invsqrtpi�-���;>mBP ?~�>tpi�-���;>m0_?~�>r00�-���;>������~�>r01�-���;>a,G W?~�>r02�-���;>h~�>r03�-���;> Fj>~�> s01�-���; >S~c ?~�> s02�-���; >d͹V_(?~�> s03�-���; >?3>~�> s04�-���; >,}Ɉ5>~�> s05�-���; >~*=~�=__ieee754_j1����=`���A~�@x�p���@~�?hx�p���? ���A&�����A~�?ix�p���?U���� ���<���>��@���������@����S~�=fabs������=p����? ~�?y�����?&��� ���@AU����Z���<���?���S~�=sin�����=~�?s����?���?���S~�=cos�����=~�?c����?9������?��?~�?ss����?���?��?~�?cc����?&���?��AP����5���<���?��?���S����=~�?z����?���? ��?~�>zero����>�����*��������T����2���<���?��?���?W����5���<� ��? ��?� ��?&���?���HAS����?���<���?���S~�=sqrt�����=���> ��?�����?W����R���<���?���S~�>pone�����>~�?u����?���?���S~�>qone�����>~�? v���� ?���?���S����=���? ��?��� ? ��?�� ��>�����?&���?AP����X���<9������?�����W����Z���<���?�����&��� ��@>AP����f���<���>��@���>�����*��������T����f���<���������? ��@��������@ ��@���?���? ��>��> ��?��> ��?��> ��?~�?!r����!?���? �� >�� > ��?�� > ��?�� > ��?�� > ��?��>���?���@ ��!?���!?���@ ��������?���!?��?�������9���������~�>"U0�-�"��;"><fɿ-�#��;���">,)vө?-�$��;���">DHU_-�%��;���">>-�&��; ���">V�x~�>#V0�-�)��;#>M? e?-�*��;���#>dw%l*?-�+��;���#>NZ>-�,��;���#>[:>-�-��; ���#>*w9P=~�=$__ieee754_y1��0��$=\���Ap�5��@ p�6��  �6��A p�7�����@ &�9�� ��AU�9������<�9��@ 9��@9��@!9��>�9����p�:�� �:�� &�:��AX�:������<9:����:��>:��>�:����&�;�� AP�;������<�;��>;��>�;����&�<�� ���@Ap�<�� ?U�<������<�=��@�=��S�=���=�=��?�>��@�>��S�>���=�>��?9?����?��??��?�?��?�@��?@��?�@��?&�A��?��AP�A������<�B��@B��@�B��S�B���=�B��?�C��? C��?�C��>�C����*C����C����T�C������<�C��?C��?�C��?W�C������<�D��?D��?�D��?&�Q��?���HAS�Q������<�Q��@�Q��S�Q���=�Q��> Q��?Q���Q��?W�Q������<�S��@�S��S�S���>�S��?�S��@�S��S�S���>�S�� ?�T��@�T��S�T���=�T��? T��?�T�� ? T��?T�� T��>T���T��?�V��?�V����&�X�� ��<AQ�X������<9Y����Y��>Y��@�Y�����[��@ [��@�[��?�\��? \�� ���">\�����"> \��?\�����"> \��?\�����"> \��?\��">�\��?�]��? ]�� ���#>]�����#> ]��?]�����#> ]��?]�����#> ]��?]��#> ]��?]��>�]�� ?�^��@�^��S~�=%__ieee754_log��^���%=~�?&.safe��^��&?�^��@�^��S�^���= ^��&?�^��>^��@^�� ^��>�^��?^�� ? ^��@^���^����9^�����^����~�>'pr8�-�m��;���'>?-�n��;���'>5z*@-�o��;���'>.ey@-�p��; ���'>2}E@-�q��;(���'>݂'z@~�>(ps8�-�t��;(>leE\@-�u��;���(>O'M܅@-�v��;���(>ŗ @-�w��;���(>,@-�x��; ���(>- zi@~�>)pr5�-�|��;)>}g=-�}��;���)>C�?-�~��;���)>cn6@-���;���)>&E[@-���; ���)>IR-@-���;(���)> ~@~�>*ps5�-���;*>=cM@-���;���*>g6@-���;���*>WD@-���;���*>@-���; ���*>Q^o0@~�>+pr3�-���;+>ݞ!)>-���;���+>{![?-���;���+>^v@-���;���+>)ѦHA@-���; ���+>7,MV@-���;(���+>>GH@~�>,ps3�-���;,>4IeA@-���;���,>_3 u@-���;���,>#7P|[@-���;���,>1.}֋@-���; ���,>S.|mY@~�>-pr2�-���;->DU|>-���;���-> vB?-���;���->@-���;���->dq7|(@-���; ���->1@-���;(���->tIK@~�>.ps2�-���;.>Պo5@-���;���.>,R_@-���;���.>ۢm@-���;���.>zk]@-���; ���.>QN @���>(���A~�?/q�p���/? ~�?0p�p���0? p���@ ���A&����� @AU����$��<p���>�'D p���>�(D W����2��<&���.@AU����)��<p���>�)D p���>�*D W����2��<&���m@AU����.��<p���>�+D p���>�,D W����2��<&������@AU����2��<p���>�-D p���>�.D ���@ ��@!��>���?���(���P ��?��� ���P�� ��?������P�� ��?������P�� ��?������P�� ��?���P�����!?��� ���Q ��?������Q�� ��?������Q�� ��?������Q�� ��?���Q�� ��?��>���?���!?��?��>�����9���������~�>1qr8�-���;���1>?-���;���1>ygE0-���;���1>vSм-���; ���1>t@$-���;(���1>jeЦ~�>qs8�-���;>[ަ,d@-���;���>b@-���;���>^W�A-���;���>rS%A-���; ���>\wW$A-���;(���>i~�>qr5�-���;>C-���;���>Y?-���;���>K -���;���>lmf-���; ���>Os1it-���;(���>h~�>qs5�-���;>ZQT@-���;���>9{1@-���;���>)d @-���;���>ѺmW@-���; ���>K6|K@-���;(���>.o~�>qr3�-���;>Oȏө5-���;���>TQ?-���;���>3p-���;���>]qL-���; ���>_GӇl-���;(���>\_fk~�>qs3�-���;>g#G@-���;���>>1@-���;���>|DNh@-���;���>T@-���; ���>K z@-���;(���>1 )p`~�>qr2�-���;>&D&-���;���>H>-���;���>Ni-���;���>h3-���; ���>Jޣ)E-���;(���>Rn96_5~�>qs2�-���;>dx=@-���;���>ho@-���;���>I@-���;���>)H%@-���; ���>><^~c@-���;(���>k� ��>(���Ap� ��0? p� ��/? p���@ ���A&����� @AU����g��<p���>�1D p���>�D W����u��<&���.@AU����l��<p���>�D p���>�D W����u��<&���m@AU����q��<p���>�D p���>�D W����u��<&������@AU����u��<p���>�D p���>�D ���@ ��@~�>one�!��>���?���(���Q ��?��� ���Q�� ��?������Q�� ��?������Q�� ��?������Q�� ��?���Q�����!?���(���P ��?��� ���P�� ��?������P�� ��?������P�� ��?������P�� ��?���P�� ��?��>���?���!?��?��������?��@�����9���������~�> r00�5� �� >���A~�> r01�5� �� >���A~�> r02�5� �� >���A~�> r03�5� �� >���A~�> s01�5� �� >���A~�>s02�5� ��>���A~�>s03�5� ��>���A~�>s04�5� ��>���A~�>s05�5� ��>���A5� ��">(���A5� ��#>(���A~�>Huge�5� ��>���A5� ��->0���A5� ��+>0���A5� ��.>(���A5� ��)>0���A5� ��,>(���A5� ��*>(���A5� ��'>0���A5� ��>0���A5� ��(>(���A5� ��>0���A5� ��>0���A5� ��>0���A5� ��>0���A~�>invsqrtpi�5� ��>���A5� ��>0���A5� ��1>0���A5� ��>0���A5� ��>���A~�>tpi�5� ��>���A5� ��>���AI ����e_jn.8 1201054062 0 0 664 7838 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_jn.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�*�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�,�����~�E</�~�E<386�~�E<include�~�E<u.h�7�-�����7�n�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�o�����~�E<libc.a�7�p����A7�9����7�9����7�����7�����~�>invsqrtpi�-���;>mBP ?~�>two�-���;>�������@~�>one�-���;>������?~�=__ieee754_jn����=���A~�@n�p���@ ~�@x�p������@ p���  ���Ap������@ p��� ����~�?lx�p��� ?��� p��� ������Ap��� ~�?ix�p���?��� &��� ��AT�������<������@�����@�����&��� AP�������<���� 9���������@������@������A &��� AX����!���<������@���S~�= __ieee754_j0����� =�����&��� ���AX����'���<������@���S~�= __ieee754_j1����� =�����p��� ������Ap���  p��� @ ������A ��� ~�? sgn�p���  ?������@���S~�= fabs����� =p���? p���@ ������@p��� ���?&���AO����;���<&��� ��AP����;���<W����>���<~�> zero���� >~�?b����?W����j��<p��� ~�?.safe�p��� |?���|?������@�����*��������R�������<&��� ��RAU�������<W����t���<W�������<������@���S~�=sin�����=���x?������@���S~�=cos�����=��x?~�?temp����?W����I���<������@���S����=���p?������@���S����=������������p?���?W����I���<������@���S����=���h?������@���S����=������������h?���?W����I���<������@���S����=���`?������@���S����=��`?���?W����I���<p���  ������A&���AO����J���<&������AO����T���<&������AO����_���<&������AO����j���<W����I���<������@���S~�=sqrt�����=���> ��?�����?W�������<� �����@� ��S� ��� =~�?a�� ��?� �����@� ��S� ��� =p� ��@ � ��?p� �����A W� ������<W� ������<W� ������<C� ��� &� ��  P� ������<� ��?� ��?p� ��  � �� p� ��\?� ��\? �����@  ��? ��?� ��?���?���?W�������<W����j��<&��� ��>AP�������<&��� !���AS�������<��� >���?W�������<������@ ��������?���?���?���?���>���?p������A W�������<W�������<W�������<C���� &���  Q�������<p��� \?���\? ��?���?���? ��?���?W�������<���?��?���?W����j��<p�@��  �@�� p�@��\?�@��\?@�����@~�?w��@��?�@���������@@�����@~�?h��@��?�A��?~�?q0��A��?�A��?A��?~�?z��A��?�A��? A��?A��������~�?q1��A��?p�A�����A W�B������<W�B������<W�B������<�B������eA�B��?�B����*B����B����T�B������<C�C��� �C��?C��?�C��?�D��? D��?D��?~�?tmp��D��?�E��?�E��?�F��?�F��?W�F������<p�H��  �H��  �I�� >~�?t��I��?p�I��  �I��  �I��p�I�� W�I������<W�I������<W�I�����<�I�����A &�I��  U�I������<p�I�� \?�I��\?I�����@I��?!I��>�I��?W�I������<�J��?�J��?�K��>�K��?p�T�� \?�T��\?�T��?�U��>U�����@~�?v��U��?�V��? V��?�V��S�V��� =�V��X?�V��X?�V��S~�=__ieee754_log��V���=p�V��@ V��?�V��?�W��9B.@�W��?�W����*W����W����T�W���;��</�X��� p�X��  �X��p�X��\?�X��\?~�?di��X��?W�X���)��<W�X���(��<W�X���:��</�X��� &�X�� AS�X���'��<�Y��?�Y��?�Z��? Z��?�Z��?�[��?[�����@[��?�[��?�\��?�\��?�]��>]��?�]��?W�]���&��<W�]���d��</�`��� p�`��  �`��p�`��\?�`��\?�`��?W�`���E��<W�`���D��<W�`���d��</�`��� &�`�� AS�`���C��<�a��?�a��?�b��? b��?�b��?�c��?c�����@c��?�c��?�d��?�d��?�e��>e��?�e��?�g��}Ô%IT�g��?�g����*g����g����L�g���c��<�h��?!h��?�h��?�i��?!i��?�i��?�j��>�j��?W�j���B��<�n�����@�n��S�n��� = n��?n��?�n��?&�q�� ?���AX�q���p��<9q����q��?�q����W�q���r��<�q��?�q����9q�����q����~�=__ieee754_yn��t��=`���Ap�t��@ p�z�����@p�{�� �{��A p�|�����@ p�~�� �~���p�~��  �~�� p�~�� �~�����Ap�~��  �~�� &�~�� ��AT�~�����<�~�����@~�����@�~����p��� ��� &���AX������<9������>�� >�����&���AP������<��� >�� >�����~�? sign�p������A ?&��� AP������<p���  ���� p���  ������A ���p������A ��� p���  ?&��� AX������<������@���S~�=!__ieee754_y0�����!=�����&��� ���Ap��� @X������<������@���S~�="__ieee754_y1�����"=p��� ?p���?���? �������&��� ��AX������<��� >�����&��� ��RAU������<W������<W������<������@���S����=���?������@���S����=��?���?W������<������@���S����=���?������@���S����=������������?���?W������<������@���S����=���?������@���S����=������������?���?W������<������@���S����=���?������@���S����=��?���?W������<p���  ������A&���AO������<&������AO������<&������AO������<&������AO������<W������<������@���S����=���> ��?�����?W������<������@���S����!=���?������@���S����"=p���@ ���?p������A W������<W������<W������<C���� &���  P������<&���?��AX������<W������<���?���?p���  ��� p���?���?�����@ ��?��?���?���?���?W�������<&��� ?AS������<���?�����W������<9������?�����9���������5���>���A5���>���A5���>���A5��� >���AI����e_lgamma_r.8 1201054063 0 0 664 11548 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_lgamma_r.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�T�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�V�����~�E</�~�E<386�~�E<include�~�E<u.h�7�W�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�c����7�c����7�����7�����~�>two52�-���;>������0C~�>half�-���;>������?~�>one�-���;>������?~�>pi�-���;>-DT! @~�>a0�-����;>Ȱ}gij?~�>a1�-���;>L?~�>a2�-���;>bU�>?~�>a3�-���;>{T"?~�> a4�-���; >O@~?~�> a5�-���; >kحg?~�> a6�-���; >]?oS?~�> a7�-���; >�ƶ@?~�> a8�-���; >M,?~�>a9�-� ��;>}P?~�>a10�-� ��;>RBtp>~�>a11�-� ��;>7X?~�>tc�-� ��;>?Vcb?~�>tf�-� ��;>Bü~�>tt�-���;>P~�>t0�-���;>8+?~�>t1�-���;> ƍ'¿~�>t2�-���;>AՔB?~�>t3�-���;>5ߨɠ~�>t4�-���;> f?~�>t5�-���;>j쑺~�>t6�-���;>Dpx?~�>t7�-���;>.n~�>t8�-���;>.ӂb?~�>t9�-���;>-V~�>t10�-���;>a L?~�>t11�-���;>sA~�> t12�-���; >lm4?~�>!t13�-���;!>8$4~�>"t14�-���;">>5?~�>#u0�-���;#>Ȱ}gij~�>$u1�-� ��;$>]�@?~�>%u2�-�!��;%>o\G?~�>&u3�-�"��;&>PDvI?~�>'u4�-�#��;'>$ N?~�>(u5�-�$��;(> +g?~�>)v1�-�%��;)>aץ@~�>*v2�-�&��;*>+%@~�>+v3�-�'��;+>PP?~�>,v4�-�(��;,>|SU?~�>-v5�-�)��;->aWZj?~�>.s0�-�*��;.>Ȱ}gij~�>/s1�-�+��;/>x6?~�>0s2�-�,��;0>YO?~�>1s3�-�-��;1>徜?~�>s4�-�.��;>a~H?~�>s5�-�/��;>9hs&^?~�>s6�-�0��;>E�?~�>r1�-�1��;>tbE?~�>r2�-�2��;>ӓ?~�>r3�-�3��;>'?~�>r4�-�4��;>u.t?~�>r5�-�5��;>[A}I?~�> r6�-�6��; >@>~�> w0�-�7��; >i}ɐ?~�> w1�-�8��; >;UUUUU?~�> w2�-�9��; >\.lf~�> w3�-�:��; >8ϘJ?~�>w4�-�;��;>AˀC~�>w5�-�<��;>LgK?~�>w6�-�=��;>C Z~�>sin_pi��A��>4���A~�@x�p�F��@ �F��A&�H����?A~�?ix�p�H��?P�H������<~�>pi��H��> H��@�H��S~�>zero��H��>�H�����Sp�H��A���S~�=__kernel_sin��H���=�H����9I����I��@~�?y��I��?�O��?�O��S~�=floor��O���=p�O��? ~�?z��O��?�P��?�P��?�P����*P����P����O�P���.���<�Q��������? Q��?�Q��?�R��?�R��S�R���=R��? R���������@�R��?�S��? S��������@~�?.safe�(S���?q�S����A?$S��?��S��?$S��?�p�S��? W�S���?���<&�U�� ��@CAU�U���4���<�V��>�V��?p�V��A W�V���?���<&�X�� ��0CAP�X���9���<�X��?~�>two52�X��>�X��?p�Y��? �Y�����A p�Z�� ?�Z��?�Z��?�[�����A W�g���q���<W�g������<�_��> _��?�_��S�_��>�_�����Sp�_��A���S�_���=�_��?W�_���@���<�a��������?a��? a��>�a��S�a��>�a�����S~�=__kernel_cos��a���=�a��?W�a���@���<~�>one��c��>c��? c��>�c��S�c��>�c�����Sp�c��A���S�c���=�c��?W�c���@���<�e��?e�������� e��>�e��S�e��>�e�����S�e���=e�����������e��?W�e���@���<�f��?f��������� f��>�f��S�f��>�f�����Sp�f��A���S�f���=�f��?W�f���@���<&�f�� ���AQ�f���{���<O�f���S���<&�f�� AO�f���A���<&�f�� ���AO�f���J���<&�f�� ���AO�f���J���<W�f���g���<&�f�� ���AO�f���S���<&�f�� ���AO�f���]���<&�f�� ���AO�f���]���<W�f���g���<9h����h��?�h����9h�����h����~�=__ieee754_lgamma_r��l��=���A~�@signgamp�p�l�����@ p�q��@~�? hx�p�q�� ?p�r�����@ p�u�����ARp�v�� ? �v��A &�w�� ��AU�w������<�w��@ w��@�w����p�x�� �x�� ~�?!lx�p�x�� !?&�x��AX�x������<�x��>x��>�x����&�y�� ��;AP�y������<&�z�� ?AP�z������<p�{��AR9|����|��@�|��S~�="__ieee754_log��|���"=|�����������|����W�|������<�}��@�}��S�}���"=}�����������}����&��� ?AP�������<&��� ��0CAp��� ?U�������<���>��>��������@���S����>~�?#t����#?���#?���>�����*��������X�������<���>��>��������#? ��@���S~�=$fabs�����$=!��>���?���?���S����"=p���!? p���? ~�?%nadj����%?���#?���>�����*��������L�������<p������@p���AO9������@���@p���  �����A��� &���AO�������<p���  ������A��� &���AO�������<W�������<9����~�?&r����&?W����"��<&��� ���@AP������<&��� ?Ap��� ?Q������<���@���S����"=p���? �������������&?&��� Di?AU�������<���>��@���?p���A W������<&��� a?AU������<~�>'tc����'>��>��@���?p������A W������<���@���?p������A W������<���>���&?&��� ô?AU������<����������@��@���?p���A W������<&��� Ĵ?AU������<���@��'>���?p������A W������<���@��>���?p������A W������<W������<���? ��?���?���?~�>(a10� ��(>~�>)a8���)> ��?~�>*a6���*> ��?~�>+a4���+> ��?~�>,a2���,> ��?~�>-a0���->~�?.p1����.?���?~�>/a11� ��/>~�>0a9���0> ��?~�>1a7���1> ��?~�>a5���> ��?~�>a3���> ��?~�>a1���> ��?~�?p2����?���? ��.?��?~�?p����?���������? ��?��?��&?���&?W������<���? ��?���?���? ��?~�?w����?���?~�>t12� ��>~�>t9���> ��?~�> t6��� > ��?~�> t3��� > ��?~�> t0��� >���.?���?~�> t13� �� >~�> t10��� > ��?~�>t7���> ��?~�>t4���> ��?~�>t1���>���?���?~�>t14� ��>~�>t11���> ��?~�>t8���> ��?~�>t5���> ��?~�>t2���>~�?p3����?���? ��.?���? ��?��? ��?~�>tt���>�����?~�>tf����>��?��&?���&?W������<~�?y����?~�>u5� ��>~�>u4���> ��?~�>u3���> ��?~�>u2���> ��?~�>u1���> ��?~�>u0���> ��?���.?���?~�> v5� �� >~�>!v4���!> ��?~�>"v3���"> ��?~�>#v2���#> ��?~�>$v1���$> ��?~�>%one���%>���?��������� ��?���.?��?����&?���&?W������<&��� AO������<&��� ���AO����A��<&��� ���AO����s��<W������<W����"��<&��� �� @AP������<~�@&x����&@~�?'.safe�(���'?q�����A'?$��'?����'?$��'?�p���'? ~�>(zero����(>~�?)t����)?p��� '?���'?��&@���?���?~�>*s6� ��*>~�>+s5���+> ��?~�>,s4���,> ��?~�>-s3���-> ��?~�>.s2���.> ��?~�>/s1���/> ��?~�>0s0���0> ��?���?���?~�>1r6� ��1>~�>r5���> ��?~�>r4���> ��?~�>r3���> ��?~�>r2���> ��?~�>r1���> ��?��%>~�?q����?~�>half����> ��?~�?p����?��?��~�? r���� ?���%>~�? z���� ?W������<W������<���?��������@ �� ?��� ?���?��������@ �� ?��� ?���?��������@ �� ?��� ?���?��������@ �� ?��� ?���?���������@ �� ?��� ?��� ?���S~�= __ieee754_log����� =�� ?��� ?W������<&��� ���AQ������<O������<&��� ���AO������<&��� ���AO������<W������<&��� ���AO������<&��� ���AO������<W������<W����"��<&��� ��CAP������<���&@���S���� =���)?���%>��&@��� ?��� ? �� ?���?���?~�> w6� �� >~�> w5��� > ��?~�>w4���> ��?~�>w3���> ��?~�>w2���> ��?~�>w1���> �� ?~�>w0���>~�?w����?���&@��>���)?��%> ����?��� ?W����"��<���&@���S���� =��%> ��&@��� ?~�?hx�&���?AP����'��<~�?nadj����?�� ?��� ?��� ?�����9���������5���>���A~�>a10�5���>���A~�>a11�5���>���A~�>t10�5���>���A~�>t11�5���>���A~�>t12�5���>���A~�>t13�5���>���A~�>t14�5���>���A~�>a0�5���>���A~�>a1�5���>���A~�>a2�5���>���A~�> a3�5��� >���A~�>!a4�5���!>���A~�>"a5�5���">���A~�>#a6�5���#>���A~�>$a7�5���$>���A~�>%a8�5���%>���A~�>&a9�5���&>���A5���>���A5���>���A5���>���A5���0>���A5���>���A5���/>���A5���>���A5���.>���A5���1>���A5���->���A~�>'t0�5���'>���A5���,>���A~�>(t1�5���(>���A5���+>���A~�>)t2�5���)>���A5���*>���A~�>*u0�5���*>���A~�>+t3�5���+>���A~�>,u1�5���,>���A~�>-t4�5���->���A~�>.u2�5���.>���A~�>/t5�5���/>���A~�>0u3�5���0>���A~�>1t6�5���1>���A~�>v1�5���>���A~�>u4�5���>���A~�>t7�5���>���A~�>v2�5���>���A~�>u5�5���>���A~�>t8�5���>���A5���>���A~�>v3�5���>���A~�>t9�5���>���A5���>���A~�> v4�5��� >���A~�> one�5��� >���A5���>���A~�> v5�5��� >���A5���>���A5���>���A5��� >���A5��� >���A~�> pi�5��� >���A~�> tc�5��� >���A~�>tf�5���>���A~�>tt�5���>���A~�>two52�5���>���A~�>zero�5���>���AI����e_log.8 1201054063 0 0 664 3335 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_log.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�C�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�E�����~�E</�~�E<386�~�E<include�~�E<u.h�7�F�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�R����7�R����7�����7�*����~�>ln2_hi�-���;>��B.?~�>ln2_lo�-���;>v<y59=~�>two54�-���;>������PC~�>Lg1�-���;>UUUUU?~�>Lg2�-���;>?~�>Lg3�-���;>Y"$I?~�>Lg4�-���;>xq?~�>Lg5�-���;>˖dF?~�> Lg6�-���; >x ?~�> Lg7�-���; >DR>?~�= __ieee754_log���� =h���A~�@ x�p��� @ p������ @ p���A &��� ���AP�������<p���  ���A��� &���AX�������<9������>~�> zero��� >�����&��� AP�������<��� @�� @�� >��������6���A ���> �� @��� @p��� @ &� �� ��AU� ������<� �� @ �� @� ����p� �� � �����A � ��A � �� � ���A p� ��  � ��d_ �A � �����A p� �� � ����?Ap� ��  � �� p� ��  @p��� ������A ��� ��� @��������~�?f����?p���  ������A ����A&������AP����c���<���?��� >�����*��������X����K���<&��� AX����B���<��� >�����W����K���<~�?.safe�p��� ?���?~�?dk����?���? ��>���? ��>����������? ��?���UUUUUU? ��?��������? ��~�?R����?&��� AX����X���<���?��?�����W����c���<p��� ?���?���?���? ��>���? ��>��?��?����������?���������@!��?~�?s����?p��� ?���?���?���? ��?~�?z����?p���  ���A ���? ��?~�?w����?p���Q�A��� ���? �� >��> ��?��> ��?~�?t1����?���? �� >��> ��?��> ��?��> ��?~�?t2����?��� � ��? ��?� ��?&�!�� AS�!������<�"��������? "��? "��?~�?hfsq��"��?&�#�� AX�#������<�#��?#��? #��?#��?#��?�#����W�#������<�$��?$��? $��?�$��? $��>$��$��?$��?�$��? $��>$���$����W�$������<&�&�� AX�&������<�&��?&��? &��?&��?�&����W�&������<�'��?'��? '��?�'��? '��>'��'��?�'��? '��>'���'����9'�����'����5�'��>���A5�'��>���A5�'��>���A5�'��>���A5�'��>���A5�'�� >���A5�'�� >���A5�'��>���A5�'�� >���A5�'��>���A5�'��>���AI'����e_log10.8 1201054064 0 0 664 1464 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_log10.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�1�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�3�����~�E</�~�E<386�~�E<include�~�E<u.h�7�4�����7�u�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�v�����~�E<libc.a�7�w����A7�@����7�@����7�����7�����~�>two54�-���;>������PC~�>ivln10�-���;>&{?~�>log10_2hi�-���;>�`PD?~�>log10_2lo�-���;>6+Y=~�=__ieee754_log10����=0���A~�@x�p���@ p������@ p���A &��� ���AP�������<p���  ���A��� &���AX�������<9������>~�>zero���>�����&��� AP�������<���@��@��>��������6���A ���> ��@���@p���@ &��� ��AU�������<���@��@�����p��� ������A ���A ��� p���  ������A������Ap��� p�����A��� ������Ap���  ����A ��� p���  ��� ~�?.safe�p���?���?~�? y���� ?p��� @���@���S~�= __ieee754_log����� = ��>��� ? ��>��~�? z���� ?��� ? ��>�� ?�����9���������5���>���A5���>���A5���>���A5���>���A5���>���AI����e_pow.8 1201054064 0 0 664 10128 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_pow.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�=�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�?�����~�E</�~�E<386�~�E<include�~�E<u.h�7�@�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�L����7�L����7�����7�����~�>bp�-���;>������?-���;���>������?~�>dp_h�-���;���>���@?~�>dp_l�-���;���>CL>~�>one�-���;>������?~�>two�-���;>�������@~�>two53�-���;>������@C~�>Huge�-���;>u�<7~~�>tiny�-���;>Yn~�> L1�-���; >33333?~�> L2�-���; >o۶m?~�> L3�-���; >M&QUU?~�> L4�-���; >A`t?~�> L5�-���; >eɓJ?~�>L6�-���;>NEJ(~?~�>P1�-���;>>UUUUU?~�>P2�-���;>lf~�>P3�-���;>,%jV?~�>P4�-���;>kA~�>P5�-���;>Фri7f>~�>lg2�-���;>9B.?~�>lg2_h�-���;>����C.?~�>lg2_l�-���;>9l a\ ~�>ovt�-���;>+eG<~�>cp�-���;>: ?~�>cp_h�-���;>��� ?~�>cp_l�-����;>[/>~�>ivln2�-���;>+eG?~�>ivln2_h�-���;>���`G?~�>ivln2_l�-���;>D] T>~�=__ieee754_pow����=���A~�@x�p� ��@~�? hx�p� ��p ?p� �����@~�?!lx�p� ��`!?~�@"y�p������"@p��� ���"@ p���p ? ���Ap��� ~�?#hy�p���l#? ���A p��� ��� &���AX�������<���>�����&�����AQ�������<&�����A~�?$ix�p���h$?X�������<&���`!?AX�������<W�������<W�������<&��� ��AS�������<W����%���<&��� ��A~�?%iy�p��� d%?X����$���<&��� AO����$���<W����%���<W����(���<���@�����"@�����~�?&yisint�p���Ax&?&���p ?AP����Z���<&� �� ��@CAU� ���/���<p� �����Ax&?W� ���Z���<&�!�� ��?AU�!���Z���<p�"�� �"�����A �"��Ap�"�� &�#�����AS�#���H���<p�$��4���A �$��  p�$�� �$�� ~�?'j�p�$��'?p�%��4���A �%��  p�%��'?�%�� &�%�� X�%���G���<p�%��'? �%�����Ap�%�����A �%�� p�%�� x&?W�%���Z���<&�&�� AX�&���Z���<p�'�����A �'�� p�'�� �'�� p�'��'?p�(�����A �(��  p�(��'?�(�� &�(�� X�(���Z���<p�(��'? �(�����Ap�(�����A �(�� p�(�� x&?&�.�� AX�.������<&�/�� ��AX�/���w���<p�0�� �0����A�0��`!?&�0��AX�0���g���<�1�����"@1�����"@�1����W�1���w���<&�2����?AU�2���p���<&�3��AU�3���m���<�3�����"@W�3���n���<~�>(zero��3��(>�3����W�3���w���<&�5��AP�5���u���<95����5�����"@W�5���v���<�5��(>�5����&�7�� ��?AX�7������<&�8��AP�8������<�8��>8��@�8����W�8������<�8��@�8����&�:�����@AX�:������<�:��@ :��@�:����&�;����?AX�;������<&�<��p ?AU�<������<�=��@�=��S~�=)sqrt��=���)=�=�����A��@�A��S~�=*fabs��A���*=p�A��d%? p�A��p ?p�A��x&?p�A��l#? p�A��h$? ~�?+ax��A��+?&�C��`!?AX�C������<&�D�� ��AO�D������<&�D�� AX�D������<W�D������<&�D�� ��?AO�D������<W�D������<�E��+?~�?,z��E��,?&�F�� AP�F������<�F��>F��,?�F��,?&�G��AP�G������<p�H��  �H����A�H��&�H��AX�H������<�I��,?I��,?�I��,?I��,?I���I��,?W�I������<&�J�����AX�J������<9K����K��,?�K��,?�M��,?�M����p�R���R�����AC�R����R��&�R��AX�R������<�R��@R��@�R��@R��@R���R����&�U�� ��AAS�U�����<&�V�� ��CAS�V������<&�W�� ?AQ�W������<&�W�� AP�W������<�W��> W��>W�W������<�W��> W��>�W����&�X�� ��?AU�X������<&�X�� AS�X������<�X��> X��>W�X������<�X��> X��>�X����&�[�� ?AP�[������<&�[�� AP�[������<�[��> [��>W�[������<�[��> [��>�[����&�\�� ��?AS�\������<&�\�� AS�\������<�\��> \��>W�\������<�\��> \��>�\�����_��@_��������~�?-t��_��-?�`��-? `��-?�`��-? `��������?`��UUUUUU? `��-?`��������? `��~�?.w��`��.?�a��> a��-?~�?/u��a��/?�b��-? b��>�b��.? b��>b��~�?0v��b��0?�c��/?c��0?~�?1t1��c��1?p�d��A1?�e��1?e��/?e��0?~�?t2��e��?W�e�����<p�h��A &�j�� ���AP�j�����<�k��> k��+?�k��+?�k��5���A p�k��+? p�l�� �l�����A �l��A �l�� �m���A p�o��  �o����?A &�p�� �AQ�p���&��<p�p��A W�p���-��<&�q�� z �AP�q���*��<p�q�����A W�q���-��<p�r��A C�r��� �r�����A p�s�� +?�v��+?~�>bp�v�� >�v��/?�w��+?w�� >!w��>�w��0?�x��/? x��0?~�?s��x��?�y��?~�?s_h��y��L?p�z��AP?�|��(>~�?t_h��|��<?p�}�� �}�����Ap�}��  �}�����A �}����� A �}��  �}�����Ap�}��<?�~��<?~�� >~��+?~�?t_l��~��4?���L? ��<?��/?���L? ��4?�� ��0?~�?s_l����D?���? ��?~�?s2����T?���T? ��T?���T? ��>�� > ��T?�� > ��T?�� > ��T?�� > ��T?�� > ��~�? r���� ?���L?��? ��D?�� ?��� ?���L? ��L?���T?���T?��������@�� ?���<?p���A@?���<?����������T?�� ?���4?���L? ��<?���/?���D? ��<?���4? ��?�����0?���/?��0?~�? p_h���� ?p���A ?��� ?��/?��0?~�? p_l���� ?���> �� ?~�? z_h���� ?���> �� ?��� ? ��>��~�> dp_l���  >~�?z_l����?~�?.safe�p��� ,?���,?���-?��� ?��?~�>dp_h��� >��-?���1?p���A1?���1?��-?�� >�� ?��?���?~�>one����>���?p���������AC����p��� /���� ��� &���AX������<9������>���?������"@~�?y1����?p���A?������"@��? ��1?������"@ ��?����� ?���? ��1?��� ?��� ?�� ?���,?p���,? p���,? &��� ��@AU������<p���  �����pA��� &���AO������<���?~�>Huge� ��> ��>�����W������<��� ?��>���,?�� ?��������*��������L������<���? ��> ��>�����W������<p���  ���A&����̐@AU������<p���  ����4o?A��� &���AO������<���?~�>tiny� ��> ��>�����W������<���,?�� ?��� ?�����*��������M������<���? ��> ��>�����p���  ���A p��� ������A ���Ap���A &��� ��?AS������<p��� C���� p������A��� p���  ��� p���  ���A������A ���Ap��� ���(>���-?p��� p����A��� ����p���  ��� p��� -?p������A ���  p���  ����A������A��� p��� &��� AP������<���� ���-?�� ?��� ?��� ?�� ?���-?p���A-?���-? ��>���/?���-?�� ?�� ?~�>lg2� ��>���-? ��>�����0?���/?��0?���,?���,?��/?��0?���.?���,? ��,?���-?���-?~�>P5� ��>~�>P4���> ��-?~�>P3���> ��-?~�>P2���> ��-?~�>P1���> ��-?��,?���1?���,? ��1?���1?~�>two���>�����,? ��.?��.?����� ?��� ?��,?��>���,?p���,? p��� ������A ��� p��� ������A&���AQ����[��<���,?���Sp��� ���S~�=scalbn�����=���,?W����^��<p��� ������A ���,?���? ��,?�����9���������5���>���A5��� >���A~�>ivln2_h�5���>���A~�>ivln2_l�5���>���A~�>lg2_h�5���>���A~�> lg2_l�5��� >���A~�>!L1�5���!>���A~�>"L2�5���">���A~�>#L3�5���#>���A~�>$L4�5���$>���A~�>%L5�5���%>���A~�>&L6�5���&>���A5���>���A5���>���A5���>���A5���>���A5���>���A5���>���A5���>���A5���>���A5���>���A~�>'cp�5���'>���A5���>���A~�>(ovt�5���(>���A5���>���A~�>)two53�5���)>���A~�>*zero�5���*>���A~�>+ivln2�5���+>���A~�>,cp_h�5���,>���A~�>-cp_l�5���->���AI����e_rem_pio2.8 1201054065 0 0 664 6474 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_rem_pio2.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�[�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�\�����~�E<libc.a�7�]����A7�&����7�&����7�����7�F����~�>two_over_pi�-���;>�A-���;���>DNn�A-���;���>)�A-���; ���>W'�A-���;���>4�A-���;���>b�A-���;���><�A-���;���>AC�A-���; ���>cQ�A-���;$���>ޫ�A-���;(���>a�A-���;,���>:n$�A-���;0���>MB�A-���;4���>I�A-���;8���> .�A-���;<���>�A-���;@���>�A-���;D���>)�A-���;H���>>�A-���;L���>5�A-���;P���>D.�A-���;T���>�A-���;X���>&p�A-���;\���>A~_�A-���;`���>֑9�A-���;d���>S9�A-���;h���>9�A-���;l���>_�A-���;p���>(�A-���;t���>;�A-���;x���>�A-���;|���>�A-���;���>/�A-���;���> Z�A-���;���>mm�A-���;���>~6�A-���;���> '�A-���;���>FO�A-���;���>f?�A-���;���>-_�A-���;���>'u�A-���;���>�A-���;���>={�A-���;���>9�A-���;���>R�A-���;���>k�A-���;���>_�A-���;���>]�A-���;���>0V�A-���;���>{F�A-���;���>k�A-���;���> �A-���;���>6�A-���;���>�A-���;���>^a�A-���;���>�A-���;���>e�A-���;���>_�A-���;���>@h�A-���;���>�A-���;���>'sM�A-���;���>1�A-���;���>V�A-���;���>ɨs�A-���;���>{`�A-���;��>k�A~�>npio2_hw�-���;>!?A-���;���>! @A-���;���>|@A-���; ���>!@A-���;���>zj@A-���;���>|"@A-���;���>%@A-���;���>!)@A-���; ���>:F,@A-���;$���>zj/@A-���;(���>\G1@A-���;,���>|2@A-���;0���>k4@A-���;4���>5@A-���;8���>ۏ7@A-���;<���>!9@A-���;@���>:@A-���;D���>:F<@A-���;H���>Z=@A-���;L���>zj?@A-���;P���>L~@@A-���;T���>\GA@A-���;X���>lB@A-���;\���>|B@A-���;`���>C@A-���;d���>kD@A-���;h���>4E@A-���;l���>E@A-���;p���>F@A-���;t���>ۏG@A-���;x���>XH@A-���;|���>!I@A~�>half�-���;>������?~�>two24�-���;>������pA~�>invpio2�-���;>m0_?~�>pio2_1�-���;>��@T!?~�>pio2_1t�-���;>1cba=~�>pio2_2�-���;>��`a=~�> pio2_2t�-���; >sp.;~�> pio2_3�-���; >���.;~�> pio2_3t�-���; >I %{9~�= __ieee754_rem_pio2���� =|���A~�@ y�p������ @ ~�@x�p���@ p���  ~�?hx�p��� ? ���A &��� !?AQ�������<���@���R9����������Rp���A�����&��� |@AP����E���<&��� AS����,���<���@��>~�?z����?&��� !?AO�������<���?��>���R���R��?��>������RW����)���<���>��?���?����?��� >����R���R��?�� >������Rp������A�����W����E���<���@��>���?&��� !?AO����9���<���?��>���R���R��?��>������RW����C���<� ��> ��?� ��?� ��? �� >� ��R� ��R ��? �� >� �����Rp���A�����&��� !9AA~�?ix�p��� ?Q�������<���@���S~�=fabs�����=p���? p������ @ ~�?t����?���? ��>��>~�?.safe�(���?q�����A?$��?����?$��?�p���? p��� ?���?~�?fn����?���? ��>��?~�?r����?���? ��>~�?w����?&���  ���AP����e���<&���  >X����f���<W����j���<���?��?���QW�������<p��� ������Ap��� ���?��?���Qp���Q������A �����Ap���  ��� &��� ���AS�������<���?���?���? ��>���?� ��? ��?� ��?�!��? !�� >�!��?!��?!��?!���!��?�"��?"��?�"��Qp�#��Q�#�����A �#����Ap�#��  �#�� &�$�� 1���AS�$������<�%��?�%��?�&��? &�� >�&��?�'��?'��?�'��?�(��? (�� >�(��?(��?(��?(���(��?�)��?)��?�)��Q�-��Q-��?-��?�-�����Q&�.��?AP�.������<�.��Q.�����������.��Q�.�����Q.�����������.�����Qp�.�� �.����.����W�.������<p�/�� �/����&�4�� ��AU�4������<�5��@5��@�5���5�����R�5��Rp�5��A�5����p�8�����@p�8��?p�9�� �9�����A �9��Ap�9�� �:�����Ap�:��  �:�� p�:�� p�:�� ?p�;��A W�;������<W�;������<W�;������<C�;��� &�;�� ���AP�;������<�<��?(<���?q�<����A?$<��?��<��?$<��?�p�<��? p�<�� ?�<��?~�?tx��<�� ?�=��?p�=�� =�� ? =��>�=��?W�=������<�?��?�?��?p�@�����A W�A������<W�A������<W�A������<p�A�� �A�� ?~�>zero��A��>�A����*A����A����X�A������</�A��� W�A������<a�B��? p�B�� Sp�B�� ���Sp�B�� ���Sp�B��  ���Sp�B�����A p�B�� ���Sp�B��>�D p�B�� ���S~�=__kernel_rem_pio2��B���=p�B����� @ &�C��?AP�C�����<�C��QC�����������C��Q�C�����QC�����������C�����Q�C����C�����D�����D����5�D��>���A5�D��>���A5�D��>���A5�D��>���A5�D��>���A5�D��>���A5�D�� >���A5�D��>���A5�D�� >���A5�D�� >���A5�D��>��A5�D��>���AID����e_remainder.8 1201054065 0 0 664 2024 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_remainder.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�]�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�^�����~�E<libc.a�7�_����A7�(����7�(����7�����7�����~�=__ieee754_remainder����=4���A~�@x�p���@ p������@~�?lx�p���?~�@p�p������@ p��� ���@ p���  ������A~�?sx�p���? ���A ���A p��� ��� ~�?lp�p��� ?&���AX�������<���@ �����@���@ �����@�������&��� ��A~�?hx�p��� ?P����"���<&��� ��AU����!���<p���  �����A��� &���AO����!���<W����"���<W����(���<���@ �����@���@ �����@�������&��� A~�?hp�p��� ?Q����5���<���@���S������@�����@������S~�= __ieee754_fmod����� =p���? p���? p���? ���@p��� ��� p���? ���  ��� &���AX����?���<~�> zero���� > ��@��������@���S~�= fabs����� =���@������@���S���� =������@&���?�� �AP����^���<���@��@������@�����*��������T����]���<������@��@���@���@��@������@�����*��������M����]���<������@��@���@W����s���<���������? �����@~�? p_half���� ?���@��� ?�����*��������T����s���<������@��@���@���@��� ?�����*��������M����s���<������@��@���@p���?���@���@�����9���������5��� >���AI����e_sinh.8 1201054066 0 0 664 1840 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_sinh.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�"�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�$�����~�E</�~�E<386�~�E<include�~�E<u.h�7�%�����7�f�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�g�����~�E<libc.a�7�h����A7�1����7�1����7�����7�����~�>one�-���;>������?~�>sHuge�-���;>3t<{~�=__ieee754_sinh����=<���A~�@x�p���@ p���  ���Ap��� &�����AU���� ���<���@��@��������������?~�?h����?&��� AP�������<9������?���?&��� ��6@AP����9���<&��� ��0>A~�?ix�p��� ?P�������<���>��@���>�����*��������T�������<���@��������@���S~�=fabs�����=~�?.safe����?���?���S~�= expm1����� =~�? t���� ?&���?��?AP����3���<��� ? �� ?��� ?��>������������@ �� ?�� ��?�������� ?��>!�� ?�� ? ��?�����&��� B.@AP����D���<���@���S����=���?���?���S~�= __ieee754_exp����� = ��?�����p���> ������A p��� @&��� 3@AU����O���<&��� 3@AX����N���<&���}AR����N���<W����O���<W����^���<���@���S����= ��������?���?���?���S���� =~�? w���� ?���? �� ?��� ?��� ? �� ?��������@ ��>�����9���������5���>���A5���>���AI����e_sqrt.8 1201054066 0 0 664 3259 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<e_sqrt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�U�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�W�����~�E</�~�E<386�~�E<include�~�E<u.h�7�X�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�d����7�d����7�����7�a����~�>one�-���;>������?~�>tiny�-���;>Yn~�=__ieee754_sqrt����=<���Ap������A ~�@x�p���@p������@ p� �� � ����A&� ����AX� ��� ���<� ��@  ��@ ��@� ����&��� AQ����!���<p��� ����p���  ��� p��� ��� &���AX�������<���@�����W����!���<&��� AP����!���<���@��@���@��@�������p��� ������A~�?m�p���?&���?AX����F���<W����)���<W����)���<W����1���<&��� AX����(���<������A?p��� ��� ���A��� ������A W����'���<p���AW����6���<W����5���<W����<���<C����p���  ������A&���AX����4���<������A W����3���<p���/�������?p��� ���A ��� p��� ��� ��� p��� ���  �����A? � ���A � �����A p�!��? �!�����A&�!��AO�!���T���<p�"��  �"�� �"�����Ap�"��  �"�� �"��  �#��  �%�����A?p�(��  �(�� �(�����Ap�(��  �(�� �(��  �)��  p�*��A~�?s1�p�*��?~�?q1�p�*��?~�?q�p�*��?p�+���� �AW�-���d���<W�-���d���<W�-���w���<&�-��AO�-���c���<p�.�� �.�� &�/��  Q�/���n���<p�0��  �0���1��  �2��?p�4��  �4�� �4�����Ap�4��  �4�� �4��  �5��  �6�����AW�6���b���<p�9�� W�:���{���<W�:���{���<W�:������<&�:��AO�:���z���<p�;��? �;�� ~�? t�p�<�� ?p�=�� ?&�=�� U�=������<p�=�� ?&�=�� X�=������<&�=��  R�=������<W�=������<W�=������<p�>��  �>��p�>��?p�?��  �?�� &�?�� X�?������<p�?��? �?�� &�?��AO�?������<W�?������<C�?���p�@�� ?�@�� &�A��  L�A������</�A��� �B��  �C��?p�E��  �E�� �E�����Ap�E��  �E�� �E��  �F��  �G�����AW�G���y���<p�K�� �K�� &�K��AO�K������<�L��>L��>~�? z��L�� ?�M�� ?�M��>�M����*M����M����M�M������<�N��>N��>�N�� ?&�O��?AX�O������<p�O��A?C�O���?W�O������<�P�� ?�P��>�P����*P����P����T�P������<&�Q��?AX�Q������<C�Q���? �R�����A?W�R������<p�T��? �T�����A �T��?p�W��?�W�����A �W����?Ap�W�� p�X��?�X�����Ap�X�� p�Y��? �Y�����A&�Y�����AX�Y������<�Y��  p�Z��?�Z�����A �Z�� p�[��  ?p�\��  ?�]�� ?�]����9]�����]����5�]��>���A5�]��>���AI]����k_cos.8 1201054067 0 0 664 1740 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<k_cos.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�3�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�5�����~�E</�~�E<386�~�E<include�~�E<u.h�7�6�����7�w�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�x�����~�E<libc.a�7�y����A7�B����7�B����7�����7�����~�>one�-���;>������?~�>C1�-���;>LUUUUU?~�>C2�-���;>wQlV~�>C3�-���;>>~�>C4�-���;>RO~~�>C5�-���;>ı!>~�>C6�-���;>8~�=__kernel_cos����=<���A~�@ x�p��� @ ���Ap��� &�����@>AP�������<��� @~�? .safe�(��� ?q�����A ?$�� ?���� ?$�� ?�p��� ? &��� AX�������<���>�������� @ �� @~�? z���� ?��� ? ��>��> �� ?��> �� ?��> �� ?��> �� ?��> �� ?~�? r���� ?&��� 33?AP����.���<��� ? �� ?��� @~�@ y� ����� @�����������? �� ?����>�����W����F���<&��� ��?AS����3���<���������?~�?qx����?W����7���<p���  �����Ap���?p���A?���������? �� ?��?~�?hz����?���>��?~�?a����?��� ? �� ?��� @ ����� @����?��?�����9���������5���>���A5���>���A5���>���A5���>���A5���>���A5���>���A5���>���AI����k_rem_pio2.8 1201054067 0 0 664 9007 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<k_rem_pio2.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�����7�����7�*����7�����~�>init_jk�-�+��;>���A-�+��;���>���A-�+��;���>���A-�+��; ���>���A~�>PIo2�-�.��;>���@!?-�/��;���>����-Dt>-�0��;���>���F<-�1��;���>���`Qx;-�2��; ���>���9-�3��;(���>���@ %z8-�4��;0���>���"6-�5��;8���>����i5~�>one�-�:��;>������?~�>two24�-�;��;>������pA~�>twon24�-�<��;>������p>~�=__kernel_rem_pio2��>��=��A~�@e0�p�>�����@ ~�@prec�p�D�����@ p�D�� >~�? jk�p�D�� ?p�E�� ?~�? jp�p�E�� ?~�@ nx�p�H�� ��� @/�H���p�I��  �I��A p�I��*A=�I�� �p�I�� �I�����A�I�����A �I�� &�I�� AP�I������<p�I��A a�J�� Q�J�����Ap�J��  �J�� p�J��  �J��Ap�M��  ~�? jv�p�M��  ?�M�� p�M��~�? jx�p�M�� ? �M�� ?~�?m�p�M��?p�N��A W�N���'���<W�N���%���<W�N���4���<C�N��� C�N��� &�N�� ?Q�N���$���<&�N�� AP�N���-���<~�>zero��N��>W�N���2���<p�N��  ~�@ipio2�p�N�����@ p�N�� Q~�?.safe�p�N��?�N��?~�?f��N�� ?W�N���#���<p�Q��A W�Q���9���<W�Q���8���<W�Q���R���<C�Q��� &�Q��  ?Q�Q���7���<p�R��A 9R����~�?fw��R��l?W�R���B���<W�R���A���<W�R���O���<C�R��� &�R�� Q�R���@���<p�R��  �R��  a�R�� Ua�R��? a�R��P�R��O~�@x�p�R��@ R�� PR��l?�R��l?W�R���?���<�R��l?~�?q��R�� ?W�R���6���<p�U�� ? W�V���T���<p�X��A p�X��  p�X�� ~�?jz�p�X�� ?�X�� ?~�?z��X��t?W�X���_���<W�X���]���<W�X���}���<C�X��� /�X��� &�X�� AS�X���\���<�Y��> Y��t?(Y���?q�Y����A?$Y��?��Y��?$Y��?�p�Y��?p�Y�� p�Y��?�Y��?�Y��l?�Z��> Z��l?Z��t?(Z���?q�Z����A?$Z��?��Z��?$Z��?�p�Z��?p�Z��  ~�?iq�p�Z�� ?p�[�� �[�� ?[��l?�[��t?W�[���[���<�_��t?�_��S~�?q0�p�_��?p�_�����S~�=scalbn��_���=�_��t?�`��t? `��������?�`��S~�=floor��`���=p�`��?p�`��? `�������� @`��t?�`��t?�a��t?(a���?q�a����A?$a��?��a��?$a��?�p�a��? p�a��  p�b�� ~�?n�p�b�� ?p�b�� ?�b��?b��t?�b��t?p�c��A&�d��AS�d������<p�e�����A �e�� p�e�� ?�e��  �e�� p�e�� ?p�f�����A �f�� �f�� �f�� ?p�g�����A �g�� p�g��  p�g�� ?�g�� p�g��W�g������<&�i��AX�i������<p�i��  p�i�� ?�i�����Ap�i��W�i������<�j��������?�j��t?�j����*j����j����R�j������<p�j�����A&�l��A~�?ih�p�l��|?S�l������<C�m��� p�m�� ?p�m��A p�n��A W�n������<W�n������<W�n������<C�n��� p�n�� &�n��  P�n������<p�o�� ? &�p�� AX�p������<&�q�� AO�q������<p�r�����A p�r�����A�r�� p�r��  p�r�� ?W�r������<p�t���A�t�� p�t��  p�t�� ?W�t������<&�v��AS�v������<W�|������<W�|������<p�y��  �y���A ?W�y������<p�{��  �{��?�A ?W�{������<p�{��&�{�����AO�{������<&�{�����AO�{������<W�{������<&�~�����AX�~������<���>��t?���t?&��� AO�������<���>���Sp������S����=p���?p���? ��t?���t?���t?���>�����*��������X����J��<p���A p���  /���� W������<W������<W���� ��</���� p��� &���  ?U������<p���  p��� ?��� W������<&��� AX����J��<~�?k�p������A?W������<W������<W������<C����?p��� ?���?&���?AX������<W������<p���  C���� W������<W������<W����G��<C���� p���  ���?&��� Q������<p��� ? a��� Qp������@ a���Qp���Op���?���?p��� ? a��� Qa���? a���P���Op���A9�������l?W����6��<W����5��<W����D��<C����&��� ?Q����4��<p���  ��� p��� ? a��� Qa���? a���P���Op���@ ��P��l?���l?W����3��<���l?��� ?W������<p���? ��� W����S���<9�������t?�����*��������X����\��</���� ������AW����U��<W����U��<W����[��<p��� ?&��� ?AX����T��</���� ������AW����S��<W������<���t?���Sp�������p������S����=p���? p���?���t?���t?���>�����*��������M������<���> ��t?(���?q�����A?$��?����?$��?�p���?p��� p���?���?���l?���> ��l?��t?(���?q�����A?$��?����?$��?�p���?p���  p��� ?C���� ������A���l?(���?q�����A?$��?����?$��?�p���?p��� ?p��� ?W������<���t?(���?q�����A?$��?����?$��?�p���?p��� ?���>���Sp������S����=~�@y�p������@p���? ���l?p��� W������<W������<W������</���� &��� AU������<p��� ?p���?���? ��l?��� ?���> ��l?���l?W������<p��� W������<W������<W������</���� &��� AU������<9�������l?p���A W������<W������<W������<C���� &���  ?Q������<p������ &��� S������<W������<p���  a��� Qa���? a���P���O �� >��l?���l?W������<���l?p������ ~�? fq����, ?W������<W����S��<W����]��<9�������l?p��� W������<W������<W������</���� &��� AU������<��� , ?��l?���l?W������<&���|?AX������<���l?W������<9������l?���VW������<9�������l?p��� W������<W������<W������</���� &��� AU������<��� , ?��l?���l?W������<&���|?AX������<���l?W������<9������l?���V���, ?��l?���l?p������A W������<W������<W���� ��<C���� &��� Q������<��� , ?��l?���l?W�������<&���|?AX���� ��<���l?W������<9������l?������VW������<p��� W������<W������<W����"��</���� &��� AS������<��� $ ?�� , ?���l?��� $ ?��l?�� , ?��� , ?���l?��� $ ?W������<p��� W����'��<W����&��<W����3��</���� &��� ���AS����%��<��� $ ?�� , ?���l?��� $ ?��l?�� , ?��� , ?���l?��� $ ?W����$��<9�������l?p��� W����:��<W����9��<W����@��</���� &��� ���AU����8��<��� , ?��l?���l?W����7��<&���|?AX����I��<���, ?���V���4 ?������V���l?������VW����R��<9������, ?���V9������4 ?������V9������l?������VW������<p������@&���AO������<&������AO������<&������AO������<&������AO������<W������<p���? ������A����������5���>���A5���>@���A5���>���A5���>���A5���>���A5���>���AI����k_sin.8 1201054068 0 0 664 1501 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<k_sin.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�,�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�.�����~�E</�~�E<386�~�E<include�~�E<u.h�7�/�����7�p�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�q�����~�E<libc.a�7�r����A7�;����7�;����7�����7�����~�>half�-���;>������?~�>S1�-���;>IUUUUUſ~�>S2�-���;>?~�>S3�-���;>a*~�>S4�-���;>}W>~�>S5�-���;>+Z~�>S6�-���;>|Z:=~�=__kernel_sin����=,���A~�@ x�p��� @ ���Ap��� &�����@>AP�������<��� @~�? .safe�(��� ?q�����A ?$�� ?���� ?$�� ?�p��� ? &��� AX�������<��� @�������� @ �� @~�? z���� ?��� ? �� @~�? v���� ?��� ? ��>��> �� ?��> �� ?��> �� ?��>~�? r���� ?~�@iy�&������@AX����*���<��� ? �� ?��> �� ?�� @�����W����6���<���>~�@y� �����@��� ? �� ?�� �� ?�����@��� ? ��>���� @�����9���������5���>���A5���>���A5���>���A5���>���A5���>���A5���>���A5���>���AI����k_tan.8 1201054068 0 0 664 3126 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<k_tan.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�2�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�4�����~�E</�~�E<386�~�E<include�~�E<u.h�7�5�����7�v�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�w�����~�E<libc.a�7�x����A7�A����7�A����7�����7�����~�>one�-���;>������?~�>pio4�-���;>-DT!?~�>pio4lo�-���;>\3&<~�>T�-���;>cUUUUU?-���;���>z?-���;���>A?-���;���>7d?-���; ���>n&?-���;(���>(V"mm?-���;0���>W?-���;8���>eDC?-���;@���>h&0?-���;H���>7~?-���;P���>2?-���;X���>sS`u-���;`���>ztp*>~�=__kernel_tan����=T���A~�@iy�p������@ ~�@x�p���@ p���  ���Ap��� &�����0>AP����&���<���@~�?.safe�(���?q�����A?$��?����?$��?�p���? &��� AX����&���<p��� ������@p���  C���� ��� &���AX�������<���@���S~�= fabs����� =!��>�����W����&���<&��� ���AX����"���<���@W����%���<9������>��@�����&��� (?AU����;���<&��� AP����0���<9������@���@9����~�@ y������ @������ @���>��@~�? z���� ?���>����� @~�? w���� ?��� ?�� ?���@9���������� @���@ ��@��� ?��� ? �� ?��� ?��� ? ��X���>��H���> �� ?��8���> �� ?��(���> �� ?�����> �� ?�����>~�? r���� ?��� ? ��`���>��P���> �� ?��@���> �� ?��0���> �� ?�� ���> �� ?�����> �� ?~�?v����?��� ? ��@~�?s����?��� ?��? ��?����� @ �� ?����� @��� ?���> ��?�� ?��� ?� ��@ �� ?� �� ?&� �� (?AU� ������<p� �� ?� ��?� ��?� �� ?  �� ?� �� ? ��? �� �� ? ��@  ���������@ ��?p� �� � �����A � �����Ap� �����A � �� p� �� ?� ��?  ��� ����&��� ���AX�������<��� ?�����W�������<��� ?��� ?p���A ?��� ?��@�� ?���?����������� ?���~�?a����?~�?t����?p���A?���? �� ?��������?���?���? ��?��? ��?��?�����9���������5���>h���A5���>���A5���>���A5���>���AI����s_asinh.8 1201054069 0 0 664 1656 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_asinh.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�_�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�`�����~�E<libc.a�7�a����A7�*����7�*����7�����7�����~�>one�-���;>������?~�>ln2�-���;>9B.?~�>Huge�-���;>u�<7~~�=asinh����=8���A~�@x�p���@~�?hx�p���? ���Ap��� &�����AU���� ���<���@��@�����&�����0>AP�������<���>��@���>�����*��������T�������<���@�����&��� ��AAS����!���<���@���S~�=fabs�����=~�?.safe����?���?���S~�= __ieee754_log����� =��>~�? w���� ?W����J���<&��� ���@AS����7���<���@���S����=~�? t���� ?���@ ��@��>���S~�= sqrt����� =�� ?!��>����������@ �� ?�����?���?���S���� =��� ?W����J���<���@ ��@��� ?���>�� ?���S���� =��>!�� ?���?���@���S����=��?���?���?���S~�= log1p����� =��� ?&���?AS����O���<��� ?�����W����R���<9������ ?�����9���������5���>���A5���>���A5���>���AI����s_atan.8 1201054069 0 0 664 2894 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_atan.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�%�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�'�����~�E</�~�E<386�~�E<include�~�E<u.h�7�(�����7�i�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�j�����~�E<libc.a�7�k����A7�4����7�4����7�����7�����~�>atanhi�-���;>Oag?-���;���>-DT!?-���;���> s?-���;���>-DT!?~�>atanlo�-���;>e/"+z<-���;���>\3&<-���;���>zp<-���;���>\3&<~�>aT�-���;> UUUUU?-���;���>똙ɿ-���;���>�$I?-���;���>q#q-���; ���>n LE?-���;(���>mt򰳿-���;0���>Q=Рf ?-���;8���>R-ޭ-���;@���> v$K{?-���;H���>/lj,D-���;P���>":?~�>one�-���;>������?~�>Huge�-���;>u�<7~~�=atan����=<���A~�@x�p���@ p��� ~�?hx�p��� ? ���Ap��� &�����DAU�������<&��� ��AQ�������<&��� ��AX�������<&������@AO�������<W�������<W�������<���@��@�����&��� AS�������<������>�����>�����W�������<9���������>�����>�����&��� ��?A~�? ix�p���  ?P����-���<&��� �� >AP����+���<���>��@���>�����*��������T����+���<���@�����p���A W����W���<���@���S~�= fabs����� =p���? p��� ? ���@&���� ��?AP�����H���<&��� ��?AP����@���<p���A ����������@ ��@��>���@���������@�����@W����G���<p������A ���@��>���@��>�����@W����W���<&��� �@AP����S���<p������A ���������? ��@��>���@�������������@W����W���<p� �����A � �������� ��@� ��@���@ ��@~�? z���� ?��� ? �� ?~�? w���� ?��� ? ��P���>��@���> �� ?��0���> �� ?�� ���> �� ?�����> �� ?��> �� ?~�? s1���� ?��� ? ��H���>��8���> �� ?��(���> �� ?�����> �� ?�����> �� ?~�?s2����?&��� AP����}���<��� ?��? ��@��@�����W�������<��� ?��? ��@�� >��@�� >��� ?&��� AP�������<9������ ?W�������<��� ?�����9���������5���> ���A5���> ���A5���>���A5���>X���A5���>���AI����s_cbrt.8 1201054070 0 0 664 1871 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_cbrt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�U�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�V�����~�E<libc.a�7�W����A7� ����7� ����7�����7�����~�>B1�-���;>x*A~�>B2�-���;>x)A~�>C�-���;>__?~�>D�-���;>42%ޑ~�>E�-���;>?~�>F�-���;>n۶m۶?~�>G�-���;>m۶m?~�=cbrt����=,���A9����~�? t���� ?~�@ x�p��� @ p���  ������A ���  &��� ��AU���� ���<��� @�� @�����p��� ������ @&���AX�������<��� @�����p���  @&��� ���AP����#���<p�����PCA ?��� @ �� ?��� ?p���VUUUA=��� ?�p��� ?������A���A ��� p���  ���>p��� ?W����,���<p���VUUUA=��� �p��� ������A���A ��� p���  ���>p��� ?��� ? �� ?�� @~�? r���� ?��� ? �� ?��>~�? s���� ?���>�� ?��� ?��>��!��>��> �� ?��� ?p���A ?C���� ?��� ? �� ?��� ?��� @�� ?��� ?��� ?�� ?~�? w���� ?��� ?�� ?��� ?�� ?����� ?��� ? �� ?�� ?��� ?���  ?��� ?�����9���������5���>���A5���>���A5���>���A5���>���A5���>���A5���>���A5���>���AI����s_ceil.8 1201054070 0 0 664 1769 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_ceil.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�]�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�^�����~�E<libc.a�7�_����A7�(����7�(����7�����7�����~�>Huge�-���;>u�<7~~�=ceil����=���A~�@x�p���@ p������@ p��� ������A �����A ���Ap��� &������AP����<���<&��� AP�������<���>��@����������������*��������T�������<&��� AP�������<p������A p���A W�������<p��� ��� &���AO�������<p�����?A p���A W����;���<p���  p����A��� p���p���  ������ &���AX����*���<���@��������>��@����������������*��������T����;���<&��� AS����7���<p���  p������A���  ��� p������� ��� p���A W����l���<&���3���AS����G���<&��� ���AX����D���<���@��@�����W����F���<���@�����W����l���<p��� ���A p���A��� p���p���  ���&���AX����R���<���@��������>��@����������������*��������T����l���<&��� AS����i���<&��� ���AX����_���<C���� W����i���<p���4���A ���  p������A��� p���  ��� &���  L����h���<C���� p���  p������� ��� p��� @p��� ���@���@�����9���������5���>���AI����s_copysign.8 1201054071 0 0 664 580 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_copysign.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�Z�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�[�����~�E<libc.a�7�\����A7�%����7�%����7�����7�����~�=copysign����=A~�@x�p���@ ���A~�@y�p������@ ������A ��� p���@���@�����9���������I����s_cos.8 1201054071 0 0 664 1337 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_cos.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�/�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�1�����~�E</�~�E<386�~�E<include�~�E<u.h�7�2�����7�s�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�t�����~�E<libc.a�7�u����A7�>����7�>����7�����7�����~�=cos����=<���A9����~�?z����?~�@x�p���@ ���A &��� !?AQ�������<���@���S���?������S~�=__kernel_cos�����=�����W����A���<&��� ��AU�������<���@��@�����W����A���<���@���S~�?y�a���? p��� ���S~�=__ieee754_rem_pio2�����=W����9���<W����A���<���?���S���?������S����=��������?���S���?������Sp������Ap������S~�=__kernel_sin�����=������������������?���S���?������S����=������������������?���S���?������Sp������Ap������S����=����� ������A&���AO�������<&������AO����!���<&������AO����*���<W����1���<9���������I����s_erf.8 1201054072 0 0 664 10774 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_erf.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�o�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�q�����~�E</�~�E<386�~�E<include�~�E<u.h�7�r�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�~����7�~����7�����7�����~�>tiny�-���;>Yn~�>half�-���;>������?~�>one�-���;>������?~�>two�-���;>�������@~�>erx�-���;>���` ?~�>efx�-� ��;>in?~�>efx8�-�!��;>in?~�>pp0�-�"��;>hn?~�> pp1�-�#��; >i}Կ~�> pp2�-�$��; >OQ*~�> pp3�-�%��; >hf#w~�> pp4�-�&��; >�~�> qq1�-�'��; > yw?~�>qq2�-�(��;>6UL?~�>qq3�-�)��;>k"t?~�>qq4�-�*��;>"]!?~�>qq5�-�+��;> aBCо~�>pa0�-�/��;>8uYc~�>pa1�-�0��;>M�?~�>pa2�-�1��;>ø@׿~�>pa3�-�2��;> Q_?~�>pa4�-�3��;>(>=c~�>pa5�-�4��;>땗Y6*?~�>pa6�-�5��;>? 8a~�>qa1�-�6��;>#f>?~�>qa2�-�7��;>3oJ?~�>qa3�-�8��;>\c?~�>qa4�-�9��;>5c`&?~�>qa5�-�:��;>Qk?~�>qa6�-�;��;>5WT?~�>ra0�-�?��;>5d `4~�> ra1�-�@��; >`s4~�>!ra2�-�A��;!>&A%~�>"ra3�-�B��;"> 0O~�>#ra4�-�C��;#>f"(Ld~�>$ra5�-�D��;$>\g~�>%ra6�-�E��;%>WeRT~�>&ra7�-�F��;&>\š#~�>'sa1�-�G��;'>vp3@~�>(sa2�-�H��;(>!jR 5a@~�>)sa3�-�I��;)>q ){@~�>*sa4�-�J��;*>h(!+@~�>+sa5�-�K��;+>pW!z@~�>,sa6�-�L��;,>,H([@~�>-sa7�-�M��;->JHG@~�>.sa8�-�N��;.>bt﮿~�>/rb0�-�R��;/>Jo94~�>0rb1�-�S��;0>ޅp~�>1rb2�-�T��;1>Z_U 1~�>rb3�-�U��;>C]d~�>rb4�-�V��;>(u~�>rb5�-�W��;>Y.ja~�>rb6�-�X��;>?8ܛN8~~�>sb1�-�Y��;>Q&V>@~�>sb2�-�Z��;> "\t@~�>sb3�-�[��;>Q@~�>sb4�-�\��;>j$h@~�> sb5�-�]��; >;@~�> sb6�-�^��; >ct}@~�> sb7�-�_��; >b-qBp6~�= erf��a�� =d���A~�@ x�p�e�� @ p�f��  ~�?hx�p�f�� ? �f��A &�g�� ��AU�g������<p�h�� �h�����A �h��p�h�� ~�>one��i��>i�� @p�i�����A�i�� ~�?.safe�p�i��?�i��?i���i����&�l�� ��?AP�l���D���<&�m�� ��0>AP�m���$���<&�n�� ���AP�n��� ���<�o�������� @ o�� @~�>efx8��o��> o�� @o�� o��������?�o����~�>efx��p��> p�� @p�� @�p�����r�� @ r�� @~�?z��r��?�s��?~�>pp4� s��>~�>pp3�s��> s��?~�>pp2�s��> s��?~�>pp1�s��> s��?~�>pp0�s��>~�?r��s��?�t��?~�>qq5� t��>~�>qq4�t��> t��?~�>qq3�t��> t��?~�>qq2�t��> t��?~�>qq1�t��> t��?t��>~�?s��t��?�u��?u��?~�? y��u�� ?�v�� @ v�� ?v�� @�v����&�x�� ��?AP�x���t���<�y�� @�y��S~�=!fabs��y���!=y��>�y��?�z��?~�>"pa6� z��">~�>#pa5�z��#> z��?~�>$pa4�z��$> z��?~�>%pa3�z��%> z��?~�>&pa2�z��&> z��?~�>'pa1�z��'> z��?~�>(pa0�z��(>~�?)P��z��)?�{��?~�>*qa6� {��*>~�>+qa5�{��+> {��?~�>,qa4�{��,> {��?~�>-qa3�{��-> {��?~�>.qa2�{��.> {��?~�>/qa1�{��/> {��?{��>~�?0Q��{��0?&�|��?AU�|���n���<�|��)?|��0?~�>1erx�|��1>�|����W�|���t���<�|��)?|��0?9|����|��1>|���|����&�~�� ��@A~�?ix�p�~�� ?U�~������<&��� AU����}���<���>~�>tiny���>�����W�������<���>��>�������� @���S����!=��� @��� @ �� @!��>���?&���?n@AP�������<���?~�>ra7� ��>~�>ra6���> ��?~�>ra5���> ��?~�>ra4���> ��?~�>ra3���> ��?~�>ra2���> ��?~�> ra1��� > ��?~�> ra0��� >~�? R���� ?���?~�> sa8� �� >~�> sa7��� > ��?~�>sa6���> ��?~�>sa5���> ��?~�>sa4���> ��?~�>sa3���> ��?~�>sa2���> ��?~�>sa1���> ��?~�>one���>~�?S����?W�������<���?~�>rb6� ��>~�>rb5���> ��?~�>rb4���> ��?~�>rb3���> ��?~�>rb2���> ��?~�>rb1���> ��?~�>rb0���>��� ?���?~�>sb7� ��>~�>sb6���> ��?~�>sb5���>~�? s� �� ?~�>!sb4���!> �� ?~�>"sb3���"> �� ?~�>#sb2���#> �� ?~�>$sb1���$> �� ?��>���?~�@%x����%@~�?&z����&?p���A&?���&?��%@���&?��%@ ����� ?��?�����S~�='__ieee754_exp�����'=~�?(.safe����(?9������&? ��&?�����������S����'= ��(?~�?)r����)?~�?*hx�&���*?AU�������<���)?��%@��>�����W�������<���)?��%@��>�����9���������~�=+erfc����+=`���Ap���%@ p���  p��� *? ���A &��� ��AU������<���>��%@p��� ������A ���p���(?���(?&���AP�������<��������A�������&��� ��?AP����6��<&��� ��p<AP������<���>��%@��������%@ ��%@���&?���&?~�>,pp4� ��,>~�>-pp3���-> ��&?~�>.pp2���.> ��&?~�>/pp1���/> ��&?~�>0pp0���0>���)?���&?~�>1qq5� ��1>~�>qq4���> ��&?~�>qq3���> ��&?~�>qq2���> ��&?~�>qq1���> ��&?��>��� ?���)?�� ?~�?y����?&��� ��?AP����,��<���%@ ��?��%@��>�����W����6��<���%@ ��?���)?���%@~�>half���>��)?���)?���>��)?�����&��� ��?AP����j��<���%@���S~�=fabs�����=��>��� ?��� ?~�>pa6� ��>~�> pa5��� > �� ?~�> pa4��� > �� ?~�> pa3��� > �� ?~�> pa2��� > �� ?~�> pa1��� > �� ?~�>pa0���>~�?P����?��� ?~�>qa6� ��>~�>qa5���> �� ?~�>qa4���> �� ?~�>qa3���> �� ?~�>qa2���> �� ?~�>qa1���> �� ?~�>one���>~�?Q����?&���*?AU����c��<���>~�>erx���>���&?���?��?��&?�����W����j��<���?��?��>���&?���>��&?�����&��� ��<@A~�?ix�p��� ?P������<���%@���S����=p���? ���%@���%@ ��%@!��>��� ?&��� m@AP������<��� ?~�>ra7� ��>~�>ra6���> �� ?~�>ra5���> �� ?~�>ra4���> �� ?~�>ra3���> �� ?~�>ra2���> �� ?~�> ra1��� >~�?!s� ��!?~�>"ra0���">~�?#R����#?���!?~�>$sa8� ��$>~�>%sa7���%> ��!?~�>&sa6���&> ��!?~�>'sa5���'> ��!?~�>(sa4���(> ��!?~�>)sa3���)> ��!?~�>*sa2���*> ��!?~�>+sa1���+> ��!?��>~�?,S����,?W������<~�?-hx�&���-?AP������<&��� ��@AP������<W������<~�>.two����.>~�>/tiny���/>��������!?~�>0rb6� ��0>~�>1rb5���1> ��!?~�>rb4���> ��!?~�>rb3���> ��!?~�>rb2���> ��!?~�>rb1���> ��!?~�>rb0���>���#?���!?~�>sb7� ��>~�>sb6���> ��!?~�>sb5���> ��!?~�> sb4��� > ��!?~�> sb3��� > ��!?~�> sb2��� > ��!?~�> sb1��� > ��!?��>���,?~�@ x���� @~�?z����?p���A?���?�� @���?�� @ �����#?��,?�����S~�=__ieee754_exp�����=~�?.safe����?9������? ��?�����������S����= ��?~�?r����?&���-?AS������<���?�� @�����W������<���?�� @��.>�����W������<&��� AS������<���/> ��/>�����W������<���.>��/>�����9���������~�>half�5���>���A~�>efx�5���>���A~�>pa0�5���>���A~�>pa1�5���>���A~�>pa2�5���>���A~�>pa3�5���>���A~�>pa4�5���>���A~�>pa5�5���>���A~�>pa6�5���>���A~�>qa1�5���>���A~�>qa2�5���>���A~�>qa3�5���>���A~�>qa4�5���>���A~�>qa5�5���>���A~�> qa6�5��� >���A5���">���A~�>!ra1�5���!>���A~�>"ra2�5���">���A5���>���A~�>#ra3�5���#>���A5���>���A~�>$ra4�5���$>���A5���>���A~�>%ra5�5���%>���A5���>���A~�>&ra6�5���&>���A~�>'erx�5���'>���A5���>���A~�>(ra7�5���(>���A5���1>���A5���0>���A5���+>���A5���*>���A5���)>���A5��� >���A~�>)sa4�5���)>���A5��� >���A~�>*sa5�5���*>���A5��� >���A~�>+sa6�5���+>���A5��� >���A~�>,sa7�5���,>���A5���>���A~�>-sa8�5���->���A5���>���A5���>���A~�>.pp0�5���.>���A~�>/pp1�5���/>���A~�>0pp2�5���0>���A~�>1pp3�5���1>���A~�>pp4�5���>���A~�>qq1�5���>���A~�>qq2�5���>���A~�>qq3�5���>���A~�>qq4�5���>���A~�>qq5�5���>���A~�>one�5���>���A~�>tiny�5���>���A~�> two�5��� >���A~�> efx8�5��� >���AI����s_expm1.8 1201054072 0 0 664 4177 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_expm1.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�o�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�q�����~�E</�~�E<386�~�E<include�~�E<u.h�7�r�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�~����7�~����7�����7�w����~�>one�-���;>������?~�>Huge�-���;>u�<7~~�>tiny�-���;>Yn~�>o_threshold�-���;>9B.@~�>ln2_hi�-���;>��B.?~�>ln2_lo�-���;>v<y59=~�>invln2�-���;>+eG?~�>Q1�-���;>~�> Q2�-� ��; >UZ?~�> Q3�-�!��; >۪~�> Q4�-�"��; >9R>~�> Q5�-�#��; >- n~�= expm1��%�� =d���A~�@x�p�+��@ p�,��  �,�����Ap�,�� &�-��AX�-��� ���<�-��@~�?y��-��?W�-��� ���<9-����-��@�-��? �.��A &�1�� zhC@AM�1���8���<&�2�� B.@AM�2���,���<&�3�� ��AM�3���#���<p�4��  �4���A�4�����@&�4��AO�4������<�5��@5��@�5����W�5���#���<&�6�� AX�6���!���<�6��@W�6���"���<�6���������6�����8��@�8��>�8����*8����8����T�8���,���<�8��> 8��>�8����&�:�� AO�:���8���<�;��@;��>�;�����������;����*;����;����L�;���8���<�<��><��>�<����&�A�� B.?AT�A���o���<&�B�� ?AL�B���M���<&�C�� AX�C���E���<�D��@D��>~�?hi��D��?�D��>~�?lo��D��?p�D�����A W�D���L���<�F��@F��>�F��?9F����F��>�F��?p�F��A W�F���g���<�H��> H��@&�H�� AX�H���S���<�H��������?W�H���T���<�H��������H��~�?.safe�(H���?q�H����A?$H��?��H��?$H��?�p�H��? p�H�� p�I��  p�I�� ?�I��?~�?t��I��?�J��? J��>J��@�J��?�K��? K��>�K��?�M��?M��?�M��@�N��?N��@N��?~�?c��N��?W�N���{���<&�P�� ��<AL�P���z���<�Q��>Q��@�Q��?�R��>R��@R��?R��@�R����W�R���{���<p�T��A �W��������? W��@~�?hfx��W��?�X��@ X��?~�?hxs��X��?�Y��? Y�� >Y�� > Y��?Y�� > Y��?Y�� > Y��?Y��> Y��?Y��>~�?r1��Y��?�Z��? Z��?Z��������@�Z��?�[��@ [��?[��������@�[��?[��?[�� [��?~�?e��[��?&�\�� AX�\������<�\��@ \��?\��?\��@�\����W�\������<�^��?^��? ^��@^��?�^��?�_��?_��?�_��?&�`�� AX�`������<�`��@`��? `��������?`���������`����&�a�� ���AX�a������<�b��������п�b��@�b����*b����b����T�b������<�b��@b��������?b��? b����������b����W�b������<�c��@c��? c���������@c��>�c����&�d�� AS�d������<&�d�� 8���AQ�d������<W�d������<�e��?e��@e��>�e��?p�f�� �f�����A �f��?�g��?g��>�g�����i��>�i��?&�j�� ���AP�j������<p�k��  p�k���� �A�k�� p�k����?A �k�� p�k�� ?�l��?l��@l��?�l��?p�m�� �m�����A �m��?W�m������<p�o����A�o�� �o�����Ap�o��?�p��?p��?p��@�p��?�q��>q��?�q��?p�r�� �r�����A �r��?�u��?�u����9u�����u����5�u��>���A5�u��>���A5�u�� >���A5�u�� >���A5�u�� >���A5�u�� >���A5�u��>���A5�u��>���A5�u��>���A5�u��>���A5�u��>���A5�u��>���AIu����s_fabs.8 1201054073 0 0 664 506 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_fabs.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�X�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�Y�����~�E<libc.a�7�Z����A7�#����7�#����7�����7�����~�=fabs����=A~�@x� ���A@���@�����9���������I����s_finite.8 1201054073 0 0 664 533 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_finite.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�Y�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�Z�����~�E<libc.a�7�[����A7�$����7�$����7�����7�����~�=finite����=���A~�@x�p���@ ���A �����A������A����������I����s_floor.8 1201054074 0 0 664 1781 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_floor.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�]�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�^�����~�E<libc.a�7�_����A7�(����7�(����7�����7�����~�>Huge�-���;>u�<7~~�=floor����=���A~�@x�p���@ p������@ p��� ������A �����A ���Ap��� &������AP����=���<&��� AP���� ���<���>��@����������������*��������T�������<&��� AU�������<p���A p���  W�������<p���  ���A��� &���AO�������<p�����A p���A W����<���<p���  p����A��� p���p���  ������ &���AX����+���<���@��������>��@����������������*��������T����<���<&��� AP����8���<p���  p������A���  ��� p������� ��� p���A W����m���<&���3���AS����H���<&��� ���AX����E���<���@��@�����W����G���<���@�����W����m���<p��� ���A p���A��� p���p���  ���&���AX����S���<���@��������>��@����������������*��������T����m���<&��� AP����j���<&��� ���AX����`���<C���� W����j���<p���4���A ���  p������A��� p���  ��� &���  L����i���<C���� p���  p������� ��� p��� @p��� ���@���@�����9���������5���>���AI����s_ilogb.8 1201054074 0 0 664 1028 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_ilogb.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�Z�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�[�����~�E<libc.a�7�\����A7�%����7�%����7�����7�����~�=ilogb����=���A~�@x�p���@ ���A &��� ���AP����&���<p������@ p��� ��� &���AX���� ���<p�����A�����W����#���<&��� AX�������<p���A W�������<W�������<W�������<������A &��� AS�������</���� W�������<W����#���<p���A ��� ���A W�������<W�������<W����#���<������A &��� AS�������</���� W�������<p��� �����W����/���<&��� ��AP����-���<p��� ������A ���A�����W����/���<p���A����������I����s_isnan.8 1201054075 0 0 664 619 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_isnan.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�Y�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�Z�����~�E<libc.a�7�[����A7�$����7�$����7�����7�����~�=isnan����= ���A~�@x�p���@ ���A p������@ p��� ������� p��� ������A��� p�����A��� ������A����������I����s_log1p.8 1201054075 0 0 664 3666 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_log1p.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�Q�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�S�����~�E</�~�E<386�~�E<include�~�E<u.h�7�T�����7������~�E</�~�E<sys�~�E<include�~�E<libc.h�7������~�E<libc.a�7�����A7�`����7�`����7�����7�D����~�>ln2_hi�-���;>��B.?~�>ln2_lo�-���;>v<y59=~�>two54�-���;>������PC~�>Lp1�-���;>UUUUU?~�>Lp2�-���;>?~�>Lp3�-���;>Y"$I?~�>Lp4�-���;>xq?~�>Lp5�-����;>˖dF?~�> Lp6�-���; >x ?~�> Lp7�-���; >DR>?~�= log1p���� =T���A~�? hu�p��� ? ~�@ x�p� �� @ p� ��  � ��Ap� �� p������A &��� z?AP����9���<&��� ��?AU�������<������������ @�����*��������X�������<9������>~�>zero���>�����W�������<��� @�� @��� @�� @�������&��� �� >AP����0���<���>�� @���>�����*��������T����'���<&��� ��<AU����(���<W����+���<��� @�����W����0���<��� @ �� @ ��������?�� @�����&��� AQ����5���<&��� þҿAS����5���<W����9���<p���A ��� @~�?f����?p������A &��� ��AU����>���<��� @�� @�����&��� AO����s���<&� �� ��@CAP� ���X���<�!�� @!��������?~�?u��!��?p�"��? p�#�� �#�����A �#��Ap�#�� &�$��AS�$���P���<�$��?$�� @$��������?W�$���S���<�$��?$��������$�� @~�?c��$��?�%��?!%��?�%��?W�%���a���<�'�� @�'��?p�(��? p�)�� �)�����A �)��Ap�)�� 9*�����*��? �,���A &�-�� �AP�-���h���<p�.�� �.����?Ap�.��?W�.���p���<C�0��� p�1�� �1����?Ap�1��?p�2�����A�2�� �2�����Ap�2�� �4��?4���������4��?�6��������? 6��? 6��?~�?hfsq��6��?&�7�� AX�7������<�8��?�8��>�8����*8����8����X�8������<&�8�� AX�8������<�8��>�8����W�8������<~�?.safe�p�9�� ?�9��? 9��>9��?�9��?p�9�� ?�9��? 9��>9��?�9�����:��UUUUUU? :��?:��������? :��?~�?R��:��?&�;�� AX�;������<�;��?;��?�;����W�;������<p�<�� ?�<��? <��>p�<�� ?�<��? <��><��?<��?<��?<���<�����>��?>���������@!>��?~�?s��>��?�?��? ?��?~�?z��?��?�@��? @�� >@�� > @��?@��> @��?@��> @��?@��> @��?@��> @��?@��> @��?�@��?&�A�� AX�A������<�A��?A��? A��?A��?A��?�A����W�A������<�B��?B��? B��?p�B�� ?�B��? B��>B��?B��B��?B��?p�B�� ?�B��? B��>B���B����9B�����B����5���>���A5���>���A5���>���A5���>���A5���>���A5��� >���A5��� >���A5���>���A5���>���A5���>���A5���>���AI����s_nextafter.8 1201054076 0 0 664 1952 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_nextafter.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�[�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�\�����~�E<libc.a�7�]����A7�&����7�&����7�����7�����~�=nextafter����=���A~�@x�p���@ p������@ ~�@y�p������@ p��� ���@p���  ���A p���  ���Ap���&��� ��AU�������<p���  �����A��� &���AO�������<W�������<&�����AU�������<p��� �����A���&���AO�������<W�������<W�������<���@�����@��������@������@�����*��������X����&���<���@�����p��� ��� &���AX����<���<p���  ������Ap���@p������A���@���@ ��@������@������@���@�����*��������X����:���<������@�����W����<���<���@�����&��� AU����P���<&���  Q����F���<&���  X����E���<&��� T����E���<W����F���<W����K���<&��� AX����I���</���� /���� W����O���<C���� &��� AX����O���<C���� W����d���<&��� AP����T���<&���  S����U���<W����[���<&���  X����Z���<&��� T����Z���<W����[���<W����`���<&��� AX����^���</���� /���� W����d���<C���� &��� AX����d���<C���� p���  �����Ap��� &�����AU����l���<���@��@�����&������AP����{���<���@ ��@������@������@���@�����*��������O����{���<p��� ���@p���  ���@������@�����p��� @p��� ���@���@�����9���������I����s_rint.8 1201054076 0 0 664 2094 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_rint.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�$�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�&�����~�E</�~�E<386�~�E<include�~�E<u.h�7�'�����7�h�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�i�����~�E<libc.a�7�j����A7�3����7�3����7�����7�����~�=dummy�����=A������~�>TWO52�-���;>������0C-���;���>������0~�=rint����=(���A~�@x�p���@ p��� ������A ������Ap���p������@ p��� ������A �����A ���Ap��� &������AP����U���<&��� AP����8���<p���  ���A��� &���AX�������<���@�����p���  ����A��� �����A p��� ����p���  ��� p��� ��� ���A ������A��� p��� @~�?sx�p���?���>��@~�?w����?����=p���?���?��>~�?t����?p���? ������Ap���  ���A ��� p��� ?���?�����W����T���<p���  p����A��� p���p���  ������ &���AX����C���<���@�����������Ap���  ������ &���AO����T���<&��� ���AX����M���<p������@A W����T���<p���  p������A��� p��� ���� ���  ��� W����x���<&���3���AS����`���<&��� ���AX����]���<���@��@�����W����_���<���@�����W����x���<p��� ���A p���A��� p���p���  ���&���AX����k���<���@�����������Ap���  ���&���AO����x���<p���  ���A p������@A��� p��� ���� ���  ��� p��� @p��� ���@p���?���>��@���?����=���?p���?��>�����9���������5���>���AI����s_scalbn.8 1201054077 0 0 664 1649 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_scalbn.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�[�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�\�����~�E<libc.a�7�]����A7�&����7�&����7�����7�����~�>two54�-���;>������PC~�>twom54�-���;>������<~�>Huge�-���;>u�<7~~�>tiny�-���;>Yn~�=scalbn����=$���A~�@n�p������@ ~�@x�p���@p������@ p��� �����A������Ap��� &���AX���� ���<p���  ���Ap���  ��� &��� AX�������<���@��������> ��@���@p���@p��� �����A������A ���Ap��� &��� <AP���� ���<���> ��@�����&��� ��AX����%���<���@��@����� ���  &��� ��AS����/���<���>���S���@������S~�=copysign�����= ��>�����&��� AS����9���<p��� ������Ap���  ���A ��� p��� @���@�����&��� AQ����L���<&��� P��AS����E���<���>���S���@������S����= ��>�����W����L���<���>���S���@������S����= ��>����� ���6���A p��� ������Ap���  ���A ��� p��� @���@ ��>�����9���������5���>���A5���>���A5���>���A5���>���AI����s_sin.8 1201054077 0 0 664 1351 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_sin.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�/�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�1�����~�E</�~�E<386�~�E<include�~�E<u.h�7�2�����7�s�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�t�����~�E<libc.a�7�u����A7�>����7�>����7�����7�����~�=sin����=<���A9����~�?z����?~�@x�p���@ ���A &��� !?AQ�������<���@���S���?������Sp���A���S~�=__kernel_sin�����=�����W����B���<&��� ��AU�������<���@��@�����W����B���<���@���S~�?y�a���? p��� ���S~�=__ieee754_rem_pio2�����=W����:���<W����B���<���?���S���?������Sp������Ap������S����=��������?���S���?������S~�=__kernel_cos�����=��������?���S���?������Sp������Ap������S����=������������������?���S���?������S����=��������������� ������A&���AO�������<&������AO����$���<&������AO����*���<W����3���<9���������I����s_tan.8 1201054078 0 0 664 974 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_tan.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�.�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�0�����~�E</�~�E<386�~�E<include�~�E<u.h�7�1�����7�r�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�s�����~�E<libc.a�7�t����A7�=����7�=����7�����7�����~�=tan����=<���A9����~�?z����?~�@x�p���@ ���A &��� !?AQ�������<���@���S���?������Sp������Ap������S~�=__kernel_tan�����=�����W����&���<&��� ��AU�������<���@��@�����W����&���<���@���S~�?y�a���? p��� ���S~�=__ieee754_rem_pio2�����=���?���S���?������S ������A ���p������A ��� p��� ���S����=�����9���������I����s_tanh.8 1201054078 0 0 664 1515 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<s_tanh.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�~�E<fdlibm.h�7�(�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<lib9.h�7�*�����~�E</�~�E<386�~�E<include�~�E<u.h�7�+�����7�l�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�m�����~�E<libc.a�7�n����A7�7����7�7����7�����7�����~�>one�-���;>������?~�>two�-���;>�������@~�>tiny�-���;>Yn~�=tanh����=0���A~�@x�p���@ p���  ~�?jx�p��� ? ���A &��� ��AU�������<&��� AU�������<���>��@��>�����W�������<���>��@��>�����&��� ��6@AP����?���<&��� ��<AP�������<���>��@ ��@�����&��� ��?AU����,���<���@���S~�=fabs�����= ��>~�?.safe����?���?���S~�= expm1����� =p���? ~�? t���� ?��� ?��>!��>��>~�? z���� ?W����>���<���@���S����=9������> �����?���?���S���� =p���? ��� ?9������ ?��� ?��>����� ?W����B���<���>��>��� ?&��� AU����F���<��� ?W����H���<9������ ?�����9���������5���>���A5���>���A5���>���AI����B�� ?�B��? B��>B��?B��B��?B��?p�B�� ?�B��? B��>B���B����9B�����B����5���>���A5���>���A5���>���A5���>���A5���>���A5��� >���A5��� >���A5���>���A5���>���A5���>���A5���>���AI����s_nextafter.8 1201054076 0 0 664 1952 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�old_contrib//root/sys/src/cmd/limbo/libmath/mkfile�������������������������������������������������� 664 � 0 � 0 � 1663 10745511541 21351�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������</$objtype/mkfile LIB=libmath.a # if we use FPcontrol-Plan9.$O, ar will complain and we get no libmath.a OFILES=\ blas.$O\ dtoa.$O\ fdim.$O\ FPcontrol-Inferno.$O\ gemm.$O\ g_fmt.$O\ gfltconv.$O\ pow10.$O\ e_acos.$O\ e_acosh.$O\ e_asin.$O\ e_atan2.$O\ e_atanh.$O\ e_cosh.$O\ e_exp.$O\ e_fmod.$O\ e_hypot.$O\ e_j0.$O\ e_j1.$O\ e_jn.$O\ e_lgamma_r.$O\ e_log.$O\ e_log10.$O\ e_pow.$O\ e_rem_pio2.$O\ e_remainder.$O\ e_sinh.$O\ e_sqrt.$O\ k_cos.$O\ k_rem_pio2.$O\ k_sin.$O\ k_tan.$O\ s_asinh.$O\ s_atan.$O\ s_cbrt.$O\ s_ceil.$O\ s_copysign.$O\ s_cos.$O\ s_erf.$O\ s_expm1.$O\ s_fabs.$O\ s_finite.$O\ s_floor.$O\ s_ilogb.$O\ s_isnan.$O\ s_log1p.$O\ s_nextafter.$O\ s_rint.$O\ s_scalbn.$O\ s_sin.$O\ s_tan.$O\ s_tanh.$O\ HFILES=\ ../include/mathi.h\ fdlibm/fdlibm.h\ lib9.h\ </sys/src/cmd/mksyslib %.$O: fdlibm/%.c $CC $CFLAGS -o $target -Ifdlibm fdlibm/$stem.c CFLAGS=-I../include $CFLAGS ���^���</���� /���� W����d���<C���� &��� AX����d���<C�old_contrib//root/sys/src/cmd/limbo/libmath/pow10.c������������������������������������������������� 664 � 0 � 0 � 123 10206413402 21224�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "lib9.h" #include "mathi.h" double ipow10(int n) { return pow(10.,n); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/���������������������������������������������������������� 775 � 0 � 0 � 0 11411740007 17624��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/NOTICE���������������������������������������������������� 664 � 0 � 0 � 355 10560641716 20526�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright © 2000-2007 Lucent Technologies Inc. and others. All rights reserved. Revisions for use with Inferno © 2006 Vita Nuova Holdings Limited. This software is provided under the terms of the Lucent Public License, Version 1.02. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-386/������������������������������������������������ 775 � 0 � 0 � 0 11411737774 21146��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-386/mkfile������������������������������������������ 664 � 0 � 0 � 413 10745513367 22315�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OBJTYPE=$objtype </$objtype/mkfile LIB=../libmp.a SFILES=\ mpvecadd.s\ mpvecdigmuladd.s\ mpvecdigmulsub.s\ mpvecsub.s\ mpdigdiv.s\ HFILES=../../include/mp.h ../port/dat.h OFILES=${SFILES:%.s=%.$O} UPDATE=mkfile\ $HFILES\ $SFILES\ </sys/src/cmd/mksyslib �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-386/mpdigdiv.s�������������������������������������� 664 � 0 � 0 � 540 10224715034 23076�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TEXT mpdigdiv(SB),$0 MOVL dividend+0(FP),BX MOVL 0(BX),AX MOVL 4(BX),DX MOVL divisor+4(FP),BX MOVL quotient+8(FP),BP XORL CX,CX CMPL DX,BX /* dividend >= 2^32 * divisor */ JHS _divovfl CMPL BX,CX /* divisor == 0 */ JE _divovfl DIVL BX /* AX = DX:AX/BX */ MOVL AX,0(BP) RET /* return all 1's */ _divovfl: NOTL CX MOVL CX,0(BP) RET ����������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-386/mpvecadd.s�������������������������������������� 664 � 0 � 0 � 1612 10224715034 23077�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) * * sum[0:alen] = a[0:alen-1] + b[0:blen-1] * * prereq: alen >= blen, sum has room for alen+1 digits */ TEXT mpvecadd(SB),$0 MOVL alen+4(FP),DX MOVL blen+12(FP),CX MOVL a+0(FP),SI MOVL b+8(FP),BX SUBL CX,DX MOVL sum+16(FP),DI XORL BP,BP /* this also sets carry to 0 */ /* skip addition if b is zero */ TESTL CX,CX JZ _add1 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ _addloop1: MOVL (SI)(BP*4), AX ADCL (BX)(BP*4), AX MOVL AX,(DI)(BP*4) INCL BP LOOP _addloop1 _add1: /* jump if alen > blen */ INCL DX MOVL DX,CX LOOP _addloop2 /* sum[alen] = carry */ _addend: JC _addcarry MOVL $0,(DI)(BP*4) RET _addcarry: MOVL $1,(DI)(BP*4) RET /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */ _addloop2: MOVL (SI)(BP*4),AX ADCL $0,AX MOVL AX,(DI)(BP*4) INCL BP LOOP _addloop2 JMP _addend ������S ������A ���p������A ��� p��� ���S����=�����9���������I����old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-386/mpvecdigmuladd.s�������������������������������� 664 � 0 � 0 � 2047 10224715034 24304�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecdigmul(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p += b*m * * each step look like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * hi = DX - constrained by hardware * lo = AX - constrained by hardware * b+n = SI - can't be BP * p+n = DI - can't be BP * i-n = BP * m = BX * oldhi = CX * */ TEXT mpvecdigmuladd(SB),$0 MOVL b+0(FP),SI MOVL n+4(FP),CX MOVL m+8(FP),BX MOVL p+12(FP),DI MOVL CX,BP NEGL BP /* BP = -n */ SHLL $2,CX ADDL CX,SI /* SI = b + n */ ADDL CX,DI /* DI = p + n */ XORL CX,CX _muladdloop: MOVL (SI)(BP*4),AX /* lo = b[i] */ MULL BX /* hi, lo = b[i] * m */ ADDL CX,AX /* lo += oldhi */ JCC _muladdnocarry1 INCL DX /* hi += carry */ _muladdnocarry1: ADDL AX,(DI)(BP*4) /* p[i] += lo */ JCC _muladdnocarry2 INCL DX /* hi += carry */ _muladdnocarry2: MOVL DX,CX /* oldhi = hi */ INCL BP /* i++ */ JNZ _muladdloop XORL AX,AX ADDL CX,(DI)(BP*4) /* p[n] + oldhi */ ADCL AX,AX /* return carry out of p[n] */ RET B�� ?�B��? B��>B��?B��B��?B��?p�B�� ?�B��? B��>B���B����9B�����B����5���>���A5���>���A5���>���A5���>���A5���>���A5��� >���A5��� >���A5���>���A5���>���A5���>���A5���>���AI����s_nextafter.8 1201054076 0 0 664 1952 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmath�~�E<fdlibm�old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-386/mpvecdigmulsub.s�������������������������������� 664 � 0 � 0 � 1713 10224715034 24344�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p -= b*m * * each step look like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * hi = DX - constrained by hardware * lo = AX - constrained by hardware * b = SI - can't be BP * p = DI - can't be BP * i = BP * n = CX - constrained by LOOP instr * m = BX * oldhi = EX * */ TEXT mpvecdigmulsub(SB),$0 MOVL b+0(FP),SI MOVL n+4(FP),CX MOVL m+8(FP),BX MOVL p+12(FP),DI XORL BP,BP PUSHL BP _mulsubloop: MOVL (SI)(BP*4),AX /* lo = b[i] */ MULL BX /* hi, lo = b[i] * m */ ADDL 0(SP),AX /* lo += oldhi */ JCC _mulsubnocarry1 INCL DX /* hi += carry */ _mulsubnocarry1: SUBL AX,(DI)(BP*4) JCC _mulsubnocarry2 INCL DX /* hi += carry */ _mulsubnocarry2: MOVL DX,0(SP) INCL BP LOOP _mulsubloop POPL AX SUBL AX,(DI)(BP*4) JCC _mulsubnocarry3 MOVL $-1,AX RET _mulsubnocarry3: MOVL $1,AX RET �� W����d���<C���� &��� AX����d���<C�old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-386/mpvecsub.s�������������������������������������� 664 � 0 � 0 � 1377 10224715034 23150�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff) * * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1] * * prereq: alen >= blen, diff has room for alen digits */ TEXT mpvecsub(SB),$0 MOVL a+0(FP),SI MOVL b+8(FP),BX MOVL alen+4(FP),DX MOVL blen+12(FP),CX MOVL diff+16(FP),DI SUBL CX,DX XORL BP,BP /* this also sets carry to 0 */ /* skip subraction if b is zero */ TESTL CX,CX JZ _sub1 /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */ _subloop1: MOVL (SI)(BP*4),AX SBBL (BX)(BP*4),AX MOVL AX,(DI)(BP*4) INCL BP LOOP _subloop1 _sub1: INCL DX MOVL DX,CX LOOP _subloop2 RET /* diff[blen:alen-1] = a[blen:alen-1] - 0 */ _subloop2: MOVL (SI)(BP*4),AX SBBL $0,AX MOVL AX,(DI)(BP*4) INCL BP LOOP _subloop2 RET ��ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-amd64/���������������������������������������������� 775 � 0 � 0 � 0 11411737775 21542��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-amd64/mkfile���������������������������������������� 664 � 0 � 0 � 413 10745515717 22711�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OBJTYPE=$objtype </$objtype/mkfile LIB=../libmp.a SFILES=\ mpvecadd.s\ mpvecdigmuladd.s\ mpvecdigmulsub.s\ mpvecsub.s\ mpdigdiv.s\ HFILES=../../include/mp.h ../port/dat.h OFILES=${SFILES:%.s=%.$O} UPDATE=mkfile\ $HFILES\ $SFILES\ </sys/src/cmd/mksyslib �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-amd64/mpdigdiv.s������������������������������������ 664 � 0 � 0 � 552 10224715035 23475�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TEXT mpdigdiv(SB),$0 /* MOVL dividend+0(FP),BX */ MOVL 0(RARG),AX MOVL 4(RARG),DX MOVL divisor+8(FP),BX MOVQ quotient+16(FP),DI XORL CX,CX CMPL DX,BX /* dividend >= 2^32 * divisor */ JHS _divovfl CMPL BX,CX /* divisor == 0 */ JE _divovfl DIVL BX /* AX = DX:AX/BX */ MOVL AX,0(DI) RET /* return all 1's */ _divovfl: NOTL CX MOVL CX,0(DI) RET ������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecadd.s������������������������������������ 664 � 0 � 0 � 1637 10224715035 23502�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) * * sum[0:alen] = a[0:alen-1] + b[0:blen-1] * * prereq: alen >= blen, sum has room for alen+1 digits */ TEXT mpvecadd(SB),$0 MOVL alen+8(FP),DX MOVL blen+24(FP),CX /* MOVL a+0(FP),SI */ MOVQ RARG, SI MOVQ b+16(FP),BX SUBL CX,DX MOVQ sum+32(FP),DI XORL BP,BP /* this also sets carry to 0 */ /* skip addition if b is zero */ TESTL CX,CX JZ _add1 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ _addloop1: MOVL (SI)(BP*4), AX ADCL (BX)(BP*4), AX MOVL AX,(DI)(BP*4) INCL BP LOOP _addloop1 _add1: /* jump if alen > blen */ INCL DX MOVL DX,CX LOOP _addloop2 /* sum[alen] = carry */ _addend: JC _addcarry MOVL $0,(DI)(BP*4) RET _addcarry: MOVL $1,(DI)(BP*4) RET /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */ _addloop2: MOVL (SI)(BP*4),AX ADCL $0,AX MOVL AX,(DI)(BP*4) INCL BP LOOP _addloop2 JMP _addend �������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecdigmuladd.s������������������������������ 664 � 0 � 0 � 2073 10224715035 24677�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecdigmul(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p += b*m * * each step look like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * hi = DX - constrained by hardware * lo = AX - constrained by hardware * b+n = SI - can't be BP * p+n = DI - can't be BP * i-n = BP * m = BX * oldhi = CX * */ TEXT mpvecdigmuladd(SB),$0 /* MOVQ b+0(FP),SI */ MOVQ RARG,SI MOVL n+8(FP),CX MOVL m+16(FP),BX MOVQ p+24(FP),DI MOVL CX,BP NEGQ BP /* BP = -n */ SHLL $2,CX ADDQ CX,SI /* SI = b + n */ ADDQ CX,DI /* DI = p + n */ XORL CX,CX _muladdloop: MOVL (SI)(BP*4),AX /* lo = b[i] */ MULL BX /* hi, lo = b[i] * m */ ADDL CX,AX /* lo += oldhi */ JCC _muladdnocarry1 INCL DX /* hi += carry */ _muladdnocarry1: ADDL AX,(DI)(BP*4) /* p[i] += lo */ JCC _muladdnocarry2 INCL DX /* hi += carry */ _muladdnocarry2: MOVL DX,CX /* oldhi = hi */ INCQ BP /* i++ */ JNZ _muladdloop XORL AX,AX ADDL CX,(DI)(BP*4) /* p[n] + oldhi */ ADCL AX,AX /* return carry out of p[n] */ RET ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecdigmulsub.s������������������������������ 664 � 0 � 0 � 1737 10224715035 24746�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p -= b*m * * each step look like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * hi = DX - constrained by hardware * lo = AX - constrained by hardware * b = SI - can't be BP * p = DI - can't be BP * i = BP * n = CX - constrained by LOOP instr * m = BX * oldhi = EX * */ TEXT mpvecdigmulsub(SB),$0 /* MOVL b+0(FP),SI */ MOVQ RARG,SI MOVL n+8(FP),CX MOVL m+16(FP),BX MOVQ p+24(FP),DI XORL BP,BP PUSHQ BP _mulsubloop: MOVL (SI)(BP*4),AX /* lo = b[i] */ MULL BX /* hi, lo = b[i] * m */ ADDL 0(SP),AX /* lo += oldhi */ JCC _mulsubnocarry1 INCL DX /* hi += carry */ _mulsubnocarry1: SUBL AX,(DI)(BP*4) JCC _mulsubnocarry2 INCL DX /* hi += carry */ _mulsubnocarry2: MOVL DX,0(SP) INCL BP LOOP _mulsubloop POPQ AX SUBL AX,(DI)(BP*4) JCC _mulsubnocarry3 MOVQ $-1,AX RET _mulsubnocarry3: MOVQ $1,AX RET ���������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-amd64/mpvecsub.s������������������������������������ 664 � 0 � 0 � 1424 10224715035 23535�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff) * * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1] * * prereq: alen >= blen, diff has room for alen digits */ TEXT mpvecsub(SB),$0 /* MOVQ a+0(FP),SI */ MOVQ RARG, SI MOVQ b+16(FP),BX MOVL alen+8(FP),DX MOVL blen+24(FP),CX MOVQ diff+32(FP),DI SUBL CX,DX XORL BP,BP /* this also sets carry to 0 */ /* skip subraction if b is zero */ TESTL CX,CX JZ _sub1 /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */ _subloop1: MOVL (SI)(BP*4),AX SBBL (BX)(BP*4),AX MOVL AX,(DI)(BP*4) INCL BP LOOP _subloop1 _sub1: INCL DX MOVL DX,CX LOOP _subloop2 RET /* diff[blen:alen-1] = a[blen:alen-1] - 0 */ _subloop2: MOVL (SI)(BP*4),AX SBBL $0,AX MOVL AX,(DI)(BP*4) INCL BP LOOP _subloop2 RET ���������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-mips/����������������������������������������������� 775 � 0 � 0 � 0 11411737776 21600��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-mips/mkfile����������������������������������������� 664 � 0 � 0 � 413 10745515736 22747�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OBJTYPE=$objtype </$objtype/mkfile LIB=../libmp.a SFILES=\ mpvecadd.s\ mpvecdigmuladd.s\ mpvecdigmulsub.s\ mpvecsub.s\ mpdigdiv.s\ HFILES=../../include/mp.h ../port/dat.h OFILES=${SFILES:%.s=%.$O} UPDATE=mkfile\ $HFILES\ $SFILES\ </sys/src/cmd/mksyslib �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-mips/mpdigdiv.s������������������������������������� 664 � 0 � 0 � 1141 10224715035 23545�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * This only works on R[45]000 chips that allow 64 bit * integer arithmetic even when uding 32 bit addresses * * R1 = dividend* * R2 = dividend[low] * R3 = dividend[high] * R4 = 32 bit divisor * R5 = quotient* */ TEXT mpdigdiv(SB),$0 MOVW 0(R1),R2 MOVW 4(R1),R3 MOVW divisor+4(FP),R4 MOVW quotient+8(FP),R5 /* divisor == 0 */ BEQ R4,_digovfl /* dividend >= 2^32 * divisor */ SGTU R4,R3,R7 BEQ R7,_digovfl _digdiv1: SLLV $32,R2 SLLV $32,R3 SRLV $32,R2 ADDVU R2,R3 SLLV $32,R4 SRLV $32,R4 DIVVU R4,R3 MOVW LO,R1 MOVW R1,0(R5) RET _digovfl: MOVW $-1,R1 MOVW R1,0(R5) RET ��� 664 � 0 � 0 � 552 10224715035 23475�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-mips/mpvecadd.s������������������������������������� 664 � 0 � 0 � 2273 10224715035 23534�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BDNZ BC 16,0, #define BDNE BC 0,2, /* * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) * * sum[0:alen] = a[0:alen-1] + b[0:blen-1] * * prereq: alen >= blen, sum has room for alen+1 digits * * R1 == a (first arg passed in R1) * R3 == carry * R4 == alen * R5 == b * R6 == blen * R7 == sum * R2 == temporary * R8 == temporary * R9 == temporary */ TEXT mpvecadd(SB),$-4 MOVW alen+4(FP), R4 MOVW b+8(FP), R5 MOVW blen+12(FP), R6 MOVW sum+16(FP), R7 SUBU R6, R4 /* calculate counter for second loop (alen > blen) */ MOVW R0, R3 /* if blen == 0, don't need to add it in */ BEQ R6,_add1 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ _addloop1: MOVW 0(R1), R8 ADDU $4, R1 MOVW 0(R5), R9 ADDU $4, R5 ADDU R3, R8 SGTU R3, R8, R3 ADDU R8, R9 SGTU R8, R9, R2 ADDU R2, R3 MOVW R9, 0(R7) ADDU $4, R7 SUBU $1, R6 BNE R6, _addloop1 _add1: /* if alen == blen, we're done */ BEQ R4, _addend /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */ _addloop2: MOVW 0(R1), R8 ADDU $4, R1 ADDU R3, R8 SGTU R3, R8, R3 MOVW R8, 0(R7) ADDU $4, R7 SUBU $1, R4 BNE R4, _addloop2 /* sum[alen] = carry */ _addend: MOVW R3, 0(R7) RET JC _addcarry MOVL $0,(DI)(BP*4) RET _addcarry: MOVL $1,(DI)(BP*4) RET /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */ _addloop2: MOVL (SI)(BP*4),AX ADCL $0,AX MOVL AX,(DI)(BP*4) INCL BP LOOP _addloop2 JMP _addend �������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-mips/mpvecdigmuladd.s������������������������������� 664 � 0 � 0 � 2112 10224715035 24726�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p += b*m * * each step looks like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * b = R1 * n = R4 * m = R5 * p = R6 * i = R7 * hi = R8 - constrained by hardware * lo = R9 - constrained by hardware * oldhi = R10 * tmp = R11 * */ TEXT mpvecdigmuladd(SB),$0 MOVW n+4(FP),R4 MOVW m+8(FP),R5 MOVW p+12(FP),R6 MOVW R0, R10 /* oldhi = 0 */ BEQ R6, _muladd1 _muladdloop: MOVW 0(R1), R9 /* lo = b[i] */ ADDU $4, R1 MOVW 0(R6), R11 /* tmp = p[i] */ MULU R9, R5 MOVW HI, R8 /* hi = (b[i] * m)>>32 */ MOVW LO, R9 /* lo = b[i] * m */ ADDU R10, R9 /* lo += oldhi */ SGTU R10, R9, R2 ADDU R2, R8 /* hi += carry */ ADDU R9, R11 /* tmp += lo */ SGTU R9, R11, R2 ADDU R2, R8 /* hi += carry */ MOVW R11, 0(R6) /* p[i] = tmp */ ADDU $4, R6 MOVW R8, R10 /* oldhi = hi */ SUBU $1, R4 BNE R4, _muladdloop _muladd1: MOVW 0(R6), R11 /* tmp = p[i] */ ADDU R10, R11 /* tmp += oldhi */ MOVW R11, 0(R6) /* p[i] = tmp */ RET ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-mips/mpvecdigmulsub.s������������������������������� 664 � 0 � 0 � 2312 10224715035 24771�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p -= b*m * * each step looks like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * b = R1 * n = R4 * m = R5 * p = R6 * i = R7 * hi = R8 - constrained by hardware * lo = R9 - constrained by hardware * oldhi = R10 * tmp = R11 * */ TEXT mpvecdigmulsub(SB),$0 MOVW n+4(FP),R4 MOVW m+8(FP),R5 MOVW p+12(FP),R6 MOVW R0, R10 /* oldhi = 0 */ _mulsubloop: MOVW 0(R1), R9 /* lo = b[i] */ ADDU $4, R1 MOVW 0(R6), R11 /* tmp = p[i] */ MULU R9, R5 MOVW HI, R8 /* hi = (b[i] * m)>>32 */ MOVW LO, R9 /* lo = b[i] * m */ ADDU R10, R9 /* lo += oldhi */ SGTU R10, R9, R2 ADDU R2, R8 /* hi += carry */ SUBU R9, R11, R3 /* tmp -= lo */ SGTU R3, R11, R2 ADDU R2, R8 /* hi += carry */ MOVW R3, 0(R6) /* p[i] = tmp */ ADDU $4, R6 MOVW R8, R10 /* oldhi = hi */ SUBU $1, R4 BNE R4, _mulsubloop MOVW 0(R6), R11 /* tmp = p[i] */ SUBU R10, R11, R3 /* tmp -= oldhi */ MOVW R3, 0(R6) /* p[i] = tmp */ SGTU R3, R11, R1 BNE R1, _mulsub2 MOVW $1, R1 /* return +1 for positive result */ RET _mulsub2: MOVW $-1, R1 /* return -1 for negative result */ RET �������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-mips/mpvecsub.s������������������������������������� 664 � 0 � 0 � 2271 10224715035 23573�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BDNZ BC 16,0, #define BDNE BC 0,2, /* * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) * * sum[0:alen] = a[0:alen-1] - b[0:blen-1] * * prereq: alen >= blen, sum has room for alen+1 digits * * R1 == a (first arg passed in R1) * R3 == carry * R4 == alen * R5 == b * R6 == blen * R7 == sum * R2 == temporary * R8 == temporary * R9 == temporary */ TEXT mpvecsub(SB),$-4 MOVW alen+4(FP), R4 MOVW b+8(FP), R5 MOVW blen+12(FP), R6 MOVW sum+16(FP), R7 SUBU R6, R4 /* calculate counter for second loop (alen > blen) */ MOVW R0, R3 /* if blen == 0, don't need to subtract it */ BEQ R6,_sub1 /* sum[0:blen-1],carry = a[0:blen-1] - b[0:blen-1] */ _subloop1: MOVW 0(R1), R8 ADDU $4, R1 MOVW 0(R5), R9 ADDU $4, R5 SUBU R3, R8, R2 SGTU R2, R8, R3 SUBU R9, R2, R8 SGTU R8, R2, R9 ADDU R9, R3 MOVW R8, 0(R7) ADDU $4, R7 SUBU $1, R6 BNE R6, _subloop1 _sub1: /* if alen == blen, we're done */ BEQ R4, _subend /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */ _subloop2: MOVW 0(R1), R8 ADDU $4, R1 SUBU R3, R8, R2 SGTU R2, R8, R3 MOVW R2, 0(R7) ADDU $4, R7 SUBU $1, R4 BNE R4, _subloop2 /* sum[alen] = carry */ _subend: RET ������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-power/���������������������������������������������� 775 � 0 � 0 � 0 11411737777 21765��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-power/mkfile���������������������������������������� 664 � 0 � 0 � 413 10745515755 23134�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OBJTYPE=$objtype </$objtype/mkfile LIB=../libmp.a SFILES=\ mpvecadd.s\ mpvecdigmuladd.s\ mpvecdigmulsub.s\ mpvecsub.s\ mpdigdiv.s\ HFILES=../../include/mp.h ../port/dat.h OFILES=${SFILES:%.s=%.$O} UPDATE=mkfile\ $HFILES\ $SFILES\ </sys/src/cmd/mksyslib �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-power/mpvecadd.s������������������������������������ 664 � 0 � 0 � 2321 10224715037 23714�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BDNZ BC 16,0, #define BDNE BC 0,2, /* * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) * * sum[0:alen] = a[0:alen-1] + b[0:blen-1] * * prereq: alen >= blen, sum has room for alen+1 digits * * R3 == a (first arg passed in R3) * R4 == alen * R5 == b * R6 == blen * R7 == sum * R8 == temporary * R9 == temporary */ TEXT mpvecadd(SB),$-4 MOVW alen+4(FP), R4 MOVW b+8(FP), R5 MOVW blen+12(FP), R6 MOVW sum+16(FP), R7 SUB R6, R4 /* calculate counter for second loop (alen > blen) */ SUB $4, R3 /* pre decrement for MOVWU's */ SUB $4, R5 /* pre decrement for MOVWU's */ SUB $4, R7 /* pre decrement for MOVWU's */ MOVW R0, XER /* zero carry going in */ /* if blen == 0, don't need to add it in */ CMP R0, R6 BEQ _add1 /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */ MOVW R6, CTR _addloop1: MOVWU 4(R3), R8 MOVWU 4(R5), R9 ADDE R8, R9 MOVWU R9, 4(R7) BDNZ _addloop1 _add1: /* if alen == blen, we're done */ CMP R0, R4 BEQ _addend /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */ MOVW R4, CTR _addloop2: MOVWU 4(R3), R8 ADDE R0, R8 MOVWU R8, 4(R7) BDNZ _addloop2 /* sum[alen] = carry */ _addend: ADDE R0, R0, R8 MOVW R8, 4(R7) RETURN 1), R8 ADDU $4, R1 MOVW 0(R5), R9 ADDU $4, R5 ADDU R3, R8 SGTU R3, R8, R3 ADDU R8, R9 SGTU R8, R9, R2 ADDU R2, R3 MOVW R9, 0(R7) ADDU $4, R7 SUBU $1, R6 BNE R6, _addloop1 _add1: /* if alen == blen, we're done */ BEQ R4, _addend /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 + carry */ old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-power/mpvecdigmuladd.s������������������������������ 664 � 0 � 0 � 2121 10224715037 25114�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BDNZ BC 16,0, #define BDNE BC 0,2, /* * mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p += b*m * * each step looks like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * b = R3 * n = R4 * m = R5 * p = R6 * i = R7 * hi = R8 - constrained by hardware * lo = R9 - constrained by hardware * oldhi = R10 * tmp = R11 * */ TEXT mpvecdigmuladd(SB),$0 MOVW n+4(FP),R4 MOVW m+8(FP),R5 MOVW p+12(FP),R6 SUB $4, R3 /* pre decrement for MOVWU's */ SUB $4, R6 /* pre decrement for MOVWU's */ MOVW R0, R10 MOVW R0, XER MOVW R4, CTR _muladdloop: MOVWU 4(R3),R9 /* lo = b[i] */ MOVW 4(R6),R11 /* tmp = p[i] */ MULHWU R9,R5,R8 /* hi = (b[i] * m)>>32 */ MULLW R9,R5,R9 /* lo = b[i] * m */ ADDC R10,R9 /* lo += oldhi */ ADDE R0,R8 /* hi += carry */ ADDC R9,R11 /* tmp += lo */ ADDE R0,R8 /* hi += carry */ MOVWU R11,4(R6) /* p[i] = tmp */ MOVW R8,R10 /* oldhi = hi */ BDNZ _muladdloop MOVW 4(R6),R11 /* tmp = p[i] */ ADDC R10,R11 MOVWU R11,4(R6) /* p[i] = tmp */ RETURN R11 /* tmp = p[i] */ MULU R9, R5 MOVW HI, R8 /* hi = (b[i] * m)>>32 */ MOVW LO, R9 /* lo = b[i] * m */ ADDU R10, R9 /* lo += oldhi */ SGTU R10, R9, R2 ADDU R2, R8 /* hi += carry */ ADDU R9, R11 /* tmp += lo */ SGTU R9, R11, R2 ADDU R2, R8 /* hi += carry */ MOVW R11, 0(R6) /* p[i] = tmp */ ADDU $4, R6 MOVW R8, R10 /* oldhi = hi */ SUBU $1, R4 BNE R4, _muladdloop _muladd1: MOVW 0(R6), R11 /* tmp = p[i] */ old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-power/mpvecdigmulsub.s������������������������������ 664 � 0 � 0 � 2424 10224715037 25163�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BDNZ BC 16,0, #define BDNE BC 0,2, #define BLT BC 0xC,0, /* * mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p) * * p -= b*m * * each step looks like: * hi,lo = m*b[i] * lo += oldhi + carry * hi += carry * p[i] += lo * oldhi = hi * * the registers are: * b = R3 * n = R4 * m = R5 * p = R6 * i = R7 * hi = R8 - constrained by hardware * lo = R9 - constrained by hardware * oldhi = R10 * tmp = R11 * borrow = R12 * */ TEXT mpvecdigmulsub(SB),$0 MOVW n+4(FP),R10 MOVW R10,CTR MOVW m+8(FP),R5 MOVW p+12(FP),R6 SUB $4, R3 /* pre decrement for MOVWU's */ SUBC $4, R6 /* pre decrement for MOVWU's and set carry */ MOVW XER,R12 MOVW R0, R10 _mulsubloop: MOVWU 4(R3),R9 /* lo = b[i] */ MOVW 4(R6),R11 /* tmp = p[i] */ MULHWU R9,R5,R8 /* hi = (b[i] * m)>>32 */ MULLW R9,R5,R9 /* lo = b[i] * m */ ADDC R10,R9 /* lo += oldhi */ ADDE R0,R8 /* hi += carry */ MOVW R12,XER SUBE R9,R11 /* tmp -= lo */ MOVW XER,R12 MOVWU R11,4(R6) /* p[i] = tmp */ MOVW R8,R10 /* oldhi = hi */ BDNZ _mulsubloop MOVW 4(R6),R11 /* tmp = p[i] */ MOVW R12,XER SUBE R10,R11 /* tmp -= lo */ MOVWU R11,4(R6) /* p[i] = tmp */ /* return -1 if the result was negative, +1 otherwise */ SUBECC R0,R0,R3 BLT _mulsub2 MOVW $1,R3 _mulsub2: RETURN mp -= lo */ SGTU R3, R11, R2 ADDU R2, R8 /* hi += carry */ MOVW R3, 0(R6) /* p[i] = tmp */ ADDU $4, R6 MOVW R8, R10 /* oldhi = hi */ SUBU $1, R4 BNE R4, _mulsubloop MOVW 0(R6), R11 /* tmp = p[i] */ SUBU R10, R11, R3 /* tmp -old_contrib//root/sys/src/cmd/limbo/libmp/Plan9-power/mpvecsub.s������������������������������������ 664 � 0 � 0 � 2136 10224715037 23761�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define BDNZ BC 16,0, #define BDNE BC 0,2, /* * mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff) * * diff[0:alen-1] = a[0:alen-1] - b[0:blen-1] * * prereq: alen >= blen, diff has room for alen digits * * R3 == a * R4 == alen * R5 == b * R6 == blen * R7 == diff * R8 == temporary * R9 == temporary */ TEXT mpvecsub(SB),$-4 MOVW alen+4(FP),R4 MOVW b+8(FP),R5 MOVW blen+12(FP),R6 MOVW diff+16(FP),R7 SUB R6, R4 /* calculate counter for second loop (alen > blen) */ SUB $4, R3 /* pre decrement for MOVWU's */ SUB $4, R5 /* pre decrement for MOVWU's */ SUBC $4, R7 /* pre decrement for MOVWU's and set carry */ /* skip subraction if b is zero */ CMP R0,R6 BEQ _sub1 /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */ MOVW R6, CTR _subloop1: MOVWU 4(R3), R8 MOVWU 4(R5), R9 SUBE R9, R8, R8 MOVWU R8, 4(R7) BDNZ _subloop1 _sub1: /* skip subtraction if a is zero */ CMP R0, R4 BEQ _subend /* diff[blen:alen-1] = a[blen:alen-1] - 0 + carry */ MOVW R4, CTR _subloop2: MOVWU 4(R3), R8 SUBE R0, R8 MOVWU R8, 4(R7) BDNZ _subloop2 _subend: RETURN n't need to subtract it */ BEQ R6,_sub1 /* sum[0:blen-1],carry = a[0:blen-1] - b[0:blen-1] */ _subloop1: MOVW 0(R1), R8 ADDU $4, R1 MOVW 0(R5), R9 ADDU $4, R5 SUBU R3, R8, R2 SGTU R2, R8, R3 SUBU R9, R2, R8 SGTU R8, R2, R9 ADDU R9, R3 MOVW R8, 0(R7) ADDU $4, R7 SUBU $1, R6 BNE R6, _subloop1 _sub1: /* if alen == blen, we're done */ BEQ R4, _subend /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 +old_contrib//root/sys/src/cmd/limbo/libmp/bigtest.c������������������������������������������������� 664 � 0 � 0 � 4001 10224723774 21441�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <lib9.h> #include <mp.h> #include <libsec.h> char *sfactors[] = { "3", "5", "17", "257", "641", "65537", "274177", "2424833", "6700417", "45592577", "6487031809", "67280421310721", "1238926361552897", "59649589127497217", "5704689200685129054721", "4659775785220018543264560743076778192897", "7455602825647884208337395736200454918783366342657", "93461639715357977769163558199606896584051237541638188580280321", "741640062627530801524787141901937474059940781097519023905821316144415759504705008092818711693940737", "130439874405488189727484768796509903946608530841611892186895295776832416251471863574140227977573104895898783928842923844831149032913798729088601617946094119449010595906710130531906171018354491609619193912488538116080712299672322806217820753127014424577" }; long start; void printmp(mpint *b, char *tag) { int n; char *p; print("%s (%d) ", tag, b->top); p = mptoa(b, 10, nil, 0); write(1, p, strlen(p)); free(p); print("\n"); } int timing(void) { long now, span; now = time(0); span = now-start; start = now; return span; } int expdebug; void main(int argc, char **argv) { mpint *p, *k, *d, *b, *e, *x, *r; int i; start = time(0); fmtinstall('B', mpconv); mpsetminbits(2*Dbits); x = mpnew(0); e = mpnew(0); r = mpnew(0); p = mpnew(0); // b = 2^32 b = mpcopy(mpone); mpleft(b, 32, b); // 2^29440 p = mpcopy(mpone); mpleft(p, 29440, p); // 2^27392 k = mpcopy(mpone); mpleft(k, 27392, k); // k = 2^29440 - 2^27392 mpsub(p, k, k); // p = 2^29440 - 2^27392 + 1 mpadd(k, mpone, p); // if(!probably_prime(p, 18)){ // print("not a prime\n"); // exits(0); // } // print("probably prime\n"); mpright(k, 10, k); printmp(k, "k ="); expdebug = 1; mpexp(b, k, p, x); printmp(x, "x ="); print("timing %d\n", timing()); for(i = 0; i < nelem(sfactors); i++){ d = strtomp(sfactors[i], nil, 10, nil); // e = k/d mpdiv(k, d, e, r); printmp(r, "r ="); // x = b^e mod p mpexp(b, e, p, x); printmp(x, "x ="); print("timing %d\n", timing()); } } define BDNZ BC 16,0, #define BDNE BC 0,2, /* * mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) * * sum[0:alen] = a[0:alen-1] + b[0:blen-1] * * prereq: alen >= blen, sum has room for alen+1 digits * * R3 == a (first arg passed in R3) * R4 == alen * R5 == b * R6 == blen * R7 == sum * R8 == temporary * R9 == temporary */ TEXT mpvecadd(SB),$-4 MOVW alen+4(FP), R4 MOVW b+8(FP), R5 MOVW blen+12(FP), R6 MOVW sum+16(FP), R7 SUB R6, R4 /* calculate counter for secondold_contrib//root/sys/src/cmd/limbo/libmp/libmp.a��������������������������������������������������� 664 � 0 � 0 � 243264 10745520460 21154�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!<arch> __.SYMDEF 1201054000 0 0 644 714 ` T E�mpdigdiv�TB�mpvecsub�T@�mpvecdigmulsub�Td>�mpvecdigmuladd�T;�mpvecadd�T3�mptouv�T3�uvtomp�T(�mptov�T(�vtomp�TD#�mptoui�TD#�uitomp�T|�mptoi�T|�itomp�T �crtpre�T �crtout�T �crtresfree�T �crtprefree�T �crtin�T�mprand�T$��mpinvert�T��mpextendedgcd�T��mpmod�T��mpexp�T��mpdiv�T��mpveccmp�T,��mpright�T��mpleft�Tr��mpvecmul�Tr��mpmul�T��mpfactorial�Tހ��mpmagcmp�Tހ��mpcmp�THy��mpmagsub�THy��mpsub�Tq��mpmagadd�Tq��mpadd�T$l��letomp�Te��betomp�T^��mptole�TV��mptobe�T1��strtomp�T��mpfmt�T��mptoa�D��mptwo�T��mplowbits0�D��mpone�T��mpnorm�T��mpsignif�T��mpassign�D��mpzero�T��mpbits�T��mpsetminbits�T��mpcopy�T��mpfree�T��mpnew��mpaux.8 1201053983 0 0 664 5565 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpaux.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�g����~�>_mptwodata�-���;>���A~�>_mptwo�-���;>���A-���;���>���A-���;���>���A-���; ���>>�D-���;���>���A~�=mptwo�-���;=>�D~�>_mponedata�-���;>���A~�>_mpone�-���;>���A-���;���>���A-���;���>���A-���; ���>>�D-���;���>���A~�=mpone�-���;=>�D~�>_mpzero�-���;>���A-���;���>���A~�>_mpzerodata�-���; ���>>�D-���;���>���A~�= mpzero�-���; =>�D~�> mpmindigits�-���; >!���A~�= mpsetminbits���� =���A~�@ n�p��� @ &��� AP�������<~�> .string�-���; > mpsetmin-���;��� > bits: n p���>� Dp���S~�=sysfatal�����=p��� @ &��� AX���� ���<p������A p���  ������A����� ������A ��� ������Ap��� >�����~�=mpnew����=���A&��� @AP�������<-���;��� > < 0�mpse-���;��� > tminbits-���; ��� > : n < 0�p���>���� Dp���S����=p������A p��� Sp������A p��� ���S~�=mallocz�����=&���A~�?b�p���?X����$���<-���;(��� > mpnew: %p���>�(��� Dp���S����=p��� @ ������A����� ������A ��� ������Ap��� &��� >P����.���<p��� > p���  p���  @������A p��� Sp������A p��� ���S����=p���? p��� ���Qp��� ���Q&���AX����>���<-���;0��� > r�mpnew:p���>�2��� Dp���S����=p���? p��� @ p��� ���Qp������AQp��� ����������~�=mpbits����=���A~�@b�p���@ ~�@m�p������@ ������A����� ������A ��� ������Ap��� p������R&��� U����e���<p������R&��� U����T���<�����p������Rp��� ���R a���Pp���Sp���A���Sp������Rp���  ~�?n�p��� ?��� p��� ������Ap������S~�=memset�����=p���@p���? p��� ���O������p��� ���R p��� Sp���  p��� ?������A p��� ���S~�=realloc�����=p���@ p��� ���Rp��� ���R&���AX����u���<-���;8��� > %r�mpbip���>�<��� Dp���S����=p���@ p������Rp��� ���R a���Pp���Sp���A���Sp������Rp���? ��� p��� ������Ap������S����=p���? p���@ p��� ���Qp��� ���Q�����~�=mpfree�� ��=���Ap� ��@ &� �� AX� ������<�����r������P ������A&���AO�������<-���;@��� > ts: %r�f-���;H��� > reeing m-���;P��� > p constap���>�G��� Dp���S����=p���@ p��� ���Pp���Sp���A���Sp������P������Ap������S����=p���@p��� ���Op���S~�=free�����=p���@p���S����=�����~�=mpnorm����=���Ap���@ p������T /���� W�������<W�������<W�������</���� &��� AU�������<p��� ���Ta��� Op���O&���AO�������<W�������<W�������<p���  C���� p��� ���Tp������T&���AX�������<p� �����AT� ����~�=mpcopy��$��=���A~�@old�p�(��@ p�(�����P �(�����A p�(�� S�(���=p�(��@ p�)�����R p�)�� ���Op�*��R p�*�� O~�?new�p�+��?p�+�� ���Op�+��Sp�+�� ���Rp�+�����Sp�+�����R�+�����Ap�+�����S~�=memmove��+���=p�,��?�,�����,����~�=mpassign��0��=���A~�@ new�p�2����� @p�2��Sp�2��@p�2�����O�2�����Ap�2�����S�2���=p�2����� @ p�2��@ p�3��Q p�3�� Rp�4�����Q p�4�� ���Rp�5�� ���Rp�5��Sp�5�� ���Qp�5�����Sp�5�����Q�5�����Ap�5�����S�5���=�5����~�=!mpsignif��:��!=���A~�@"n�p�:��"@p�?�����U&�?��AX�?������<p�@��A�@����p�A�����U /�A��� W�A������<W�A������<W�A�����</�A��� &�A�� AU�A������<p�B�� ���Ua�B�� Op�B��O p�C�����A W�C������<W�C������<W�C�����</�C��� &�C�� AU�C������<p�D��  p�D�����A�D�� p�D��  �D�� &�D�� AO�D�����<p�E�� �E�����A �E�� C�E����E����W�E������<W�E������<p�H��A�H�����H����~�=#mplowbits0��M��#=���Ap�M��"@p�R�����U&�R��AX�R�����<p�S��A�S����p�T��Ap�U��A p�V��A p�W�� ���Up�W��O W�c���"��<W�c���"��<W�c���9��<p�Y��  p�Y�����A�Y�� p�Y��  �Y�� &�Y�� AO�Y���*��<W�Z���!��<C�[���C�\��� &�]��  ���AX�]���8��<C�^��� p�^�����U &�^��  U�^���4��<p�_��A�_����p�`�� ���Ua�`�� Op�`��O p�a��A W�a��� ��<p�d���d�����d����-�d��;X��� > nt������5�d��=���A5�d��>���A5�d��>���A5�d�� =���A5�d�� >���A5�d��>���A5�d�� >`���A5�d��>���A5�d��>���A5�d��>���A5�d��=���AId����mpfmt.8 1201053984 0 0 664 6241 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpfmt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<include�~�E<libsec.h�7�����~�E<libsec.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7� ����7�����~�>to64��"��>$���A~�?p�p�'��A?~�@b�p�(��@ p�(�� Sp�(��A���Sp�(��A���Sa�(��? p�(��  ���S~�=mptobe��(���=&�)��AP�)��� ���<p�*��A�*����~�@buf�p�+�����@ p�+�� S~�@len�p�+�����@ p�+�� ���Sp�+��? p�+�� ���Sp�+�� ���S~�=enc64��+���=~�?rv�p�+��?p�,��?p�,��S~�= free��,��� =p�-��?�-�����-����~�> to32��1�� >(���Ap�7��@p�7�����O�7�����A �7�����A~�? n�p�8�� ?p�8��S~�= malloc��8��� =&�9��AX�9���(���<p�:��A�:����p�;��@ p�;�� Sp�;��?p�;�����Sp�;�� ? p�;�� ���Sp�;��A ���S�;���=p�;�� &�<��AP�<���5���<p�=��A�=�����@����~�? .safe�p�@�����A ?:�@�� ?�&�@�� AO�@���A���<p�A�� �A����p�A�����A ?:�A�� ?�p�A�����A �A��  �A��  p�B�����@ p�B�� Sp�B�����@ p�B�� ���Sp�B��? p�B�� ���Sp�B��  ���S~�=enc32��B���=p�B��?p�C��?p�C��S�C��� =p�D��?�D�����D����~�>set16�-�G��;>0���A-�G��;���>1���A-�G��;���>2���A-�G��;���>3���A-�G��;���>4���A-�G��;���>5���A-�G��;���>6���A-�G��;���>7���A-�G��;���>8���A-�G��; ���>9���A-�G��; ���>A���A-�G��; ���>B���A-�G��; ���>C���A-�G��; ���>D���A-�G��;���>E���A-�G��;���>F���A~�>to16��J��>���Ap�J�����@ &�P�� ���AP�P���V���<p�Q��A�Q����p�S�����@ p�T�����@ p�T��  a�T�� Q~�?eout�p�T��?p�U��@p�U�����Op�U��@ p�U�� ���P a�U��P �U��AW�U���e���<W�U���d���<W�U������< �U��Ap�U��@p�U�� ���O&�U��M�U���c���<p�V��Up�W�����A W�W���o���<W�W���n���<W�W������<�W�����A &�W�� AU�W���m���<p�X��  p�X���X��  �X�����Ap�X�� &�Y��AX�Y���{���<&�Y�� ���@X�Y���{���<W�Y������<&�Z�� ?M�Z������<p�[��A�[����p�\�� C�\��� r�\�� > o�\�� OW�\���l���<W�\���b���<&�`�� ���@X�`������<p�a�� C�a��� o�a��0���AO&�b�� ?M�b������<p�c��A�c����o�d��ARp�e��A�e�����e����~�>modbillion��i��>���A~�@out�p�i�����@ ~�@r�p�i�����@ p�n��AW�n������<W�n������<W�n������<C�n���&�n�� ���AP�n������<p�o�� p�o��A p�o�� ���A ?2�o�� ?�p�o�� p�p��A|�p�� ��p�����A p�p��  &�q��  ���@R�q������<p�r��A�r����/�s��� p�s�� �s��0���A o�s�� T~�@rem�&�t��@AX�t������<&�t�� AO�t������<W�t������<W�u������<W�u������<p�w�� �w�����w����~�>to10��{��>(���A&������@���AP�������<p���A�����p���@ p��� S~�=mpcopy�����=~�?d�p���?p���AS~�=mpnew�����=~�?r�p���?p����ʚ;A p��� Sp���A���S~�=uitomp�����=p���? ~�?billion�p���?p������@ p������@ a��� Qp��� /���� ~�?out�p��� ?o���APW�������<W�������<W�������<p������R&���AO�������<p��� Sp���?p������Sp��� ���Sp���?p��� ���S~�=mpdiv�����=p���? p������P p��� Sp���? p��� ���P p���P p��� ���Sp���? p��� ���Sp������@ p���  ���S����>p���? &���Ap���?X�������<W�������<W�������<p��� S~�=mpfree�����=p���?p���S����=p���?p���S����=p������@ p������@ p���? &��� AX�������<p���A�����p��� ��� ��� &���  O������<p��� Sp��� ���Sp��� ���S~�= memmove����� =p���A����������~�=!mpfmt����!= ���A~�@"fmt�p���"@ ������A���Rp������Rp���O&���AX������<p��� S~�>#.string�p���>�#D p��� ���S~�=$fmtstrcpy�����$=�����p���Sp���(���R p��� ���Sp���A���Sp���A ���S~�=%mptoa�����%=p���"@ ���A,���Q&���AX����&��<p��� Sp���>����#D p��� ���S����$=�����W����/��<p��� Sp���?p������S����$=p���?p���S���� =p���A�������������%= ���Ap������@ p���@ p��� ���@ ~�?&alloced�p���A&?&��� AX����M��<p������T ������A ���"���A p���VUUUA=��� �p��� ������A���A ��� p��� C����p��� ���@p���S���� =p���@ p��� ���@ p��� &���AX����L��<p���A�����p������A&?&��� ���AP����Q��<p���A�����p��� ���@p���  p���T&���AP����Z��<p��� C���� o���-���AO/���� W����t��<W����~��<p��� Sp��� ���Sp��� ���S����>p��� W����[��<p��� Sp��� ���Sp��� ���S���� >p��� W����[��<p��� Sp��� ���Sp��� ���S����>p��� W����[��<p��� Sp��� ���Sp��� ���S����>p��� W����[��<~�@'base�p������'@&��� ���AO����n��<&������AO����h��<&��� ���AO����b��<&���@���AO����\��<W����h��<&��� AP������<&���&?AO������<p������@p���S���� =p���A�����p������@����������-���;#> *�*�����5���#>���A5���>���AI����strtomp.8 1201053985 0 0 664 9451 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<strtomp.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<include�~�E<libsec.h�7�����~�E<libsec.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7� ����7�����~�>set64�-�.��;>A���A-�.��;���>B���A-�.��;���>C���A-�.��;���>D���A-�.��;���>E���A-�.��;���>F���A-�.��;���>G���A-�.��;���>H���A-�.��;���>I���A-�.��; ���>J���A-�.��; ���>K���A-�.��; ���>L���A-�.��; ���>M���A-�.��; ���>N���A-�.��;���>O���A-�.��;���>P���A-�.��;���>Q���A-�.��;���>R���A-�.��;���>S���A-�.��;���>T���A-�.��;���>U���A-�.��;���>V���A-�.��;���>W���A-�.��;���>X���A-�.��;���>Y���A-�.��;���>Z���A-�.��;���>a���A-�.��;���>b���A-�.��;���>c���A-�.��;���>d���A-�.��;���>e���A-�.��;���>f���A-�.��; ���>g���A-�.��;!���>h���A-�.��;"���>i���A-�.��;#���>j���A-�.��;$���>k���A-�.��;%���>l���A-�.��;&���>m���A-�.��;'���>n���A-�.��;(���>o���A-�.��;)���>p���A-�.��;*���>q���A-�.��;+���>r���A-�.��;,���>s���A-�.��;-���>t���A-�.��;.���>u���A-�.��;/���>v���A-�.��;0���>w���A-�.��;1���>x���A-�.��;2���>y���A-�.��;3���>z���A-�.��;4���>0���A-�.��;5���>1���A-�.��;6���>2���A-�.��;7���>3���A-�.��;8���>4���A-�.��;9���>5���A-�.��;:���>6���A-�.��;;���>7���A-�.��;<���>8���A-�.��;=���>9���A-�.��;>���>+���A-�.��;?���>/���A~�>set32�-�/��;>2���A-�/��;���>3���A-�/��;���>4���A-�/��;���>5���A-�/��;���>6���A-�/��;���>7���A-�/��;���>8���A-�/��;���>9���A-�/��;���>a���A-�/��; ���>b���A-�/��; ���>c���A-�/��; ���>d���A-�/��; ���>e���A-�/��; ���>f���A-�/��;���>g���A-�/��;���>h���A-�/��;���>i���A-�/��;���>j���A-�/��;���>k���A-�/��;���>m���A-�/��;���>n���A-�/��;���>p���A-�/��;���>q���A-�/��;���>r���A-�/��;���>s���A-�/��;���>t���A-�/��;���>u���A-�/��;���>v���A-�/��;���>w���A-�/��;���>x���A-�/��;���>y���A-�/��;���>z���A~�>set16�-�0��;>0���A-�0��;���>1���A-�0��;���>2���A-�0��;���>3���A-�0��;���>4���A-�0��;���>5���A-�0��;���>6���A-�0��;���>7���A-�0��;���>8���A-�0��; ���>9���A-�0��; ���>A���A-�0��; ���>B���A-�0��; ���>C���A-�0��; ���>D���A-�0��;���>E���A-�0��;���>F���A-�0��;���>0���A-�0��;���>1���A-�0��;���>2���A-�0��;���>3���A-�0��;���>4���A-�0��;���>5���A-�0��;���>6���A-�0��;���>7���A-�0��;���>8���A-�0��;���>9���A-�0��;���>a���A-�0��;���>b���A-�0��;���>c���A-�0��;���>d���A-�0��;���>e���A-�0��;���>f���A~�>set10�-�1��;>0���A-�1��;���>1���A-�1��;���>2���A-�1��;���>3���A-�1��;���>4���A-�1��;���>5���A-�1��;���>6���A-�1��;���>7���A-�1��;���>8���A-�1��; ���>9���A~�>init��4��>���A~�>tab�p�8��>����Dp�8��Sp�8�����Ap�8�����Sp�8�����Ap�8�����S~�=memset��8���=p�9��>���Dp�9��Sp�9�����Ap�9�����Sp�9�����Ap�9�����S�9���=p�:��>���Dp�:��Sp�:�����Ap�:�����Sp�:�����Ap�:�����S�:���=p�;��>���Dp�;��Sp�;�����Ap�;�����Sp�;�����Ap�;�����S�;���=p�=��>�D W�=���"���<W�=���!���<W�=���*���<C�=��� r�=��Q%�=��AO�=��� ���<p�>�� �>��>�Dr�>��Q o�>�� ���>W�>������<p�?��>�D W�?���/���<W�?���.���<W�?���7���<C�?��� r�?��Q%�?��AO�?���-���<p�@�� �@��>�Dr�@��Q o�@�� ��>W�@���,���<p�A��>�D W�A���<���<W�A���;���<W�A���I���<C�A��� r�A��R%�A��AO�A���:���<p�B�� �B��>�D�B���� �B�����A �B��  �B�����A�B�� r�B��R o�B�� ��>W�B���9���<p�C��>�D W�C���N���<W�C���M���<W�C���V���<C�C��� r�C��Q%�C��AO�C���L���<p�D�� �D��>�Dr�D��Q o�D�� ��>W�D���K���<p�F�����A>�F����~�>from16��J��> ���A~�@ b�p�J����� @ ~�@ a�p�J�� @ p�P��A���Tp�Q��  W�Q���a���<W�Q���`���<W�Q���j���<C�Q��� r�Q��Q%�Q��AO�Q���_���<s�R��Q s�R�� ��>&�R�����AX�R���i���<W�S���_���<W�S���^���<p�T�� Sp�T�� ~�? p�p�T��  ?�T�� �T�����Ap�T�����S~�= mpbits��T��� =p�T����� @p�T�� @p�T�� ? p�U��A���V~�? next�p�V��  ?W�W���y���<W�W���y���<W�W������<&�W�� T�W���x���<p�X��A p�Y��A W�Y������<W�Y������<W�Y������< �Y�����A &�Y��  ���AP�Y������<&�Z�� R�Z������<W�[������</�\��� s�\��R �\��>���Ds�\��Op�\��  �\�� �\�� W�\���~���<p�^�����VC�^������Vp�^�� ���V a�^��Pp�^�� OW�^���w���<p�`�� ?�`�����`����~�>mppow10�-�d��;>���A-�d��;���> ���A-�d��;���>d���A-�d��; ���>��A-�d��;���>'��A-�d��;���>�A-�d��;���>@B�A-�d��;���>�A-�d��; ���>�A-�d��;$���>�ʚ;A~�>from10��h��>(���Ap�n��AS~�=mpnew��n���=~�?pow�p�n��?p�o��AS�o���=p�o�� @~�?r�p�o��?p�q����� @p�q��A���OW�������<W�������<W�������<p�t��A ~�?x�p�t�� ?p�u��A W�u������<W�u������<W�u������<C�u��� &�u��  ���AP�u������<s�v��U s�v�� ��>p�v�� &�w�����AX�w������<W�x������<C�y���p�y�� @p�z�� a�z�� O �z��p�z�� �{��  p�{�� ?W�{������<&�}�� AX�}������<W�~������<~�?i�p��� ?p��� >p���Sp���?p������S~�=uitomp�����=p���?p���Sp���?p������S����=p������ @ p��� Sp���?p������Sp��� ���S~�=mpmul�����=p������ @ p��� Sp���?p������Sp��� ���S~�=mpadd�����=p��� @&���? ���AO�������<W�������<W�������<p���?p���S~�=mpfree�����=p���?p���S����=p��� @����������~�>from64����>(���Ap��� @ p���  W�������<W�������<W�������<C���� s���Q s��� ���>&������AO�������<W�������<p���  p���  @���  ~�?buf�p��� ?p������ @p���S~�?n�p��� ?a��� P ���p������S���� =p���? p��� S~�=malloc�����=p���? &���AX������<p��� @�����p��� ?p���Sp��� ���Sp���? p��� ���Sp���  ���S~�=dec64�����=p��� p��� ?p���Sp��� ���Sp������ @p������S~�=betomp�����=p��� ?p���S~�=free�����=p��� @����������~�> from32���� >(���Ap��� @ p���  W������<W������<W����#��<C���� s���Q s��� ���>&������AO������<W������<p���  p���  @���  p��� ?p������ @p���Sp��� ?a��� Pp������S���� =p���? p��� S����=p���? &���AX����5��<p��� @�����p��� ?p���Sp��� ���Sp���? p��� ���Sp���  ���S~�=!dec32�����!=p��� p��� ?p���Sp��� ���Sp������ @p������S����=p��� ?p���S����=p��� @����������~�="strtomp����"=���Ap��� ��� @ p��� @ &��� AX����S��<p���AS����=p��� @ p��� p��� ��� @&���>AX����X��<����>p��� ��� @ p��� @ W����[��<W����[��<W����d��<r���Q&��� ���AO����b��<r���Q&��� ���AO����b��<W����Z��<C���� W����Y��<p������A ~�?#sign�p��� #?W����j��<W����i��<W����t��<C���� W����o��<W����s��<���� p��� #?W����g��<r���Q&���-���AO����l��<W����k��<W����h��<W������<W������<p���  @p��� Sp��� ���S����>p��� W����u��<p���  @p��� Sp��� ���S����>p��� W����u��<p���  @p��� Sp��� ���S���� >p��� W����u��<p���  @p��� Sp��� ���S����>p��� W����u��<~�@$base�p������$@&��� ���AO����v��<&������AO����|��<&��� ���AO������<&���@���AO������<W����|��<~�?%e�p��� %?&���  @X������<p���A�����p��� ��� @p���S~�=&mpnorm�����&=p��� ��� @ ~�@'pp�p������'@ p���#? p��� R&��� AO������<p���%? p��� Qp��� ����������5���>(���A5���>��A5���> ���A5���>!���A5���>!���A5���>A���AI����mptobe.8 1201053985 0 0 664 1913 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mptobe.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mptobe����=,���A~�@p�p������@ &��� AX���� ���<~�@b�p���@p������O������A ������A~�@n�p������@p���S~�=malloc�����=p��� &��� AX�������<p���A�����~�@pp�&��� ���@AO�������<p��� ���@p��� Op��� ���@p��� Sp���A���Sp������@p������S~�=memset�����=p������@ p������@ p���@p������O&���AX����'���<&��� ���AL����%���<p���A�����W����'���<p������A�����~�?s�p��� ?p���? p���  a��� Q~�? e�p��� ?p������Ap���@p������O/����W����4���<W����3���<W����X���</����&���AU����2���<p���@p��� ���Oa���Op���O~�? x�p��� ?p������A W����@���<W����?���<W����W���<������A &��� AU����>���<p���  p��� ?��� o��� s��� &���AX����K���<&���AX����L���<W����M���<W����=���<&���  ?M����Q���<p���A�����p��� C���� s���  o��� Op���AW����=���<W����1���<p���?&��� X����b���<&���  ?M����_���<p���A�����p��� C���� o���AOp��� ���?����������I����mptole.8 1201053986 0 0 664 1823 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mptole.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mptole����=(���A~�@p�p������@ &��� AX���� ���<~�@b�p���@p������O������A ������A~�@n�p������@p���S~�=malloc�����=p��� ~�@pp�&��� ���@AO�������<p��� ���@p��� O&��� AX�������<p���A�����p��� ���@p��� Sp���A���Sp������@p������S~�=memset�����=p������@ p������@ p���@p������O&���AX����'���<&��� ���AL����%���<p���A�����W����'���<p���A�����~�?s�p��� ?p���? p���  a��� Qp���p���AW����1���<W����0���<W����K���<C����p���@p������O/����&���P����/���<p���@p��� ���Oa���Op���O p���A W����?���<W����>���<W����J���<C���� &��� ���AP����=���<&��� M����E���<p���A�����p��� C���� o��� O������A W����<���<W����.���<p���@p��� ���Oa���Op���O W����R���<W����R���<W����]���<&��� AT����Q���<&��� M����X���<p���A�����p��� C���� o��� O������A W����P���<p��� ���?����������I����betomp.8 1201053986 0 0 664 1544 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<betomp.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=betomp����=���A~�@b�p������@ ~�@p�p���@ ~�@n�p������@ &��� AX���� ���<p���AS~�=mpnew�����=p���@ p������@ p��� W�������<W�������<W�������<p��� @s���Q&���AX�������<&��� ���AR�������<W���� ���<C���� /���� W���� ���<p��� ���@p��� Sp��� p��� ���@������Ap������S~�=mpbits�����=p���@p������@p���������A ������A������Ap������@ p������Pp������@p������O /���� p���/����������A ������Ap��� p���A W����4���<W����3���<W����H���</����&���AT����2���<p���C����s���Op���  ��� ��� ������A &��� AP����G���<p��� /���� p������@ p��� ���P a���Pp��� Op������A p���A W����1���<p������@����������I����letomp.8 1201053986 0 0 664 1372 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<letomp.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=letomp����=���A~�@b�p������@ ~�?i�p���A?~�?m�p���A?~�?x�p���A?&��� AX���� ���<p���AS~�=mpnew�����=p��� p��� ���@p��� S~�@n�p������@������Ap������S~�=mpbits�����=p������@~�@ s�p��� @p���? p���? p���? W�������<W�������<W����-���</����&���AT�������<p���C����s���Op���  ��� ��� ������A &���  ���AX����,���<p��� C���� p������@ p��� ���P a���Pp��� Op���A p���A W�������<&��� AS����5���<p��� C���� p������@ p��� ���P a���Pp��� Op������@p��� ���Op������@����������I����mpadd.8 1201053987 0 0 664 1872 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpadd.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpmagadd����=(���A~�@b2�p������@ ~�@sum�p������@ ~�@b1�p���@ p������Tp������Q &��� S���� ���<p���  p���  p���  p��� @p������Q p��� ���@p������T&��� AX�������<~�=mpzero�p���=p���Sp��� ���S~�=mpassign�����=�����&���A~�?m�p���?X�������<p��� Sp��� ���S����=�����p��� Sp��� ~�?n�p��� ?������A ��� ���Ap������S~�= mpbits����� =p���? p������@ p���  C���� p��� ���Qp���@p��� ���Op���Sp��� ���Sp������@p��� ���Op������Sp���?p��� ���Sp��� ���Qp������S~�= mpvecadd����� =p������@ p������APp��� S~�= mpnorm����� =�����~�= mpadd���� =���Ap������@ p������@ p���@ p���Qp���R &��� O����O���<p���Q&���AP����J���<p��� Sp��� ���Sp��� ���S~�= mpmagsub����� =W����N���<p��� Sp��� ���Sp��� ���S���� =W����\���<p���Q~�?sign�p���?p��� Sp��� ���Sp��� ���S����=p������@ p������P&���AO����\���<p��� p���? p��� O�����I����mpsub.8 1201053987 0 0 664 1881 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpsub.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpmagsub����=,���A~�@b1�p���@ p��� S~�@b2�p������@ p��� ���S~�=mpmagcmp�����=p������@~�@diff�p������@ p���@ &���AP�������<~�?sign�p���A?p���  p��� p��� W�������<p������A?p��� @p������Q p������@p������U&���A~�?m�p���?X�������<p��� Sp��� ���S~�=mpassign�����=p������@p���? p��� O�����p��� Sp��� ~�? n�p���  ?������Ap������S~�= mpbits����� =p���@p��� ���Op���Sp��� ?p������Sp������@p��� ���Op������Sp���?p��� ���Sp������@p��� ���Op������S~�= mpvecsub����� =p������@ p���? p��� Qp��� ? p��� ���Qp��� S~�= mpnorm����� =�����~�= mpsub���� =���Ap������@ p������@ p���@ p���Qp���R &��� O����M���<p���Qp���?p��� Sp��� ���Sp��� ���S~�=mpmagadd�����=p������@p���? p��� O�����p���Qp���?p��� Sp��� ���Sp��� ���S����=p������@ p������Q&���AO����Z���<p���Q=���?p���Q�����I����mpcmp.8 1201053988 0 0 664 1153 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpcmp.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpmagcmp����=���A~�@b1�p���@ ~�@b2�p������@ p������Rp������Q ��� &���AO���� ���<�����p��� ���R p��� Sp������R p��� ���Sp��� ���Q p��� ���Sp������Q p���  ���S~�=mpveccmp�����=����������~�=mpcmp����= ���Ap������@ p���@ p���Qp���R &��� O�������<p���Qp���R ��� �����p���Q&���AP����'���<p��� Sp��� ���S����=�����W����+���<p��� Sp��� ���S����=����������I����mpfactorial.8 1201053988 0 0 664 3994 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpfactorial.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<include�~�E<libsec.h�7�����~�E<libsec.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7� ����7�g����~�=mpfactorial��"��=���A~�?cnt�p�+��A?p�,��A~�?mmax�p�,��?~�?max�p�,��?~�?p�p�-�����A?p�.��AS~�=mpnew��.���=p�.��? ~�?r�p�.��?~�?k�p�/�����A?W�/������<W�/������<W�/������<C�/���?p�/��?~�@ n�&�/�� @R�/��� ���<~�? pp�p�0��A ?p�1��A ?a�2��?p�2��Sp�2�����Ap�2�����Sp�2��?p�2�����Sa�2�� ?p�2�� ���S~�= mpvecdigmuladd��2��� =p�2��? &�3�� ?AX�3���#���<p�4�� ?p�4��?W�4������<C�6���?p�7��? �7�����A&�7��AX�7���q���<~�? stk�p�8�� \ ? p�9��?p�9��S~�? s�p�9��  ?p�9�����P�9�����A �9��@���Ap�9�����S~�=mpbits��9���=p�:��?p�:�� ���Op�:��Sp�:��A���Sp�:�� ?p�:�����O�:�����A �:�����Ap�:�����S~�=memset��:���=p�:�� ? p�;�� ���Pp�;��Sp�;�����Pp�;�����Sa�;��?p�;�����Sp�;�����Ap�;�� ���Sp�;��?p�;�� ���Op�;�����S~�=mpvecmul��;���=p�;�� ? p�;��? p�<�����AQp�=�����R �=�����A p�=�� ���Qp�>�� Sp�>�� ���S~�=mpassign��>���=p�>��? p�?�����A W�?���X���<W�?���V���<W�?���p���<~�?i�p�?��? �?��  p�?�� p�?�� ?/�?���p�?��? �?�� &�?�� AX�?���U���<p�@�� \ ?p�@��Sp�@�� X ?p�@�����Sp�@��?p�@�����S~�=mpmul��@���=p�A��?p�A��Sp�A��? p�A�� X ?p�A�����S�A���=p�A��? /�B��� p�B�� ?W�B���T���<W�B������<C�E��� &�F�� ?S�F���~���<C�G���?&�H�� ���Ap�H�� ?S�H���y���<~�=abort��I���=p�J�� ���A p�J�� S�J���=p�J��? p�J�� \ ?p�L�� \ ?p�L�����A���Op�M�� ?p�M�� \ ?p�M�� ���Op�M��? p�M�� Op�O��?p�O��?W�O��� ���<&�R�� AP�R������<p�S��?p�S��Sp�S�� ���Ap�S�����S�S���=p�S��? p�S��? p�T�����A���Rp�U�����ARp�V�� ���Rp�V��? p�V�� OW�V������<p�X�� /�X��� p�X�� ?a�X��\ ? a�X��Pp�X��O p�Y��?p�Y��Sp�Y��  ?p�Y�����P�Y�����A �Y��@���Ap�Y�����S�Y���=p�Z��?p�Z�� ���Op�Z��Sp�Z��A���Sp�Z�� ?p�Z�����O�Z�����A �Z�����Ap�Z�����S�Z���=p�Z�� ? p�[�� ���Pp�[��Sp�[�����Pp�[�����Sa�[��?p�[�����Sp�[�����Ap�[�� ���Sp�[��?p�[�� ���Op�[�����S�[���=p�[��? p�[��? p�\�����ARp�]�� ? p�]�����P �]�����A p�]�� ���RW�`������<W�`������<W�`������<&�`�� AU�`������<p�a�� Sp�a�� /�a��� p�a�� ?a�a��\ ? a�a��Pp�a��Op�a�����Sp�a�� ���S�a���=p�a��? p�a��? W�a������<p�b��? W�b������<W�b������<W�b������</�b��� &�b�� AU�b������<p�c�� ?p�c�� \ ?p�c��S~�=mpfree��c���=p�c��? p�c��? W�c������<p�d�� S~�=mpnorm��d���=p�e��?�e�����e����Ie����mpmul.8 1201053989 0 0 664 6502 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpmul.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�F����~�>mpkaratsuba����>\���A~�@a�p���@~�@b�p������@~�@alen�p������@ ~�@blen�p��� ���@ p��� &��� ���A���A������Ap��� p���  ������A&���AO�������<C���� ~�?u0len�p��� ?p��� ��� ~�?u1len�p���?&���  S�������<p���  p��� ��� ~�?v1len�p���?W�������<p���  p���A?~�? u0�p��� ?p���? a��� V~�? u1�p��� ?~�? v0�p��� ?~�? v0len�p���  ?a��� U~�? v1�p��� ?~�?n�p��� ?a��� R ������A ������A p��� Sp������A p��� ���S~�=mallocz�����=p���? p��� &���A~�?t�p���?X����6���<~�>.string�-���;> mpkarats-���;���> uba: %r�p���>�Dp���S~�=sysfatal�����=p���? p���? ~�?u0v0�p��� ?a��� R ������A~�?u1v1�p���?p���  ������A a��� R ������A~�?diffprod�p���?p���  a��� P ������A a��� R ��� ���A~�?res�p���?p��� ������AC����~�?reslen�p���?~�?sign�p������A?p��� ? p��� Sp���? p��� ���Sp��� ? p��� ���Sp���? p���  ���S~�=mpveccmp�����=p��� ? p��� ? p���? p���? &���AP����b���<p���A?p��� Sp���?p������Sp��� ���Sp���  ���Sp��� ���S~�=mpvecsub�����=W����h���<p��� Sp��� ���Sp��� ���Sp���  ���Sp��� ���S����=p��� ? p��� Sp��� ? p��� ���Sp��� ? p��� ���Sp���? p���  ���S����=p��� ? p��� ? p���? p���? &���AP�������<p���?����p���?p��� Sp��� ���Sp��� ���Sp���  ���Sp��� ���S����=W�������<p��� Sp��� ?p������Sp��� ���Sp���  ���Sp��� ���S����=p���?p���Sp���?p������Sp���?p������Sp��� ?p��� ���Sp���?p������S~�=mpvecmul�����=p���?p���Sp���A���Sp���?������A ������Ap������S~�=memset�����=p���? &��� AS�������<p��� ?p���Sp���?p������Sp��� ?p������Sp���  ���Sp���?p������S����=p��� ?p���Sp���?p������Sp��� ?p������Sp��� ?p��� ���Sp���?p������S����=p���? p��� Sp���?p������Sp���?p������Sp���? ��� ?p��� ���Sp��� ���S~�=mpvecadd�����=p���? p���? a��� Qp���Sp���?��� p������Sp���?p������Sp���? ��� ?p��� ���Sa��� Qp������S����=p���?p���?p���? p���? &���AS�������<p���  a��� Qp���Sp������ p������Sp���?p������Sp���? ���p��� ���Sp���  a��� Qp������S����=p���? p���? a��� Qp���Sp���  ���p���? ��� p��� ���Sp���?p������Sp���? ���?p��� ���Sa��� Qp������S����=p���?p���? p���? &���?AP������<p���  a��� Qp���Sp������ p������Sp���?p������Sp���? ��� ?p��� ���Sp���  a��� Qp������S����=W������<p���  a��� Qp���Sp������ p������Sp���?p������Sp���? ��� ?p��� ���Sp���  a��� Qp������S����=~�@p�p������@p���Sp���?p������Sp������@ ��� ���@������Ap������S~�=memmove�����=p���?p���S~�= free����� =��������=(���Ap������@p������@p��� ���@ &��� P����1��<p��� p��� p���  p���@ p������@p���@p��� ���@&��� AX����;��<p���Sp���A���Sp��� ��� ������Ap������S����=�����&�"�� ���AU�"���?��<&�"�� ���AQ�"���@��<W�"���I��<p�$��@p�$��Sp�$�����Sp�$�����@p�$�����Sp�$��  ���Sp�$�����S�$���>W�$���c��<p�'��A W�'���N��<W�'���M��<W�'���c��<C�'��� &�'��  p�'��  ���@P�'���L��<p�(�����@ p�(�� Q &�)�� AO�)���b��<p�*��@p�*��Sp�*�����@p�*�����Sp�*�� ���S~�?!i�p�*�� !?a�*�� Up�*�� ���S~�="mpvecdigmuladd��*���"=p�*�����@p�*�����@p�*�� ���@ p�*��!? W�*���K��<�*����~�=#mpmul��0��#= ���A~�@$prod�p�0�����$@ ~�?%oprod�p�4��A%?~�@&b1�&�5�� &@O�5���l��<~�@'b2�&�5�� ���'@O�5���l��<W�5���p��<p�6�� %?p�7��AS~�=(mpnew��7���(=p�7�� p�:��A���Pp�;�� ���$@p�;�� Sp�;��&@p�;�����Op�;�����'@ p�;�����P �;�� �;�����A �;�� ���Ap�;�����S~�=)mpbits��;���)=p�;��&@ p�;�����'@ p�<�� ���Rp�<��Sp�<�����Rp�<�����Sp�<�� ���Pp�<�����Sp�<�����Pp�<�� ���Sp�<�����$@p�<�� ���Op�<�����S�<���=p�<��&@p�<�����'@ p�<�����$@ p�=�����Tp�=�����U �=�� C�=���p�=�����Rp�>��Up�>��T =�>�� �p�>��Rp�?�� S~�=*mpnorm��?���*=p�?��%? &�A�� AO�A�����<p�B�����$@p�B��Sp�B�� ���S~�=+mpassign��B���+=p�C�����$@p�C��S~�=,mpfree��C���,=�C����5�C��>���AIC����mpleft.8 1201053989 0 0 664 2267 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpleft.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpleft����=0���A~�@shift�p������@~�@res�p������@ ~�@b�p���@ p���R p��� Tp������R&���AX���� ���<p���A���T�����&���AP�������<p��� Sp�������p������Sp��� ���S~�=mpright�����=�����p������Rp��� S~�?otop�p���?������A ���p������S~�=mpbits�����=p������@ p���?p������@ p���������A ���  ������A����� ������A ��� ������Ap������Tp��� ����� ������A ��� ������Ap���������Ap���  ��� ~�?l�p��� ?p��� ���A���?~�? r�p��� ?&���?AX����G���</����W����;���<W����:���<W����F���</����&���AU����9���<a���Up��� ���T a���Pp���@ p��� ���P a���P p���P p��� OW����8���<W����g���<p���A /����W����M���<W����L���<W����a���</����&���AU����K���<p���@p��� ���Oa���Op���O~�? this�p��� ?p���? p��� ��� p��� ? p��� ? ���  ��� a���U p��� ���T a��� Q p������Pp��� ? W����J���<p��� ���Ta���Op���? p���  ���  p��� Op���A W����l���<W����k���<W����r���<C���� &��� P����j���<p��� ���Ta��� Op���AOW����i���<W����u���<W����u���<W�������<p������T&���AS����~���<p������Tp��� ���T a���Pp���O&���AO�������<W����t���</�������TW����s���<�����I����mpright.8 1201053990 0 0 664 2355 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpright.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpright����=,���A~�@shift�p������@ ~�@b�p���@~�@res�p������@p���U p��� Op������U&���AX���� ���<p������@p���A���O�����&��� AP�������<p���Sp��� ����p������Sp������@p������S~�=mpleft�����=�����p������@&���O����"���<p������@p���Sp������U������A��� p������S~�=mpbits�����=p������@ p���@p��� ����� ������A ��� ������Ap���������Ap���  ��� ~�?r�p��� ?p��� ���A���?~�?l�p���?p������U&���U����5���<p������@p���A���O�����&���?AX����K���<p���A W����<���<W����;���<W����J���<C���� p������U���&��� P����:���<p������@p��� ���Oa��� Op���  a���R p��� ���U a��� Q p���P p��� OW����9���<W����t���<p��� ���Ua���Op���O p���A W����S���<W����R���<W����k���<C���� p������U���/����&��� P����Q���<p���  a���Qp��� ���U a���Pp������O~�? this�p��� ?p���? p��� ?��� p���? p���  ���  ��� p������@ p��� ���P a��� P p���Pp��� ? W����P���<p��� C���� p������@ p��� ���P a���Pp���? p���  ���  p��� OW����w���<W����w���<W�������<&��� AS�������<p������@p��� ���Oa��� Op���O&���AO�������<W����v���</���� W����u���<p������@p��� ���O&��� AX�������<p������@p������AO�����I����mpveccmp.8 1201053990 0 0 664 1270 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpveccmp.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpveccmp����=���A~�@b�p������@~�@a�p���@~�@blen�p��� ���@ ~�@alen�p������@ W�������<W�������<W�������<&���  S�������</���� a��� Up���O&���AO�������<p������A�����W�������<W�������<W�������<W�������<&���  S�������</���� a��� Vp���O&���AO�������<p���A�����W�������<W����"���<W����"���<W����2���<&��� AS����!���</���� p��� U��� V&���AX����*���<W���� ���<&��� UT����/���<p���A�����W����1���<p������A�����W���� ���<p���A����������I����mpdiv.8 1201053991 0 0 664 4794 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpdiv.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpdiv����=H���A~�@divisor�p������@p������O&���AX�������<~�=abort�����=~�@dividend�p���@ p��� Sp������@ p��� ���S~�=mpmagcmp�����=p������@ p���@ ~�@remainder�p��� ���@ &���AP�������<&��� AO�������<p��� Sp��� ���S~�=mpassign�����=~�@quotient�&������@AO�������<~�= mpzero�p��� =p���Sp������@p������S����=�����p������Qp��� ���Q a���Pp���O~�? qd�p��� ?p���A W����'���<W����&���<W����-���<C���� p��� ? ������A&���AX����%���<������A ?W����$���<p������R ������A ���  ~�? s�p���  ? ���@���A p��� S~�= mpnew����� =p������@ p���@ p��� ? p��� &��� AX����<���<&��� ���@X����=���<W����?���<&���  ���@X����@���<W����G���<p��� S~�? u�p���  ?p��� ���S����=p��� ?p������@ W����[���<p��� Sp��� ���Sp���  ?p��� ���S~�=mpleft�����=p������@ p������P ������A p��� S���� =p��� p������@p���Sp��� ?p������S~�?v�p��� ?p��� ���S����=p��� ?p���? p������U p��� ���U a��� P ���A p������T p��� ���T a��� P ���A p��� ?p������T~�?vn�p���?~�?up�p��� ?p���R~�?vp�p��� ?p���Q &��� M����p���< ������A p��� ?p���ARC�������Up������A p��� S���� =p���? p���? ~�?t�p���?p���A ~�?qp�p��� ?&������@AO�������<p������@p���Sp��� ?p������Op���? p������P ��� ������Ap������S~�=mpbits�����=p���? p���? p��� ?p������Op���? p������P ��� p������@ p������Pp������@p������O p������@ p��� ���P a��� P ���A p��� ?p��� ?p������O~�?j�p���?W�������<W�������<W������</����?p���?&��� S�������<p��� p��� ? ���Ap���Sp���?p���Op������Sa��� ?p������S~�=mpdigdiv�����=p���? &��� ���AS�������<W�������<W�������<W�������<p���?p��� ���Op���Sp���A���Sp��� ���Ap������S~�=memset�����=p���? ���Ap���Sp������Ap������Sp��� ?p������Sp���?p��� ���Op��� ���S~�=mpvecdigmuladd�����=p���? p��� ���P p��� Sp������A p��� ���Sp���? ���A p��� ���Sp������A p���  ���S~�=mpveccmp�����=p���? &���AS�������</���� ?W�������<W�������<W�������<p���? p��� ���P p��� Sp��� ���Sp��� ? p��� ���Sp���  ������A p���? ���  p���  ���S~�=mpvecdigmulsub�����=p���? p���? p���? &���AP�������<p��� ������Ap���  ��� p��� Sp��� C����p������Sp���?p��� ���Op������Sp���  ���Sp��� ������Ap���  ��� p��� ���S~�=mpvecadd�����=p���? p���? p���? /���� ?&��� AO�������<p���  ���A p��� ?p��� ? p��� Op��� ?/�������Op���  ���A p���AOW�������<&� �� AO� �����<p� �����@p� ��S~�=mpnorm�� ���=p� ��@p� ��Op� �����@ p� ��P &� �� O� �����<p� �����@p� ��AO&��� ���@AO���� ��<p��� ?p���Sp��� ?p������Sp��� ���@p������S~�=mpright�����=p��� ���@p���@ p���P p��� Op���?p���S~�=mpfree�����=p��� ?p���S����=p���? &��� ���@O����+��<p��� S����=�����I����mpexp.8 1201053991 0 0 664 3586 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpexp.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpexp����=0���A~�@e�p������@ p��� S~�=mpzero�p���= p��� ���S~�=mpcmp�����=&���AX�������<~�=mpone�p���=p���S~�@res�p��� ���@p������S~�=mpassign�����=�����&���AP�������<~�>.string�-���;> mpexp: n-���;���> egative -���;���> exponentp���>�Dp���S~�= sysfatal����� =~�@ b�p��� @ p��� S~�= mpcopy����� =p��� @ ~�@ m�p������ @~�? t�p��� ?p��� ���@p��� ?~�?tofree�p���A?p��� ���@&��� X����$���<p��� S���� =p������ @p��� @������A?p��� ���@&������@X����-���<p������@ p��� S���� =p������ @p������@������A?p��� ���@&���X����5���<p���S���� =p���p������ @������A?p������@p������O/����~�?i�p���?p������@p��� ���Op���? a��� Op���O p������A W����C���<W����B���<W����I���<������A p���  ��� ~�?d�p��� ?&���AX����A���<W����@���<������A p���A W����N���<W����N���<W�������<W����R���<W����Q���<W�������<������A &��� A~�?bit�p��� ?O����P���<p���  ?p���Sp���  ?p������Sp���  ~�?j�p��� ?������A p���  ?p������S~�=mpmul�����=p������ @p���? p���? p���  ���?&���AO����s���<p���  ������A p���  ?p���Sp��� @p������Sp���  ?p������S����=p������ @p���? p���? W����t���<������A &���AO����{���<p���  ?p������Op������U &��� Q����|���<W�������<p���  ?p���Sp������Sp���  p��� ?������A p���  ?p������S~�=mpmod�����=p������ @p���? p���? ������A W����O���</����?p���?&���AP�������<W����M���<p������A p������@p��� ���Op���? a��� Op���Op���?W����L���<&���AO�������<p���  ?p���Sp������Sp���  p��� ?������A p���  ?p������S����=p���? ������A p���  ?&��� ���@X�������<p���  ������A p���  ?p���S~�=mpfree�����=W�������<p��� ?p���  ?p���Sp��� ���@p������S����=p���? p���  ?p���S����=&���?AO�������<p����? �������A&����AO��������<p��� @p���S����=p���? ������A&���AO�������<p������@p���S����=p���? ������A&���AO�������<p������ @p���S����=�����-���;���> ��������5���> ���AI����mpmod.8 1201053992 0 0 664 892 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpmod.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=mpmod����=���A~�@b�p���@p���S~�@m�p������@p������Sp���A���S~�@remainder�p������@p��� ���S~�=mpdiv�����=p������@ p���P&���AP�������<p������@p���Sp��� ���Sp��� ���S~�=mpadd�����=�����I����mpextendedgcd.8 1201053992 0 0 664 4654 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpextendedgcd.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����7�����~�=mpextendedgcd����=,���A~�@b�p������@ ~�@v�p������@ ~�@a�p���@ p���Q&���AU���� ���<p���R&���AU���� ���<W�������<~�=mpzero�p���=p���Sp��� ���S~�=mpassign�����=p���=p���S~�@y�p������@p������S����=p���=p���S~�@x�p��� ���@p������S����=�����p������Q&���AX����+���<p��� Sp��� ���S����=~�= mpone�p��� =p���Sp������@p������S����=p���=p���Sp��� ���@p������S����=�����p������R&���AX����<���<p��� Sp��� ���S����=p��� =p���Sp��� ���@p������S����=p���=p���Sp������@p������S����=�����~�? g�p���A ?p��� S~�= mpcopy����� =p���@p������@ p��� S���� =p���@ p������@W����H���<W����H���<W����b���<p��� ���Qp���O ������A&���AX����S���<p������@p��� ���Op���O ������A&���AO����T���<W����G���<p��� Sp������Ap������Sp��� ���S~�= mpright����� =p������@ p��� Sp������Ap������Sp��� ���S���� =p���@ C���� ?W����F���<p��� S���� =~�? u�p��� ?p������@p���Sp������@p������S����=p��� = p��� S���� =~�?A�p���?p���= p��� S���� =~�?B�p���?p���= p��� S���� =~�?C�p���?p��� = p��� S���� =p������@ p��� ? ~�?D�p���?W�������<W�������<W������<W�������<W�������<W�������<p��� ���Qp���O ������A&���AX�������<p��� Sp������Ap������Sp��� ���S���� =p���? p��� ���Pp���O ������A&���AX�������<p���?p��� ���Op���O ������A&���AX�������<W�������<p��� Sp������@p������Sp��� ���S~�=mpadd�����=p���? p��� Sp���@p������Sp��� ���S~�=mpsub�����=p���? p��� Sp������Ap������Sp��� ���S���� =p���? p��� Sp������Ap������Sp��� ���S���� =p������@ p��� ? W�������<W�������<W�������<W�������<p��� ���Rp���O ������A&���AX�������<p��� Sp������Ap������Sp��� ���S���� =p���? p��� ���Pp���O ������A&���AX�������<p���?p��� ���Op���O ������A&���AX�������<W�������<p��� Sp������@p������Sp��� ���S����=p���? p��� Sp���@p������Sp��� ���S����=p���? p��� Sp������Ap������Sp��� ���S���� =p���? p��� Sp������Ap������Sp��� ���S���� =p������@ p��� ? W�������<p��� Sp��� ���S~�=mpcmp�����=p������@ p��� ? &���AU������<p��� Sp��� ���Sp��� ���S����=p���? p��� Sp���?p������Sp��� ���S����=p���? p��� Sp���?p������Sp��� ���S����=p������@ p��� ? W������<p��� Sp��� ���Sp��� ���S����=p���? p��� Sp���?p������Sp��� ���S����=p���? p��� Sp���?p������Sp��� ���S����=p������@ p��� ? p������Q&���AX������<W����~���<W����}���<p���?p���Sp��� ���@p������S����=p���?p���Sp������@p������S����=p������@ p��� Sp��� ?p������Sp��� ���S~�=mpleft�����=p���?p���S~�=mpfree�����=p���?p���S����=p����?p����S�����=p���?p���S����=p��� ?p���S����=p���@p���S����=p������@p���S����=����������I����mpinvert.8 1201053993 0 0 664 1128 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mpinvert.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����7�����~�=mpinvert����=$���Ap���AS~�=mpnew�����=~�?dc1�p���?p���AS����=p��� ~�@b�p���@p���S~�@m�p������@p������Sp���?p������S~�@res�p������@p��� ���S~�?dc2�p��� ?p��� ���S~�=mpextendedgcd�����=p���? p��� S~�= mpone�p��� = p��� ���S~�= mpcmp����� =&���AO�������<~�= abort����� =p������@p���Sp������@p������Sp������@p������S~�= mpmod����� =p���?p���S~�= mpfree����� =p���?p���S���� =�����I����mprand.8 1201053993 0 0 664 1776 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mprand.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<include�~�E<libsec.h�7�����~�E<libsec.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7� ����7�F����~�=mprand��"��=$���A~�@b�p�"�����@ ~�@bits�p�"��@p�(�� �(�����A�(���� �(�����A �(�� �(�����A~�?n�p�(��?&�)�� AX�)������<p�*�� S~�=mpnew��*���=p�*�����@W�*������<p�,�� Sp�,�� ���S~�=mpbits��,���=p�.��? �.�����A p�.�� S~�=malloc��.���=&�/��AX�/������<p�0��A�0����~�?p�p�1��?p�1��Sp�1��?�1�����Ap�1�����S~�@ gen�p�1����� @�1���p�2��?p�2��Sp�2��?�2�����Ap�2�����Sp�2�����@p�2�����S~�= betomp��2��� =p�3��?p�3��S~�= free��3��� =p�3�����@ p�3��? p�6��@�6���� �6�����A �6��  �6�����A�6�� /�7��� &�8��AS�8���?���<p�9�����Ap�:�� �:�� /�;���p�<�� ���Ta�<�� O �<��OW�?���C���<W�?���B���<W�?���L���</�?��� &�?�� AU�?���A���<p�@�� ���Ta�@�� Op�@��O&�@��AO�@���K���<W�A���A���<W�A���@���<p�B��  C�B��� p�B�� ���Tp�C�����ATp�D�� �D�����D����ID����crt.8 1201053994 0 0 664 4940 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<crt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<include�~�E<libsec.h�7�����~�E<libsec.a�7����A7�����7�����~�=crtpre��#��=$���A~�@n�p�)��@ a�)�� P a�)�� P �)�����A �)�����A p�)�� S~�=malloc��)���=p�)��@p�)�� &�*��A~�?crt�p�*��?X�*������<~�>.string�-�+��;> crtpre: p�+��>�Dp�+��S~�=sysfatal��+���=p�+��@p�+��? p�,��  �,�����A p�,�� ���Tp�-��  a�-��R �-�����A p�-�� ���Tp�.�����Ta�.��Op�.�� ���Tp�/��Tp�2��A W�2���"���<W�2���!���<W�2���0���<C�2��� &�2�� P�2��� ���<~�?i�p�3�� ?~�@m�p�3�����@ p�3�� R p�3�� S~�= mpcopy��3��� =p�3��@p�3��? p�3��? p�3�����P a�3�� P p�3��PW�3������<~�= mpone�p�6�� = p�6�� S�6��� =p�6��~�? u�p�6�� ?p�7��A W�7���:���<W�7���9���<W�7���M���<C�7��� &�7�� @P�7���8���<p�8��Sp�8�� ?p�8�����@ p�8�� Qp�8�����Sp�8�����S~�= mpmul��8��� =p�9�� ? p�9�� S�9��� =p�9�� ?p�9��? p�9��? p�9�� ���P a�9�� P p�9��PW�9���7���<p�=�����A W�=���R���<W�=���Q���<W�=������<C�=��� p�=�� ?&�=�� @P�=���P���<p�>�� = p�>�� S�>��� =p�>�� ?p�>�����@p�>��? p�>��? p�>�����P a�>�� P p�>��Pp�?��A W�?���d���<W�?���c���<W�?������<C�?��� &�?��  P�?���b���<~�? j�p�@��  ?p�@�� Up�@��Sp�@�� Up�@�����Sp�@�����S~�=mpinvert��@���=p�@�� ? p�A�� Sp�A��?p�A�����Op�A��? a�A�� Op�A��Op�A�����Sp�A�� ���S�A��� =p�A��? p�B�� ?p�B��Sp�B�����@ p�B�� Qp�B�����Sp�B��?p�B�����Oa�B�� Op�B��Op�B�����S~�=mpmod��B���=p�B�� ?p�B�����@p�B�� ? p�B��? W�B���a���<W�B���O���<p�F��S~�=mpfree��F���=p�H��?�H�����H����~�=crtprefree��L��=���A~�@crt�p�L��@ p�P��A W�P������<W�P������<W�P������<C�P��� p�P��P&�P�� P�P������<&�Q�� AO�Q������<p�R�����Pp�R�� ?a�R�� Op�R��Op�R��S�R���=p�R��@ p�R��? p�S�� ���Pp�S�� ?a�S�� Op�S��Op�S��S�S���=p�T��@p�T�����Op�T��? a�T�� Op�T��Op�T��S�T���=p�T��@ p�T��? W�T������<p�V�� S~�=free��V���=�V����~�=crtin��[��=���Ap�`��@ p�`��P a�`�� P �`�����A �`�����A p�`�� S�`���=p�`�� &�a��A~�?res�p�a��?X�a������<-�b��;���> %r�crtinp�b��>� ���Dp�b��S�b���=p�b��? p�c��@ p�c��P p�c�� Qp�d��A W�d������<W�d������<W�d������<C�d��� p�d��Q&�d�� p�d�� ?P�d������<p�e��AS~�=mpnew��e���=p�e��?p�e��? a�e�� U p�e�����P~�@x�p�f�����@p�f��Sp�f��@p�f�����Oa�f�� Op�f��Op�f�����Sa�f�� Up�f�����Op�f�����S�f���=p�f��? p�f��? W�f������<p�h�� �h�����h����~�=crtout��m��=���Ap�r��AS�r���=p�r�� ?~�@res�p�s�����@p�s�����Op�s��Sp�s�����@p�s�����S~�=mpassign��s���=p�u�����A W�u������<W�u������<W�u���,��<C�u��� p�u��@p�u��O&�u�� P�u������<p�v��  p�v�� ?p�v�����@ a�v�� Qp�v�����Op�v��Sp�v�����@p�v�����Sp�v�� ?p�v�����S~�=mpsub��v���=p�v�� ? p�w�� Sp�w��@p�w�����Op�w��? a�w�� Op�w��Op�w�����Sp�w�� ���S�w��� =p�w�� ? p�x�� Sp�x��@p�x�����Op�x��? a�x�� Op�x��Op�x�����Sp�x�� ���S�x���=p�x�� ? p�y�� Sp�y��@p�y�� ���Op�y��? a�y�� Op�y��Op�y�����Sp�y�� ���S�y��� =p�y�����@ p�z�� Sp�z�� ?p�z�����Sp�z�� ���S~�=mpadd��z���=p�z��? W�z������<p�}�� ?p�}��S�}���=�}����~�=crtresfree����=���Ap���@ p���A W����7��<W����6��<W����B��<C���� p���R&��� P����5��<p��� ?a��� Rp������Op���S����=p���@ p���? W����4��<p��� S����=�����-���;���> : %r����5���>���AI����mptoi.8 1201053994 0 0 664 1420 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mptoi.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=itomp����= ���A~�@b�p������@ &��� AX�������<p���AS~�=mpnew�����=p��� ~�=mpzero�p���=p���Sp��� ���@p��� ���S~�=mpassign�����=~�@i�p���@ p������@ &��� AO�������<p������A���Q&��� AP�������<p���AQp��� ���Qp���  ���� p��� OW�������<p��� ���Qp��� Op��� ����������~�=mptoi����=���Ap���@ p������Q&���AX����%���<p���A�����p��� ���Qp���O p���Q&���AS����3���<p������Q&������AQ����0���<&��� AR����0���<W����2���<p���A W����2���<W����<���<p������Q&������AQ����9���<&��� ���AR����9���<W����;���<p������A W����<���<���� p��� ����������I����mptoui.8 1201053995 0 0 664 1155 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mptoui.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=uitomp����= ���A~�@b�p������@ &��� AX�������<p���AS~�=mpnew�����=p��� ~�=mpzero�p���=p���Sp��� ���@p��� ���S~�=mpassign�����=~�@i�p���@ p������@ &��� AO�������<p������A���Qp��� ���Qp��� Op��� ����������~�=mptoui����=���Ap���@ p��� ���Qp���O p���Q&���AP�������<p���A W����&���<p������Q&������AQ����%���<&��� AR����%���<W����&���<p���A p��� ����������I����mptov.8 1201053995 0 0 664 2903 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mptov.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=vtomp����=���A~�@b�p������@ &��� AX���� ���<p������A p��� S~�=mpnew�����=p������@W���� ���<p��� Sp������Ap������S~�=mpbits�����=~�=mpzero�p���=p���Sp������@p������S~�=mpassign�����=p������@ ~�@v�p���@&���AX�������<p������@&���AX�������<W�������<W�������<W�������<p��� �����p������@&���AQ����'���<X����(���<p���@&���AL����'���<W����(���<W����(���<W����1���<p���ATp���@p������@ ���� �������A ~�?uv�p���?p��� ?W����5���<p���@p���?p������@p���?p���A W����:���<W����9���<W����N���<C���� &��� ���AP����E���<p���?&���AX����D���<p���?&���AX����D���<W����E���<W����E���<W����F���<W����8���<p��� ���Ta��� Op���? p��� Op���?p���A?p���?W����7���<p��� ���Tp��� ����������~�= mptov���� =���Ap������@ p������P&���AX����[���<~�@ .ret�p��� @p���AOp���A���O�����p��� S~�= mpnorm����� =p������@p������U&������AS����m���<p���U&���AS����i���<p��� @p���AOp���A���O�����W����m���<p��� @p���AOp������A���O�����~�? v�p���A ?p���A ?p���A W����t���<W����s���<W�������<C���� p������U&��� P����r���<p���  ������A p��� ���Up���  p���  a��� Op���O��� p���A ��� ?���  ?W����q���<p���U&���AS�������<p��� ?&���AR�������<X�������<p��� ?&���AR�������<W�������<W�������<W�������<p���A ?p���A ?W�������<p��� ?&������AR�������<X�������<p��� ?&���AR�������<W�������<W�������<W�������<p���A ?p������A ?W�������<p��� ?p��� ? ���� �������A p��� ?p���  ?p��� @ p��� ?p���Pp��� ?p������P����������I����mptouv.8 1201053996 0 0 664 2070 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<mptouv.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=uvtomp����=���A~�@b�p������@ &��� AX���� ���<p������A p��� S~�=mpnew�����=p������@W���� ���<p��� Sp������Ap������S~�=mpbits�����=~�=mpzero�p���=p���Sp������@p������S~�=mpassign�����=p������@ ~�@v�p���@&���AX�������<p������@&���AX�������<W�������<W�������<W�������<p��� �����p���A W����#���<W����"���<W����7���<C���� &��� ���AP����.���<p���@&���AX����-���<p������@&���AX����-���<W����.���<W����.���<W����/���<W����!���<p��� ���Ta��� Op���@ p��� Op������@p���A���@p���@W���� ���<p��� ���Tp��� ����������~�=mptouv����=���Ap������@ p������P&���AX����D���<~�@ .ret�p��� @p���AOp���A���O�����p��� S~�= mpnorm����� =p������@ p������T&������AS����N���<p��� @p���AOp���A���O�����~�? v�p���A ?p���A ?p���A W����U���<W����T���<W����i���<C���� p������T&��� P����S���<p��� ���Ta��� Op���Op���A p���  ������A &���  ���AP����c���<����  ��� W����f���<��� p��� p���A��� ?���  ?W����R���<p��� @ p��� ?p���Pp��� ?p������P����������I����mpvecadd.8 1201053998 0 0 664 573 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<Plan9-386�~�E<mpvecadd.s�7������7�6�����~�=mpvecadd�����=A~�@alen�p� ������@ ~�@blen�p� ��� ���@ ~�@a�p� ���@~�@b�p�������@ ����  ~�@sum�p�������@����  ����  ~�<_add1�O��������<p���� U���� Rp���� VC����� ~�<_addloop1�j����� ���<C� ���� p�"���  ~�< _addloop2�j�#������� <~�< _addcarry�M�'������� <p�(���A V�)�����p�+������A V�,�����p�0��� U�0���Ap�2��� VC�2���� j�4������� <~�< _addend�W�5������� <I6�����mpvecdigmuladd.81201053998 0 0 664 508 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<Plan9-386�~�E<mpvecdigmuladd.s�7������7�5�����~�=mpvecdigmuladd�����=A~�@b�p����@~�@n�p�������@ ~�@m�p�������@ ~�@p�p���� ���@p����  ����� � ������A � ���  �!��� �"���  p�%��� U|�&��� � �&��� ~�<_muladdnocarry1�L�(�������<C�(���� �*��� V~�<_muladdnocarry2�L�,�������<C�,���� p�/���  C�/���� ~�<_muladdloop�X�1���� ���<�1��� �2���  V�3����5�����I5�����mpvecdigmulsub.81201053999 0 0 664 523 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<Plan9-386�~�E<mpvecdigmulsub.s�7������7�6�����~�=mpvecdigmulsub�����=A~�@b�p����@~�@n�p�������@ ~�@m�p�������@ ~�@p�p���� ���@����  � ��� �p�"��� U|�#��� � �#���S~�<_mulsubnocarry1�L�%���� ���<C�%���� �'��� V~�<_mulsubnocarry2�L�)�������<C�)���� p�,��� SC�,���� ~�<_mulsubloop�j�.�������<�.�����/��� V~�< _mulsubnocarry3�L�1������� <p�2���A�3�����p�5������A�6�����I6�����mpvecsub.8 1201053999 0 0 664 492 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<Plan9-386�~�E<mpvecsub.s�7������7�-�����~�=mpvecsub�����=A~�@a�p� ���@~�@b�p� ������@ ~�@alen�p� ������@ ~�@blen�p���� ���@ ~�@diff�p�������@����  ����  ����  ~�<_sub1�O��������<p���� U���� Rp���� VC����� ~�<_subloop1�j����� ���<C����� p�!���  ~�< _subloop2�j�"������� <�#�����p�'��� U�'���Ap�)��� VC�)���� j�+������� <�,�����I-�����mpdigdiv.8 1201053999 0 0 664 363 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<Plan9-386�~�E<mpdigdiv.s�7������7������~�=mpdigdiv�����=A~�@dividend�p����@ p����Rp�������R ~�@divisor�p�������@ ~�@quotient�p�������@ ����  &� ���  ~�<_divovfl�L� �������<&� ���  O� �������<2���� �p����T����������� p���� T������I����������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7old_contrib//root/sys/src/cmd/limbo/libmp/mkfile���������������������������������������������������� 664 � 0 � 0 � 1443 10745513044 21030�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������</$objtype/mkfile # TARGMODEL not SYSTARG for now DIRS=port Plan9-$objtype %:QV: for (j in $DIRS) { { test -d $j && { echo '@{builtin cd' $j ';' mk $MKFLAGS $stem '}' @{builtin cd $j; mk $MKFLAGS $stem} } } || test ! -e $j } # the remainder are only intended for testing on a few system types test.$O: test.c port/lib9.h ../include/mp.h port/dat.h $CC -Iport test.c $O.test: test.$O libmp.a $LD -o $O.test test.$O bigtest.$O: bigtest.c port/lib9.h ../include/mp.h port/dat.h $CC -Iport bigtest.c $O.bigtest: bigtest.$O libmp.a $LD -o $O.bigtest bigtest.$O allout: objtype=386; OBJTYPE=$objtype; mk; mk 8.test 8.bigtest objtype=power; OBJTYPE=$objtype; mk; mk q.test q.bigtest objtype=mips; OBJTYPE=$objtype; mk; mk v.test v.bigtest cleanout: rm -f [qv8].* *.[qv8] E<sys�~�E<include�~�E<mp.h�7�����~�E<libmp.a�7����A7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<port�~�E<dat.h�7�����7�����7�����~�=uitomp����= ���A~�@b�p������@ &old_contrib//root/sys/src/cmd/limbo/libmp/mtest.c��������������������������������������������������� 664 � 0 � 0 � 1515 10224715035 21132�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <u.h> #include <libc.h> #include <mp.h> #include "port/dat.h" int loops = 1; long randomreg; void srand(long seed) { randomreg = seed; } long lrand(void) { randomreg = randomreg*104381 + 81761; return randomreg; } void prng(uchar *p, int n) { while(n-- > 0) *p++ = lrand(); } void testshift(char *str) { mpint *b1, *b2; int i; b1 = strtomp(str, nil, 16, nil); malloccheck(); fprint(2, "A"); b2 = mpnew(0); fprint(2, "B"); malloccheck(); mpleft(b1, 20, b2); fprint(2, "C"); malloccheck(); mpfree(b1); fprint(2, "D"); malloccheck(); mpfree(b2); } void main(int argc, char **argv) { mpint *x, *y; ARGBEGIN{ case 'n': loops = atoi(ARGF()); break; }ARGEND; fmtinstall('B', mpfmt); fmtinstall('Q', mpfmt); srand(0); mpsetminbits(2*Dbits); testshift("1111111111111111"); print("done\n"); exits(0); } ����=~�=mpzero�p���=p���Sp������@p������S~�=mpassign�����=p������@ ~�@v�p���@&���AX�������<p������@&���AX��old_contrib//root/sys/src/cmd/limbo/libmp/port/����������������������������������������������������� 775 � 0 � 0 � 0 11411740006 20607��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/betomp.c��������������������������������������������� 664 � 0 � 0 � 1101 10224715036 22240�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // convert a big-endian byte array (most significant byte first) to an mpint mpint* betomp(uchar *p, uint n, mpint *b) { int m, s; mpdigit x; if(b == nil) b = mpnew(0); // dump leading zeros while(*p == 0 && n > 1){ p++; n--; } // get the space mpbits(b, n*8); b->top = DIGITS(n*8); m = b->top-1; // first digit might not be Dbytes long s = ((n-1)*8)%Dbits; x = 0; for(; n > 0; n--){ x |= ((mpdigit)(*p++)) << s; s -= 8; if(s < 0){ b->p[m--] = x; s = Dbits-8; x = 0; } } return b; } �����AR�������<X�������<p��� ?&���AR�������<W�������<W�������<W�������<p���A ?p������A ?W�������<p��� ?p��� ? ���� �������A p��� ?p���  ?p��� @ p��� ?p���Pp��� ?p������P����������I����mptouv.8 1201053996 0 0 664 2070 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limboold_contrib//root/sys/src/cmd/limbo/libmp/port/crt.c������������������������������������������������ 664 � 0 � 0 � 4002 10224715036 21545�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // chinese remainder theorem // // handbook of applied cryptography, menezes et al, 1997, pp 610 - 613 struct CRTpre { int n; // number of moduli mpint **m; // pointer to moduli mpint **c; // precomputed coefficients mpint **p; // precomputed products mpint *a[1]; // local storage }; // setup crt info, returns a newly created structure CRTpre* crtpre(int n, mpint **m) { CRTpre *crt; int i, j; mpint *u; crt = malloc(sizeof(CRTpre)+sizeof(mpint)*3*n); if(crt == nil) sysfatal("crtpre: %r"); crt->m = crt->a; crt->c = crt->a+n; crt->p = crt->c+n; crt->n = n; // make a copy of the moduli for(i = 0; i < n; i++) crt->m[i] = mpcopy(m[i]); // precompute the products u = mpcopy(mpone); for(i = 0; i < n; i++){ mpmul(u, m[i], u); crt->p[i] = mpcopy(u); } // precompute the coefficients for(i = 1; i < n; i++){ crt->c[i] = mpcopy(mpone); for(j = 0; j < i; j++){ mpinvert(m[j], m[i], u); mpmul(u, crt->c[i], u); mpmod(u, m[i], crt->c[i]); } } mpfree(u); return crt; } void crtprefree(CRTpre *crt) { int i; for(i = 0; i < crt->n; i++){ if(i != 0) mpfree(crt->c[i]); mpfree(crt->p[i]); mpfree(crt->m[i]); } free(crt); } // convert to residues, returns a newly created structure CRTres* crtin(CRTpre *crt, mpint *x) { int i; CRTres *res; res = malloc(sizeof(CRTres)+sizeof(mpint)*crt->n); if(res == nil) sysfatal("crtin: %r"); res->n = crt->n; for(i = 0; i < res->n; i++){ res->r[i] = mpnew(0); mpmod(x, crt->m[i], res->r[i]); } return res; } // garners algorithm for converting residue form to linear void crtout(CRTpre *crt, CRTres *res, mpint *x) { mpint *u; int i; u = mpnew(0); mpassign(res->r[0], x); for(i = 1; i < crt->n; i++){ mpsub(res->r[i], x, u); mpmul(u, crt->c[i], u); mpmod(u, crt->m[i], u); mpmul(u, crt->p[i-1], u); mpadd(x, u, x); } mpfree(u); } // free the residue void crtresfree(CRTres *res) { int i; for(i = 0; i < res->n; i++) mpfree(res->r[i]); free(res); } ,�����p�0��� U�0���Ap�2��� VC�2���� j�4������� <~�< _addend�W�5������� <I6�����mpvecdigmuladd.81201053998 0 0 664 508 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<Plan9-386�~�E<mpvecdigmuladd.s�7������7�5�����~�=mpvecdigmuladd�����=A~�@b�p����@~�@n�p�������@ ~�@m�p�������@ ~�@p�p���� ���@p����  ����� � ������A � ���  �!��� �"���  p�%��� U|�&��� � �&��� ~�<_muladdnocarry1�L�(�������<C�(��old_contrib//root/sys/src/cmd/limbo/libmp/port/crttest.c�������������������������������������������� 664 � 0 � 0 � 1455 10224715036 22456�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> void testcrt(mpint **p) { CRTpre *crt; CRTres *res; mpint *m, *x, *y; int i; fmtinstall('B', mpconv); // get a modulus and a test number m = mpnew(1024+160); mpmul(p[0], p[1], m); x = mpnew(1024+160); mpadd(m, mpone, x); // do the precomputation for crt conversion crt = crtpre(2, p); // convert x to residues res = crtin(crt, x); // convert back y = mpnew(1024+160); crtout(crt, res, y); print("x %B\ny %B\n", x, y); mpfree(m); mpfree(x); mpfree(y); } void main(void) { int i; mpint *p[2]; long start; start = time(0); for(i = 0; i < 10; i++){ p[0] = mpnew(1024); p[1] = mpnew(1024); DSAprimes(p[0], p[1], nil); testcrt(p); mpfree(p[0]); mpfree(p[1]); } print("%d secs with more\n", time(0)-start); exits(0); } 0 664 363 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libmp�~�E<Plan9-386�~�E<mpdigdiv.s�7������7������~�=mpdigdiv�����=A~�@dividend�p����@ p����Rp�������R ~�@divisold_contrib//root/sys/src/cmd/limbo/libmp/port/dat.h������������������������������������������������ 664 � 0 � 0 � 557 10242672666 21540�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define mpdighi (mpdigit)((ulong)1<<(Dbits-1)) #define DIGITS(x) ((Dbits - 1 + (x))/Dbits) // for converting between int's and mpint's #define MAXUINT ((uint)-1) #define MAXINT (MAXUINT>>1) #define MININT (MAXINT+1) // for converting between vlongs's and mpint's #define MAXUVLONG (~(uvlong)0) #define MAXVLONG (MAXUVLONG>>1) #define MINVLONG (MAXVLONG+(uvlong)1) �������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/letomp.c��������������������������������������������� 664 � 0 � 0 � 660 10224715036 22243�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // convert a little endian byte array (least significant byte first) to an mpint mpint* letomp(uchar *s, uint n, mpint *b) { int i=0, m = 0; mpdigit x=0; if(b == nil) b = mpnew(0); mpbits(b, 8*n); for(; n > 0; n--){ x |= ((mpdigit)(*s++)) << i; i += 8; if(i == Dbits){ b->p[m++] = x; i = 0; x = 0; } } if(i > 0) b->p[m++] = x; b->top = m; return b; } ��������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/lib9.h����������������������������������������������� 664 � 0 � 0 � 41 10745513070 21562�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <u.h> #include <libc.h> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mkfile����������������������������������������������� 664 � 0 � 0 � 1137 10745513352 22016�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������</$objtype/mkfile LIB=../libmp.a FILES=\ mpaux\ mpfmt\ strtomp\ mptobe\ mptole\ betomp\ letomp\ mpadd\ mpsub\ mpcmp\ mpfactorial\ mpmul\ mpleft\ mpright\ mpvecadd\ mpvecsub\ mpvecdigmuladd\ mpveccmp\ mpdigdiv\ mpdiv\ mpexp\ mpmod\ mpextendedgcd\ mpinvert\ mprand\ crt\ mptoi\ mptoui\ mptov\ mptouv\ ALLOFILES=${FILES:%=%.$O} # cull things in the per-machine directories from this list OFILES= `{rc ./reduce-rc $O Plan9-$objtype $ALLOFILES } HFILES=\ lib9.h\ ../../include/mp.h\ dat.h\ CFILES=${FILES:%=%.c} UPDATE=mkfile\ $HFILES\ $CFILES\ </sys/src/cmd/mksyslib ����� 664 � 0 � 0 � 1101 10224715036 22240�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpadd.c���������������������������������������������� 664 � 0 � 0 � 1417 10224715036 22051�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // sum = abs(b1) + abs(b2), i.e., add the magnitudes void mpmagadd(mpint *b1, mpint *b2, mpint *sum) { int m, n; mpint *t; // get the sizes right if(b2->top > b1->top){ t = b1; b1 = b2; b2 = t; } n = b1->top; m = b2->top; if(n == 0){ mpassign(mpzero, sum); return; } if(m == 0){ mpassign(b1, sum); return; } mpbits(sum, (n+1)*Dbits); sum->top = n+1; mpvecadd(b1->p, n, b2->p, m, sum->p); sum->sign = 1; mpnorm(sum); } // sum = b1 + b2 void mpadd(mpint *b1, mpint *b2, mpint *sum) { int sign; if(b1->sign != b2->sign){ if(b1->sign < 0) mpmagsub(b2, b1, sum); else mpmagsub(b1, b2, sum); } else { sign = b1->sign; mpmagadd(b1, b2, sum); if(sum->top != 0) sum->sign = sign; } } ��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpaux.c���������������������������������������������� 664 � 0 � 0 � 5132 10224715036 22114�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" static mpdigit _mptwodata[1] = { 2 }; static mpint _mptwo = { 1, 1, 1, _mptwodata, MPstatic }; mpint *mptwo = &_mptwo; static mpdigit _mponedata[1] = { 1 }; static mpint _mpone = { 1, 1, 1, _mponedata, MPstatic }; mpint *mpone = &_mpone; static mpdigit _mpzerodata[1] = { 0 }; static mpint _mpzero = { 1, 1, 0, _mpzerodata, MPstatic }; mpint *mpzero = &_mpzero; static int mpmindigits = 33; // set minimum digit allocation void mpsetminbits(int n) { if(n < 0) sysfatal("mpsetminbits: n < 0"); if(n == 0) n = 1; mpmindigits = DIGITS(n); } // allocate an n bit 0'd number mpint* mpnew(int n) { mpint *b; if(n < 0) sysfatal("mpsetminbits: n < 0"); b = mallocz(sizeof(mpint), 1); if(b == nil) sysfatal("mpnew: %r"); n = DIGITS(n); if(n < mpmindigits) n = mpmindigits; b->p = (mpdigit*)mallocz(n*Dbytes, 1); if(b->p == nil) sysfatal("mpnew: %r"); b->size = n; b->sign = 1; return b; } // guarantee at least n significant bits void mpbits(mpint *b, int m) { int n; n = DIGITS(m); if(b->size >= n){ if(b->top >= n) return; memset(&b->p[b->top], 0, Dbytes*(n - b->top)); b->top = n; return; } b->p = (mpdigit*)realloc(b->p, n*Dbytes); if(b->p == nil) sysfatal("mpbits: %r"); memset(&b->p[b->top], 0, Dbytes*(n - b->top)); b->size = n; b->top = n; } void mpfree(mpint *b) { if(b == nil) return; if(b->flags & MPstatic) sysfatal("freeing mp constant"); memset(b->p, 0, b->size*Dbytes); // information hiding free(b->p); free(b); } void mpnorm(mpint *b) { int i; for(i = b->top-1; i >= 0; i--) if(b->p[i] != 0) break; b->top = i+1; if(b->top == 0) b->sign = 1; } mpint* mpcopy(mpint *old) { mpint *new; new = mpnew(Dbits*old->size); new->top = old->top; new->sign = old->sign; memmove(new->p, old->p, Dbytes*old->top); return new; } void mpassign(mpint *old, mpint *new) { mpbits(new, Dbits*old->top); new->sign = old->sign; new->top = old->top; memmove(new->p, old->p, Dbytes*old->top); } // number of significant bits in mantissa int mpsignif(mpint *n) { int i, j; mpdigit d; if(n->top == 0) return 0; for(i = n->top-1; i >= 0; i--){ d = n->p[i]; for(j = Dbits-1; j >= 0; j--){ if(d & (((mpdigit)1)<<j)) return i*Dbits + j + 1; } } return 0; } // k, where n = 2**k * q for odd q int mplowbits0(mpint *n) { int k, bit, digit; mpdigit d; if(n->top==0) return 0; k = 0; bit = 0; digit = 0; d = n->p[0]; for(;;){ if(d & (1<<bit)) break; k++; bit++; if(bit==Dbits){ if(++digit >= n->top) return 0; d = n->p[digit]; bit = 0; } } return k; } t; CRTres *res; mpint *m, *x, *y; int i; fmtinstall('B', mpconv); // get a modulus and a test number m = mpnew(1024+160); mpmul(p[0], p[1], m); x = mpnew(1024+160); mpadd(m, mpone, x); // do the precomputation for crt conversion crt = crtpre(2, p); // convert x to residues res = crtin(crt, x); // convert back y = mpnew(1024+160); crtout(crt, res, y); print("x %B\ny %B\n", x, y); mpfree(m); mpfreold_contrib//root/sys/src/cmd/limbo/libmp/port/mpcmp.c���������������������������������������������� 664 � 0 � 0 � 721 10224715036 22055�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // return neg, 0, pos as abs(b1)-abs(b2) is neg, 0, pos int mpmagcmp(mpint *b1, mpint *b2) { int i; i = b1->top - b2->top; if(i) return i; return mpveccmp(b1->p, b1->top, b2->p, b2->top); } // return neg, 0, pos as b1-b2 is neg, 0, pos int mpcmp(mpint *b1, mpint *b2) { if(b1->sign != b2->sign) return b1->sign - b2->sign; if(b1->sign < 0) return mpmagcmp(b2, b1); else return mpmagcmp(b1, b2); } �����������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpdigdiv.c������������������������������������������� 664 � 0 � 0 � 1334 10224715036 22565�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // // divide two digits by one and return quotient // void mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient) { mpdigit hi, lo, q, x, y; int i; hi = dividend[1]; lo = dividend[0]; // return highest digit value if the result >= 2**32 if(hi >= divisor || divisor == 0){ divisor = 0; *quotient = ~divisor; return; } // at this point we know that hi < divisor // just shift and subtract till we're done q = 0; x = divisor; for(i = Dbits-1; hi > 0 && i >= 0; i--){ x >>= 1; if(x > hi) continue; y = divisor<<i; if(x == hi && y > lo) continue; if(y > lo) hi--; lo -= y; hi -= x; q |= 1<<i; } q += lo/divisor; *quotient = q; } b = mpnew(0); mpbits(b, 8*n); for(; n > 0; n--){ x |= ((mpdigit)(*s++)) << i; i += 8; if(i == Dbits){ b->p[m++] = x; i = 0; x = 0; } } if(i > 0) b->p[m++] = x; b->top = m; return b; } ��������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpdiv.c���������������������������������������������� 664 � 0 � 0 � 4567 10224715036 22114�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // division ala knuth, seminumerical algorithms, pp 237-238 // the numbers are stored backwards to what knuth expects so j // counts down rather than up. void mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) { int j, s, vn, sign; mpdigit qd, *up, *vp, *qp; mpint *u, *v, *t; // divide bv zero if(divisor->top == 0) abort(); // quick check if(mpmagcmp(dividend, divisor) < 0){ if(remainder != nil) mpassign(dividend, remainder); if(quotient != nil) mpassign(mpzero, quotient); return; } // D1: shift until divisor, v, has hi bit set (needed to make trial // divisor accurate) qd = divisor->p[divisor->top-1]; for(s = 0; (qd & mpdighi) == 0; s++) qd <<= 1; u = mpnew((dividend->top+2)*Dbits + s); if(s == 0 && divisor != quotient && divisor != remainder) { mpassign(dividend, u); v = divisor; } else { mpleft(dividend, s, u); v = mpnew(divisor->top*Dbits); mpleft(divisor, s, v); } up = u->p+u->top-1; vp = v->p+v->top-1; vn = v->top; // D1a: make sure high digit of dividend is less than high digit of divisor if(*up >= *vp){ *++up = 0; u->top++; } // storage for multiplies t = mpnew(4*Dbits); qp = nil; if(quotient != nil){ mpbits(quotient, (u->top - v->top)*Dbits); quotient->top = u->top - v->top; qp = quotient->p+quotient->top-1; } // D2, D7: loop on length of dividend for(j = u->top; j > vn; j--){ // D3: calculate trial divisor mpdigdiv(up-1, *vp, &qd); // D3a: rule out trial divisors 2 greater than real divisor if(vn > 1) for(;;){ memset(t->p, 0, 3*Dbytes); // mpvecdigmuladd adds to what's there mpvecdigmuladd(vp-1, 2, qd, t->p); if(mpveccmp(t->p, 3, up-2, 3) > 0) qd--; else break; } // D4: u -= v*qd << j*Dbits sign = mpvecdigmulsub(v->p, vn, qd, up-vn); if(sign < 0){ // D6: trial divisor was too high, add back borrowed // value and decrease divisor mpvecadd(up-vn, vn+1, v->p, vn, up-vn); qd--; } // D5: save quotient digit if(qp != nil) *qp-- = qd; // push top of u down one u->top--; *up-- = 0; } if(qp != nil){ mpnorm(quotient); if(dividend->sign != divisor->sign) quotient->sign = -1; } if(remainder != nil){ mpright(u, s, remainder); // u is the remainder shifted remainder->sign = dividend->sign; } mpfree(t); mpfree(u); if(v != divisor) mpfree(v); } �����������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpeuclid.c������������������������������������������� 664 � 0 � 0 � 2415 10224715036 22565�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> // extended euclid // // For a and b it solves, d = gcd(a,b) and finds x and y s.t. // ax + by = d // // Handbook of Applied Cryptography, Menezes et al, 1997, pg 67 void mpeuclid(mpint *a, mpint *b, mpint *d, mpint *x, mpint *y) { mpint *tmp, *x0, *x1, *x2, *y0, *y1, *y2, *q, *r; if(a->sign<0 || b->sign<0) sysfatal("mpeuclid: negative arg"); if(mpcmp(a, b) < 0){ tmp = a; a = b; b = tmp; tmp = x; x = y; y = tmp; } if(b->top == 0){ mpassign(a, d); mpassign(mpone, x); mpassign(mpzero, y); return; } a = mpcopy(a); b = mpcopy(b); x0 = mpnew(0); x1 = mpcopy(mpzero); x2 = mpcopy(mpone); y0 = mpnew(0); y1 = mpcopy(mpone); y2 = mpcopy(mpzero); q = mpnew(0); r = mpnew(0); while(b->top != 0 && b->sign > 0){ // q = a/b // r = a mod b mpdiv(a, b, q, r); // x0 = x2 - qx1 mpmul(q, x1, x0); mpsub(x2, x0, x0); // y0 = y2 - qy1 mpmul(q, y1, y0); mpsub(y2, y0, y0); // rotate values tmp = a; a = b; b = r; r = tmp; tmp = x2; x2 = x1; x1 = x0; x0 = tmp; tmp = y2; y2 = y1; y1 = y0; y0 = tmp; } mpassign(a, d); mpassign(x2, x); mpassign(y2, y); mpfree(x0); mpfree(x1); mpfree(x2); mpfree(y0); mpfree(y1); mpfree(y2); mpfree(q); mpfree(r); mpfree(a); mpfree(b); } ic }; mpint *mpone = &_mpone; static mpdigit _mpzerodata[1] = { 0 }; static mpint _mpzero = { 1, 1, 0, _mpzerodata, MPstatic }; mpint *mpzero = &_mpzero; static int mpmindigits = 33; // set minimum digit allocation void mpsetminbits(inold_contrib//root/sys/src/cmd/limbo/libmp/port/mpexp.c���������������������������������������������� 664 � 0 � 0 � 2365 10224715036 22120�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // res = b**e // // knuth, vol 2, pp 398-400 enum { Freeb= 0x1, Freee= 0x2, Freem= 0x4, }; //int expdebug; void mpexp(mpint *b, mpint *e, mpint *m, mpint *res) { mpint *t[2]; int tofree; mpdigit d, bit; int i, j; i = mpcmp(e,mpzero); if(i==0){ mpassign(mpone, res); return; } if(i<0) sysfatal("mpexp: negative exponent"); t[0] = mpcopy(b); t[1] = res; tofree = 0; if(res == b){ b = mpcopy(b); tofree |= Freeb; } if(res == e){ e = mpcopy(e); tofree |= Freee; } if(res == m){ m = mpcopy(m); tofree |= Freem; } // skip first bit i = e->top-1; d = e->p[i]; for(bit = mpdighi; (bit & d) == 0; bit >>= 1) ; bit >>= 1; j = 0; for(;;){ for(; bit != 0; bit >>= 1){ mpmul(t[j], t[j], t[j^1]); if(bit & d) mpmul(t[j^1], b, t[j]); else j ^= 1; if(m != nil && t[j]->top > m->top){ mpmod(t[j], m, t[j^1]); j ^= 1; } } if(--i < 0) break; bit = mpdighi; d = e->p[i]; } if(m != nil){ mpmod(t[j], m, t[j^1]); j ^= 1; } if(t[j] == res){ mpfree(t[j^1]); } else { mpassign(t[j], res); mpfree(t[j]); } if(tofree){ if(tofree & Freeb) mpfree(b); if(tofree & Freee) mpfree(e); if(tofree & Freem) mpfree(m); } } + 1; } } return 0; } // k, where n = 2**k * q for odd q int mplowbits0(mpint *n) { int k, bit, digit; mpdigit d; if(n->top==0) return 0; k = 0; bit = 0; digit = 0; d = n->p[0]; for(;;){ if(d & (1<<bit)) break; k++; bit++; if(bit==Dbits){ old_contrib//root/sys/src/cmd/limbo/libmp/port/mpextendedgcd.c�������������������������������������� 664 � 0 � 0 � 3313 10224715036 23574�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #define iseven(a) (((a)->p[0] & 1) == 0) // extended binary gcd // // For a anv b it solves, v = gcd(a,b) and finds x and y s.t. // ax + by = v // // Handbook of Applied Cryptography, Menezes et al, 1997, pg 608. void mpextendedgcd(mpint *a, mpint *b, mpint *v, mpint *x, mpint *y) { mpint *u, *A, *B, *C, *D; int g; if(a->sign < 0 || b->sign < 0){ mpassign(mpzero, v); mpassign(mpzero, y); mpassign(mpzero, x); return; } if(a->top == 0){ mpassign(b, v); mpassign(mpone, y); mpassign(mpzero, x); return; } if(b->top == 0){ mpassign(a, v); mpassign(mpone, x); mpassign(mpzero, y); return; } g = 0; a = mpcopy(a); b = mpcopy(b); while(iseven(a) && iseven(b)){ mpright(a, 1, a); mpright(b, 1, b); g++; } u = mpcopy(a); mpassign(b, v); A = mpcopy(mpone); B = mpcopy(mpzero); C = mpcopy(mpzero); D = mpcopy(mpone); for(;;) { // print("%B %B %B %B %B %B\n", u, v, A, B, C, D); while(iseven(u)){ mpright(u, 1, u); if(!iseven(A) || !iseven(B)) { mpadd(A, b, A); mpsub(B, a, B); } mpright(A, 1, A); mpright(B, 1, B); } // print("%B %B %B %B %B %B\n", u, v, A, B, C, D); while(iseven(v)){ mpright(v, 1, v); if(!iseven(C) || !iseven(D)) { mpadd(C, b, C); mpsub(D, a, D); } mpright(C, 1, C); mpright(D, 1, D); } // print("%B %B %B %B %B %B\n", u, v, A, B, C, D); if(mpcmp(u, v) >= 0){ mpsub(u, v, u); mpsub(A, C, A); mpsub(B, D, B); } else { mpsub(v, u, v); mpsub(C, A, C); mpsub(D, B, D); } if(u->top == 0) break; } mpassign(C, x); mpassign(D, y); mpleft(v, g, v); mpfree(A); mpfree(B); mpfree(C); mpfree(D); mpfree(u); mpfree(a); mpfree(b); return; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpfactorial.c���������������������������������������� 664 � 0 � 0 � 2527 10224715037 23271�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> #include "dat.h" mpint* mpfactorial(ulong n) { int i; ulong k; unsigned cnt; int max, mmax; mpdigit p, pp[2]; mpint *r, *s, *stk[31]; cnt = 0; max = mmax = -1; p = 1; r = mpnew(0); for(k=2; k<=n; k++){ pp[0] = 0; pp[1] = 0; mpvecdigmuladd(&p, 1, (mpdigit)k, pp); if(pp[1] == 0) /* !overflow */ p = pp[0]; else{ cnt++; if((cnt & 1) == 0){ s = stk[max]; mpbits(r, Dbits*(s->top+1+1)); memset(r->p, 0, Dbytes*(s->top+1+1)); mpvecmul(s->p, s->top, &p, 1, r->p); r->sign = 1; r->top = s->top+1+1; /* XXX: norm */ mpassign(r, s); for(i=4; (cnt & (i-1)) == 0; i=i<<1){ mpmul(stk[max], stk[max-1], r); mpassign(r, stk[max-1]); max--; } }else{ max++; if(max > mmax){ mmax++; if(max > nelem(stk)) abort(); stk[max] = mpnew(Dbits); } stk[max]->top = 1; stk[max]->p[0] = p; } p = (mpdigit)k; } } if(max < 0){ mpbits(r, Dbits); r->top = 1; r->sign = 1; r->p[0] = p; }else{ s = stk[max--]; mpbits(r, Dbits*(s->top+1+1)); memset(r->p, 0, Dbytes*(s->top+1+1)); mpvecmul(s->p, s->top, &p, 1, r->p); r->sign = 1; r->top = s->top+1+1; /* XXX: norm */ } while(max >= 0) mpmul(r, stk[max--], r); for(max=mmax; max>=0; max--) mpfree(stk[max]); mpnorm(r); return r; } remainder) { mpassign(dividend, u); v = divisor; } else { mpleft(dividend, s, u); v = mpnew(divisor->top*Dbits); mpleft(divisor, s, v); } up = u->p+u->top-1old_contrib//root/sys/src/cmd/limbo/libmp/port/mpfmt.c���������������������������������������������� 664 � 0 � 0 � 5251 10224715037 22110�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> #include "dat.h" static int to64(mpint *b, char *buf, int len) { uchar *p; int n, rv; p = nil; n = mptobe(b, nil, 0, &p); if(n < 0) return -1; rv = enc64(buf, len, p, n); free(p); return rv; } static int to32(mpint *b, char *buf, int len) { uchar *p; int n, rv; // leave room for a multiple of 5 buffer size n = b->top*Dbytes + 5; p = malloc(n); if(p == nil) return -1; n = mptobe(b, p, n, nil); if(n < 0) return -1; // round up buffer size, enc32 only accepts a multiple of 5 if(n%5) n += 5 - (n%5); rv = enc32(buf, len, p, n); free(p); return rv; } static char set16[] = "0123456789ABCDEF"; static int to16(mpint *b, char *buf, int len) { mpdigit *p, x; int i, j; char *out, *eout; if(len < 1) return -1; out = buf; eout = buf+len; for(p = &b->p[b->top-1]; p >= b->p; p--){ x = *p; for(i = Dbits-4; i >= 0; i -= 4){ j = 0xf & (x>>i); if(j != 0 || out != buf){ if(out >= eout) return -1; *out++ = set16[j]; } } } if(out == buf) *out++ = '0'; if(out >= eout) return -1; *out = 0; return 0; } static char* modbillion(int rem, ulong r, char *out, char *buf) { ulong rr; int i; for(i = 0; i < 9; i++){ rr = r%10; r /= 10; if(out <= buf) return nil; *--out = '0' + rr; if(rem == 0 && r == 0) break; } return out; } static int to10(mpint *b, char *buf, int len) { mpint *d, *r, *billion; char *out; if(len < 1) return -1; d = mpcopy(b); r = mpnew(0); billion = uitomp(1000000000, nil); out = buf+len; *--out = 0; do { mpdiv(d, billion, d, r); out = modbillion(d->top, r->p[0], out, buf); if(out == nil) break; } while(d->top != 0); mpfree(d); mpfree(r); mpfree(billion); if(out == nil) return -1; len -= out-buf; if(out != buf) memmove(buf, out, len); return 0; } int mpfmt(Fmt *fmt) { mpint *b; char *p; b = va_arg(fmt->args, mpint*); if(b == nil) return fmtstrcpy(fmt, "*"); p = mptoa(b, fmt->prec, nil, 0); fmt->flags &= ~FmtPrec; if(p == nil) return fmtstrcpy(fmt, "*"); else{ fmtstrcpy(fmt, p); free(p); return 0; } } char* mptoa(mpint *b, int base, char *buf, int len) { char *out; int rv, alloced; alloced = 0; if(buf == nil){ len = ((b->top+1)*Dbits+2)/3 + 1; buf = malloc(len); if(buf == nil) return nil; alloced = 1; } if(len < 2) return nil; out = buf; if(b->sign < 0){ *out++ = '-'; len--; } switch(base){ case 64: rv = to64(b, out, len); break; case 32: rv = to32(b, out, len); break; default: case 16: rv = to16(b, out, len); break; case 10: rv = to10(b, out, len); break; } if(rv < 0){ if(alloced) free(buf); return nil; } return buf; } pfree(x2); mpfree(y0); mpfree(y1); mpfree(y2); mpfree(q); mpfree(r); mpfree(a); mpfree(b); } ic }; mpint *mpone = &_mpone; static mpdigit _mpzerodata[1] = { 0 }; static mpint _mpzero = { 1, 1, 0, _mpzerodata, MPstatic }; mpint *mpzero = &_mpzero; static int mpmindigits = 33; // set minimum digit allocation void mpsetminbits(inold_contrib//root/sys/src/cmd/limbo/libmp/port/mpinvert.c������������������������������������������� 664 � 0 � 0 � 612 10224715037 22605�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #define iseven(a) (((a)->p[0] & 1) == 0) // use extended gcd to find the multiplicative inverse // res = b**-1 mod m void mpinvert(mpint *b, mpint *m, mpint *res) { mpint *dc1, *dc2; // don't care dc1 = mpnew(0); dc2 = mpnew(0); mpextendedgcd(b, m, dc1, res, dc2); if(mpcmp(dc1, mpone) != 0) abort(); mpmod(res, m, res); mpfree(dc1); mpfree(dc2); } ����������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpleft.c��������������������������������������������� 664 � 0 � 0 � 1612 10224715037 22251�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // res = b << shift void mpleft(mpint *b, int shift, mpint *res) { int d, l, r, i, otop; mpdigit this, last; res->sign = b->sign; if(b->top==0){ res->top = 0; return; } // a negative left shift is a right shift if(shift < 0){ mpright(b, -shift, res); return; } // b and res may be the same so remember the old top otop = b->top; // shift mpbits(res, otop*Dbits + shift); // overkill res->top = DIGITS(otop*Dbits + shift); d = shift/Dbits; l = shift - d*Dbits; r = Dbits - l; if(l == 0){ for(i = otop-1; i >= 0; i--) res->p[i+d] = b->p[i]; } else { last = 0; for(i = otop-1; i >= 0; i--) { this = b->p[i]; res->p[i+d+1] = (last<<l) | (this>>r); last = this; } res->p[d] = last<<l; } for(i = 0; i < d; i++) res->p[i] = 0; // normalize while(res->top > 0 && res->p[res->top-1] == 0) res->top--; } ����������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpmod.c���������������������������������������������� 664 � 0 � 0 � 367 10224715037 22064�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // remainder = b mod m // // knuth, vol 2, pp 398-400 void mpmod(mpint *b, mpint *m, mpint *remainder) { mpdiv(b, m, nil, remainder); if(remainder->sign < 0) mpadd(m, remainder, remainder); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpmul.c���������������������������������������������� 664 � 0 � 0 � 6046 10224715037 22122�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // // from knuth's 1969 seminumberical algorithms, pp 233-235 and pp 258-260 // // mpvecmul is an assembly language routine that performs the inner // loop. // // the karatsuba trade off is set empiricly by measuring the algs on // a 400 MHz Pentium II. // // karatsuba like (see knuth pg 258) // prereq: p is already zeroed static void mpkaratsuba(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p) { mpdigit *t, *u0, *u1, *v0, *v1, *u0v0, *u1v1, *res, *diffprod; int u0len, u1len, v0len, v1len, reslen; int sign, n; // divide each piece in half n = alen/2; if(alen&1) n++; u0len = n; u1len = alen-n; if(blen > n){ v0len = n; v1len = blen-n; } else { v0len = blen; v1len = 0; } u0 = a; u1 = a + u0len; v0 = b; v1 = b + v0len; // room for the partial products t = mallocz(Dbytes*5*(2*n+1), 1); if(t == nil) sysfatal("mpkaratsuba: %r"); u0v0 = t; u1v1 = t + (2*n+1); diffprod = t + 2*(2*n+1); res = t + 3*(2*n+1); reslen = 4*n+1; // t[0] = (u1-u0) sign = 1; if(mpveccmp(u1, u1len, u0, u0len) < 0){ sign = -1; mpvecsub(u0, u0len, u1, u1len, u0v0); } else mpvecsub(u1, u1len, u0, u1len, u0v0); // t[1] = (v0-v1) if(mpveccmp(v0, v0len, v1, v1len) < 0){ sign *= -1; mpvecsub(v1, v1len, v0, v1len, u1v1); } else mpvecsub(v0, v0len, v1, v1len, u1v1); // t[4:5] = (u1-u0)*(v0-v1) mpvecmul(u0v0, u0len, u1v1, v0len, diffprod); // t[0:1] = u1*v1 memset(t, 0, 2*(2*n+1)*Dbytes); if(v1len > 0) mpvecmul(u1, u1len, v1, v1len, u1v1); // t[2:3] = u0v0 mpvecmul(u0, u0len, v0, v0len, u0v0); // res = u0*v0<<n + u0*v0 mpvecadd(res, reslen, u0v0, u0len+v0len, res); mpvecadd(res+n, reslen-n, u0v0, u0len+v0len, res+n); // res += u1*v1<<n + u1*v1<<2*n if(v1len > 0){ mpvecadd(res+n, reslen-n, u1v1, u1len+v1len, res+n); mpvecadd(res+2*n, reslen-2*n, u1v1, u1len+v1len, res+2*n); } // res += (u1-u0)*(v0-v1)<<n if(sign < 0) mpvecsub(res+n, reslen-n, diffprod, u0len+v0len, res+n); else mpvecadd(res+n, reslen-n, diffprod, u0len+v0len, res+n); memmove(p, res, (alen+blen)*Dbytes); free(t); } #define KARATSUBAMIN 32 void mpvecmul(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *p) { int i; mpdigit d; mpdigit *t; // both mpvecdigmuladd and karatsuba are fastest when a is the longer vector if(alen < blen){ i = alen; alen = blen; blen = i; t = a; a = b; b = t; } if(blen == 0){ memset(p, 0, Dbytes*(alen+blen)); return; } if(alen >= KARATSUBAMIN && blen > 1){ // O(n^1.585) mpkaratsuba(a, alen, b, blen, p); } else { // O(n^2) for(i = 0; i < blen; i++){ d = b[i]; if(d != 0) mpvecdigmuladd(a, alen, d, &p[i]); } } } void mpmul(mpint *b1, mpint *b2, mpint *prod) { mpint *oprod; oprod = nil; if(prod == b1 || prod == b2){ oprod = prod; prod = mpnew(0); } prod->top = 0; mpbits(prod, (b1->top+b2->top+1)*Dbits); mpvecmul(b1->p, b1->top, b2->p, b2->top, prod->p); prod->top = b1->top+b2->top+1; prod->sign = b1->sign*b2->sign; mpnorm(prod); if(oprod != nil){ mpassign(prod, oprod); mpfree(prod); } } de <libsec.h> #include "dat.h" static int to64(mpint *b, char *buf, int len) { uchar *p; int n, rv; p = nil; n = mptobe(b, nil, 0, &p); if(n < 0) return -1; rv = enc64(buf, len, p, n); free(p); return rv; } static int to32(mpint *b, char *buf, int len) { uchar *p; int n, rv; // leave room for a multiple of 5 buffer size n = b->top*Dbytes + 5; p = malloc(n); if(p == nil) return -1; n = mptobe(b, p, n, nil); if(n < 0) return -1; // round up bufold_contrib//root/sys/src/cmd/limbo/libmp/port/mprand.c��������������������������������������������� 664 � 0 � 0 � 1110 10224715037 22234�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> #include "dat.h" mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b) { int n, m; mpdigit mask; uchar *p; n = DIGITS(bits); if(b == nil) b = mpnew(bits); else mpbits(b, bits); p = malloc(n*Dbytes); if(p == nil) return nil; (*gen)(p, n*Dbytes); betomp(p, n*Dbytes, b); free(p); // make sure we don't give too many bits m = bits%Dbits; n--; if(m > 0){ mask = 1; mask <<= m; mask--; b->p[n] &= mask; } for(; n >= 0; n--) if(b->p[n] != 0) break; b->top = n+1; b->sign = 1; return b; } r); out = modbillion(d->top, r->p[0], out, buf); if(out == nil) break; } while(d->top != 0); mpfree(d); mpfree(r); mpfree(billion); if(out == nil) return -1; len -= out-buf; if(out != buf) memmove(buf, out, len); return 0; } int mpfmt(Fmt *fmt) { mpint *b; char *p; b = va_arg(fmt->args, mpint*); if(b == nil) return fmtstrcpy(fmt, "*"); p = mptoa(b, fmt->prec, nil, 0); fmt->flags &= ~FmtPrec; if(p == niold_contrib//root/sys/src/cmd/limbo/libmp/port/mpright.c�������������������������������������������� 664 � 0 � 0 � 1550 10224715037 22435�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // res = b >> shift void mpright(mpint *b, int shift, mpint *res) { int d, l, r, i; mpdigit this, last; res->sign = b->sign; if(b->top==0){ res->top = 0; return; } // a negative right shift is a left shift if(shift < 0){ mpleft(b, -shift, res); return; } if(res != b) mpbits(res, b->top*Dbits - shift); d = shift/Dbits; r = shift - d*Dbits; l = Dbits - r; // shift all the bits out == zero if(d>=b->top){ res->top = 0; return; } // special case digit shifts if(r == 0){ for(i = 0; i < b->top-d; i++) res->p[i] = b->p[i+d]; } else { last = b->p[d]; for(i = 0; i < b->top-d-1; i++){ this = b->p[i+d+1]; res->p[i] = (this<<l) | (last>>r); last = this; } res->p[i++] = last>>r; } while(i > 0 && res->p[i-1] == 0) i--; res->top = i; if(i==0) res->sign = 1; } ��������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpsub.c���������������������������������������������� 664 � 0 � 0 � 1430 10224715037 22106�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // diff = abs(b1) - abs(b2), i.e., subtract the magnitudes void mpmagsub(mpint *b1, mpint *b2, mpint *diff) { int n, m, sign; mpint *t; // get the sizes right if(mpmagcmp(b1, b2) < 0){ sign = -1; t = b1; b1 = b2; b2 = t; } else sign = 1; n = b1->top; m = b2->top; if(m == 0){ mpassign(b1, diff); diff->sign = sign; return; } mpbits(diff, n*Dbits); mpvecsub(b1->p, n, b2->p, m, diff->p); diff->sign = sign; diff->top = n; mpnorm(diff); } // diff = b1 - b2 void mpsub(mpint *b1, mpint *b2, mpint *diff) { int sign; if(b1->sign != b2->sign){ sign = b1->sign; mpmagadd(b1, b2, diff); diff->sign = sign; return; } sign = b1->sign; mpmagsub(b1, b2, diff); if(diff->top != 0) diff->sign *= sign; } ft < 0){ mpright(b, -shift, res); return; } // b and res may be the same so remember the old top otop = b->top; // shift mpbits(res, otop*Dbits + shift); // overkill res->top = DIGITS(otop*Dbits + shift); d = shift/Dbitold_contrib//root/sys/src/cmd/limbo/libmp/port/mptobe.c��������������������������������������������� 664 � 0 � 0 � 1557 10224715037 22260�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // convert an mpint into a big endian byte array (most significant byte first) // return number of bytes converted // if p == nil, allocate and result array int mptobe(mpint *b, uchar *p, uint n, uchar **pp) { int i, j, suppress; mpdigit x; uchar *e, *s, c; if(p == nil){ n = (b->top+1)*Dbytes; p = malloc(n); } if(p == nil) return -1; if(pp != nil) *pp = p; memset(p, 0, n); // special case 0 if(b->top == 0){ if(n < 1) return -1; else return 1; } s = p; e = s+n; suppress = 1; for(i = b->top-1; i >= 0; i--){ x = b->p[i]; for(j = Dbits-8; j >= 0; j -= 8){ c = x>>j; if(c == 0 && suppress) continue; if(p >= e) return -1; *p++ = c; suppress = 0; } } // guarantee at least one byte if(s == p){ if(p >= e) return -1; *p++ = 0; } return p - s; } �������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mptoi.c���������������������������������������������� 664 � 0 � 0 � 1104 10224715037 22106�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" /* * this code assumes that mpdigit is at least as * big as an int. */ mpint* itomp(int i, mpint *b) { if(b == nil) b = mpnew(0); mpassign(mpzero, b); if(i != 0) b->top = 1; if(i < 0){ b->sign = -1; *b->p = -i; } else *b->p = i; return b; } int mptoi(mpint *b) { uint x; if(b->top==0) return 0; x = *b->p; if(b->sign > 0){ if(b->top > 1 || (x > MAXINT)) x = (int)MAXINT; else x = (int)x; } else { if(b->top > 1 || x > MAXINT+1) x = (int)MININT; else x = -(int)x; } return x; } ; // divide each piece in half n = alen/2; if(alen&1) n++; u0len = n; u1len = alen-n; if(blen > n){ v0len = n; v1len = blen-n; } else { v0len = blen; v1len = 0; } u0 = a; u1 = a + u0len; v0 = b; v1 = b + v0len; // room for the partial products t = mallocz(Dbytes*5*(2*n+1), 1); if(t == nil) sysfatal("mpkaratsuba: %r"); u0v0 = t; u1v1 = t + (2*n+1); diffprod = t + 2*(2*n+1); res = t + 3*(2*n+1); reslen = 4*n+old_contrib//root/sys/src/cmd/limbo/libmp/port/mptole.c��������������������������������������������� 664 � 0 � 0 � 1422 10224715037 22261�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // convert an mpint into a little endian byte array (least significant byte first) // return number of bytes converted // if p == nil, allocate and result array int mptole(mpint *b, uchar *p, uint n, uchar **pp) { int i, j; mpdigit x; uchar *e, *s; if(p == nil){ n = (b->top+1)*Dbytes; p = malloc(n); } if(pp != nil) *pp = p; if(p == nil) return -1; memset(p, 0, n); // special case 0 if(b->top == 0){ if(n < 1) return -1; else return 0; } s = p; e = s+n; for(i = 0; i < b->top-1; i++){ x = b->p[i]; for(j = 0; j < Dbytes; j++){ if(p >= e) return -1; *p++ = x; x >>= 8; } } x = b->p[i]; while(x > 0){ if(p >= e) return -1; *p++ = x; x >>= 8; } return p - s; } onger vector if(alen < blen){ i = alen; alen = blen; blen = i; t = a; a = b; b = t; } if(blen == 0){ memset(p, 0, Dbytes*(alen+blen)); return; } if(alen >= KARATSUBAMIN && blen > 1){ // O(n^1.585) mpkaratsuba(a, old_contrib//root/sys/src/cmd/limbo/libmp/port/mptoui.c��������������������������������������������� 664 � 0 � 0 � 635 10224715037 22263�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" /* * this code assumes that mpdigit is at least as * big as an int. */ mpint* uitomp(uint i, mpint *b) { if(b == nil) b = mpnew(0); mpassign(mpzero, b); if(i != 0) b->top = 1; *b->p = i; return b; } uint mptoui(mpint *b) { uint x; x = *b->p; if(b->sign < 0){ x = 0; } else { if(b->top > 1 || x > MAXUINT) x = MAXUINT; } return x; } ���������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mptouv.c��������������������������������������������� 664 � 0 � 0 � 1316 10403024661 22310�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" #define VLDIGITS (sizeof(vlong)/sizeof(mpdigit)) /* * this code assumes that a vlong is an integral number of * mpdigits long. */ mpint* uvtomp(uvlong v, mpint *b) { int s; if(b == nil) b = mpnew(VLDIGITS*sizeof(mpdigit)); else mpbits(b, VLDIGITS*sizeof(mpdigit)); mpassign(mpzero, b); if(v == 0) return b; for(s = 0; s < VLDIGITS && v != 0; s++){ b->p[s] = v; v >>= sizeof(mpdigit)*8; } b->top = s; return b; } uvlong mptouv(mpint *b) { uvlong v; int s; if(b->top == 0) return 0; mpnorm(b); if(b->top > VLDIGITS) return MAXVLONG; v = 0; for(s = 0; s < b->top; s++) v |= (uvlong)b->p[s]<<(s*sizeof(mpdigit)*8); return v; } billion); if(out == nil) return -1; len -= out-buf; if(out != buf) memmove(buf, out, len); return 0; } int mpfmt(Fmt *fmt) { mpint *b; char *p; b = va_arg(fmt->args, mpint*); if(b == nil) return fmtstrcpy(fmt, "*"); p = mptoa(b, fmt->prec, nil, 0); fmt->flags &= ~FmtPrec; if(p == niold_contrib//root/sys/src/cmd/limbo/libmp/port/mptov.c���������������������������������������������� 664 � 0 � 0 � 1722 10242672742 22136�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" #define VLDIGITS (sizeof(vlong)/sizeof(mpdigit)) /* * this code assumes that a vlong is an integral number of * mpdigits long. */ mpint* vtomp(vlong v, mpint *b) { int s; uvlong uv; if(b == nil) b = mpnew(VLDIGITS*sizeof(mpdigit)); else mpbits(b, VLDIGITS*sizeof(mpdigit)); mpassign(mpzero, b); if(v == 0) return b; if(v < 0){ b->sign = -1; uv = -v; } else uv = v; for(s = 0; s < VLDIGITS && uv != 0; s++){ b->p[s] = uv; uv >>= sizeof(mpdigit)*8; } b->top = s; return b; } vlong mptov(mpint *b) { uvlong v; int s; if(b->top == 0) return 0; mpnorm(b); if(b->top > VLDIGITS){ if(b->sign > 0) return (vlong)MAXVLONG; else return (vlong)MINVLONG; } v = 0; for(s = 0; s < b->top; s++) v |= b->p[s]<<(s*sizeof(mpdigit)*8); if(b->sign > 0){ if(v > MAXVLONG) v = MAXVLONG; } else { if(v > MINVLONG) v = MINVLONG; else v = -(vlong)v; } return (vlong)v; } ����������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpvecadd.c������������������������������������������� 664 � 0 � 0 � 1007 10224715037 22543�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // prereq: alen >= blen, sum has at least blen+1 digits void mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum) { int i, carry; mpdigit x, y; carry = 0; for(i = 0; i < blen; i++){ x = *a++; y = *b++; x += carry; if(x < carry) carry = 1; else carry = 0; x += y; if(x < y) carry++; *sum++ = x; } for(; i < alen; i++){ x = *a++ + carry; if(x < carry) carry = 1; else carry = 0; *sum++ = x; } *sum = carry; } // diff = b1 - b2 void mpsub(mpint *b1, mpint *b2, mpint *diff) { int sign; if(b1->sign != b2->sign){ sign = b1->sign; mpmagadd(b1, b2, diff); diff->sign = sign; return; } sign = b1->sign; mpmagsub(b1, b2, diff); if(diff->top != 0) diff->sign *= sign; } ft < 0){ mpright(b, -shift, res); return; } // b and res may be the same so remember the old top otop = b->top; // shift mpbits(res, otop*Dbits + shift); // overkill res->top = DIGITS(otop*Dbits + shift); d = shift/Dbitold_contrib//root/sys/src/cmd/limbo/libmp/port/mpveccmp.c������������������������������������������� 664 � 0 � 0 � 572 10224715037 22560�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" int mpveccmp(mpdigit *a, int alen, mpdigit *b, int blen) { mpdigit x; while(alen > blen) if(a[--alen] != 0) return 1; while(blen > alen) if(b[--blen] != 0) return -1; while(alen > 0){ --alen; x = a[alen] - b[alen]; if(x == 0) continue; if(x > a[alen]) return -1; else return 1; } return 0; } ��������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpvecdigmuladd.c������������������������������������� 664 � 0 � 0 � 3056 10224715037 23753�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" #define LO(x) ((x) & ((1<<(Dbits/2))-1)) #define HI(x) ((x) >> (Dbits/2)) static void mpdigmul(mpdigit a, mpdigit b, mpdigit *p) { mpdigit x, ah, al, bh, bl, p1, p2, p3, p4; int carry; // half digits ah = HI(a); al = LO(a); bh = HI(b); bl = LO(b); // partial products p1 = ah*bl; p2 = bh*al; p3 = bl*al; p4 = ah*bh; // p = ((p1+p2)<<(Dbits/2)) + (p4<<Dbits) + p3 carry = 0; x = p1<<(Dbits/2); p3 += x; if(p3 < x) carry++; x = p2<<(Dbits/2); p3 += x; if(p3 < x) carry++; p4 += carry + HI(p1) + HI(p2); // can't carry out of the high digit p[0] = p3; p[1] = p4; } // prereq: p must have room for n+1 digits void mpvecdigmuladd(mpdigit *b, int n, mpdigit m, mpdigit *p) { int i; mpdigit carry, x, y, part[2]; carry = 0; part[1] = 0; for(i = 0; i < n; i++){ x = part[1] + carry; if(x < carry) carry = 1; else carry = 0; y = *p; mpdigmul(*b++, m, part); x += part[0]; if(x < part[0]) carry++; x += y; if(x < y) carry++; *p++ = x; } *p = part[1] + carry; } // prereq: p must have room for n+1 digits int mpvecdigmulsub(mpdigit *b, int n, mpdigit m, mpdigit *p) { int i; mpdigit x, y, part[2], borrow; borrow = 0; part[1] = 0; for(i = 0; i < n; i++){ x = *p; y = x - borrow; if(y > x) borrow = 1; else borrow = 0; x = part[1]; mpdigmul(*b++, m, part); x += part[0]; if(x < part[0]) borrow++; x = y - x; if(x > y) borrow++; *p++ = x; } x = *p; y = x - borrow - part[1]; *p = y; if(y > x) return -1; else return 1; } /mptole.c��������������������������������������������� 664 � 0 � 0 � 1422 10224715037 22261�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/mpvecsub.c������������������������������������������� 664 � 0 � 0 � 1013 10224715037 22601�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include "dat.h" // prereq: a >= b, alen >= blen, diff has at least alen digits void mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff) { int i, borrow; mpdigit x, y; borrow = 0; for(i = 0; i < blen; i++){ x = *a++; y = *b++; y += borrow; if(y < borrow) borrow = 1; else borrow = 0; if(x < y) borrow++; *diff++ = x - y; } for(; i < alen; i++){ x = *a++; y = x - borrow; if(y > x) borrow = 1; else borrow = 0; *diff++ = y; } } //root/sys/src/cmd/limbo/libmp/port/mptoui.c��������������������������������������������� 664 � 0 � 0 � 635 10224715037 22263�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/os.h������������������������������������������������� 664 � 0 � 0 � 110 10232134437 21356�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <lib9.h> extern ulong truerand(void); extern vlong nsec(void); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/reduce-nt�������������������������������������������� 664 � 0 � 0 � 127 10242676111 22406�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# for now, just return the input files shift # $O shift # $SYSTARG-$OBJTYPE echo -n $* �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/reduce-rc�������������������������������������������� 664 � 0 � 0 � 462 10224744124 22373�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O=$1 shift nonport=$1 shift ls -p ../$nonport/*.[cs] >[2]/dev/null | sed 's/..$//' > /tmp/reduce.$pid # # if empty directory, just return the input files # if (! ~ $status '|') { echo $* rm /tmp/reduce.$pid exit 0 } echo $* | tr ' ' \012 | grep -v -f /tmp/reduce.$pid | tr \012 ' ' rm /tmp/reduce.$pid ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/reduce-sh�������������������������������������������� 664 � 0 � 0 � 270 10400412132 22361�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O=$1 shift nonport=$1 shift for i in $* do j=`echo $i | sed 's/\.'$O'//'` if test ! -f ../$nonport/$j.c -a ! -f ../$nonport/$j.s -a ! -f ../$nonport/$j.spp then echo $i fi done ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/port/strtomp.c�������������������������������������������� 664 � 0 � 0 � 5673 10224715037 22505�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> #include "dat.h" static struct { int inited; uchar t64[256]; uchar t32[256]; uchar t16[256]; uchar t10[256]; } tab; enum { INVAL= 255 }; static char set64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static char set32[] = "23456789abcdefghijkmnpqrstuvwxyz"; static char set16[] = "0123456789ABCDEF0123456789abcdef"; static char set10[] = "0123456789"; static void init(void) { char *p; memset(tab.t64, INVAL, sizeof(tab.t64)); memset(tab.t32, INVAL, sizeof(tab.t32)); memset(tab.t16, INVAL, sizeof(tab.t16)); memset(tab.t10, INVAL, sizeof(tab.t10)); for(p = set64; *p; p++) tab.t64[*p] = p-set64; for(p = set32; *p; p++) tab.t32[*p] = p-set32; for(p = set16; *p; p++) tab.t16[*p] = (p-set16)%16; for(p = set10; *p; p++) tab.t10[*p] = (p-set10); tab.inited = 1; } static char* from16(char *a, mpint *b) { char *p, *next; int i; mpdigit x; b->top = 0; for(p = a; *p; p++) if(tab.t16[*(uchar*)p] == INVAL) break; mpbits(b, (p-a)*4); b->top = 0; next = p; while(p > a){ x = 0; for(i = 0; i < Dbits; i += 4){ if(p <= a) break; x |= tab.t16[*(uchar*)--p]<<i; } b->p[b->top++] = x; } return next; } static ulong mppow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; static char* from10(char *a, mpint *b) { ulong x, y; mpint *pow, *r; int i; pow = mpnew(0); r = mpnew(0); b->top = 0; for(;;){ // do a billion at a time in native arithmetic x = 0; for(i = 0; i < 9; i++){ y = tab.t10[*(uchar*)a]; if(y == INVAL) break; a++; x *= 10; x += y; } if(i == 0) break; // accumulate into mpint uitomp(mppow10[i], pow); uitomp(x, r); mpmul(b, pow, b); mpadd(b, r, b); if(i != 9) break; } mpfree(pow); mpfree(r); return a; } static char* from64(char *a, mpint *b) { char *buf = a; uchar *p; int n, m; for(; tab.t64[*(uchar*)a] != INVAL; a++) ; n = a-buf; mpbits(b, n*6); p = malloc(n); if(p == nil) return a; m = dec64(p, n, buf, n); betomp(p, m, b); free(p); return a; } static char* from32(char *a, mpint *b) { char *buf = a; uchar *p; int n, m; for(; tab.t64[*(uchar*)a] != INVAL; a++) ; n = a-buf; mpbits(b, n*5); p = malloc(n); if(p == nil) return a; m = dec32(p, n, buf, n); betomp(p, m, b); free(p); return a; } mpint* strtomp(char *a, char **pp, int base, mpint *b) { int sign; char *e; if(b == nil) b = mpnew(0); if(tab.inited == 0) init(); while(*a==' ' || *a=='\t') a++; sign = 1; for(;; a++){ switch(*a){ case '-': sign *= -1; continue; } break; } switch(base){ case 10: e = from10(a, b); break; default: case 16: e = from16(a, b); break; case 32: e = from32(a, b); break; case 64: e = from64(a, b); break; } // if no characters parsed, there wasn't a number to convert if(e == a) return nil; mpnorm(b); b->sign = sign; if(pp != nil) *pp = e; return b; } ���������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libmp/test.c���������������������������������������������������� 664 � 0 � 0 � 27723 10224723763 21015�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <lib9.h> #include <mp.h> #include "dat.h" int loops = 1; long randomreg; void srand(long seed) { randomreg = seed; } long lrand(void) { randomreg = randomreg*104381 + 81761; return randomreg; } void prng(uchar *p, int n) { while(n-- > 0) *p++ = lrand(); } void testconv(char *str) { mpint *b; char *p; b = strtomp(str, nil, 16, nil); p = mptoa(b, 10, nil, 0); print("%s = ", p); strtomp(p, nil, 10, b); free(p); print("%B\n", b); p = mptoa(b, 16, nil, 0); print("%s = ", p); strtomp(p, nil, 16, b); free(p); print("%B\n", b); p = mptoa(b, 32, nil, 0); print("%s = ", p); strtomp(p, nil, 32, b); free(p); print("%B\n", b); p = mptoa(b, 64, nil, 0); print("%s = ", p); strtomp(p, nil, 64, b); free(p); print("%B\n", b); mpfree(b); } void testshift(char *str) { mpint *b1, *b2; int i; b1 = strtomp(str, nil, 16, nil); b2 = mpnew(0); for(i = 0; i < 64; i++){ mpleft(b1, i, b2); print("%2.2d %B\n", i, b2); } for(i = 0; i < 64; i++){ mpright(b2, i, b1); print("%2.2d %B\n", i, b1); } mpfree(b1); mpfree(b2); } void testaddsub(char *str) { mpint *b1, *b2; int i; b1 = strtomp(str, nil, 16, nil); b2 = mpnew(0); for(i = 0; i < 16; i++){ mpadd(b1, b2, b2); print("%2.2d %B\n", i, b2); } for(i = 0; i < 16; i++){ mpsub(b2, b1, b2); print("%2.2d %B\n", i, b2); } mpfree(b1); mpfree(b2); } void testvecdigmuladd(char *str, mpdigit d) { mpint *b, *b2; int i; vlong now; b = strtomp(str, nil, 16, nil); b2 = mpnew(0); mpbits(b2, (b->top+1)*Dbits); now = nsec(); for(i = 0; i < loops; i++){ memset(b2->p, 0, b2->top*Dbytes); mpvecdigmuladd(b->p, b->top, d, b2->p); } if(loops > 1) print("%lld ns for a %d*%d vecdigmul\n", (nsec()-now)/loops, b->top*Dbits, Dbits); mpnorm(b2); print("0 + %B * %ux = %B\n", b, d, b2); mpfree(b); mpfree(b2); } void testvecdigmulsub(char *str, mpdigit d) { mpint *b, *b2; int i; vlong now; b = strtomp(str, nil, 16, nil); b2 = mpnew(0); mpbits(b2, (b->top+1)*Dbits); now = nsec(); for(i = 0; i < loops; i++){ memset(b2->p, 0, b2->top*Dbytes); mpvecdigmulsub(b->p, b->top, d, b2->p); } if(loops > 1) print("%lld ns for a %d*%d vecdigmul\n", (nsec()-now)/loops, b->top*Dbits, Dbits); mpnorm(b2); print("0 - %B * %ux = %B\n", b, d, b2); mpfree(b); mpfree(b2); } void testmul(char *str) { mpint *b, *b1, *b2; vlong now; int i; b = strtomp(str, nil, 16, nil); b1 = mpcopy(b); b2 = mpnew(0); now = nsec(); for(i = 0; i < loops; i++) mpmul(b, b1, b2); if(loops > 1) print("%lld µs for a %d*%d mult\n", (nsec()-now)/(loops*1000), b->top*Dbits, b1->top*Dbits); print("%B * %B = %B\n", b, b1, b2); mpfree(b); mpfree(b1); mpfree(b2); } void testmul2(mpint *b, mpint *b1) { mpint *b2; vlong now; int i; b2 = mpnew(0); now = nsec(); for(i = 0; i < loops; i++) mpmul(b, b1, b2); if(loops > 1) print("%lld µs for a %d*%d mult\n", (nsec()-now)/(loops*1000), b->top*Dbits, b1->top*Dbits); print("%B * ", b); print("%B = ", b1); print("%B\n", b2); mpfree(b2); } void testdigdiv(char *str, mpdigit d) { mpint *b; mpdigit q; int i; vlong now; b = strtomp(str, nil, 16, nil); now = nsec(); for(i = 0; i < loops; i++) mpdigdiv(b->p, d, &q); if(loops > 1) print("%lld ns for a %d / %d div\n", (nsec()-now)/loops, 2*Dbits, Dbits); print("%B / %ux = %ux\n", b, d, q); mpfree(b); } void testdiv(mpint *x, mpint *y) { mpint *b2, *b3; vlong now; int i; b2 = mpnew(0); b3 = mpnew(0); now = nsec(); for(i = 0; i < loops; i++) mpdiv(x, y, b2, b3); if(loops > 1) print("%lld µs for a %d/%d div\n", (nsec()-now)/(1000*loops), x->top*Dbits, y->top*Dbits); print("%B / %B = %B %B\n", x, y, b2, b3); mpfree(b2); mpfree(b3); } void testmod(mpint *x, mpint *y) { mpint *r; vlong now; int i; r = mpnew(0); now = nsec(); for(i = 0; i < loops; i++) mpmod(x, y, r); if(loops > 1) print("%lld µs for a %d/%d mod\n", (nsec()-now)/(1000*loops), x->top*Dbits, y->top*Dbits); print("%B mod %B = %B\n", x, y, r); mpfree(r); } void testinvert(mpint *x, mpint *y) { mpint *r, *d1, *d2; vlong now; int i; r = mpnew(0); d1 = mpnew(0); d2 = mpnew(0); now = nsec(); mpextendedgcd(x, y, r, d1, d2); mpdiv(x, r, x, d1); mpdiv(y, r, y, d1); for(i = 0; i < loops; i++) mpinvert(x, y, r); if(loops > 1) print("%lld µs for a %d in %d invert\n", (nsec()-now)/(1000*loops), x->top*Dbits, y->top*Dbits); print("%B**-1 mod %B = %B\n", x, y, r); mpmul(r, x, d1); mpmod(d1, y, d2); print("%B*%B mod %B = %B\n", x, r, y, d2); mpfree(r); mpfree(d1); mpfree(d2); } void testsub1(char *a, char *b) { mpint *b1, *b2, *b3; b1 = strtomp(a, nil, 16, nil); b2 = strtomp(b, nil, 16, nil); b3 = mpnew(0); mpsub(b1, b2, b3); print("%B - %B = %B\n", b1, b2, b3); } void testmul1(char *a, char *b) { mpint *b1, *b2, *b3; b1 = strtomp(a, nil, 16, nil); b2 = strtomp(b, nil, 16, nil); b3 = mpnew(0); mpmul(b1, b2, b3); print("%B * %B = %B\n", b1, b2, b3); } void testexp(char *base, char *exp, char *mod) { mpint *b, *e, *m, *res; int i; uvlong now; b = strtomp(base, nil, 16, nil); e = strtomp(exp, nil, 16, nil); res = mpnew(0); if(mod != nil) m = strtomp(mod, nil, 16, nil); else m = nil; now = nsec(); for(i = 0; i < loops; i++) mpexp(b, e, m, res); if(loops > 1) print("%ulldµs for a %d to the %d bit exp\n", (nsec()-now)/(loops*1000), b->top*Dbits, e->top*Dbits); if(m != nil) print("%B ^ %B mod %B == %B\n", b, e, m, res); else print("%B ^ %B == %B\n", b, e, res); mpfree(b); mpfree(e); mpfree(res); if(m != nil) mpfree(m); } void testgcd(void) { mpint *a, *b, *d, *x, *y, *t1, *t2; int i; uvlong now, then; uvlong etime; d = mpnew(0); x = mpnew(0); y = mpnew(0); t1 = mpnew(0); t2 = mpnew(0); etime = 0; a = strtomp("4EECAB3E04C4E6BC1F49D438731450396BF272B4D7B08F91C38E88ADCD281699889AFF872E2204C80CCAA8E460797103DE539D5DF8335A9B20C0B44886384F134C517287202FCA914D8A5096446B40CD861C641EF9C2730CB057D7B133F4C2B16BBD3D75FDDBD9151AAF0F9144AAA473AC93CF945DBFE0859FB685D5CBD0A8B3", nil, 16, nil); b = strtomp("C41CFBE4D4846F67A3DF7DE9921A49D3B42DC33728427AB159CEC8CBBDB12B5F0C244F1A734AEB9840804EA3C25036AD1B61AFF3ABBC247CD4B384224567A863A6F020E7EE9795554BCD08ABAD7321AF27E1E92E3DB1C6E7E94FAAE590AE9C48F96D93D178E809401ABE8A534A1EC44359733475A36A70C7B425125062B1142D", nil, 16, nil); mpextendedgcd(a, b, d, x, y); print("gcd %B*%B+%B*%B = %B?\n", a, x, b, y, d); mpfree(a); mpfree(b); for(i = 0; i < loops; i++){ a = mprand(2048, prng, nil); b = mprand(2048, prng, nil); then = nsec(); mpextendedgcd(a, b, d, x, y); now = nsec(); etime += now-then; mpmul(a, x, t1); mpmul(b, y, t2); mpadd(t1, t2, t2); if(mpcmp(d, t2) != 0) print("%d gcd %B*%B+%B*%B != %B\n", i, a, x, b, y, d); // else // print("%d euclid %B*%B+%B*%B == %B\n", i, a, x, b, y, d); mpfree(a); mpfree(b); } mpfree(x); mpfree(y); mpfree(d); mpfree(t1); mpfree(t2); if(loops > 1) print("binary %llud\n", etime); } extern int _unnormalizedwarning = 1; void main(int argc, char **argv) { mpint *x, *y; ARGBEGIN{ case 'n': loops = atoi(ARGF()); break; }ARGEND; fmtinstall('B', mpfmt); fmtinstall('Q', mpfmt); srand(0); mpsetminbits(2*Dbits); testshift("1111111111111111"); testaddsub("fffffffffffffffff"); testdigdiv("1234567812345678", 0x76543218); testdigdiv("1ffff", 0xffff); testdigdiv("ffff", 0xffff); testdigdiv("fff", 0xffff); testdigdiv("effffffff", 0xffff); testdigdiv("ffffffff", 0x1); testdigdiv("ffffffff", 0); testdigdiv("200000000", 2); testdigdiv("ffffff00fffffff1", 0xfffffff1); testvecdigmuladd("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 2); testconv("0"); testconv("-abc0123456789abcedf"); testconv("abc0123456789abcedf"); testvecdigmulsub("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 2); testsub1("1FFFFFFFE00000000", "FFFFFFFE00000001"); testmul1("ffffffff", "f"); testmul("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); testmul1("100000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000004FFFFFFFFFFFFFFFE0000000200000000000000000000000000000003FFFFFFFFFFFFFFFE0000000200000000000000000000000000000002FFFFFFFFFFFFFFFE0000000200000000000000000000000000000001FFFFFFFFFFFFFFFE0000000200000000000000000000000000000000FFFFFFFFFFFFFFFE0000000200000000FFFFFFFE00000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); testmul1("1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001", "1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001"); testmul1("1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001", "1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001"); testmul1("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); x = mprand(256, prng, nil); y = mprand(128, prng, nil); testdiv(x, y); x = mprand(2048, prng, nil); y = mprand(1024, prng, nil); testdiv(x, y); // x = mprand(4*1024, prng, nil); // y = mprand(4*1024, prng, nil); // testmul2(x, y); testsub1("677132C9", "-A26559B6"); testgcd(); x = mprand(512, prng, nil); x->sign = -1; y = mprand(256, prng, nil); testdiv(x, y); testmod(x, y); x->sign = 1; testinvert(y, x); testexp("111111111", "222", "1000000000000000000000"); testexp("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); #ifdef asdf #endif adsf print("done\n"); exits(0); } s); now = nsec(); for(i = 0; i < loops; i++old_contrib//root/sys/src/cmd/limbo/libsec/��������������������������������������������������������� 775 � 0 � 0 � 0 11411740013 17757��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/NOTICE��������������������������������������������������� 664 � 0 � 0 � 355 10560641716 20664�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright © 2000-2007 Lucent Technologies Inc. and others. All rights reserved. Revisions for use with Inferno © 2006 Vita Nuova Holdings Limited. This software is provided under the terms of the Lucent Public License, Version 1.02. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/Plan9-386/����������������������������������������������� 775 � 0 � 0 � 0 11411740007 21263��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/Plan9-386/md5block.s������������������������������������� 664 � 0 � 0 � 12371 7255750024 23166�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * rfc1321 requires that I include this. The code is new. The constants * all come from the rfc (hence the copyright). We trade a table for the * macros in rfc. The total size is a lot less. -- presotto * * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All * rights reserved. * * License to copy and use this software is granted provided that it * is identified as the "RSA Data Security, Inc. MD5 Message-Digest * Algorithm" in all material mentioning or referencing this software * or this function. * * License is also granted to make and use derivative works provided * that such works are identified as "derived from the RSA Data * Security, Inc. MD5 Message-Digest Algorithm" in all material * mentioning or referencing the derived work. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software forany particular purpose. It is provided "as is" * without express or implied warranty of any kind. * These notices must be retained in any copies of any part of this * documentation and/or software. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 /* * SI is data * a += FN(B,C,D); * a += x[sh] + t[sh]; * a = (a << S11) | (a >> (32 - S11)); * a += b; */ #define BODY1(off,V,FN,SH,A,B,C,D)\ FN(B,C,D)\ LEAL V(A)(DI*1),A;\ ADDL (off)(BP),A;\ ROLL $SH,A;\ ADDL B,A;\ #define BODY(off,V,FN,SH,A,B,C,D)\ FN(B,C,D)\ LEAL V(A)(DI*1),A;\ ADDL (off)(BP),A;\ ROLL $SH,A;\ ADDL B,A;\ /* * fn1 = ((c ^ d) & b) ^ d */ #define FN1(B,C,D)\ MOVL C,DI;\ XORL D,DI;\ ANDL B,DI;\ XORL D,DI;\ /* * fn2 = ((b ^ c) & d) ^ c; */ #define FN2(B,C,D)\ MOVL B,DI;\ XORL C,DI;\ ANDL D,DI;\ XORL C,DI;\ /* * fn3 = b ^ c ^ d; */ #define FN3(B,C,D)\ MOVL B,DI;\ XORL C,DI;\ XORL D,DI;\ /* * fn4 = c ^ (b | ~d); */ #define FN4(B,C,D)\ MOVL D,DI;\ XORL $-1,DI;\ ORL B,DI;\ XORL C,DI;\ #define DATA 0 #define LEN 4 #define STATE 8 #define EDATA (-4) TEXT _md5block+0(SB),$4 MOVL data+DATA(FP),AX ADDL len+LEN(FP),AX MOVL AX,edata+EDATA(SP) MOVL data+DATA(FP),BP mainloop: MOVL state+STATE(FP),SI MOVL (SI),AX MOVL 4(SI),BX MOVL 8(SI),CX MOVL 12(SI),DX BODY1( 0*4,0xd76aa478,FN1,S11,AX,BX,CX,DX) BODY1( 1*4,0xe8c7b756,FN1,S12,DX,AX,BX,CX) BODY1( 2*4,0x242070db,FN1,S13,CX,DX,AX,BX) BODY1( 3*4,0xc1bdceee,FN1,S14,BX,CX,DX,AX) BODY1( 4*4,0xf57c0faf,FN1,S11,AX,BX,CX,DX) BODY1( 5*4,0x4787c62a,FN1,S12,DX,AX,BX,CX) BODY1( 6*4,0xa8304613,FN1,S13,CX,DX,AX,BX) BODY1( 7*4,0xfd469501,FN1,S14,BX,CX,DX,AX) BODY1( 8*4,0x698098d8,FN1,S11,AX,BX,CX,DX) BODY1( 9*4,0x8b44f7af,FN1,S12,DX,AX,BX,CX) BODY1(10*4,0xffff5bb1,FN1,S13,CX,DX,AX,BX) BODY1(11*4,0x895cd7be,FN1,S14,BX,CX,DX,AX) BODY1(12*4,0x6b901122,FN1,S11,AX,BX,CX,DX) BODY1(13*4,0xfd987193,FN1,S12,DX,AX,BX,CX) BODY1(14*4,0xa679438e,FN1,S13,CX,DX,AX,BX) BODY1(15*4,0x49b40821,FN1,S14,BX,CX,DX,AX) BODY( 1*4,0xf61e2562,FN2,S21,AX,BX,CX,DX) BODY( 6*4,0xc040b340,FN2,S22,DX,AX,BX,CX) BODY(11*4,0x265e5a51,FN2,S23,CX,DX,AX,BX) BODY( 0*4,0xe9b6c7aa,FN2,S24,BX,CX,DX,AX) BODY( 5*4,0xd62f105d,FN2,S21,AX,BX,CX,DX) BODY(10*4,0x02441453,FN2,S22,DX,AX,BX,CX) BODY(15*4,0xd8a1e681,FN2,S23,CX,DX,AX,BX) BODY( 4*4,0xe7d3fbc8,FN2,S24,BX,CX,DX,AX) BODY( 9*4,0x21e1cde6,FN2,S21,AX,BX,CX,DX) BODY(14*4,0xc33707d6,FN2,S22,DX,AX,BX,CX) BODY( 3*4,0xf4d50d87,FN2,S23,CX,DX,AX,BX) BODY( 8*4,0x455a14ed,FN2,S24,BX,CX,DX,AX) BODY(13*4,0xa9e3e905,FN2,S21,AX,BX,CX,DX) BODY( 2*4,0xfcefa3f8,FN2,S22,DX,AX,BX,CX) BODY( 7*4,0x676f02d9,FN2,S23,CX,DX,AX,BX) BODY(12*4,0x8d2a4c8a,FN2,S24,BX,CX,DX,AX) BODY( 5*4,0xfffa3942,FN3,S31,AX,BX,CX,DX) BODY( 8*4,0x8771f681,FN3,S32,DX,AX,BX,CX) BODY(11*4,0x6d9d6122,FN3,S33,CX,DX,AX,BX) BODY(14*4,0xfde5380c,FN3,S34,BX,CX,DX,AX) BODY( 1*4,0xa4beea44,FN3,S31,AX,BX,CX,DX) BODY( 4*4,0x4bdecfa9,FN3,S32,DX,AX,BX,CX) BODY( 7*4,0xf6bb4b60,FN3,S33,CX,DX,AX,BX) BODY(10*4,0xbebfbc70,FN3,S34,BX,CX,DX,AX) BODY(13*4,0x289b7ec6,FN3,S31,AX,BX,CX,DX) BODY( 0*4,0xeaa127fa,FN3,S32,DX,AX,BX,CX) BODY( 3*4,0xd4ef3085,FN3,S33,CX,DX,AX,BX) BODY( 6*4,0x04881d05,FN3,S34,BX,CX,DX,AX) BODY( 9*4,0xd9d4d039,FN3,S31,AX,BX,CX,DX) BODY(12*4,0xe6db99e5,FN3,S32,DX,AX,BX,CX) BODY(15*4,0x1fa27cf8,FN3,S33,CX,DX,AX,BX) BODY( 2*4,0xc4ac5665,FN3,S34,BX,CX,DX,AX) BODY( 0*4,0xf4292244,FN4,S41,AX,BX,CX,DX) BODY( 7*4,0x432aff97,FN4,S42,DX,AX,BX,CX) BODY(14*4,0xab9423a7,FN4,S43,CX,DX,AX,BX) BODY( 5*4,0xfc93a039,FN4,S44,BX,CX,DX,AX) BODY(12*4,0x655b59c3,FN4,S41,AX,BX,CX,DX) BODY( 3*4,0x8f0ccc92,FN4,S42,DX,AX,BX,CX) BODY(10*4,0xffeff47d,FN4,S43,CX,DX,AX,BX) BODY( 1*4,0x85845dd1,FN4,S44,BX,CX,DX,AX) BODY( 8*4,0x6fa87e4f,FN4,S41,AX,BX,CX,DX) BODY(15*4,0xfe2ce6e0,FN4,S42,DX,AX,BX,CX) BODY( 6*4,0xa3014314,FN4,S43,CX,DX,AX,BX) BODY(13*4,0x4e0811a1,FN4,S44,BX,CX,DX,AX) BODY( 4*4,0xf7537e82,FN4,S41,AX,BX,CX,DX) BODY(11*4,0xbd3af235,FN4,S42,DX,AX,BX,CX) BODY( 2*4,0x2ad7d2bb,FN4,S43,CX,DX,AX,BX) BODY( 9*4,0xeb86d391,FN4,S44,BX,CX,DX,AX) ADDL $(16*4),BP MOVL state+STATE(FP),DI ADDL AX,0(DI) ADDL BX,4(DI) ADDL CX,8(DI) ADDL DX,12(DI) MOVL edata+EDATA(SP),DI CMPL BP,DI JCS mainloop RET END 0000000000000001000000000000000000000001000000000000000000000001"); testmul1("1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001", "10000000000old_contrib//root/sys/src/cmd/limbo/libsec/Plan9-386/mkfile����������������������������������������� 664 � 0 � 0 � 272 10745514352 22451�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OBJTYPE=$objtype </$objtype/mkfile LIB=../libsec.a FILES=\ md5block\ sha1block\ HFILES=../../include/libsec.h SFILES=${FILES:%=%.s} OFILES=${FILES:%=%.$O} </sys/src/cmd/mksyslib ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/Plan9-386/sha1block.s������������������������������������ 664 � 0 � 0 � 7142 7255750024 23315�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� TEXT _sha1block+0(SB),$352 /* x = (wp[off-f] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; * wp[off] = x; * x += A <<< 5; * E += 0xca62c1d6 + x; * x = FN(B,C,D); * E += x; * B >>> 2 */ #define BSWAPDI BYTE $0x0f; BYTE $0xcf; #define BODY(off,FN,V,A,B,C,D,E)\ MOVL (off-64)(BP),DI;\ XORL (off-56)(BP),DI;\ XORL (off-32)(BP),DI;\ XORL (off-12)(BP),DI;\ ROLL $1,DI;\ MOVL DI,off(BP);\ LEAL V(DI)(E*1),E;\ MOVL A,DI;\ ROLL $5,DI;\ ADDL DI,E;\ FN(B,C,D)\ ADDL DI,E;\ RORL $2,B;\ #define BODY0(off,FN,V,A,B,C,D,E)\ MOVL off(BX),DI;\ BSWAPDI;\ MOVL DI,off(BP);\ LEAL V(DI)(E*1),E;\ MOVL A,DI;\ ROLL $5,DI;\ ADDL DI,E;\ FN(B,C,D)\ ADDL DI,E;\ RORL $2,B;\ /* * fn1 = (((C^D)&B)^D); */ #define FN1(B,C,D)\ MOVL C,DI;\ XORL D,DI;\ ANDL B,DI;\ XORL D,DI;\ /* * fn24 = B ^ C ^ D */ #define FN24(B,C,D)\ MOVL B,DI;\ XORL C,DI;\ XORL D,DI;\ /* * fn3 = ((B ^ C) & (D ^= B)) ^ B * D ^= B to restore D */ #define FN3(B,C,D)\ MOVL B,DI;\ XORL C,DI;\ XORL B,D;\ ANDL D,DI;\ XORL B,DI;\ XORL B,D;\ /* * stack offsets * void sha1block(uchar *DATA, int LEN, ulong *STATE) */ #define DATA 0 #define LEN 4 #define STATE 8 /* * stack offsets for locals * ulong w[80]; * uchar *edata; * ulong *w15, *w40, *w60, *w80; * register local * ulong *wp = BP * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi * ulong tmp = edi */ #define WARRAY (-4-(80*4)) #define TMP1 (-8-(80*4)) #define TMP2 (-12-(80*4)) #define W15 (-16-(80*4)) #define W40 (-20-(80*4)) #define W60 (-24-(80*4)) #define W80 (-28-(80*4)) #define EDATA (-32-(80*4)) MOVL data+DATA(FP),AX ADDL len+LEN(FP),AX MOVL AX,edata+EDATA(SP) LEAL aw15+(WARRAY+15*4)(SP),DI MOVL DI,w15+W15(SP) LEAL aw40+(WARRAY+40*4)(SP),DX MOVL DX,w40+W40(SP) LEAL aw60+(WARRAY+60*4)(SP),CX MOVL CX,w60+W60(SP) LEAL aw80+(WARRAY+80*4)(SP),DI MOVL DI,w80+W80(SP) mainloop: LEAL warray+WARRAY(SP),BP MOVL state+STATE(FP),DI MOVL (DI),AX MOVL 4(DI),BX MOVL BX,tmp1+TMP1(SP) MOVL 8(DI),CX MOVL 12(DI),DX MOVL 16(DI),SI MOVL data+DATA(FP),BX loop1: BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI) MOVL SI,tmp2+TMP2(SP) BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX) MOVL tmp1+TMP1(SP),SI BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX) BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI) MOVL SI,tmp1+TMP1(SP) BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX) MOVL tmp2+TMP2(SP),SI ADDL $20,BX ADDL $20,BP CMPL BP,w15+W15(SP) JCS loop1 BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI) ADDL $4,BX MOVL BX,data+DATA(FP) MOVL tmp1+TMP1(SP),BX BODY(4,FN1,0x5a827999,SI,AX,BX,CX,DX) BODY(8,FN1,0x5a827999,DX,SI,AX,BX,CX) BODY(12,FN1,0x5a827999,CX,DX,SI,AX,BX) BODY(16,FN1,0x5a827999,BX,CX,DX,SI,AX) ADDL $20,BP loop2: BODY(0,FN24,0x6ed9eba1,AX,BX,CX,DX,SI) BODY(4,FN24,0x6ed9eba1,SI,AX,BX,CX,DX) BODY(8,FN24,0x6ed9eba1,DX,SI,AX,BX,CX) BODY(12,FN24,0x6ed9eba1,CX,DX,SI,AX,BX) BODY(16,FN24,0x6ed9eba1,BX,CX,DX,SI,AX) ADDL $20,BP CMPL BP,w40+W40(SP) JCS loop2 loop3: BODY(0,FN3,0x8f1bbcdc,AX,BX,CX,DX,SI) BODY(4,FN3,0x8f1bbcdc,SI,AX,BX,CX,DX) BODY(8,FN3,0x8f1bbcdc,DX,SI,AX,BX,CX) BODY(12,FN3,0x8f1bbcdc,CX,DX,SI,AX,BX) BODY(16,FN3,0x8f1bbcdc,BX,CX,DX,SI,AX) ADDL $20,BP CMPL BP,w60+W60(SP) JCS loop3 loop4: BODY(0,FN24,0xca62c1d6,AX,BX,CX,DX,SI) BODY(4,FN24,0xca62c1d6,SI,AX,BX,CX,DX) BODY(8,FN24,0xca62c1d6,DX,SI,AX,BX,CX) BODY(12,FN24,0xca62c1d6,CX,DX,SI,AX,BX) BODY(16,FN24,0xca62c1d6,BX,CX,DX,SI,AX) ADDL $20,BP CMPL BP,w80+W80(SP) JCS loop4 MOVL state+STATE(FP),DI ADDL AX,0(DI) ADDL BX,4(DI) ADDL CX,8(DI) ADDL DX,12(DI) ADDL SI,16(DI) MOVL edata+EDATA(SP),DI CMPL data+DATA(FP),DI JCS mainloop RET END that such works are identified as "derived from the RSA Data * Security, Inc. MD5 Message-Digest Algorithm" in all material * mentioning or referencing the derived work. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software forany particular purpose. It is provided "as is" * without express or implied warranty old_contrib//root/sys/src/cmd/limbo/libsec/Plan9-mips/���������������������������������������������� 775 � 0 � 0 � 0 11411740010 21705��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/Plan9-mips/md5block.s������������������������������������ 664 � 0 � 0 � 16044 7255750024 23617�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * rfc1321 requires that I include this. The code is new. The constants * all come from the rfc (hence the copyright). We trade a table for the * macros in rfc. The total size is a lot less. -- presotto * * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All * rights reserved. * * License to copy and use this software is granted provided that it * is identified as the "RSA Data Security, Inc. MD5 Message-Digest * Algorithm" in all material mentioning or referencing this software * or this function. * * License is also granted to make and use derivative works provided * that such works are identified as "derived from the RSA Data * Security, Inc. MD5 Message-Digest Algorithm" in all material * mentioning or referencing the derived work. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software forany particular purpose. It is provided "as is" * without express or implied warranty of any kind. * These notices must be retained in any copies of any part of this * documentation and/or software. */ /* round 1 */ DATA md5tab<>+( 0*4)(SB)/4,$0xd76aa478 DATA md5tab<>+( 1*4)(SB)/4,$0xe8c7b756 DATA md5tab<>+( 2*4)(SB)/4,$0x242070db DATA md5tab<>+( 3*4)(SB)/4,$0xc1bdceee DATA md5tab<>+( 4*4)(SB)/4,$0xf57c0faf DATA md5tab<>+( 5*4)(SB)/4,$0x4787c62a DATA md5tab<>+( 6*4)(SB)/4,$0xa8304613 DATA md5tab<>+( 7*4)(SB)/4,$0xfd469501 DATA md5tab<>+( 8*4)(SB)/4,$0x698098d8 DATA md5tab<>+( 9*4)(SB)/4,$0x8b44f7af DATA md5tab<>+(10*4)(SB)/4,$0xffff5bb1 DATA md5tab<>+(11*4)(SB)/4,$0x895cd7be DATA md5tab<>+(12*4)(SB)/4,$0x6b901122 DATA md5tab<>+(13*4)(SB)/4,$0xfd987193 DATA md5tab<>+(14*4)(SB)/4,$0xa679438e DATA md5tab<>+(15*4)(SB)/4,$0x49b40821 /* round 2 */ DATA md5tab<>+(16*4)(SB)/4,$0xf61e2562 DATA md5tab<>+(17*4)(SB)/4,$0xc040b340 DATA md5tab<>+(18*4)(SB)/4,$0x265e5a51 DATA md5tab<>+(19*4)(SB)/4,$0xe9b6c7aa DATA md5tab<>+(20*4)(SB)/4,$0xd62f105d DATA md5tab<>+(21*4)(SB)/4,$0x02441453 DATA md5tab<>+(22*4)(SB)/4,$0xd8a1e681 DATA md5tab<>+(23*4)(SB)/4,$0xe7d3fbc8 DATA md5tab<>+(24*4)(SB)/4,$0x21e1cde6 DATA md5tab<>+(25*4)(SB)/4,$0xc33707d6 DATA md5tab<>+(26*4)(SB)/4,$0xf4d50d87 DATA md5tab<>+(27*4)(SB)/4,$0x455a14ed DATA md5tab<>+(28*4)(SB)/4,$0xa9e3e905 DATA md5tab<>+(29*4)(SB)/4,$0xfcefa3f8 DATA md5tab<>+(30*4)(SB)/4,$0x676f02d9 DATA md5tab<>+(31*4)(SB)/4,$0x8d2a4c8a /* round 3 */ DATA md5tab<>+(32*4)(SB)/4,$0xfffa3942 DATA md5tab<>+(33*4)(SB)/4,$0x8771f681 DATA md5tab<>+(34*4)(SB)/4,$0x6d9d6122 DATA md5tab<>+(35*4)(SB)/4,$0xfde5380c DATA md5tab<>+(36*4)(SB)/4,$0xa4beea44 DATA md5tab<>+(37*4)(SB)/4,$0x4bdecfa9 DATA md5tab<>+(38*4)(SB)/4,$0xf6bb4b60 DATA md5tab<>+(39*4)(SB)/4,$0xbebfbc70 DATA md5tab<>+(40*4)(SB)/4,$0x289b7ec6 DATA md5tab<>+(41*4)(SB)/4,$0xeaa127fa DATA md5tab<>+(42*4)(SB)/4,$0xd4ef3085 DATA md5tab<>+(43*4)(SB)/4,$0x04881d05 DATA md5tab<>+(44*4)(SB)/4,$0xd9d4d039 DATA md5tab<>+(45*4)(SB)/4,$0xe6db99e5 DATA md5tab<>+(46*4)(SB)/4,$0x1fa27cf8 DATA md5tab<>+(47*4)(SB)/4,$0xc4ac5665 /* round 4 */ DATA md5tab<>+(48*4)(SB)/4,$0xf4292244 DATA md5tab<>+(49*4)(SB)/4,$0x432aff97 DATA md5tab<>+(50*4)(SB)/4,$0xab9423a7 DATA md5tab<>+(51*4)(SB)/4,$0xfc93a039 DATA md5tab<>+(52*4)(SB)/4,$0x655b59c3 DATA md5tab<>+(53*4)(SB)/4,$0x8f0ccc92 DATA md5tab<>+(54*4)(SB)/4,$0xffeff47d DATA md5tab<>+(55*4)(SB)/4,$0x85845dd1 DATA md5tab<>+(56*4)(SB)/4,$0x6fa87e4f DATA md5tab<>+(57*4)(SB)/4,$0xfe2ce6e0 DATA md5tab<>+(58*4)(SB)/4,$0xa3014314 DATA md5tab<>+(59*4)(SB)/4,$0x4e0811a1 DATA md5tab<>+(60*4)(SB)/4,$0xf7537e82 DATA md5tab<>+(61*4)(SB)/4,$0xbd3af235 DATA md5tab<>+(62*4)(SB)/4,$0x2ad7d2bb DATA md5tab<>+(63*4)(SB)/4,$0xeb86d391 #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 #define AREG R5 #define BREG R6 #define CREG R7 #define DREG R8 #define DATAREG R1 #define TABREG R10 #define STREG R11 #define XREG R12 #define ELOOPREG R13 #define EDREG R14 #define IREG R15 #define TMP1 R9 #define TMP2 R2 #define TMP3 R3 #define TMP4 R4 /* * decode little endian data into x[off], then the body * bodies have this form: * a += FN(B,C,D); * a += x[off] + t[off]; * a = (a << S11) | (a >> (32 - S11)); * a += b; */ #define BODY1(off,FN,SH,A,B,C,D)\ MOVBU off(DATAREG),TMP2;\ MOVBU (off+1)(DATAREG),TMP3;\ MOVBU (off+2)(DATAREG),TMP1;\ MOVBU (off+3)(DATAREG),TMP4;\ SLL $8,TMP3;\ OR TMP3,TMP2;\ SLL $16,TMP1;\ OR TMP1,TMP2;\ SLL $24,TMP4;\ OR TMP4,TMP2;\ MOVW off(TABREG),TMP3;\ FN(B,C,D)\ ADDU TMP1,A;\ MOVW TMP2,off(XREG);\ ADDU TMP2,A;\ ADDU TMP3,A;\ SLL $SH,A,TMP1;\ SRL $(32-SH),A;\ OR TMP1,A;\ ADDU B,A;\ #define BODY(off,inc,FN,SH,A,B,C,D)\ MOVW off(TABREG),TMP3;\ ADDU XREG,IREG,TMP4;\ MOVW (TMP4),TMP2;\ ADDU $(inc*4),IREG;\ AND $63,IREG;\ FN(B,C,D)\ ADDU TMP1,A;\ ADDU TMP2,A;\ ADDU TMP3,A;\ SLL $SH,A,TMP1;\ SRL $(32-SH),A;\ OR TMP1,A;\ ADDU B,A;\ /* * fn1 = ((c ^ d) & b) ^ d */ #define FN1(B,C,D)\ XOR C,D,TMP1;\ AND B,TMP1;\ XOR D,TMP1;\ /* * fn2 = ((b ^ c) & d) ^ c; */ #define FN2(B,C,D)\ XOR B,C,TMP1;\ AND D,TMP1;\ XOR C,TMP1;\ /* * fn3 = b ^ c ^ d; */ #define FN3(B,C,D)\ XOR B,C,TMP1;\ XOR D,TMP1;\ /* * fn4 = c ^ (b | ~d); */ #define FN4(B,C,D)\ XOR $-1,D,TMP1;\ OR B,TMP1;\ XOR C,TMP1;\ #define DATA 0 #define LEN 4 #define STATE 8 #define XOFF (-4-16*4) TEXT _md5block+0(SB),$68 MOVW len+LEN(FP),TMP1 ADDU DATAREG,TMP1,EDREG MOVW state+STATE(FP),STREG MOVW 0(STREG),AREG MOVW 4(STREG),BREG MOVW 8(STREG),CREG MOVW 12(STREG),DREG mainloop: MOVW $md5tab<>+0(SB),TABREG ADDU $(16*4),DATAREG,ELOOPREG MOVW $x+XOFF(SP),XREG loop1: BODY1(0,FN1,S11,AREG,BREG,CREG,DREG) BODY1(4,FN1,S12,DREG,AREG,BREG,CREG) BODY1(8,FN1,S13,CREG,DREG,AREG,BREG) BODY1(12,FN1,S14,BREG,CREG,DREG,AREG) ADDU $16,DATAREG ADDU $16,TABREG ADDU $16,XREG BNE DATAREG,ELOOPREG,loop1 MOVW $x+XOFF(SP),XREG MOVW $(1*4),IREG MOVW $(1*4),ELOOPREG loop2: BODY(0,5,FN2,S21,AREG,BREG,CREG,DREG) BODY(4,5,FN2,S22,DREG,AREG,BREG,CREG) BODY(8,5,FN2,S23,CREG,DREG,AREG,BREG) BODY(12,5,FN2,S24,BREG,CREG,DREG,AREG) ADDU $16,TABREG BNE IREG,ELOOPREG,loop2 MOVW $(5*4),IREG MOVW $(5*4),ELOOPREG loop3: BODY(0,3,FN3,S31,AREG,BREG,CREG,DREG) BODY(4,3,FN3,S32,DREG,AREG,BREG,CREG) BODY(8,3,FN3,S33,CREG,DREG,AREG,BREG) BODY(12,3,FN3,S34,BREG,CREG,DREG,AREG) ADDU $16,TABREG BNE IREG,ELOOPREG,loop3 MOVW $0,IREG loop4: BODY(0,7,FN4,S41,AREG,BREG,CREG,DREG) BODY(4,7,FN4,S42,DREG,AREG,BREG,CREG) BODY(8,7,FN4,S43,CREG,DREG,AREG,BREG) BODY(12,7,FN4,S44,BREG,CREG,DREG,AREG) ADDU $16,TABREG BNE IREG,R0,loop4 MOVW 0(STREG),TMP1 MOVW 4(STREG),TMP2 MOVW 8(STREG),TMP3 MOVW 12(STREG),TMP4 ADDU TMP1,AREG ADDU TMP2,BREG ADDU TMP3,CREG ADDU TMP4,DREG MOVW AREG,0(STREG) MOVW BREG,4(STREG) MOVW CREG,8(STREG) MOVW DREG,12(STREG) BNE DATAREG,EDREG,mainloop RET GLOBL md5tab<>+0(SB),$256 END MP1(SP),CX,DX,SI) MOVL SI,tmp2+TMP2(SP) BODY0(4,FN1,0x5a827999,SI,AX,tmp1+TMP1(SP),CX,DX) MOVL tmp1+TMP1(SP),SI BODY0(8,FN1,0x5a827999,DX,tmp2+TMP2(SP),AX,SI,CX) BODY0(12,FN1,0x5a827999,CX,DX,tmp2+TMP2(SP),AX,SI) MOVL SI,tmp1+TMP1(SP) BODY0(16,FN1,0x5a827999,SI,CX,DX,tmp2+TMP2(SP),AX) MOVL tmp2+TMP2(SP),SI ADDL $20,BX ADDL $20,BP CMPL BP,w15+W15(SP) JCS loop1 BODY0(0,FN1,0x5a827999,AX,tmp1+TMP1(SP),CX,DX,SI) ADDL $4,BX MOVL BX,data+DATA(FP) MOVL tmp1+TMPold_contrib//root/sys/src/cmd/limbo/libsec/Plan9-mips/mkfile���������������������������������������� 664 � 0 � 0 � 272 10745516011 23073�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OBJTYPE=$objtype </$objtype/mkfile LIB=../libsec.a FILES=\ md5block\ sha1block\ HFILES=../../include/libsec.h SFILES=${FILES:%=%.s} OFILES=${FILES:%=%.$O} </sys/src/cmd/mksyslib ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/Plan9-mips/sha1block.s����������������������������������� 664 � 0 � 0 � 10057 7255750024 23764�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� TEXT _sha1block+0(SB),$328 /* * wp[off] = x; * x += A <<< 5; * E += 0xca62c1d6 + x; * x = FN(B,C,D); * E += x; * B >>> 2 */ #define BODYX(off,FN,V,A,B,C,D,E)\ FN(B,C,D)\ ADDU TMP1,E;\ ADDU V,E;\ MOVW TMP2,off(WREG);\ ADDU TMP2,E;\ SLL $5,A,TMP3;\ SRL $27,A,TMP4;\ OR TMP3,TMP4;\ ADDU TMP4,E;\ SLL $30,B,TMP4;\ SRL $2,B;\ OR TMP4,B /* * x = data[i] * BODYX */ #define BODY1(off,FN,V,A,B,C,D,E)\ MOVBU off(DATAREG),TMP2;\ MOVBU (off+1)(DATAREG),TMP3;\ MOVBU (off+2)(DATAREG),TMP1;\ MOVBU (off+3)(DATAREG),TMP4;\ SLL $24,TMP2;\ SLL $16,TMP3;\ OR TMP3,TMP2;\ SLL $8,TMP1;\ OR TMP1,TMP2;\ OR TMP4,TMP2;\ BODYX(off,FN,V,A,B,C,D,E) /* * x = (wp[off-3] ^ wp[off-8] ^ wp[off-14] ^ wp[off-16]) <<< 1; * BODYX */ #define BODY(off,FN,V,A,B,C,D,E)\ MOVW (off-64)(WREG),TMP1;\ MOVW (off-56)(WREG),TMP2;\ MOVW (off-32)(WREG),TMP3;\ MOVW (off-12)(WREG),TMP4;\ XOR TMP1,TMP2;\ XOR TMP3,TMP2;\ XOR TMP4,TMP2;\ SLL $1,TMP2,TMP1;\ SRL $31,TMP2;\ OR TMP1,TMP2;\ BODYX(off,FN,V,A,B,C,D,E) /* * fn1 = (((C^D)&B)^D); */ #define FN1(B,C,D)\ XOR C,D,TMP1;\ AND B,TMP1;\ XOR D,TMP1; /* * fn24 = B ^ C ^ D */ #define FN24(B,C,D)\ XOR B,C,TMP1;\ XOR D,TMP1; /* * fn3 = ((B ^ C) & (D ^ B)) ^ B */ #define FN3(B,C,D)\ XOR B,C,TMP1;\ XOR B,D,TMP4;\ AND TMP4,TMP1;\ XOR B,TMP1; /* * stack offsets * void vtSha1Block(ulong *STATE, uchar *DATA, int LEN) */ #define DATA 0 #define LEN 4 #define STATE 8 /* * stack offsets for locals * ulong w[80]; * uchar *edata; * ulong *w15, *w40, *w60, *w80; * register local * ulong *wp = BP * ulong a = eax, b = ebx, c = ecx, d = edx, e = esi * ulong tmp = edi */ #define WARRAY (-4-(80*4)) #define AREG R5 #define BREG R6 #define CREG R7 #define DREG R8 #define EREG R9 #define DATAREG R1 #define STREG R11 #define WREG R12 #define W15REG R13 #define W60REG R14 #define W40REG R15 #define W80REG R16 #define EDREG R17 #define VREG R18 #define TMP1 R10 #define TMP2 R2 #define TMP3 R3 #define TMP4 R4 #define TMP5 R19 MOVW len+LEN(FP),TMP1 MOVW state+STATE(FP),STREG ADDU DATAREG,TMP1,EDREG MOVW 0(STREG),AREG MOVW 4(STREG),BREG MOVW 8(STREG),CREG MOVW 12(STREG),DREG MOVW 16(STREG),EREG MOVW $warray+WARRAY(SP),WREG ADDU $(15*4),WREG,W15REG ADDU $(40*4),WREG,W40REG ADDU $(60*4),WREG,W60REG ADDU $(80*4),WREG,W80REG mainloop: MOVW $warray+WARRAY(SP),WREG MOVW $0x5a827999,VREG loop1: BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG) BODY1(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG) BODY1(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG) BODY1(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG) BODY1(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG) ADDU $20,DATAREG ADDU $20,WREG BNE WREG,W15REG,loop1 BODY1(0,FN1,VREG,AREG,BREG,CREG,DREG,EREG) ADDU $4,DATAREG BODY(4,FN1,VREG,EREG,AREG,BREG,CREG,DREG) BODY(8,FN1,VREG,DREG,EREG,AREG,BREG,CREG) BODY(12,FN1,VREG,CREG,DREG,EREG,AREG,BREG) BODY(16,FN1,VREG,BREG,CREG,DREG,EREG,AREG) ADDU $20,WREG MOVW $0x6ed9eba1,VREG loop2: BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG) BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG) BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG) BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG) BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG) ADDU $20,WREG BNE WREG,W40REG,loop2 MOVW $0x8f1bbcdc,VREG loop3: BODY(0,FN3,VREG,AREG,BREG,CREG,DREG,EREG) BODY(4,FN3,VREG,EREG,AREG,BREG,CREG,DREG) BODY(8,FN3,VREG,DREG,EREG,AREG,BREG,CREG) BODY(12,FN3,VREG,CREG,DREG,EREG,AREG,BREG) BODY(16,FN3,VREG,BREG,CREG,DREG,EREG,AREG) ADDU $20,WREG BNE WREG,W60REG,loop3 MOVW $0xca62c1d6,VREG loop4: BODY(0,FN24,VREG,AREG,BREG,CREG,DREG,EREG) BODY(4,FN24,VREG,EREG,AREG,BREG,CREG,DREG) BODY(8,FN24,VREG,DREG,EREG,AREG,BREG,CREG) BODY(12,FN24,VREG,CREG,DREG,EREG,AREG,BREG) BODY(16,FN24,VREG,BREG,CREG,DREG,EREG,AREG) ADDU $20,WREG BNE WREG,W80REG,loop4 MOVW 0(STREG),TMP1 MOVW 4(STREG),TMP2 MOVW 8(STREG),TMP3 MOVW 12(STREG),TMP4 MOVW 16(STREG),TMP5 ADDU TMP1,AREG ADDU TMP2,BREG ADDU TMP3,CREG ADDU TMP4,DREG ADDU TMP5,EREG MOVW AREG,0(STREG) MOVW BREG,4(STREG) MOVW CREG,8(STREG) MOVW DREG,12(STREG) MOVW EREG,16(STREG) BNE DATAREG,EDREG,mainloop RET END TA md5tab<>+(47*4)(SB)/4,$0xc4ac5665 /* round 4 */ DATA md5tab<>+(48*4)(SB)/4,$0xf4292244 DATA md5tab<>+(49*4)(SB)/4,$0x432aff97 DATA md5tab<>+(50*4)(SB)/4,$0xab9423a7 DATA md5tab<>+(51*4)(SB)/4,$0xfc93a039 DATA md5tab<>+(52*4)(SB)/4,$0x655b59c3 DATA md5tab<>+(53*4)(SB)/4,$0x8f0ccc92 DATA md5tab<>+(54*4)(SB)/4,$0xffeff47d DATA md5tab<>+(55*4)(SB)/4,$0x85845dd1 DATA md5tab<>+(56*4)(SB)/4,$0x6fa87e4f DATA md5tab<>+(57*4)(SB)/4,$0xfe2ce6e0 old_contrib//root/sys/src/cmd/limbo/libsec/libsec.a������������������������������������������������� 664 � 0 � 0 � 1676374 10745520523 21505�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!<arch> __.SYMDEF 1201054035 0 0 644 1356 ` Te�_sha1block�TL�_md5block�T@�dsaverify�T4�dsasign�T/�dsaprivtopub�T &�dsasigalloc�T &�dsaprivalloc�T &�dsapubfree�T &�dsasigfree�T &�dsaprivfree�T &�dsapuballoc�T�dsagen�T(�egverify�T�egsign�T0�egprivtopub�T�egsigfree�T�egprivalloc�T�egprivfree�T�egpubfree�T�egpuballoc�T�egsigalloc�T�egdecrypt�TL�egencrypt�T�eggen�T�rsaprivtopub�T�rsapuballoc�T�rsaprivalloc�T�rsaprivfree�T�rsapubfree�T�rsadecrypt�T�rsaencrypt�TX�rsafill�Tr�rsagen�T�genstrongprime�Tƒ�gensafeprime�T �DSAprimes�T^x�genprime�T<�smallprimetest�T-�probably_prime�T)�nfastrand�TX&�fastrand�T<"�prng�T�genrandom�T �setupRC4state�T �rc4back�T �rc4�T �rc4skip�T�md5pickle�T�md5unpickle�T�sha1unpickle�T�sha1pickle�T�sha1�T�md4�T`�md5�Tx�hmac_md5�Tx�hmac_sha1�T`�idea_cipher�T`�setupIDEAstate�T`�idea_key_setup�T�bfECBencrypt�T�setupBFstate�T�bfCBCencrypt�T�bfCBCdecrypt�T�bfECBdecrypt�TF��aesCBCdecrypt�TF��aesCBCencrypt�TF��setupAESstate�TH��des3CBCdecrypt�TH��des3CBCencrypt�T��des3ECBencrypt�T��des3ECBdecrypt�T��desCBCdecrypt�T��desCBCencrypt�T��desECBdecrypt�T��desECBencrypt�T|��setupDES3state�T|��setupDESstate�T��key_setup�T��des_key_setup�T��des64to56�T��triple_block_cipher�T��block_cipher�T��des56to64�des.8 1201054002 0 0 664 30402 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<des.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�c����~�>spbox�-���;>��A-���;���>���A-���; ���>�A-���;���>�A-���;���>��A-���;���>���A-���;���>���A-���; ���>���A-���;$���>��A-���;(���>�A-���;,���>���A-���;0���>�A-���;4���>�A-���;8���>���A-���;<���>���A-���;@���>��A-���;D���>��A-���;H���>��A-���;L���>���A-���;P���>���A-���;T���>��A-���;X���>��A-���;\���>�A-���;`���>��A-���;d���>��A-���;h���>��A-���;l���>��A-���;t���>��A-���;x���>��A-���;|���>���A-���;���>���A-���;���>�A-���;���>���A-���;���>��A-���;���>��A-���;���>���A-���;���>���A-���;���>���A-���;���>�A-���;���>���A-���;���>���A-���;���>��A-���;���>���A-���;���>���A-���;���>�A-���;���>��A-���;���>�A-���;���>��A-���;���>��A-���;���>�A-���;���>��A-���;���>��A-���;���>��A-���;���>��A-���;���>��A-���;���>��A-���;���>��A-���;���>��A-���;���>���A-���;���>�A-���;���>@@A-���;��>�@�@A-���;��>�@��A-���; ��>@�A-���;��>���A-���;��>���A-���;��>�@A-���;��>@�@A-���; ��>��@A-���;$��>@@A-���;(��>�@@A-���;,��>���@A-���;0��>�@�@A-���;4��>���A-���;8��>���A-���;<��>�@A-���;@��>�@�A-���;D��>��A-���;H��>@�@A-���;P��>���@A-���;T��>�@��A-���;X��>@�A-���;\��>��@A-���;`��>��A-���;d��>��@A-���;l��>�@�A-���;p��>@��A-���;t��>�@@A-���;x��>��@A-���;|��>@��A-���;��>@�A-���;��>�@A-���;��>���A-���;��>@�@A-���;��>��@A-���;��>�@@A-���;��>�@��A-���;��>��@A-���;��>�@�@A-���;��>���A-���;��>@@A-���;��>@�A-���;��>���A-���;��>�@��A-���;��>���@A-���;��>@��A-���;��>�@@A-���;��>���A-���;��>��@A-���;��>��A-���;��>@�@A-���;��>��@A-���;��>��A-���;��>�@�A-���;��>�@�@A-���;��>@��A-���;��>���@A-���;��>�@A-���;��>@@A-���;��>�@�A-���;���>��A-���;��>�A-���; ��>�A-���;��>��A-���;��>�A-���;��>��A-���; ��>��A-���;$��>��A-���;(��>��A-���;,��>���A-���;0��>A-���;4��>��A-���;8��>��A-���;<��>��A-���;@��>���A-���;D��>���A-���;H��>�A-���;L��>���A-���;P��>��A-���;T��>��A-���;X��>�A-���;\��>�A-���;`��>�A-���;d��>��A-���;h��>���A-���;l��>�A-���;p��>���A-���;t��>A-���;x��>���A-���;|��>���A-���;��>�A-���;��>���A-���;��>��A-���;��>��A-���;��>���A-���;��>�A-���;��>��A-���;��>���A-���;��>��A-���;��>A-���;��>��A-���;��>��A-���;��>���A-���;��>�A-���;��>�A-���;��>���A-���;��>���A-���;��>A-���;��>���A-���;��>�A-���;��>��A-���;��>��A-���;��>��A-���;��>�A-���;��>��A-���;��>��A-���;��>�A-���;��>���A-���;��>�A-���;��>��A-���;���>�@A-���;��>@�A-���;��>@�A-���; ��>@���A-���;��>@@�A-���;��>@�@A-���;��>��@A-���;��>��A-���;$��>�@�A-���;(��>�@�A-���;,��>@@A-���;0��>@��A-���;8��>@�@�A-���;<��>��@A-���;@��>���A-���;D��>���A-���;H��>��@�A-���;L��>�@A-���;P��>@���A-���;T��>��@�A-���;X��>��A-���;\��>@��A-���;`��>@�@A-���;d��>���A-���;h��>@��A-���;l��>@�@�A-���;p��>���A-���;t��>@@�A-���;x��>@@A-���;|��>@��A-���;��>@�@�A-���;��>��@A-���;��>�@�A-���;��>@@A-���;��>@��A-���;��>�@�A-���;��>@��A-���;��>@�@�A-���;��>@�@A-���;��>���A-���;��>�@A-���;��>@�A-���;��>@�A-���;��>@���A-���;��>@@A-���;��>@��A-���;��>���A-���;��>���A-���;��>��@A-���;��>��A-���;��>@@�A-���;��>@�@A-���;��>��A-���;��>@��A-���;��>��@�A-���;��>�@A-���;��>@���A-���;��>��@�A-���;��>���A-���;��>@@�A-���;���>���A-���;��>�A-���;��>��A-���; ��>��!A-���;��>���A-���;��>���A-���;��>��� A-���;��>��A-���; ��>� A-���;$��>���A-���;(��>��A-���;,��>� A-���;0��>��!A-���;4��>��!A-���;8��>��A-���;<��>��� A-���;@��>���A-���;D��>�� A-���;H��>�� A-���;P��>�� A-���;T��>�!A-���;X��>�!A-���;\��>��A-���;`��>��!A-���;d��>�� A-���;l��>���!A-���;p��>�A-���;t��>���A-���;x��>���!A-���;|��>��A-���;��>���A-���;��>��!A-���;��>���A-���;��>���A-���;��>��� A-���;��>��A-���;��>��!A-���;��>� A-���;��>��A-���;��>��� A-���;��>��!A-���;��>�A-���;��>� A-���;��>���A-���;��>���A-���;��>��!A-���;��>�!A-���;��>��A-���;��>���!A-���;��>�!A-���;��>��A-���;��>�� A-���;��>���!A-���;��>��A-���;��>��A-���;��>�� A-���;��>���A-���;��>�� A-���;��>�A-���;��>�� A-���;���>��A-���;��>�� A-���;��>� ��A-���; ��> A-���;��>�� A-���;��>���A-���;��> A-���;��>�� �A-���; ��>� �A-���;$��> �A-���;(��>�� �A-���;,��>��A-���;0��>� �A-���;4��>� �A-���;8��>���A-���;<��> ��A-���;D��>� �A-���;H��> �A-���;L��>� ��A-���;P��>� �A-���;T��> �A-���;X��>���A-���;\��>� A-���;`��>� A-���;h��> �A-���;l��>� A-���;p��> ��A-���;t��>� �A-���;x��>� A-���;|��>���A-���;��>� �A-���;��>���A-���;��>� A-���;��>� �A-���;��> A-���;��>�� �A-���;��> ��A-���;��>��A-���;��>�� �A-���;��>� �A-���;��>���A-���;��> ��A-���;��>��A-���;��> A-���;��>� �A-���;��>�� A-���;��> �A-���;��>� A-���;��>� A-���;��>���A-���;��>� ��A-���;��>�� A-���;��> �A-���;��>� ��A-���;��>� �A-���;��> �A-���;��>� A-���;��>���A-���;��>� �A-���;��> �A-���;���>���A-���;��>�A-���;��>�A-���;��>���A-���;��>�A-���;��>�A-���;��>�A-���; ��>A-���;$��>���A-���;,��>��A-���;0��>���A-���;4��>���A-���;8��>�A-���;<��>��A-���;@��>��A-���;D��>�A-���;H��>��A-���;L��>��A-���;P��>��A-���;T��>��A-���;X��>�A-���;\��>��A-���;`��>��A-���;d��>���A-���;h��>��A-���;l��>A-���;p��>��A-���;t��>���A-���;x��>���A-���;|��>��A-���;��>���A-���;��>��A-���;��>���A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>���A-���;��>��A-���;��>���A-���;��>��A-���;��>���A-���;��>�A-���;��>��A-���;��>�A-���;��>�A-���;��>��A-���;��>��A-���;��>A-���;��>��A-���;��>��A-���;��>���A-���;��>A-���;��>�A-���;��>��A-���;��>���A-���;��>��A-���;��>��A-���;��>���A-���;��>��A-���;���> �A-���;��>���A-���;��>���A-���; ��> A-���;��>���A-���;��> �A-���;��> ���A-���;��>���A-���; ��> ��A-���;$��>��A-���;(��> A-���;,��>��A-���;0��>�A-���;4��> �A-���;8��>���A-���;<��> ���A-���;@��>��A-���;D��> ��A-���;H��>��A-���;L��> ��A-���;P��>��A-���;T��> ��A-���;X��> �A-���;\��>�A-���;`��> ��A-���;l��> �A-���;p��> ��A-���;t��>��A-���;x��> �A-���;|��>���A-���;��> �A-���;��>���A-���;��>�A-���;��>���A-���;��> ���A-���;��> �A-���;��>���A-���;��> �A-���;��>��A-���;��> ���A-���;��> ��A-���;��>��A-���;��> �A-���;��>���A-���;��>���A-���;��> �A-���;��> A-���;��> ��A-���;��> ��A-���;��>��A-���;��>��A-���;��> �A-���;��> A-���;��>��A-���;��>��A-���;��> ��A-���;��> ��A-���;��> ��A-���;��>���A-���;��>�A~�=block_cipher����=���A~�@text�p������@~�@key�p���@ s������V������As���V ��� p��� s������V ������A ��� s������V ������A ��� p���s������V������As������V ��� p��� s������V ������A ��� s������V ������A ��� p��� p���������A ���UUUUAp���  ���A ��� ���  ���A p��� ���UUUUA ���  p��� ������A ����3�3Ap���  ���33A ��� p���  ������A �����A ��� p��� ��� ���A �����Ap���  ���A ��� p���  ��� ���A �����A ��� p��� p��� ������A ����3�3Ap���  ���33A ��� p���  ������A �����A ��� p��� ��� ���A �����Ap���  ���A ��� p���  ��� ���A �����A ��� p��� ~�@decrypting�&������@AO����U���<~�?keystep�p���A? ���x���A W����V���<p������A?~�?i�p���A?W����[���<W����Z���<W�������<C����?&���?���AP����Y���<p���Tp��� ������Ap���  ������A ��� ���p��� ������A ������A p��� >p��� ������A ������A ��� ���>p��� ������A ������A ��� ���>p��� ������A ��� ���>��� p������Tp��� ������Ap���  ������A ��� ���p��� ������A ������A p��� ���>p��� ������A ������A ��� ���>p��� ������A ������A ��� ���>p��� ������A ��� ���>��� p� ��?� �����A � �� p� ��Tp� �� � �����Ap� ��  � �����A � �� � ��p� �� � �����A � �����A p� �� >p� �� � �����A � �����A � �� ���>p� �� � �����A � �����A � �� ���>p� �� � �����A � �� ���>� �� p������Tp��� ������Ap���  ������A ��� ���p��� ������A ������A p��� ���>p��� ������A ������A ��� ���>p��� ������A ������A ��� ���>p��� ������A ��� ���>��� p���?������A ��� W����X���<p���  ���  ���A p���  ���UUUUA ���  p��� ������A ���UUUUAp���  ���A ��� p��� ������A ����3�3Ap���  ���33A ��� p���  ������A �����A ��� p��� �"�� ���A �"����Ap�"��  �"��A �"�� p�"��  �"�� ���A �"����A �"�� p�"�� p�%�� �%�����A �%���3�3Ap�%��  �%��33A �%�� p�%��  �%�����A �%����A �%�� p�%�� �(�� ���A �(����Ap�(��  �(��A �(�� p�(��  �(�� ���A �(����A �(�� o�+��Vp�,�� �,�����Ao�,�����Vp�-�� �-�����Ao�-�����Vp�.�� �.�����Ao�.�����Vo�/�� ���Vp�0�� �0�����Ao�0�����Vp�1�� �1�����Ao�1�����Vp�2�� �2�����Ao�2�����V�2����~�=triple_block_cipher��9��=$���Ap�B�����@s�B�����O�B�����Ap�B�����@ s�B��P �B�� p�B�� p�B�����@ s�B�����P �B�����A �B�� p�B�����@ s�B�����P �B�����A �B�� p�B�� p�C�����@s�C�����O�C�����Ap�C�����@ s�C�����P �C�� p�C�� p�C�����@ s�C�����P �C�����A �C�� p�C�����@ s�C�����P �C�����A �C�� p�C�� p�D�� �D�����A �D��UUUUAp�D��  �D��A �D�� �E��  �E��A p�E��  �E��UUUUA �E��  p�F�� �F�����A �F���3�3Ap�F��  �F��33A �F�� p�F��  �F�����A �F����A �F�� p�F�� �I�� ���A �I����Ap�I��  �I��A �I�� p�I��  �I�� ���A �I����A �I�� p�I�� p�L�� �L�����A �L���3�3Ap�L��  �L��33A �L�� p�L��  �L�����A �L����A �L�� p�L�� �O�� ���A �O����Ap�O��  �O��A �O�� p�O��  �O�� ���A �O����A �O�� p�O�� ~�? j�p�S��A ?W�S���e��<W�S���d��<W�S�����<C�S��� ?&�S�� ?���AP�S���c��<~�@ ende�p�T����� @ �T�����A&�T�����AX�T���r��<p�U�� ?�U�����A~�@ expanded_key�p�U�� @ �U�� �U��x��A p�V��AW�V���x��<p�X�� ? �X�����A p�X�� @ a�X�� Qp�X�� p�Y�����A�[�����A��� @p�\��A?W�\���~��<W�\���}��<W�\�����<C�\���?&�\��?���AP�\���|��<p�]��Qp�^�� �^�����Ap�^��  �^�����A �^�� �^��p�_�� �_�����A �_�����A p�_�� >p�_�� �_�����A �_�����A �_�� ���>p�_�� �_�����A �_�����A �_�� ���>p�_�� �_�����A �_�� ���>�_�� p�c�����Qp�d�� �d�����Ap�d��  �d�����A �d�� �d��p�e�� �e�����A �e�����A p�e�� ���>p�e�� �e�����A �e�����A �e�� ���>p�e�� �e�����A �e�����A �e�� ���>p�e�� �e�����A �e�� ���>�e�� p�i���i�����A �i�� p�k��Qp�l�� �l�����Ap�l��  �l�����A �l�� �l��p�m�� �m�����A �m�����A p�m�� >p�m�� �m�����A �m�����A �m�� ���>p�m�� �m�����A �m�����A �m�� ���>p�m�� �m�����A �m�� ���>�m�� p�q�����Qp�r�� �r�����Ap�r��  �r�����A �r�� �r��p�s�� �s�����A �s�����A p�s�� ���>p�s�� �s�����A �s�����A �s�� ���>p�s�� �s�����A �s�����A �s�� ���>p�s�� �s�����A �s�� ���>�s�� p�w���w�����A �w�� W�w���{��<p�z��  p�{��  p�|��  W�|���b��<p���  ��� ���Ap���  ���UUUUA ��� p��� ������A ���UUUUAp���  ���A ��� p��� ������A ����3�3Ap���  ���33A ��� p���  ������A �����A ��� p��� ��� ���A �����Ap���  ���A ��� p���  ��� ���A �����A ��� p��� p���������A ����3�3Ap��� ���33A ��� p��� ������A �����A ��� p��� ��� ���A �����Ap���  ���A ��� p���  ��� ���A �����A ��� p��� p������@o��� Op��� ������Ap������@ o������Pp��� ������Ap������@ o������Pp��� ������Ap������@ o������Pp������@o��� ���Op��� ������Ap������@ o������Pp��� ������Ap������@ o������Pp��� ������Ap������@ o������P�����~�> comptab�-���;��� >���A-���;��� >���A-���; ��� >��A-���;��� >���A-���;��� >��A-���;��� >���A-���;��� >��A-���;$��� >���A-���;(��� >���A-���;,��� >��A-���;0��� >���A-���;4��� >��A-���;8��� >���A-���;<��� >��A-���;D��� >���A-���;H��� >���A-���;L��� >��A-���;T��� >���A-���;X��� >���A-���;\��� >��A-���;`��� >� ��A-���;d��� >� �A-���;h��� >�(��A-���;l��� >�(�A-���;p��� >� ��A-���;t��� >� �A-���;x��� >�(��A-���;|��� >�(�A-���;��� >���A-���;��� >���A-���;��� >��A-���;��� >���A-���;��� >���A-���;��� >��A-���;��� >��@�A-���;��� >�@�A-���;��� >�@�A-���;��� >@�A-���;��� >��@�A-���;��� >�@�A-���;��� >�@�A-���;��� >@�A-���;��� > ���A-���;��� >���A-���;��� > ��A-���;��� >���A-���;��� > ��A-���;��� >��A-���;��� > �A-���;��� >���A-���;��� >"���A-���;��� >��A-���;��� >"��A-���;��� >��A-���;��� >"��A-���;��� >�A-���;��� >"�A-���;�� >���A-���;�� >�� �A-���; �� >� �A-���;�� >���A-���;�� >���A-���;�� >� �A-���;�� >� �A-���;$�� >���A-���;(�� >�� �A-���;,�� >� �A-���;0�� >���A-���;4�� >���A-���;8�� >� �A-���;<�� >� �A-���;D�� >@���A-���;H�� >���A-���;L�� >P���A-���;P�� >�@��A-���;T�� >@@��A-���;X�� >@��A-���;\�� >P@��A-���;`�� >���A-���;d�� >@��A-���;h�� >��A-���;l�� >P��A-���;p�� >�@�A-���;t�� >@@�A-���;x�� >@�A-���;|�� >P@�A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >���A-���;�� >��A-���;�� >��A-���;�� >�A-���;�� >���A-���;�� >��A-���;�� >�� �A-���;�� >� �A-���;�� >��A-���;�� >�A-���;�� >� �A-���;�� > �A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >@���A-���;�� >@��A-���;�� >@��A-���;�� >@�A-���;�� >@���A-���;�� >@��A-���;�� >@��A-���;�� >@�A-���;�� >��@�A-���;�� >���A-���; �� >�@�A-���;�� >���A-���;�� >�@�A-���;�� >��A-���;�� >@�A-���; �� >���A-���;$�� >�@�A-���;(�� >���A-���;,�� >�@�A-���;0�� >��A-���;4�� >@�A-���;8�� >��A-���;<�� >@�A-���;D�� >���A-���;H�� >���A-���;L�� >��A-���;P�� > ���A-���;T�� > ��A-���;X�� > ��A-���;\�� > �A-���;`�� >�@��A-���;d�� >�P��A-���;h�� >�@�A-���;l�� >�P�A-���;p�� > @��A-���;t�� > P��A-���;x�� > @�A-���;|�� > P�A-���;�� >���A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >���A-���;�� >��A-���;�� >���A-���;�� >��A-���;�� >���A-���;�� >��A-���;�� >��A-���;�� >�A-���;�� >��A-���;�� >�A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >��A-���;�� >���A-���;�� >���A-���;�� >��A-���;�� >��A-���;�� >���A-���; �� >���A-���;�� >���A-���;�� >���A-���;�� >���A-���;�� >���A-���; �� >� ��A-���;$�� > ��A-���;(�� >� ��A-���;,�� > ��A-���;0�� > ��A-���;4�� > ��A-���;8�� > ��A-���;<�� > ��A-���;D�� >���A-���;H�� >�� �A-���;L�� >� �A-���;P�� >���A-���;T�� >��A-���;X�� >��"�A-���;\�� >�"�A-���;`�� >���A-���;d�� >���A-���;h�� >� �A-���;l�� >� �A-���;p�� >��A-���;t�� >��A-���;x�� >�"�A-���;|�� >�"�A~�> keysh�-���; >���A-���;��� >���A-���;��� >���A-���; ��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���; ��� >���A-���;$��� >���A-���;(��� >���A-���;,��� >���A-���;0��� >���A-���;4��� >���A-���;8��� >���A-���;<��� >���A~�>keycompperm����>���A~�@left�p���@~�@right�p������@ p���AW����B��<W����A��<W������<C����&������AP����@��<p��� > p������ p������A ��� > p��� ���  ��� p��� ���Ap��� > p��� ��� p������A ��� > p���  ���  ��� p��� ���A p��� ������A ���<���A p��� �� >p��� ������A ���<���A ��� @�� >p��� ������A ���<���A ��� ��� >p��� ������A ���<���A ��� ��� >p��� ��� ���A ���<���A ��� ��� >p��� ������A ���<���A ��� @��� >p��� ������A ���<���A ���  >p��� p���  ������A ���<���A p��� @�� >p���  ������A ���<���A ��� ��� >p���  ������A ���<���A ��� �� >p���  ������A ���<���A ��� �� >p���  ��� ���A ���<���A ��� @�� >p���  ������A ���<���A ��� ��� >p���  ������A ���<���A ��� �� >p��� p���  ������A������Ap���  �����A ��� ���A ��� p���  ������A ������A ��� p���  ������A ������A ��� ~�@ek�p������@ p���Pp���  �����A������Ap���  ���?���A ������A ��� p���  ������A ������A ��� p���  ���?���A ������A ��� p������@ p������P ������A���@W����?��<�����~�=des_key_setup����=$���Ap���@ s������Q������As���Q ��� p��� s������Q ������A ��� s������Q ������A ��� p��� s������Q������As������Q ��� p��� s������Q ������A ��� s������Q ������A ��� p��� p��� ������A ���@@@@Ap���  ������A ���A ��� p���  ������A ���A ��� p���  ������A ���A ��� p���  ���A ��� p���  ������A ��� A ��� p���  ������A ���A ��� p���  ������A ���A ��� p��� p��� ������A ���Ap���  ������A ���A ��� p���  ������A ���@@@@A ��� p���  ���A ��� p���  ������A ��� A ��� p���  ������A ���A ��� p��� p� �� � �����A � ���3�3Ap� ��  � ��33A � �� p� ��  � �����A � ����A � �� p� �� � �� ���A � ����Ap� ��  � ��A � �� p� ��  � �� ���A � ����A � �� p� �� p��� ������A ����3�3Ap���  ���33A ��� p���  ������A �����A ��� p��� ��� ���A �����Ap���  ���A ��� p���  ��� ���A �����A ��� p��� p���  ���A p��� ������A ������Ap���  ����A ��� p��� Sp��� ���Sp������@p������S����>�����~�>parity�-���;>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���> ���A-���;���> ���A-���;���>���A-���;���>���A-���; ���>���A-���; ���>���A-���; ���>���A-���; ���>���A-���; ���>���A-���;���>���A-���;���>���A-� ��;���> ���A-� ��;���>#���A-� ��;���>%���A-� ��;���>&���A-� ��;���>)���A-� ��;���>*���A-� ��;���>,���A-� ��;���>/���A-�!��;���>1���A-�!��;���>2���A-�!��;���>4���A-�!��;���>7���A-�!��;���>8���A-�!��;���>;���A-�!��;���>=���A-�!��;���>>���A-�"��; ���>@���A-�"��;!���>C���A-�"��;"���>E���A-�"��;#���>F���A-�"��;$���>I���A-�"��;%���>J���A-�"��;&���>L���A-�"��;'���>O���A-�#��;(���>Q���A-�#��;)���>R���A-�#��;*���>T���A-�#��;+���>W���A-�#��;,���>X���A-�#��;-���>[���A-�#��;.���>]���A-�#��;/���>^���A-�$��;0���>a���A-�$��;1���>b���A-�$��;2���>d���A-�$��;3���>g���A-�$��;4���>h���A-�$��;5���>k���A-�$��;6���>m���A-�$��;7���>n���A-�%��;8���>p���A-�%��;9���>s���A-�%��;:���>u���A-�%��;;���>v���A-�%��;<���>y���A-�%��;=���>z���A-�%��;>���>|���A-�%��;?���>���A-�&��;@���>���A-�&��;A���>���A-�&��;B���>���A-�&��;C���>���A-�&��;D���>���A-�&��;E���>���A-�&��;F���>���A-�&��;G���>���A-�'��;H���>���A-�'��;I���>���A-�'��;J���>���A-�'��;K���>���A-�'��;L���>���A-�'��;M���>���A-�'��;N���>���A-�'��;O���>���A-�(��;P���>���A-�(��;Q���>���A-�(��;R���>���A-�(��;S���>���A-�(��;T���>���A-�(��;U���>���A-�(��;V���>���A-�(��;W���>���A-�)��;X���>���A-�)��;Y���>���A-�)��;Z���>���A-�)��;[���>���A-�)��;\���>���A-�)��;]���>���A-�)��;^���>���A-�)��;_���>���A-�*��;`���>���A-�*��;a���>���A-�*��;b���>���A-�*��;c���>���A-�*��;d���>���A-�*��;e���>���A-�*��;f���>���A-�*��;g���>���A-�+��;h���>���A-�+��;i���>���A-�+��;j���>���A-�+��;k���>���A-�+��;l���>���A-�+��;m���>���A-�+��;n���>���A-�+��;o���>���A-�,��;p���>���A-�,��;q���>���A-�,��;r���>���A-�,��;s���>���A-�,��;t���>���A-�,��;u���>���A-�,��;v���>���A-�,��;w���>���A-�-��;x���>���A-�-��;y���>���A-�-��;z���>���A-�-��;{���>���A-�-��;|���>���A-�-��;}���>���A-�-��;~���>���A-�-��;���>���A~�=des56to64��4��= ���A~�@k56�p�4��@ ~�@k64�p�4�����@ s�8��T�8�����As�8�����T �8�����A �8�� s�8�����T �8�����A �8�� s�8�����T �8�� p�8�� s�9�����T�9�����As�9�����T �9�����A �9�� s�9�����T �9�����A �9�� p�9�� p�;��  �;�����A �;�����A s�;�� >o�;��Rp�<��  �<�����A �<�����A s�<�� >o�<�����Rp�=��  �=�� ���A �=�����A s�=�� >o�=�����Rp�>��  �>�����A �>�����A s�>�� >o�>�����Rp�?��  �?�����A p�?��  �?�����A �?��  �?�����A s�?�� >o�?�����Rp�@��  �@�����A �@�����A s�@�� >o�@�����Rp�A��  �A�����A �A�����A s�A�� >o�A�����Rp�B��  �B�����A �B�����A s�B�� >o�B�����R�B����~�=des64to56��I��= ���Ap�I�����@ p�I��@ s�M��Q �M�����A�M�����As�M�����Q �M�����A �M�����A �M�� s�M�����Q �M�����A �M�� ���A �M�� s�M�����Q �M�����A �M�����A �M�� s�M�����Q �M�����A �M�� p�M�� s�O�����Q �O�����A�O�����As�O�����Q �O�����A �O�����A �O�� s�O�����Q �O�����A �O�����A �O�� s�O�����Q �O�����A �O�����A �O�� p�O�� p�R�� �R�����Ao�R��Rp�S�� �S�����Ao�S�����Rp�T�� �T�����Ao�T�����Ro�U�� ���Rp�V�� �V�����Ao�V�����Rp�W�� �W�����Ao�W�����Rp�X�� �X�����Ao�X�����R�X����~�=key_setup��\��=���Ap�`��@p�`��S~�?k64�a�`��?p�`�����S�`���=a�a��?p�a��Sp�a�����@p�a�����S�a���=�a����5�a��>���A5�a�� >@���A5�a��>���A5�a�� >��AIa����desmodes.8 1201054003 0 0 664 1752 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<desmodes.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=setupDESstate����=���A~�@s�p���@p���Sp���A���Sp������Ap������S~�=memset�����=p���@ ������Ap���S~�@key�p������@p������Sp������Ap������S~�=memmove�����=p������@p���Sp���@ ��� ���Ap������S~�=des_key_setup�����=~�@ivec�p������@ &��� AO�������<p���@ ������Ap���Sp��� ���Sp������Ap������S����=p���@p���ᆳAO�����~�=setupDES3state����=���Ap���@p���Sp���A���Sp�����Ap������S����=p���@ ������Ap���Sp������@p������Sp������Ap������S����=p������@p���Sp���@ ������Ap������S����=p������@ ������Ap���Sp���@ ������Ap������S����=p������@ ������Ap���Sp���@ �����Ap������S����=p������@ &��� AO����O���<p���@ �����Ap���Sp��� ���Sp������Ap������S����=p���@p���ᆳAO�����I����desECB.8 1201054004 0 0 664 2072 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<desECB.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�@����~�=desECBencrypt����= ���AW�������<W�������<W�������<~�@len�������A���@&������@���AU�������<~�@s�p� �����@ � �� ���Ap� ��S~�@p�p� ��@p� �����Sp� ��A���S~�=block_cipher�� ���= �!�����A@W�!������<&�$�����@AS�$���.���<p�%��A W�%������<W�%������<W�%������<C�%��� &�%�� ���AP�%������<~�?tmp�o�&��  ?W�&������<p�'�����@ �'�� ���Ap�'��Sa�'��?p�'�����Sp�'��A���S�'���=p�'�����@p�'��@ p�(��A W�(���)���<W�(���(���<W�(���.���<C�(��� &�(�� P�(���'���<s�)�� ?�)�� RW�)���&���<�)����~�=desECBdecrypt��.��= ���AW�3���4���<W�3���3���<W�3���@���<�3�����A���@&�3�����@���AU�3���2���<p�4�����@ �4�� ���Ap�4��Sp�4��@p�4�����Sp�4�����Ap�4�����S�4���= �5�����A@W�5���1���<&�8�����@AS�8���^���<p�9��A W�9���G���<W�9���F���<W�9���K���<C�9��� &�9�� ���AP�9���E���<o�:��  ?W�:���D���<p�;�����@ �;�� ���Ap�;��Sa�;��?p�;�����Sp�;��A���S�;���=p�;�����@p�;��@ p�<��A W�<���Y���<W�<���X���<W�<���^���<C�<��� &�<�� P�<���W���<s�=�� ?�=�� RW�=���V���<�=����I=����desCBC.8 1201054004 0 0 664 2702 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<desCBC.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�K����~�=desCBCencrypt����= ���A~�@p�p���@~�@s�p������@W�!������<W�!������<W�!���-���<~�@len��!�����A���@&�!�����@���AU�!������<p�"�� p�#�� �#�����A p�$��  �$�����A W�$������<W�$������<W�$������<&�$��  L�$������<p�%�� C�%��� p�%��  C�%��� s�%��P �%�� OW�%������<p�&�� �&�� ���Ap�&��Sp�&�����Sp�&��A���S~�=block_cipher��&���=p�'�����@ �'�����Ap�'��Sp�'��@p�'�����Sp�'�����Ap�'�����S~�=memmove��'���=p�'��@p�'�����@ �(�����Ap�(��@W�(������<&�+�����@AS�+���I���<p�,�� �,�����A p�-�� �-�� ���Ap�-��S~�?ip�p�-�� ?p�-�� ���Sp�-��A���S�-���=p�-��@ p�-��? p�.�����@ a�.�� Qp�.�� W�.���@���<W�.���@���<W�.���I���<&�.��  L�.���?���<p�/�� C�/��� p�/��  C�/��� s�/��P �/�� OW�/���>���<�/����~�=desCBCdecrypt��4��=(���Ap�4�����@p�4��@W�9���Q���<W�9���P���<W�9���{���<�9�����A���@&�9�����@���AU�9���O���<~�? tmp�a�:�� ?p�:��Sp�:�����Sp�:�����Ap�:�����S�:���=p�;�����@ �;�� ���Ap�;��Sp�;��@p�;�����Sp�;�����Ap�;�����S�;���=p�;�����@ p�;��@a�<�� ?p�<�� p�=��  �=�����A p�>��  �>�����A W�>���l���<W�>���l���<W�>���z���<&�>��  L�>���k���<p�?��C�?���p�?��@s�?��Q �?�� Op�@�� C�@��� p�@��  C�@��� s�@��P o�@�� OW�@���j���<W�@���N���<&�D�����@AS�D������<p�E�� �E�����A p�F�� �F�� ���Ap�F��Sp�F�� ?p�F�� ���Sp�F��A���S�F���=p�F��@ p�F��? p�G�����@ a�G�� Qp�G�� W�G������<W�G������<W�G������<&�G��  L�G������<p�H�� C�H��� p�H��  C�H��� s�H��P �H�� OW�H������<�H����IH����des3ECB.8 1201054005 0 0 664 2124 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<des3ECB.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�@����~�=des3ECBencrypt����= ���AW�������<W�������<W�������<~�@len�������A���@&������@���AU�������<~�@s�p� �����@ � �����Ap� ��S~�@p�p� ��@p� �����Sp� �����Ap� �����S~�=triple_block_cipher�� ���= �!�����A@W�!������<&�$�����@AS�$���0���<p�%��A W�%������<W�%������<W�%������<C�%��� &�%�� ���AP�%������<~�?tmp�o�&��  ?W�&������<p�'�����@ �'�����Ap�'��Sa�'��?p�'�����Sp�'�����Ap�'�����S�'���=p�'�����@p�'��@ p�(��A W�(���+���<W�(���*���<W�(���0���<C�(��� &�(�� P�(���)���<s�)�� ?�)�� RW�)���(���<�)����~�=des3ECBdecrypt��.��= ���AW�3���6���<W�3���5���<W�3���B���<�3�����A���@&�3�����@���AU�3���4���<p�4�����@ �4�����Ap�4��Sp�4��@p�4�����Sp�4�����Ap�4�����S�4���= �5�����A@W�5���3���<&�8�����@AS�8���a���<p�9��A W�9���I���<W�9���H���<W�9���M���<C�9��� &�9�� ���AP�9���G���<o�:��  ?W�:���F���<p�;�����@ �;�����Ap�;��Sa�;��?p�;�����Sp�;�����Ap�;�����S�;���=p�;�����@p�;��@ p�<��A W�<���\���<W�<���[���<W�<���a���<C�<��� &�<�� P�<���Z���<s�=�� ?�=�� RW�=���Y���<�=����I=����des3CBC.8 1201054006 0 0 664 2754 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<des3CBC.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�K����~�=des3CBCencrypt����= ���A~�@p�p���@~�@s�p������@W�!������<W�!������<W�!���.���<~�@len��!�����A���@&�!�����@���AU�!������<p�"�� p�#�� �#����A p�$��  �$�����A W�$������<W�$������<W�$������<&�$��  L�$������<p�%�� C�%��� p�%��  C�%��� s�%��P �%�� OW�%������<p�&�� �&�����Ap�&��Sp�&�����Sp�&�����Ap�&�����S~�=triple_block_cipher��&���=p�'�����@ �'����Ap�'��Sp�'��@p�'�����Sp�'�����Ap�'�����S~�=memmove��'���=p�'��@p�'�����@ �(�����Ap�(��@W�(������<&�+�����@AS�+���K���<p�,�� �,����A p�-�� �-�����Ap�-��S~�?ip�p�-�� ?p�-�� ���Sp�-�����Ap�-�����S�-���=p�-��@ p�-��? p�.�����@ a�.�� Qp�.�� W�.���B���<W�.���B���<W�.���K���<&�.��  L�.���A���<p�/�� C�/��� p�/��  C�/��� s�/��P �/�� OW�/���@���<�/����~�=des3CBCdecrypt��4��=(���Ap�4�����@p�4��@W�9���S���<W�9���R���<W�9���}���<�9�����A���@&�9�����@���AU�9���Q���<~�? tmp�a�:�� ?p�:��Sp�:�����Sp�:�����Ap�:�����S�:���=p�;�����@ �;�����Ap�;��Sp�;��@p�;�����Sp�;�����Ap�;�����S�;���=p�;�����@ p�;��@a�<�� ?p�<�� p�=��  �=����A p�>��  �>�����A W�>���n���<W�>���n���<W�>���|���<&�>��  L�>���m���<p�?��C�?���p�?��@s�?��Q �?�� Op�@�� C�@��� p�@��  C�@��� s�@��P o�@�� OW�@���l���<W�@���P���<&�D�����@AS�D������<p�E�� �E����A p�F�� �F�����Ap�F��Sp�F�� ?p�F�� ���Sp�F�����Ap�F�����S�F���=p�F��@ p�F��? p�G�����@ a�G�� Qp�G�� W�G������<W�G������<W�G������<&�G��  L�G������<p�H�� C�H��� p�H��  C�H��� s�H��P �H�� OW�H������<�H����IH����aes.8 1201054007 0 0 664 94499 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<aes.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7� �����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7�!�����~�E</�~�E<386�~�E<include�~�E<u.h�7�"�����7�c�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�d�����~�E<libc.a�7�e����A7�.����7�.����7�0����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�1����7�����7� ����~�=setupAESstate����=���A~�@s�p���@p���Sp���A���Sp�����Ap������S~�=memset�����=~�@keybytes�p������@ &���  ���AS���� ���<p��� ���A p���@ ��� ���Ap���S~�@key�p������@p������Sp��� ���@p��� ���S~�=memmove�����=p������@ p���@ p��� ���Qp���  ���,���A p��� Sp���  �����A p��� ���Sp���  ��� ���A p��� ���Sp���  ������A p���  ���S~�>rijndaelKeySetup�����>p���@ p������@ ~�@ivec�p��� ���@ p������T&��� AO����2���<p���  ��� ��Ap���Sp��� ���Sp������Ap������S����=p���@ p������@ &��� ���AO����6���<&��� ���AX����7���<W����:���<&���  ���AO����:���<W����;���<p���AT�����~�= aesCBCencrypt���� =4���A~�@ p�p��� @p������@W����C���<W����B���<W����s���<~�@ len�������A��� @&������ @���AU����A���<p��� p��� ��� ��A p���  ������A W����M���<W����M���<W����V���<&���  L����L���<p��� C���� p���  C���� s���P ��� OW����K���<p��� ���,���Ap���Sp������Up������Sp������S~�? q�a��� ?p��� ���S~�> rijndaelEncrypt����� >p������@ ��� ��Ap���Sa��� ?p������Sp������Ap������S����=p��� @p���Sa��� ?p������Sp������Ap������S����=p��� @p������@ ������Ap��� @W����@���<&������ @AS�������<p��� ��� ��A p��� ���,���Ap���Sp������Up������S~�?ip�p��� ?p��� ���Sa��� ?p��� ���S���� >p������@ ��� ��Ap���Sa��� ?p������Sp������Ap������S����=p��� @ p���? p������ @ a��� Qp��� W�������<W�������<W�������<&���  L�������<p��� C���� p���  C���� s���P ��� OW�������<�����~�=aesCBCdecrypt����=D���Ap������@p��� @W�������<W�������<W�������<������A��� @&������ @���AU�������<~�?tmp�a���?p���Sp������Sp������Ap������S����=p������@ p���  �����Ap���Sp������Pp������Sp��� @p������Sa��� ?p��� ���S~�>rijndaelDecrypt�����>p��� @p���Sa��� ?p������Sp������Ap������S����=p������@ p��� @a���?p��� p���  ��� ��A p���  ������A W�������<W�������<W�������<&���  L�������<p���C����p��� @s���Q ��� Op��� C���� p���  C���� s���P o��� OW�������<W�������<&������ @AS�������<p��� ��� ��A p��� ���,���Ap���Sp������Vp������Sp��� ?p��� ���Sa��� ?p��� ���S���� >p������@ ��� ��Ap���Sa��� ?p������Sp������Ap������S����=p��� @ p���? p������ @ a��� Qp��� W�������<W�������<W�������<&���  L�������<p��� C���� p���  C���� s���P ��� OW�������<��������>���A~�@erk�p���@ p��� S~�@cipherKey�p������@ p��� ���S~�@keyBits�p��� ���@ p��� ���S~�>rijndaelKeySetupEnc�����>~�@drk�p������@ p���@ p���p� �� � �����A p� �� Rp� ��Tp� �� � �����A a� �� Rp� �����Op� �����Tp��� ������A a��� Rp������Op������Tp��� ������A a��� Rp��� ���Op��� ���Tp���Rp��� ������A p���  p��� Qp��� ������A p���  a��� Qp������R p��� ���Op��� ������A p���  a��� Qp������R p��� ���Op��� ������A p���  a��� Qp��� ���R p���  ���Op���������A ��� p������AW����;��<W����:��<W������<C����&���P����9��< ������A ������A p���R ������A ~�>Te4�s��� >~�>Td0�a���>p���Op���R ������A ������A s��� > ~�>Td1�a��� > p���P ��� p���R ������A ������A s��� > ~�>Td2�a��� > p���P ��� p���R ������A s��� > ~�>Td3�a��� > p���P ��� p���Tp������R ������A s��� >a���>p���Op������R ������A ������A s��� > a��� > p���P ��� p������R ������A ������A s��� > a��� > p���P ��� p������R ������A s��� > a��� > p���P ��� p������Tp�"�����R �"�����A s�"�� >a�"��>p�"��Op�"�����R �"�����A �"�����A s�"�� > a�"�� > p�"��P �"�� p�"�����R �"�����A �"�����A s�"�� > a�"�� > p�"��P �"�� p�"�����R �"�����A s�"�� > a�"�� > p�"��P �"�� p�"�����Tp�'�� ���R �'�����A s�'�� >a�'��>p�'��Op�'�� ���R �'�����A �'�����A s�'�� > a�'�� > p�'��P �'�� p�'�� ���R �'�����A �'�����A s�'�� > a�'�� > p�'��P �'�� p�'�� ���R �'�����A s�'�� > a�'�� > p�'��P �'�� p�'�� ���TW�'���8��<p�-���-�����-����~�>Te0�-�?��;>ccA-�?��;���>||A-�?��;���>wwA-�?��; ���>{{A-�@��;���> A-�@��;���>kkA-�@��;���>ooA-�@��;���>TőA-�A��; ���>P00`A-�A��;$���>A-�A��;(���>ggA-�A��;,���>}++VA-�B��;0���>A-�B��;4���>b׵A-�B��;8���>櫫MA-�B��;<���>vvA-�C��;@���>EʏA-�C��;D���>A-�C��;H���>@ɉA-�C��;L���>}}A-�D��;P���>A-�D��;T���>YYA-�D��;X���>GGA-�D��;\���> A-�E��;`���>쭭AA-�E��;d���>gԳA-�E��;h���>_A-�E��;l���>꯯EA-�F��;p���>#A-�F��;t���>SA-�F��;x���>rrA-�F��;|���>[A-�G��;���>·uA-�G��;���>A-�G��;���>=A-�G��;���>j&&LA-�H��;���>Z66lA-�H��;���>A??~A-�H��;���>A-�H��;���>ÕA-�I��;���>\44hA-�I��;���>QA-�I��;���>4A-�I��;���>A-�J��;���>qqA-�J��;���>sثA-�J��;���>S11bA-�J��;���>?*A-�K��;���> A-�K��;���>RǕA-�K��;���>e##FA-�K��;���>^ÝA-�L��;���>(0A-�L��;���>7A-�L��;���> A-�L��;���>/A-�M��;���> A-�M��;���>6$A-�M��;���>A-�M��;���>=A-�N��;���>&A-�N��;���>i''NA-�N��;���>ͲA-�N��;���>uuA-�O��;���> A-�O��;��>A-�O��;��>t,,XA-�O��; ��>.4A-�P��;��>-6A-�P��;��>nnA-�P��;��>ZZA-�P��;��>[A-�Q��; ��>RRA-�Q��;$��>M;;vA-�Q��;(��>aַA-�Q��;,��>γ}A-�R��;0��>{))RA-�R��;4��>>A-�R��;8��>q//^A-�R��;<��>A-�S��;@��>SSA-�S��;D��>hѹA-�S��;L��>,A-�T��;P��>` @A-�T��;T��>A-�T��;X��>ȱyA-�T��;\��>[[A-�U��;`��>jjA-�U��;d��>FˍA-�U��;h��>پgA-�U��;l��>K99rA-�V��;p��>JJA-�V��;t��>LLA-�V��;x��>XXA-�V��;|��>JυA-�W��;��>kлA-�W��;��>*A-�W��;��>媪OA-�W��;��>A-�X��;��>CCA-�X��;��>MMA-�X��;��>U33fA-�X��;��>A-�Y��;��>EEA-�Y��;��>A-�Y��;��>A-�Y��;��>A-�Z��;��>PPA-�Z��;��>D<<xA-�Z��;��>%A-�Z��;��>㨨KA-�[��;��>QQA-�[��;��>]A-�[��;��>@@A-�[��;��>A-�\��;��>?A-�\��;��>!A-�\��;��>H88pA-�\��;��>A-�]��;��>߼cA-�]��;��>wA-�]��;��>uگA-�]��;��>c!!BA-�^��;��>0 A-�^��;��>A-�^��;��>A-�^��;��>mҿA-�_��;���>ĹA-�_��;��> A-�_��;��>5&A-�_��; ��>/A-�`��;��>__A-�`��;��>5A-�`��;��>DDA-�`��;��>9.A-�a��; ��>WēA-�a��;$��>UA-�a��;(��>~~A-�a��;,��>G==zA-�b��;0��>ddA-�b��;4��>]]A-�b��;8��>+2A-�b��;<��>ssA-�c��;@��>``A-�c��;D��>A-�c��;H��>OOA-�c��;L��>ܣA-�d��;P��>f""DA-�d��;T��>~**TA-�d��;X��>;A-�d��;\��> A-�e��;`��>FFA-�e��;d��>)A-�e��;h��>ӸkA-�e��;l��><(A-�f��;p��>yާA-�f��;t��>^^A-�f��;x��> A-�f��;|��>vۭA-�g��;��>;A-�g��;��>V22dA-�g��;��>N::tA-�g��;��> A-�h��;��>IIA-�h��;��>  A-�h��;��>l$$HA-�h��;��>\\A-�i��;��>]ŸA-�i��;��>nӽA-�i��;��>שּׁCA-�i��;��>bbA-�j��;��>9A-�j��;��>1A-�j��;��>7A-�j��;��>yyA-�k��;��>2A-�k��;��>CȋA-�k��;��>Y77nA-�k��;��>mmA-�l��;��>A-�l��;��>dձA-�l��;��>NNA-�l��;��>੩IA-�m��;��>llA-�m��;��>VVA-�m��;��>A-�m��;��>%A-�n��;��>eeA-�n��;��>zzA-�n��;��>鮮GA-�n��;��>A-�o��;���>պoA-�o��;��>xxA-�o��;��>o%%JA-�o��; ��>r..\A-�p��;��>$8A-�p��;��>WA-�p��;��>ǴsA-�p��;��>QƗA-�q��; ��>#A-�q��;$��>|ݡA-�q��;(��>ttA-�q��;,��>!>A-�r��;0��>KKA-�r��;4��>ܽaA-�r��;8��> A-�r��;<��>A-�s��;@��>ppA-�s��;D��>B>>|A-�s��;H��>ĵqA-�s��;L��>ffA-�t��;P��>HHA-�t��;T��>A-�t��;X��>A-�t��;\��>A-�u��;`��>aaA-�u��;d��>_55jA-�u��;h��>WWA-�u��;l��>йiA-�v��;p��>A-�v��;t��>XA-�v��;x��>':A-�v��;|��>'A-�w��;��>8A-�w��;��>A-�w��;��>+A-�w��;��>3"A-�x��;��>iiA-�x��;��>p٩A-�x��;��>A-�x��;��>3A-�y��;��>-A-�y��;��>"<A-�y��;��>A-�y��;��> A-�z��;��>I·A-�z��;��>UUA-�z��;��>x((PA-�z��;��>zߥA-�{��;��>A-�{��;��>YA-�{��;��> A-�{��;��> A-�|��;��>ڿeA-�|��;��>1A-�|��;��>BBA-�|��;��>hhA-�}��;��>AAA-�}��;��>)A-�}��;��>w--ZA-�}��;��>A-�~��;��>˰{A-�~��;��>TTA-�~��;��>ֻmA-�~��;��>:,A~�>Te1�-���;>ccƥA-���;���>||A-���;���>wwA-���; ���>{{A-���;���> A-���;���>kkֽA-���;���>ooޱA-���;���>őTA-���; ���>00`PA-���;$���>A-���;(���>ggΩA-���;,���>++V}A-���;0���>A-���;4���>׵bA-���;8���>MA-���;<���>vvA-���;@���>ʏEA-���;D���>A-���;H���>ɉ@A-���;L���>}}A-���;P���>A-���;T���>YYA-���;X���>GGA-���;\���> A-���;`���>AA-���;d���>ԳgA-���;h���>_A-���;l���>EA-���;p���>#A-���;t���>SA-���;x���>rrA-���;|���>[A-���;���>uA-���;���>A-���;���>=A-���;���>&&LjA-���;���>66lZA-���;���>??~AA-���;���>A-���;���>̃OA-���;���>44h\A-���;���>QA-���;���>4A-���;���>A-���;���>qqA-���;���>ثsA-���;���>11bSA-���;���>*?A-���;���> A-���;���>ǕRA-���;���>##FeA-���;���>Ý^A-���;���>0(A-���;���>7A-���;���> A-���;���>/A-���;���> A-���;���>$6A-���;���>A-���;���>=A-���;���>&A-���;���>''NiA-���;���>A-���;���>uuA-���;���> A-���;��>A-���;��>,,XtA-���; ��>4.A-���;��>6-A-���;��>nnܲA-���;��>ZZA-���;��>[A-���; ��>RRA-���;$��>;;vMA-���;(��>ַaA-���;,��>}A-���;0��>))R{A-���;4��>>A-���;8��>//^qA-���;<��>A-���;@��>SSA-���;D��>ѹhA-���;L��>,A-���;P��> @`A-���;T��>A-���;X��>yA-���;\��>[[A-���;`��>jjԾA-���;d��>ˍFA-���;h��>gA-���;l��>99rKA-���;p��>JJA-���;t��>LLA-���;x��>XXA-���;|��>υJA-���;��>лkA-���;��>*A-���;��>OA-���;��>A-���;��>CCA-���;��>MMA-���;��>33fUA-���;��>A-���;��>EEA-���;��>A-���;��>A-���;��>A-���;��>PPA-���;��><<xDA-���;��>%A-���;��>KA-���;��>QQA-���;��>]A-���;��>@@A-���;��>A-���;��>?A-���;��>!A-���;��>88pHA-���;��>A-���;��>cA-���;��>wA-���;��>گuA-���;��>!!BcA-���;��> 0A-���;��>A-���;��>A-���;��>ҿmA-���;���>́LA-���;��> A-���;��>&5A-���; ��>/A-���;��>__A-���;��>5A-���;��>DDA-���;��>.9A-���; ��>ēWA-���;$��>UA-���;(��>~~A-���;,��>==zGA-���;0��>ddȬA-���;4��>]]A-���;8��>2+A-���;<��>ssA-���;@��>``A-���;D��>A-���;H��>OOA-���;L��>ܣA-���;P��>""DfA-���;T��>**T~A-���;X��>;A-���;\��> A-���;`��>FFA-���;d��>)A-���;h��>kA-���;l��>(<A-���;p��>ާyA-���;t��>^^A-���;x��> A-���;|��>ۭvA-���;��>;A-���;��>22dVA-���;��>::tNA-���;��> A-���;��>IIA-���;��> A-���;��>$$HlA-���;��>\\A-���;��>Ÿ]A-���;��>ӽnA-���;��>CA-���;��>bbĦA-���;��>9A-���;��>1A-���;��>7A-���;��>yyA-���;��>2A-���;��>ȋCA-���;��>77nYA-���;��>mmڷA-���;��>A-���;��>ձdA-���;��>NNA-���;��>IA-���;��>llشA-���;��>VVA-���;��>A-���;��>%A-���;��>eeʯA-���;��>zzA-���;��>GA-���;��>A-���;���>oA-���;��>xxA-���;��>%%JoA-���; ��>..\rA-���;��>8$A-���;��>WA-���;��>sA-���;��>ƗQA-���; ��>#A-���;$��>ݡ|A-���;(��>ttA-���;,��>>!A-���;0��>KKA-���;4��>aA-���;8��> A-���;<��>A-���;@��>ppA-���;D��>>>|BA-���;H��>qA-���;L��>ff̪A-���;P��>HHA-���;T��>A-���;X��>A-���;\��>A-���;`��>aa£A-���;d��>55j_A-���;h��>WWA-���;l��>iA-���;p��>A-���;t��>XA-���;x��>:'A-���;|��>'A-���;��>8A-���;��>A-���;��>+A-���;��>"3A-���;��>iiһA-���;��>٩pA-���;��>A-���;��>3A-���;��>-A-���;��><"A-���;��>A-���;��> A-���;��>·IA-���;��>UUA-���;��>((PxA-���;��>ߥzA-���;��>A-���;��>YA-���;��> A-���;��> A-���;��>eA-���;��>1A-���;��>BBA-���;��>hhиA-���;��>AAA-���;��>)A-���;��>--ZwA-���;��>A-���;��>{A-���;��>TTA-���;��>mA-���;��>,:A~�>Te2�-���;>cƥcA-���;���>||A-���;���>wwA-���; ���>{{A-���;���> A-���;���>kֽkA-���;���>oޱoA-���;���>őTA-���; ���>0`P0A-���;$���>A-���;(���>gΩgA-���;,���>+V}+A-���;0���>A-���;4���>׵bA-���;8���>MA-���;<���>vvA-���;@���>ʏEA-���;D���>A-���;H���>ɉ@A-���;L���>}}A-���;P���>A-���;T���>YYA-���;X���>GGA-���;\���> A-���;`���>AA-���;d���>ԳgA-���;h���>_A-���;l���>EA-���;p���>#A-���;t���>SA-���;x���>rrA-���;|���>[A-���;���>u·A-���;���>A-���;���>=A-���;���>&Lj&A-���;���>6lZ6A-���;���>?~A?A-���;���>A-���;���>̃OA-���;���>4h\4A-���;���>QA-���;���>4A-���;���>A-���;���>qqA-���;���>ثsA-���;���>1bS1A-���;���>*?A-���;���> A-���;���>ǕRA-���;���>#Fe#A-���;���>Ý^A-���;���>0(A-���;���>7A-���;���> A-���;���>/A-���;���> A-���;���>$6A-���;���>A-���;���>=A-���;���>&A-���;���>'Ni'A-���;���>ͲA-���;���>uuA-���;���>  A-���;��>A-���;��>,Xt,A-���; ��>4.A-���;��>6-A-���;��>nܲnA-���;��>ZZA-���;��>[A-���; ��>RRA-���;$��>;vM;A-���;(��>ַaA-���;,��>}γA-���;0��>)R{)A-���;4��>>A-���;8��>/^q/A-���;<��>A-���;@��>SSA-���;D��>ѹhA-���;L��>,A-���;P��> @` A-���;T��>A-���;X��>yȱA-���;\��>[[A-���;`��>jԾjA-���;d��>ˍFA-���;h��>gپA-���;l��>9rK9A-���;p��>JJA-���;t��>LLA-���;x��>XXA-���;|��>υJA-���;��>лkA-���;��>*A-���;��>OA-���;��>A-���;��>CCA-���;��>MMA-���;��>3fU3A-���;��>A-���;��>EEA-���;��>A-���;��>A-���;��>A-���;��>PPA-���;��><xD<A-���;��>%A-���;��>KA-���;��>QQA-���;��>]A-���;��>@@A-���;��>A-���;��>?A-���;��>!A-���;��>8pH8A-���;��>A-���;��>c߼A-���;��>wA-���;��>گuA-���;��>!Bc!A-���;��> 0A-���;��>A-���;��>A-���;��>ҿmA-���;���>́LA-���;��>  A-���;��>&5A-���; ��>/A-���;��>__A-���;��>5A-���;��>DDA-���;��>.9A-���; ��>ēWA-���;$��>UA-���;(��>~~A-���;,��>=zG=A-���;0��>dȬdA-���;4��>]]A-���;8��>2+A-���;<��>ssA-���;@��>``A-���;D��>A-���;H��>OOA-���;L��>ܣA-���;P��>"Df"A-���;T��>*T~*A-���;X��>;A-���;\��> A-���;`��>FFA-���;d��>)A-���;h��>kӸA-���;l��>(<A-���;p��>ާyA-���;t��>^^A-���;x��>  A-���;|��>ۭvA-���;��>;A-���;��>2dV2A-���;��>:tN:A-���;��>  A-���;��>IIA-���;��> A-���;��>$Hl$A-���;��>\\A-���;��>Ÿ]A-���;��>ӽnA-���;��>CA-���;��>bĦbA-���;��>9A-���;��>1A-���;��>7A-���;��>yyA-���;��>2A-���;��>ȋCA-���;��>7nY7A-���;��>mڷmA-���;��>A-���;��>ձdA-���;��>NNA-���;��>IA-���;��>lشlA-���;��>VVA-���;��>A-���;��>%A-���;��>eʯeA-���;��>zzA-���;��>GA-���;��>A-���;���>oպA-���;��>xxA-���;��>%Jo%A-���; ��>.\r.A-���;��>8$A-���;��>WA-���;��>sǴA-���;��>ƗQA-���; ��>#A-���;$��>ݡ|A-���;(��>ttA-���;,��>>!A-���;0��>KKA-���;4��>aܽA-���;8��> A-���;<��>A-���;@��>ppA-���;D��>>|B>A-���;H��>qĵA-���;L��>f̪fA-���;P��>HHA-���;T��>A-���;X��>A-���;\��>A-���;`��>a£aA-���;d��>5j_5A-���;h��>WWA-���;l��>iйA-���;p��>A-���;t��>XA-���;x��>:'A-���;|��>'A-���;��>8A-���;��>A-���;��>+A-���;��>"3A-���;��>iһiA-���;��>٩pA-���;��>A-���;��>3A-���;��>-A-���;��><"A-���;��>A-���;��> A-���;��>·IA-���;��>UUA-���;��>(Px(A-���;��>ߥzA-���;��>A-���;��>YA-���;��> A-���;��>  A-����;��>eڿA-����;��>1A-����;��>BBA-����;��>hиhA-���;��>AAA-���;��>)A-���;��>-Zw-A-���;��>A-���;��>{˰A-���;��>TTA-���;��>mֻA-���;��>,:A~�>Te3�-���;>ƥccA-���;���>||A-���;���>wwA-���; ���>{{A-���;���> A-���;���>ֽkkA-���;���>ޱooA-���;���>TA-���; ���>`P00A-���;$���>A-���;(���>ΩggA-���;,���>V}++A-� ��;0���>A-� ��;4���>bA-� ��;8���>M櫫A-� ��;<���>vvA-� ��;@���>EA-� ��;D���>A-� ��;H���>@A-� ��;L���>}}A-� ��;P���>A-� ��;T���>YYA-� ��;X���>GGA-� ��;\���> A-� ��;`���>A쭭A-� ��;d���>gA-� ��;h���>_A-� ��;l���>E꯯A-� ��;p���>#A-� ��;t���>SA-� ��;x���>rrA-� ��;|���>[A-���;���>u·A-���;���>A-���;���>=A-���;���>Lj&&A-���;���>lZ66A-���;���>~A??A-���;���>A-���;���>OA-���;���>h\44A-���;���>QA-���;���>4A-���;���>A-���;���>qqA-���;���>sA-���;���>bS11A-���;���>*?A-���;���> A-���;���>RA-���;���>Fe##A-���;���>^A-���;���>0(A-���;���>7A-���;���> A-���;���>/A-���;���> A-���;���>$6A-���;���>A-���;���>=A-���;���>&A-���;���>Ni''A-���;���>ͲA-���;���>uuA-���;���> A-���;��>A-���;��>Xt,,A-���; ��>4.A-���;��>6-A-���;��>ܲnnA-���;��>ZZA-���;��>[A-���; ��>RRA-���;$��>vM;;A-���;(��>aA-���;,��>}γA-���;0��>R{))A-���;4��>>A-���;8��>^q//A-���;<��>A-���;@��>SSA-���;D��>hA-���;L��>,A-���;P��>@` A-���;T��>A-���;X��>yȱA-���;\��>[[A-���;`��>ԾjjA-���;d��>FA-���;h��>gپA-���;l��>rK99A-���;p��>JJA-���;t��>LLA-���;x��>XXA-���;|��>JA-���;��>kA-���;��>*A-���;��>O媪A-���;��>A-���;��>CCA-���;��>MMA-���;��>fU33A-���;��>A-� ��;��>EEA-� ��;��>A-� ��;��>A-� ��;��>A-�!��;��>PPA-�!��;��>xD<<A-�!��;��>%A-�!��;��>K㨨A-�"��;��>QQA-�"��;��>]A-�"��;��>@@A-�"��;��>A-�#��;��>?A-�#��;��>!A-�#��;��>pH88A-�#��;��>A-�$��;��>c߼A-�$��;��>wA-�$��;��>uA-�$��;��>Bc!!A-�%��;��> 0A-�%��;��>A-�%��;��>A-�%��;��>mA-�&��;���>LA-�&��;��> A-�&��;��>&5A-�&��; ��>/A-�'��;��>__A-�'��;��>5A-�'��;��>DDA-�'��;��>.9A-�(��; ��>WA-�(��;$��>UA-�(��;(��>~~A-�(��;,��>zG==A-�)��;0��>ȬddA-�)��;4��>]]A-�)��;8��>2+A-�)��;<��>ssA-�*��;@��>``A-�*��;D��>A-�*��;H��>OOA-�*��;L��>A-�+��;P��>Df""A-�+��;T��>T~**A-�+��;X��>;A-�+��;\��> A-�,��;`��>FFA-�,��;d��>)A-�,��;h��>kӸA-�,��;l��>(<A-�-��;p��>yA-�-��;t��>^^A-�-��;x��> A-�-��;|��>vA-�.��;��>;A-�.��;��>dV22A-�.��;��>tN::A-�.��;��> A-�/��;��>IIA-�/��;��> A-�/��;��>Hl$$A-�/��;��>\\A-�0��;��>]A-�0��;��>nA-�0��;��>CשּׁA-�0��;��>ĦbbA-�1��;��>9A-�1��;��>1A-�1��;��>7A-�1��;��>yyA-�2��;��>2A-�2��;��>CA-�2��;��>nY77A-�2��;��>ڷmmA-�3��;��>A-�3��;��>dA-�3��;��>NNA-�3��;��>I੩A-�4��;��>شllA-�4��;��>VVA-�4��;��>A-�4��;��>%A-�5��;��>ʯeeA-�5��;��>zzA-�5��;��>G鮮A-�5��;��>A-�6��;���>oպA-�6��;��>xxA-�6��;��>Jo%%A-�6��; ��>\r..A-�7��;��>8$A-�7��;��>WA-�7��;��>sǴA-�7��;��>QA-�8��; ��>#A-�8��;$��>|A-�8��;(��>ttA-�8��;,��>>!A-�9��;0��>KKA-�9��;4��>aܽA-�9��;8��> A-�9��;<��>A-�:��;@��>ppA-�:��;D��>|B>>A-�:��;H��>qĵA-�:��;L��>̪ffA-�;��;P��>HHA-�;��;T��>A-�;��;X��>A-�;��;\��>A-�<��;`��>£aaA-�<��;d��>j_55A-�<��;h��>WWA-�<��;l��>iйA-�=��;p��>A-�=��;t��>XA-�=��;x��>:'A-�=��;|��>'A-�>��;��>8A-�>��;��>A-�>��;��>+A-�>��;��>"3A-�?��;��>һiiA-�?��;��>pA-�?��;��>A-�?��;��>3A-�@��;��>-A-�@��;��><"A-�@��;��>A-�@��;��> A-�A��;��>IA-�A��;��>UUA-�A��;��>Px((A-�A��;��>zA-�B��;��>A-�B��;��>YA-�B��;��> A-�B��;��> A-�C��;��>eڿA-�C��;��>1A-�C��;��>BBA-�C��;��>иhhA-�D��;��>AAA-�D��;��>)A-�D��;��>Zw--A-�D��;��>A-�E��;��>{˰A-�E��;��>TTA-�E��;��>mֻA-�E��;��>,:A-�H��;>c���A-�H��;���>|���A-�H��;���>w���A-�H��;���>{���A-�I��;���>���A-�I��;���>k���A-�I��;���>o���A-�I��;���>���A-�J��;���>0���A-�J��; ���>���A-�J��; ���>g���A-�J��; ���>+���A-�K��; ���>���A-�K��; ���>���A-�K��;���>���A-�K��;���>v���A-�L��;���>���A-�L��;���>���A-�L��;���>���A-�L��;���>}���A-�M��;���>���A-�M��;���>Y���A-�M��;���>G���A-�M��;���>���A-�N��;���>���A-�N��;���>���A-�N��;���>���A-�N��;���>���A-�O��;���>���A-�O��;���>���A-�O��;���>r���A-�O��;���>���A-�P��; ���>���A-�P��;!���>���A-�P��;"���>���A-�P��;#���>&���A-�Q��;$���>6���A-�Q��;%���>?���A-�Q��;&���>���A-�Q��;'���>���A-�R��;(���>4���A-�R��;)���>���A-�R��;*���>���A-�R��;+���>���A-�S��;,���>q���A-�S��;-���>���A-�S��;.���>1���A-�S��;/���>���A-�T��;0���>���A-�T��;1���>���A-�T��;2���>#���A-�T��;3���>���A-�U��;4���>���A-�U��;5���>���A-�U��;6���>���A-�U��;7���>���A-�V��;8���>���A-�V��;9���>���A-�V��;:���>���A-�V��;;���>���A-�W��;<���>���A-�W��;=���>'���A-�W��;>���>���A-�W��;?���>u���A-�X��;@���> ���A-�X��;A���>���A-�X��;B���>,���A-�X��;C���>���A-�Y��;D���>���A-�Y��;E���>n���A-�Y��;F���>Z���A-�Y��;G���>���A-�Z��;H���>R���A-�Z��;I���>;���A-�Z��;J���>���A-�Z��;K���>���A-�[��;L���>)���A-�[��;M���>���A-�[��;N���>/���A-�[��;O���>���A-�\��;P���>S���A-�\��;Q���>���A-�\��;S���>���A-�]��;T���> ���A-�]��;U���>���A-�]��;V���>���A-�]��;W���>[���A-�^��;X���>j���A-�^��;Y���>���A-�^��;Z���>���A-�^��;[���>9���A-�_��;\���>J���A-�_��;]���>L���A-�_��;^���>X���A-�_��;_���>���A-�`��;`���>���A-�`��;a���>���A-�`��;b���>���A-�`��;c���>���A-�a��;d���>C���A-�a��;e���>M���A-�a��;f���>3���A-�a��;g���>���A-�b��;h���>E���A-�b��;i���>���A-�b��;j���>���A-�b��;k���>���A-�c��;l���>P���A-�c��;m���><���A-�c��;n���>���A-�c��;o���>���A-�d��;p���>Q���A-�d��;q���>���A-�d��;r���>@���A-�d��;s���>���A-�e��;t���>���A-�e��;u���>���A-�e��;v���>8���A-�e��;w���>���A-�f��;x���>���A-�f��;y���>���A-�f��;z���>���A-�f��;{���>!���A-�g��;|���>���A-�g��;}���>���A-�g��;~���>���A-�g��;���>���A-�h��;���>���A-�h��;���> ���A-�h��;���>���A-�h��;���>���A-�i��;���>_���A-�i��;���>���A-�i��;���>D���A-�i��;���>���A-�j��;���>���A-�j��;���>���A-�j��;���>~���A-�j��;���>=���A-�k��;���>d���A-�k��;���>]���A-�k��;���>���A-�k��;���>s���A-�l��;���>`���A-�l��;���>���A-�l��;���>O���A-�l��;���>���A-�m��;���>"���A-�m��;���>*���A-�m��;���>���A-�m��;���>���A-�n��;���>F���A-�n��;���>���A-�n��;���>���A-�n��;���>���A-�o��;���>���A-�o��;���>^���A-�o��;���> ���A-�o��;���>���A-�p��;���>���A-�p��;���>2���A-�p��;���>:���A-�p��;���> ���A-�q��;���>I���A-�q��;���>���A-�q��;���>$���A-�q��;���>\���A-�r��;���>���A-�r��;���>���A-�r��;���>���A-�r��;���>b���A-�s��;���>���A-�s��;���>���A-�s��;���>���A-�s��;���>y���A-�t��;���>���A-�t��;���>���A-�t��;���>7���A-�t��;���>m���A-�u��;���>���A-�u��;���>���A-�u��;���>N���A-�u��;���>���A-�v��;���>l���A-�v��;���>V���A-�v��;���>���A-�v��;���>���A-�w��;���>e���A-�w��;���>z���A-�w��;���>���A-�w��;���>���A-�x��;���>���A-�x��;���>x���A-�x��;���>%���A-�x��;���>.���A-�y��;���>���A-�y��;���>���A-�y��;���>���A-�y��;���>���A-�z��;���>���A-�z��;���>���A-�z��;���>t���A-�z��;���>���A-�{��;���>K���A-�{��;���>���A-�{��;���>���A-�{��;���>���A-�|��;���>p���A-�|��;���>>���A-�|��;���>���A-�|��;���>f���A-�}��;���>H���A-�}��;���>���A-�}��;���>���A-�}��;���>���A-�~��;���>a���A-�~��;���>5���A-�~��;���>W���A-�~��;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>i���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>U���A-���;���>(���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���> ���A-���;���>���A-���;���>���A-���;���>B���A-���;���>h���A-���;���>A���A-���;���>���A-���;���>-���A-���;���>���A-���;���>���A-���;���>T���A-���;���>���A-���;���>���A-���;>PQA-���;���>SeA~A-���;���>äA-���; ���>^':A-���;���>k;A-���;���>EA-���;���>XA-���;���>KA-���; ���>U0 A-���;$���>mvA-���;(���>v̈A-���;,���>%LA-���;0���>OA-���;4���>*A-���;8���>D5&A-���;<���>bA-���;@���>IZA-���;D���>g%A-���;H���>EA-���;L���>]A-���;P���>u/A-���;T���>LA-���;X���>FA-���;\���>kA-���;`���>_A-���;d���>A-���;h���>zmA-���;l���>YRA-���;p���>-A-���;t���>!tXA-���;x���>)iIA-���;|���>DɎA-���;���>juA-���;���>xyA-���;���>k>XA-���;���>q'A-���;���>OA-���;���>A-���;���>f A-���;���>:}A-���;���>JcA-���;���>1A-���;���>`3QA-���;���>ESbA-���;���>wdA-���;���>kA-���;���>A-���;���>+A-���;���>XhHpA-���;���>EA-���;���>lޔA-���;���>{RA-���;���>#sA-���;���>KrA-���;���>WA-���;���>*UfA-���;���>(A-���;���>µ/A-���;���>{ņA-���;���>7A-���;���>(0A-���;���>#A-���;���>jA-���;���>\A-���;���>+ϊA-���;��>yA-���;��>A-���; ��>iNA-���;��>eA-���;��>վA-���;��>b4A-���;��>A-���; ��>S.4A-���;$��>UA-���;(��>2A-���;,��>uA-���;0��>9 A-���;4��>`@A-���;8��>q^A-���;<��>QnA-���;@��>!>A-���;D��>=ݖA-���;H��>>A-���;L��>FMA-���;P��>TA-���;T��>]qA-���;X��>oA-���;\��>P`A-���;`��>$A-���;d��>A-���;h��>C@A-���;l��>wgA-���;p��>BA-���;t��>A-���;x��>8[A-���;|��>yA-���;��>G |A-���;��>B|A-���;��>A-���;��> A-���;��>H+2A-���;��>pA-���;��>NrZlA-���;��>A-���;��>V8A-���;��>ծ=A-���;��>'9-6A-���;��>d A-���;��>!\hA-���;��>T[A-���;��>:.6$A-���;��>g A-���;��>WA-���;��>ҖA-���;��>A-���;��>OA-���;��> aA-���;��>iKwZA-���;��>A-���;��> A-���;��>*A-���;��>C"<A-���;��>A-���;��> A-���;��>NjA-���;��>-A-���;��>ȩA-���;���>WA-���;��>LuA-���;��>ݙA-���; ��>`A-���;��>&A-���;��>r\A-���;��>;fDA-���;��>4~[A-���; ��>v)CA-���;$��>#A-���;(��>hA-���;,��>cA-���;0��>1A-���;4��>cBA-���;8��>@"A-���;<��> ƄA-���;@��>}$JA-���;D��>=A-���;H��>2A-���;L��>m)A-���;P��>K/A-���;T��>0A-���;X��>R A-���;\��>wA-���;`��>l+A-���;d��>pA-���;h��>HA-���;l��>"dGA-���;p��>ČA-���;t��>?A-���;x��>,}VA-���;|��>3"A-���;��>NIA-���;��>8A-���;��>ʌA-���;��>6 ԘA-���;��>ρA-���;��>(zA-���;��>&A-���;��>?A-���;��>:,A-���;��> xPA-���;��>_jA-���;��>bF~TA-���;��>A-���;��>ؐA-���;��>^9.A-���;��>ÂA-���;��>]A-���;��>|iA-���;��>-oA-���;��>%A-���;��>;A-���;��>}A-���;��>ncA-���;��>{;A-���;��> x&A-���;��>YnA-���;��>A-���;��>OA-���;��>enA-���;��>~A-���;��>ϼ!A-���;��>A-���;���>ٛA-���;��>6oJA-���;��> A-���; ��>|)A-���;��>1A-���;��>1#?*A-���;��>0A-���;��>f5A-���; ��>7NtA-���;$��>ʂA-���;(��>АA-���;,��>ا3A-���;0��>JA-���;4��>AA-���;8��>PA-���;<��>/A-���;@��>MvA-���;D��>MCA-���;H��>TMA-���;L��>A-���;P��>ўA-���;T��>jLA-���;X��>,A-���;\��>QeFA-���;`��>^A-���;d��>]5A-���;h��>stA-���;l��>.A A-���;p��>ZgA-���;t��>RےA-���;x��>3VA-���;|��>GmA-���;��>aךA-���;��>z 7A-���;��>YA-���;��><A-���;��>'A-���;��>5aA-���;��>A-���;��><GzA-���;��>YҜA-���;��>?sUA-���;��>yA-���;��>7sA-���;��>SA-���;��>[_A-���;��>o=A-���;��>DxA-���;��>A-���;��>>hA-���;��>,4$8A-���;��>_@A-���;��>rA-���;��> %A-���;��>I<(A-���;��>A A-���;��>q9A-���;��>޳ A-���;��>A-���;��>VdA-���;��>a{A-���;��>p2A-���;��>t\lHA-���;��>BWA-���;>QPA-���;���>eA~SA-���;���>A-���; ���>^':A-���;���>k;A-���;���>EA-���;���>XA-���;���>KA-���; ���>0 UA-���;$���>mvA-���;(���>v̈A-���;,���>L%A-���;0���>OA-���;4���>*A-���;8���>D5&A-���;<���>bA-���;@���>ZIA-���;D���>%gA-���;H���>EA-���;L���>]A-���;P���>u/A-���;T���>LA-���;X���>FA-���;\���>kA-���;`���>_A-���;d���>A-���;h���>zmA-���;l���>YRA-���;p���>-A-���;t���>!tXA-���;x���>iI)A-���;|���>ɎDA-���;���>ujA-���;���>yxA-���;���>>XkA-���;���>q'A-���;���>OᾶA-���;���>A-���;���> fA-���;���>:}A-���;���>JcA-���;���>1A-���;���>3Q`A-���;���>SbEA-���;���>wdA-���;���>kA-���;���>A-���;���>+A-���;���>hHpXA-���;���>EA-���;���>lޔA-���;���>{RA-���;���>s#A-���;���>KrA-���;���>WA-���;���>Uf*A-���;���>(A-���;���>µ/A-���;���>{ņA-���;���>7ӥA-���;���>(0A-���;���>#A-���;���>jA-���;���>\A-���;���>ϊ+A-���;��>yA-���;��>A-���; ��>iNA-���;��>eA-���;��>A-���;��>b4A-���;��>ĊA-���; ��>S.4A-���;$��>UA-���;(��>2A-���;,��>uA-���;0��> 9A-���;4��>`@A-���;8��>q^A-���;<��>nQA-���;@��>!>A-���;D��>ݖ=A-���;H��>>ݮA-���;L��>MFA-���;P��>TA-���;T��>]qA-���;X��>oA-���;\��>P`A-���;`��>$A-���;d��>֗A-���;h��>C@A-���;l��>gwA-���;p��>B谽A-���;t��>A-���;x��>[8A-���;|��>yA-���;��> |GA-���;��>B|A-���;��>A-���;��> A-���;��>+2HA-���;��>pA-���;��>rZlNA-���;��>A-���;��>8VA-���;��>ծ=A-���;��>9-6'A-���;��> dA-���;��>\h!A-���;��>T[A-���;��>.6$:A-���;��>g A-���;��>WA-���;��>A-���;��>A-���;��>OA-���;��> aA-���;��>KwZiA-���;��>A-���;��> A-���;��>*A-���;��>"<CA-���;��>A-���;��>  A-���;��>NjA-���;��>-A-���;��>A-���;���>WA-���;��>uLA-���;��>ݙA-���; ��>`A-���;��>&A-���;��>r\A-���;��>;fDA-���;��>~[4A-���; ��>)CvA-���;$��>#A-���;(��>hA-���;,��>cA-���;0��>1A-���;4��>cBA-���;8��>"@A-���;<��>Ƅ A-���;@��>$J}A-���;D��>=A-���;H��>2A-���;L��>)mA-���;P��>/KA-���;T��>0A-���;X��>R A-���;\��>wA-���;`��>+lA-���;d��>pA-���;h��>HA-���;l��>dG"A-���;p��>A-���;t��>?A-���;x��>,}VA-���;|��>3"A-���;��>NIA-���;��>8A-���;��>ʌA-���;��> Ԙ6A-���;��>A-���;��>z(A-���;��>&A-���;��>?A-���;��>:,A-���;��>xP A-���;��>_jA-���;��>F~TbA-���;��>A-���;��>ؐA-���;��>9.^A-���;��>ÂA-���;��>]A-���;��>i|A-���;��>-oA-���;��>%ϳA-���;��>;A-���;��>}A-���;��>cnA-���;��>;{A-���;��>x& A-���;��>YnA-���;��>A-���;��>OA-���;��>neA-���;��>~A-���;��>ϼ!A-���;��>A-���;���>A-���;��>6oJA-���;��> A-���; ��>|)A-���;��>1A-���;��>#?*1A-���;��>0A-���;��>f5A-���; ��>Nt7A-���;$��>ʂA-���;(��>АA-���;,��>ا3A-���;0��>JA-���;4��>AA-���;8��>PA-���;<��>/A-����;@��>MvA-����;D��>CMA-����;H��>MTA-����;L��>A-���;P��>ўA-���;T��>jLA-���;X��>,A-���;\��>QeFA-���;`��>^A-���;d��>5]A-���;h��>tsA-���;l��>A .A-���;p��>gZA-���;t��>ےRA-���;x��>V3A-���;|��>GmA-���;��>aךA-���;��> 7zA-���;��>YA-���;��><A-���;��>'A-���;��>a5A-���;��>A-���;��>Gz<A-���;��>ҜYA-���;��>sU?A-���;��>yA-���;��>7sA-���;��>SA-���;��>_[A-���;��>o=A-���;��>DxA-���;��>ʁA-���;��>h>A-���;��>4$8,A-���;��>@_A-� ��;��>rA-� ��;��>% A-� ��;��>I<(A-� ��;��> AA-� ��;��>9qA-� ��;��> A-� ��;��>؜A-� ��;��>VdA-� ��;��>{aA-� ��;��>2pA-� ��;��>\lHtA-� ��;��>WBA-���;>QPA-���;���>A~SeA-���;���>äA-���; ���>':^A-���;���>;kA-���;���>EA-���;���>XA-���;���>KA-���; ���>0 UA-���;$���>vmA-���;(���>̈vA-���;,���>%LA-���;0���>OA-���;4���>*A-���;8���>5&DA-���;<���>bA-���;@���>IZA-���;D���>%gA-���;H���>EA-���;L���>]A-���;P���>/uA-���;T���>LA-���;X���>FA-���;\���>kA-���;`���>_A-���;d���>A-���;h���>mzA-���;l���>RYA-���;p���>-A-���;t���>tX!A-���;x���>I)iA-���;|���>ɎDA-���;���>ujA-���;���>xyA-���;���>Xk>A-���;���>'qA-���;���>ᾶOA-���;���>A-���;���> fA-���;���>}:A-���;���>cJA-���;���>1A-���;���>Q`3A-���;���>SbEA-���;���>dwA-���;���>kA-���;���>A-���;���>+A-���;���>HpXhA-���;���>EA-���;���>ޔlA-���;���>{RA-���;���>s#A-���;���>KrA-���;���>WA-���;���>Uf*A-���;���>(A-���;���>/A-���;���>ņ{A-���;���>7ӥA-���;���>(0A-���;���>#A-���;���>jA-���;���>\A-���;���>ϊ+A-���;��>yA-���;��>A-���; ��>iNA-���;��>eA-���;��>վA-���;��>4bA-���;��>ĊA-� ��; ��>.4SA-� ��;$��>UA-� ��;(��>2A-� ��;,��>uA-�!��;0��> 9A-�!��;4��>`@A-�!��;8��>q^A-�!��;<��>nQA-�#��;@��>!>A-�#��;D��>ݖ=A-�#��;H��>>ݮA-�#��;L��>MFA-�$��;P��>TA-�$��;T��>q]A-�$��;X��>oA-�$��;\��>P`A-�%��;`��>$A-�%��;d��>֗A-�%��;h��>@CA-�%��;l��>gwA-�&��;p��>谽BA-�&��;t��>A-�&��;x��>8[A-�&��;|��>yA-�'��;��>|G A-�'��;��>B|A-�'��;��>A-�(��;��> A-�(��;��>+2HA-�(��;��>pA-�(��;��>ZlNrA-�)��;��>A-�)��;��>V8A-�)��;��>=A-�)��;��>-6'9A-�*��;��> dA-�*��;��>\h!A-�*��;��>[TA-�*��;��>6$:.A-�+��;��> gA-�+��;��>WA-�+��;��>ҖA-�+��;��>A-�,��;��>OA-�,��;��>a A-�,��;��>wZiKA-�,��;��>A-�-��;��> A-�-��;��>*A-�-��;��>"<CA-�-��;��>A-�.��;��>  A-�.��;��>A-�.��;��>-A-�.��;��>ȩA-�/��;���>WA-�/��;��>uLA-�/��;��>A-�/��; ��>`A-�0��;��>&A-�0��;��>r\A-�0��;��>fD;A-�0��;��>[4~A-�1��; ��>Cv)A-�1��;$��>#A-�1��;(��>hA-�1��;,��>cA-�2��;0��>1A-�2��;4��>cBA-�2��;8��>@"A-�2��;<��>Ƅ A-�3��;@��>J}$A-�3��;D��>=A-�3��;H��>2A-�3��;L��>)mA-�4��;P��>K/A-�4��;T��>0A-�4��;X��> RA-�4��;\��>wA-�5��;`��>+lA-�5��;d��>pA-�5��;h��>HA-�5��;l��>G"dA-�6��;p��>ČA-�6��;t��>?A-�6��;x��>}V,A-�6��;|��>3"A-�7��;��>INA-�7��;��>8A-�7��;��>ʌA-�7��;��>Ԙ6 A-�8��;��>ρA-�8��;��>z(A-�8��;��>&A-�8��;��>?A-�9��;��>:,A-�9��;��>xP A-�9��;��>_jA-�9��;��>~TbFA-�:��;��>A-�:��;��>ؐA-�:��;��>9.^A-�:��;��>ÂA-�;��;��>]A-�;��;��>i|A-�;��;��>o-A-�;��;��>%ϳA-�<��;��>;A-�<��;��>}A-�<��;��>ncA-�<��;��>;{A-�=��;��>& xA-�=��;��>YnA-�=��;��>A-�=��;��>OA-�>��;��>enA-�>��;��>~A-�>��;��>!A-�>��;��>A-�?��;���>ٛA-�?��;��>oJ6A-�?��;��> A-�?��; ��>)|A-�@��;��>1A-�@��;��>?*1#A-�@��;��>0A-�@��;��>5fA-�A��; ��>Nt7A-�A��;$��>A-�A��;(��>A-�A��;,��>3A-�B��;0��>JA-�B��;4��>AA-�B��;8��>PA-�B��;<��>/A-�C��;@��>MvA-�C��;D��>CMA-�C��;H��>TMA-�C��;L��>A-�D��;P��>ўA-�D��;T��>jLA-�D��;X��>,A-�D��;\��>eFQA-�E��;`��>^A-�E��;d��>]5A-�E��;h��>stA-�E��;l��> .AA-�F��;p��>gZA-�F��;t��>ےRA-�F��;x��>3VA-�F��;|��>mGA-�G��;��>ךaA-�G��;��>7z A-�G��;��>YA-�G��;��><A-�H��;��>'A-�H��;��>a5A-�H��;��>A-�H��;��>Gz<A-�I��;��>ҜYA-�I��;��>U?sA-�I��;��>yA-�I��;��>s7A-�J��;��>SA-�J��;��>_[A-�J��;��>=oA-�J��;��>DxA-�K��;��>ʁA-�K��;��>h>A-�K��;��>$8,4A-�K��;��>_@A-�L��;��>rA-�L��;��> %A-�L��;��><(IA-�L��;��> AA-�M��;��>9qA-�M��;��> ޳A-�M��;��>؜A-�M��;��>VdA-�N��;��>{aA-�N��;��>2pA-�N��;��>lHt\A-�N��;��>BWA-�Q��;>QPA-�Q��;���>~SeAA-�Q��;���>äA-�Q��; ���>:^'A-�R��;���>;kA-�R��;���>EA-�R��;���>XA-�R��;���>KA-�S��; ���> U0A-�S��;$���>mvA-�S��;(���>vA-�S��;,���>%LA-�T��;0���>OA-�T��;4���>*A-�T��;8���>&D5A-�T��;<���>bA-�U��;@���>IZA-�U��;D���>%gA-�U��;H���>EA-�U��;L���>]A-�V��;P���>u/A-�V��;T���>LA-�V��;X���>FA-�V��;\���>kA-�W��;`���>_A-�W��;d���>A-�W��;h���>zmA-�W��;l���>YRA-�X��;p���>-A-�X��;t���>X!tA-�X��;x���>I)iA-�X��;|���>DA-�Y��;���>ujA-�Y��;���>xyA-�Y��;���>k>XA-�Y��;���>'qA-�Z��;���>OA-�Z��;���>A-�Z��;���>f A-�Z��;���>}:A-�[��;���>cJA-�[��;���>1A-�[��;���>`3QA-�[��;���>bESA-�\��;���>wdA-�\��;���>kA-�\��;���>A-�\��;���>+A-�]��;���>pXhHA-�]��;���>EA-�]��;���>lA-�]��;���>R{A-�^��;���>#sA-�^��;���>rKA-�^��;���>WA-�^��;���>f*UA-�_��;���>(A-�_��;���>/µA-�_��;���>{A-�_��;���>ӥ7A-�`��;���>0(A-�`��;���>#A-�`��;���>jA-�`��;���>\A-�a��;���>+A-�a��;��>yA-�a��;��>A-�a��; ��>NiA-�b��;��>eA-�b��;��>վA-�b��;��>b4A-�b��;��>ĊA-�c��; ��>4S.A-�c��;$��>UA-�c��;(��>2A-�c��;,��>uA-�d��;0��> 9A-�d��;4��>@`A-�d��;8��>^qA-�d��;<��>QnA-�e��;@��>>!A-�e��;D��>=A-�e��;H��>ݮ>A-�e��;L��>MFA-�f��;P��>TA-�f��;T��>q]A-�f��;X��>oA-�f��;\��>`PA-�g��;`��>$A-�g��;d��>֗A-�g��;h��>C@A-�g��;l��>gwA-�h��;p��>BA-�h��;t��>A-�h��;x��>8[A-�h��;|��>yA-�i��;��>G |A-�i��;��>|BA-�i��;��>A-�j��;��> A-�j��;��>2H+A-�j��;��>pA-�j��;��>lNrZA-�k��;��>A-�k��;��>V8A-�k��;��>=ծA-�k��;��>6'9-A-�l��;��> dA-�l��;��>h!\A-�l��;��>T[A-�l��;��>$:.6A-�m��;��> g A-�m��;��>WA-�m��;��>ҖA-�m��;��>A-�n��;��>OA-�n��;��>a A-�n��;��>ZiKwA-�n��;��>A-�o��;��> A-�o��;��>*A-�o��;��><C"A-�o��;��>A-�p��;��> A-�p��;��>NjA-�p��;��>-A-�p��;��>ȩA-�q��;���>WA-�q��;��>LuA-�q��;��>ݙA-�q��; ��>`A-�r��;��>&A-�r��;��>\rA-�r��;��>D;fA-�r��;��>[4~A-�s��; ��>v)CA-�s��;$��>#A-�s��;(��>hA-�s��;,��>cA-�t��;0��>1A-�t��;4��>BcA-�t��;8��>@"A-�t��;<��> A-�u��;@��>}$JA-�u��;D��>=A-�u��;H��>2A-�u��;L��>m)A-�v��;P��>K/A-�v��;T��>0A-�v��;X��> RA-�v��;\��>wA-�w��;`��>+lA-�w��;d��>pA-�w��;h��>HA-�w��;l��>G"dA-�x��;p��>ČA-�x��;t��>?A-�x��;x��>V,}A-�x��;|��>"3A-�y��;��>NIA-�y��;��>8A-�y��;��>A-�y��;��>6 A-�z��;��>ρA-�z��;��>(zA-�z��;��>&A-�z��;��>?A-�{��;��>,:A-�{��;��>P xA-�{��;��>j_A-�{��;��>TbF~A-�|��;��>A-�|��;��>A-�|��;��>.^9A-�|��;��>A-�}��;��>]A-�}��;��>i|A-�}��;��>o-A-�}��;��>ϳ%A-�~��;��>;A-�~��;��>}A-�~��;��>ncA-�~��;��>{;A-���;��> x&A-���;��>nYA-���;��>A-���;��>OA-���;��>enA-���;��>~A-���;��>!ϼA-���;��>A-���;���>ٛA-���;��>J6oA-���;��> A-���; ��>)|A-���;��>1A-���;��>*1#?A-���;��>0A-���;��>5fA-���; ��>t7NA-���;$��>ʂA-���;(��>АA-���;,��>3اA-���;0��>JA-���;4��>AA-���;8��>PA-���;<��>/A-���;@��>vMA-���;D��>CMA-���;H��>TMA-���;L��>A-���;P��>A-���;T��>LjA-���;X��>,A-���;\��>FQeA-���;`��>^A-���;d��>]5A-���;h��>stA-���;l��>.A A-���;p��>ZgA-���;t��>RA-���;x��>3VA-���;|��>mGA-���;��>aA-���;��>7z A-���;��>YA-���;��><A-���;��>'A-���;��>5aA-���;��>A-���;��>z<GA-���;��>YA-���;��>U?sA-���;��>yA-���;��>s7A-���;��>SA-���;��>_[A-���;��>o=A-���;��>xDA-���;��>ʁA-���;��>>hA-���;��>8,4$A-���;��>_@A-���;��>rA-���;��> %A-���;��>(I<A-���;��>A A-���;��>9qA-���;��>޳ A-���;��>؜A-���;��>dVA-���;��>{aA-���;��>p2A-���;��>Ht\lA-���;��>BWA~�> Td4�-���; >R���A-���;��� > ���A-���;��� >j���A-���;��� >���A-���;��� >0���A-���;��� >6���A-���;��� >���A-���;��� >8���A-���;��� >���A-���; ��� >@���A-���; ��� >���A-���; ��� >���A-���; ��� >���A-���; ��� >���A-���;��� >���A-���;��� >���A-���;��� >|���A-���;��� >���A-���;��� >9���A-���;��� >���A-���;��� >���A-���;��� >/���A-���;��� >���A-���;��� >���A-���;��� >4���A-���;��� >���A-���;��� >C���A-���;��� >D���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���; ��� >T���A-���;!��� >{���A-���;"��� >���A-���;#��� >2���A-���;$��� >���A-���;%��� >���A-���;&��� >#���A-���;'��� >=���A-���;(��� >���A-���;)��� >L���A-���;*��� >���A-���;+��� > ���A-���;,��� >B���A-���;-��� >���A-���;.��� >���A-���;/��� >N���A-���;0��� >���A-���;1��� >.���A-���;2��� >���A-���;3��� >f���A-���;4��� >(���A-���;5��� >���A-���;6��� >$���A-���;7��� >���A-���;8��� >v���A-���;9��� >[���A-���;:��� >���A-���;;��� >I���A-���;<��� >m���A-���;=��� >���A-���;>��� >���A-���;?��� >%���A-���;@��� >r���A-���;A��� >���A-���;B��� >���A-���;C��� >d���A-���;D��� >���A-���;E��� >h���A-���;F��� >���A-���;G��� >���A-���;H��� >���A-���;I��� >���A-���;J��� >\���A-���;K��� >���A-���;L��� >]���A-���;M��� >e���A-���;N��� >���A-���;O��� >���A-���;P��� >l���A-���;Q��� >p���A-���;R��� >H���A-���;S��� >P���A-���;T��� >���A-���;U��� >���A-���;V��� >���A-���;W��� >���A-���;X��� >^���A-���;Y��� >���A-���;Z��� >F���A-���;[��� >W���A-���;\��� >���A-���;]��� >���A-���;^��� >���A-���;_��� >���A-���;`��� >���A-���;a��� >���A-���;b��� >���A-���;d��� >���A-���;e��� >���A-���;f��� >���A-���;g��� > ���A-���;h��� >���A-���;i��� >���A-���;j��� >X���A-���;k��� >���A-���;l��� >���A-���;m��� >���A-���;n��� >E���A-���;o��� >���A-���;p��� >���A-���;q��� >,���A-���;r��� >���A-���;s��� >���A-���;t��� >���A-���;u��� >?���A-���;v��� >���A-���;w��� >���A-���;x��� >���A-���;y��� >���A-���;z��� >���A-���;{��� >���A-���;|��� >���A-���;}��� >���A-���;~��� >���A-���;��� >k���A-���;��� >:���A-���;��� >���A-���;��� >���A-���;��� >A���A-���;��� >O���A-���;��� >g���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >s���A-���;��� >���A-���;��� >���A-���;��� >t���A-���;��� >"���A-���;��� >���A-���;��� >���A-���;��� >5���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >7���A-���;��� >���A-���;��� >���A-���;��� >u���A-���;��� >���A-���;��� >n���A-���;��� >G���A-���;��� >���A-���;��� >���A-���;��� >q���A-���;��� >���A-���;��� >)���A-���;��� >���A-���;��� >���A-���;��� >o���A-���;��� >���A-���;��� >b���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >V���A-���;��� >>���A-���;��� >K���A-���;��� >���A-���;��� >���A-���;��� >y���A-���;��� > ���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >x���A-���;��� >���A-���;��� >Z���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >3���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >1���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >Y���A-���;��� >'���A-���;��� >���A-���;��� >���A-���;��� >_���A-���;��� >`���A-���;��� >Q���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >J���A-���;��� > ���A-���;��� >-���A-���;��� >���A-���;��� >z���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >;���A-���;��� >M���A-���;��� >���A-���;��� >*���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� >���A-���;��� ><���A-���;��� >���A-���;��� >S���A-���;��� >���A-���;��� >a���A-���;��� >���A-���;��� >+���A-���;��� >���A-���;��� >~���A-���;��� >���A-���;��� >w���A-���;��� >���A-���;��� >&���A-���;��� >���A-���;��� >i���A-���;��� >���A-���;��� >c���A-���;��� >U���A-���;��� >!���A-���;��� > ���A-���;��� >}���A~�>!rcon�-���;!>���A-���;���!>���A-���;���!>���A-���; ���!>���A-���;���!>���A-���;���!>��� A-���;���!>���@A-���;���!>���A-���; ���!>���A-���;$���!>���6A���> ���Ap������@p������@ ~�@"rk�p���"@ p���A s���Q������As������Q ������A ��� s������Q ������A ��� s������Q ��� p���Rs������Q������As������Q ������A ��� s������Q ������A ��� s������Q ��� p������Rs������Q������As��� ���Q ������A ��� s��� ���Q ������A ��� s��� ���Q ��� p������Rs��� ���Q������As��� ���Q ������A ��� s������Q ������A ��� s������Q ��� p��� ���R&������AX������<W������<W������<W������<p��� ���Rp��� ������A ������A s��� >������Ap���R ��� p��� p��� ������A ������A s��� > ������A ��� p��� ������A s��� > ������A ��� p��� ������A s��� > ��� ��� !>p������Rp������Rp������R ��� p������Rp������Rp������R ��� p������Rp��� ���Rp������R ��� p������RC���� &���  ���AX���� ��<p��� ���A����� �������A W�������<s������Q������As������Q ������A ��� s������Q ������A ��� s������Q ��� p������Rs������Q������As������Q ������A ��� s������Q ������A ��� s������Q ��� p������R&������AX����^��<W����)��<W����)��<W����^��<p������Rp��� ������A ������A s��� >������Ap���R ��� p��� p��� ������A ������A s��� > ������A ��� p��� ������A s��� > ������A ��� p��� ������A s��� > ��� ��� !>p������Rp������Rp������R ��� p������Rp������Rp������R ��� p��� ���Rp��� ���Rp��� ���R ��� p���$���RC���� &��� ���AX����T��<p��� ���A�����p������Rp���$���R ��� p���(���Rp������Rp���(���R ��� p���,���R ������A W����'��<s������Q������As������Q ������A ��� s������Q ������A ��� s������Q ��� p������Rs������Q������As������Q ������A ��� s������Q ������A ��� s������Q ��� p������R&������AX������<W�5���y��<W�5���y��<W�5�����<p������Rp��� ������A ������A s��� >������Ap���R ��� p��� p��� ������A ������A s��� > ������A ��� p��� ������A s��� > ������A ��� p��� ������A s��� > ��� ��� !>p��� ���Rp�$�����Rp�$�� ���R �$�� p�$��$���Rp�%�����Rp�%��$���R �%�� p�%��(���Rp�&�� ���Rp�&��(���R �&�� p�&��,���RC�'��� &�'�� ���AX�'�����<p�(�����A�(����p�*��,���Rp�+�� �+�����A s�+�� >�+�����Ap�+�����R �+�� p�+�� p�+�� �+�����A �+�����A s�+�� > �+�����A �+�� p�+�� �+�����A �+�����A s�+�� > �+�����A �+�� p�+�� �+�����A s�+�� > �+�� p�+��0���Rp�0�����Rp�0��0���R �0�� p�0��4���Rp�1�����Rp�1��4���R �1�� p�1��8���Rp�2�����Rp�2��8���R �2�� p�2��<���R �4�� ���A W�4���w��<p�7��A�7�����7����~�>#rijndaelKeySetupDec��?��#>$���Ap�D��"@ p�D�� Sp�D�����@ p�D�� ���Sp�D�����@ p�D�� ���S�D���>p�D��"@ ~�?$Nr�p�D��$?p�F��Ap�F��$?�F�����Ap�F��W�F�����<W�F�����<W�F�����< �F�����A�F�����A&�F��P�F�����<p�G��  p�G��Q p�G��  p�G��Qp�G��  p�G��Qp�G��  p�G�� Qp�H��  a�H��Qp�H�����O~�?%temp�p�H��%?p�H��  a�H��Qp�H��  a�H��R p�H�����P p�H�� ���Op�H��  a�H��Qp�H��%? p�H�� ���Op�I��  a�I��Qp�I�����Op�I��%?p�I��  a�I��Qp�I��  a�I��R p�I�����P p�I�� ���Op�I��  a�I��Qp�I��%? p�I�� ���Op�J��  a�J��Qp�J�� ���Op�J��%?p�J��  a�J��Qp�J��  a�J��R p�J�� ���P p�J��  ���Op�J��  a�J��Qp�J��%? p�J��  ���OW�J�����<p�M�����A W�M�����<W�M�����<W�M�����<C�M��� &�M�� $?P�M�����< �N�����A p�O��T �O�����A s�O�� >a�O��>p�O��Op�O��T �O�����A �O�����A s�O�� > a�O�� > p�O��P �O�� p�O��T �O�����A �O�����A s�O�� > a�O�� > p�O��P �O�� p�O��T �O�����A s�O�� > a�O�� > p�O��P �O�� p�O��Tp�T�����T �T�����A s�T�� >a�T��>p�T��Op�T�����T �T�����A �T�����A s�T�� > a�T�� > p�T��P �T�� p�T�����T �T�����A �T�����A s�T�� > a�T�� > p�T��P �T�� p�T�����T �T�����A s�T�� > a�T�� > p�T��P �T�� p�T�����Tp�Y�����T �Y�����A s�Y�� >a�Y��>p�Y��Op�Y�����T �Y�����A �Y�����A s�Y�� > a�Y�� > p�Y��P �Y�� p�Y�����T �Y�����A �Y�����A s�Y�� > a�Y�� > p�Y��P �Y�� p�Y�����T �Y�����A s�Y�� > a�Y�� > p�Y��P �Y�� p�Y�����Tp�^�� ���T �^�����A s�^�� >a�^��>p�^��Op�^�� ���T �^�����A �^�����A s�^�� > a�^�� > p�^��P �^�� p�^�� ���T �^�����A �^�����A s�^�� > a�^�� > p�^��P �^�� p�^�� ���T �^�����A s�^�� > a�^�� > p�^��P �^�� p�^�� ���TW�^�����<p�d��$?�d�����d�����g�� >$���A~�@&pt�p�g�����&@ ~�@'ct�p�g�� ���'@ p�g��"@ s�q��Q�q�����As�q�����Q �q�����A �q�� s�q�����Q �q�����A �q�� s�q�����Q �q�� p�q��R �q�� ~�?(s0�p�q��(?s�r�����Q�r�����As�r�����Q �r�����A �r�� s�r�����Q �r�����A �r�� s�r�����Q �r�� p�r�����R �r�� ~�?)s1�p�r��)?s�s�����Q�s�����As�s�� ���Q �s�����A �s�� s�s�� ���Q �s�����A �s�� s�s�� ���Q �s�� p�s�����R �s�� ~�?*s2�p�s��*?s�t�� ���Q�t�����As�t�� ���Q �t�����A �t�� s�t�����Q �t�����A �t�� s�t�����Q �t�� p�t�� ���R �t�� p�t�� p�w��(? �w�����A p�w�� >p�w��)? �w�����A �w����A �w�� >p�w��*? �w�����A �w����A �w�� >p�w��  �w�����A �w�� >p�w�����R �w�� ~�?+t0�p�w��+?p�x��)? �x�����A p�x�� >p�x��*? �x�����A �x����A �x�� >p�x��  �x�����A �x����A �x�� >p�x��(? �x�����A �x�� >p�x�����R �x�� p�x��p�y��*? �y�����A p�y�� >p�y��  �y�����A �y����A �y�� >p�y��(? �y�����A �y����A �y�� >p�y��)? �y�����A �y�� >p�y�����R �y�� p�y��p�z��  �z�����A p�z�� >p�z��(? �z�����A �z����A �z�� >p�z��)? �z�����A �z����A �z�� >p�z��*? �z�����A �z�� >p�z�����R �z�� p�z�� p�|��+? �|�����A p�|�� >p�|�� �|�����A �|����A �|�� >p�|�� �|�����A �|����A �|�� >p�|��  �|�����A �|�� >p�|�� ���R �|�� p�|��(?p�}�� �}�����A p�}�� >p�}�� �}�����A �}����A �}�� >p�}��  �}�����A �}����A �}�� >p�}��+? �}�����A �}�� >p�}��$���R �}�� p�}��)?p�~�� �~�����A p�~�� >p�~��  �~�����A �~����A �~�� >p�~��+? �~�����A �~����A �~�� >p�~�� �~�����A �~�� >p�~��(���R �~�� p�~��*?p���  ������A p��� >p���+? ������A �����A ��� >p��� ������A �����A ��� >p��� ������A ��� >p���,���R ��� p��� p���(? ������A p��� >p���)? ������A �����A ��� >p���*? ������A �����A ��� >p���  ������A ��� >p���0���R ��� p���+?p���)? ������A p��� >p���*? ������A �����A ��� >p���  ������A �����A ��� >p���(? ������A ��� >p���4���R ��� p���p���*? ������A p��� >p���  ������A �����A ��� >p���(? ������A �����A ��� >p���)? ������A ��� >p���8���R ��� p���p���  ������A p��� >p���(? ������A �����A ��� >p���)? ������A �����A ��� >p���*? ������A ��� >p���<���R ��� p��� p���+? ������A p��� >p��� ������A �����A ��� >p��� ������A �����A ��� >p���  ������A ��� >p���@���R ��� p���(?p��� ������A p��� >p��� ������A �����A ��� >p���  ������A �����A ��� >p���+? ������A ��� >p���D���R ��� p���)?p��� ������A p��� >p���  ������A �����A ��� >p���+? ������A �����A ��� >p��� ������A ��� >p���H���R ��� p���*?p���  ������A p��� >p���+? ������A �����A ��� >p��� ������A �����A ��� >p��� ������A ��� >p���L���R ��� p��� p���(? ������A p��� >p���)? ������A �����A ��� >p���*? ������A �����A ��� >p���  ������A ��� >p���P���R ��� p���+?p���)? ������A p��� >p���*? ������A �����A ��� >p���  ������A �����A ��� >p���(? ������A ��� >p���T���R ��� p���p���*? ������A p��� >p���  ������A �����A ��� >p���(? ������A �����A ��� >p���)? ������A ��� >p���X���R ��� p���p���  ������A p��� >p���(? ������A �����A ��� >p���)? ������A �����A ��� >p���*? ������A ��� >p���\���R ��� p��� p���+? ������A p��� >p��� ������A �����A ��� >p��� ������A �����A ��� >p���  ������A ��� >p���`���R ��� p���(?p��� ������A p��� >p��� ������A �����A ��� >p���  ������A �����A ��� >p���+? ������A ��� >p���d���R ��� p���)?p��� ������A p��� >p���  ������A �����A ��� >p���+? ������A �����A ��� >p��� ������A ��� >p���h���R ��� p���*?p���  ������A p��� >p���+? ������A �����A ��� >p��� ������A �����A ��� >p��� ������A ��� >p���l���R ��� p��� p���(? ������A p��� >p���)? ������A �����A ��� >p���*? ������A �����A ��� >p���  ������A ��� >p���p���R ��� p���+?p���)? ������A p��� >p���*? ������A �����A ��� >p���  ������A �����A ��� >p���(? ������A ��� >p���t���R ��� p���p���*? ������A p��� >p���  ������A �����A ��� >p���(? ������A �����A ��� >p���)? ������A ��� >p���x���R ��� p���p���  ������A p��� >p���(? ������A �����A ��� >p���)? ������A �����A ��� >p���*? ������A ��� >p���|���R ��� p��� p���+? ������A p��� >p��� ������A �����A ��� >p��� ������A �����A ��� >p���  ������A ��� >p������R ��� p���(?p��� ������A p��� >p��� ������A �����A ��� >p���  ������A �����A ��� >p���+? ������A ��� >p������R ��� p���)?p��� ������A p��� >p���  ������A �����A ��� >p���+? ������A �����A ��� >p��� ������A ��� >p������R ��� p���*?p���  ������A p��� >p���+? ������A �����A ��� >p��� ������A �����A ��� >p��� ������A ��� >p������R ��� p��� p���(? ������A p��� >p���)? ������A �����A ��� >p���*? ������A �����A ��� >p���  ������A ��� >p������R ��� p���+?p���)? ������A p��� >p���*? ������A �����A ��� >p���  ������A �����A ��� >p���(? ������A ��� >p������R ��� ~�?,t1�p���,?p���*? ������A p��� >p���  ������A �����A ��� >p���(? ������A �����A ��� >p���)? ������A ��� >p������R ��� p���p���  ������A p��� >p���(? ������A �����A ��� >p���)? ������A �����A ��� >p���*? ������A ��� >p������R ��� p���~�@-Nr�&������-@ ���AS����:��<p���+? ������A p��� >p���,? ������A �����A ��� >p��� ������A �����A ��� >p��� ������A ��� >p������R ��� p���(?p���,? ������A p��� >p��� ������A �����A ��� >p��� ������A �����A ��� >p���+? ������A ��� >p������R ��� p���)?p��� ������A p��� >p��� ������A �����A ��� >p���+? ������A �����A ��� >p���,? ������A ��� >p������R ��� p���*?p��� ������A p��� >p���+? ������A �����A ��� >p���,? ������A �����A ��� >p��� ������A ��� >p������R ��� p��� p���(? ������A p��� >p���)? ������A �����A ��� >p���*? ������A �����A ��� >p���  ������A ��� >p������R ��� p���+?p���)? ������A p��� >p���*? ������A �����A ��� >p���  ������A �����A ��� >p���(? ������A ��� >p������R ��� p���,?p���*? ������A p��� >p���  ������A �����A ��� >p���(? ������A �����A ��� >p���)? ������A ��� >p������R ��� p���p���  ������A p��� >p���(? ������A �����A ��� >p���)? ������A �����A ��� >p���*? ������A ��� >p������R ��� p���&������-@ ���AS����:��<p���+? ������A p��� >p���,? ������A �����A ��� >p��� ������A �����A ��� >p��� ������A ��� >p������R ��� p���(?p���,? ������A p��� >p��� ������A �����A ��� >p��� ������A �����A ��� >p���+? ������A ��� >p������R ��� p���)?p��� ������A p��� >p��� ������A �����A ��� >p���+? ������A �����A ��� >p���,? ������A ��� >p������R ��� p���*?p��� ������A p��� >p���+? ������A �����A ��� >p���,? ������A �����A ��� >p��� ������A ��� >p������R ��� p��� p���(? ������A p��� >p���)? ������A �����A ��� >p���*? ������A �����A ��� >p���  ������A ��� >p������R ��� p���+?p���)? ������A p��� >p���*? ������A �����A ��� >p���  ������A �����A ��� >p���(? ������A ��� >p������R ��� p���,?p���*? ������A p��� >p���  ������A �����A ��� >p���(? ������A �����A ��� >p���)? ������A ��� >p������R ��� p���p���  ������A p��� >p���(? ������A �����A ��� >p���)? ������A �����A ��� >p���*? ������A ��� >p������R ��� p���p������-@������A������A ��� p���+? ������A s��� >������Ap���,? ������A ������A s��� > ������A ��� p��� ������A ������A s��� > ������A ��� p��� ������A s��� > ��� p���R ��� p��� � �����Ao� ��Tp� �� � �����Ao� �����Tp� �� � �����Ao� �����To� �� ���Tp� ��,? � �����A s� �� >� �����Ap� �� � �����A � �����A s� �� > � �����A � �� p� �� � �����A � �����A s� �� > � �����A � �� p� ��+? � �����A s� �� > � �� p� �����R � �� p� �� � �����Ao� �����Tp� �� � �����Ao� �����Tp� �� � �����Ao� �����To� �� ���Tp� �� � �����A s� �� >� �����Ap� �� � �����A � �����A s� �� > � �����A � �� p� ��+? � �����A � �����A s� �� > � �����A � �� p� ��,? � �����A s� �� > � �� p� �����R � �� p� �� � �����Ao� �����Tp� �� � �����Ao� �� ���Tp� �� � �����Ao� �� ���To� ��  ���Tp� �� � �����A s� �� >� �����Ap� ��+? � �����A � �����A s� �� > � �����A � �� p� ��,? � �����A � �����A s� �� > � �����A � �� p� �� � �����A s� �� > � �� p� �� ���R � �� p� �� � �����Ao� �� ���Tp� �� � �����Ao� �� ���Tp� �� � �����Ao� �����To� �� ���T� ����� ��>$���Ap� �����'@ p� �� ���&@ p� ��"@ s�& ��Q�& �����As�& �����Q �& �����A �& �� s�& �����Q �& �����A �& �� s�& �����Q �& �� p�& ��R �& �� p�& ��(?s�' �����Q�' �����As�' �����Q �' �����A �' �� s�' �����Q �' �����A �' �� s�' �����Q �' �� p�' �����R �' �� p�' ��)?s�( �����Q�( �����As�( �� ���Q �( �����A �( �� s�( �� ���Q �( �����A �( �� s�( �� ���Q �( �� p�( �����R �( �� p�( ��*?s�) �� ���Q�) �����As�) �� ���Q �) �����A �) �� s�) �����Q �) �����A �) �� s�) �����Q �) �� p�) �� ���R �) �� p�) �� p�, ��(? �, �����A p�, �� >p�, ��  �, �����A �, ����A �, �� >p�, ��*? �, �����A �, ����A �, �� >p�, ��)? �, �����A �, �� >p�, �����R �, �� p�, ��+?p�- ��)? �- �����A p�- �� >p�- ��(? �- �����A �- ����A �- �� >p�- ��  �- �����A �- ����A �- �� >p�- ��*? �- �����A �- �� >p�- �����R �- �� p�- ��p�. ��*? �. �����A p�. �� >p�. ��)? �. �����A �. ����A �. �� >p�. ��(? �. �����A �. ����A �. �� >p�. ��  �. �����A �. �� >p�. �����R �. �� p�. ��p�/ ��  �/ �����A p�/ �� >p�/ ��*? �/ �����A �/ ����A �/ �� >p�/ ��)? �/ �����A �/ ����A �/ �� >p�/ ��(? �/ �����A �/ �� >p�/ �����R �/ �� p�/ �� p�1 ��+? �1 �����A p�1 �� >p�1 ��  �1 �����A �1 ����A �1 �� >p�1 �� �1 �����A �1 ����A �1 �� >p�1 �� �1 �����A �1 �� >p�1 �� ���R �1 �� p�1 ��(?p�2 �� �2 �����A p�2 �� >p�2 ��+? �2 �����A �2 ����A �2 �� >p�2 ��  �2 �����A �2 ����A �2 �� >p�2 �� �2 �����A �2 �� >p�2 ��$���R �2 �� p�2 ��)?p�3 �� �3 �����A p�3 �� >p�3 �� �3 �����A �3 ����A �3 �� >p�3 ��+? �3 �����A �3 ����A �3 �� >p�3 ��  �3 �����A �3 �� >p�3 ��(���R �3 �� p�3 ��*?p�4 ��  �4 �����A p�4 �� >p�4 �� �4 �����A �4 ����A �4 �� >p�4 �� �4 �����A �4 ����A �4 �� >p�4 ��+? �4 �����A �4 �� >p�4 ��,���R �4 �� p�4 �� p�6 ��(? �6 �����A p�6 �� >p�6 ��  �6 �����A �6 ����A �6 �� >p�6 ��*? �6 �����A �6 ����A �6 �� >p�6 ��)? �6 �����A �6 �� >p�6 ��0���R �6 �� p�6 ��+?p�7 ��)? �7 �����A p�7 �� >p�7 ��(? �7 �����A �7 ����A �7 �� >p�7 ��  �7 �����A �7 ����A �7 �� >p�7 ��*? �7 �����A �7 �� >p�7 ��4���R �7 �� p�7 ��p�8 ��*? �8 �����A p�8 �� >p�8 ��)? �8 �����A �8 ����A �8 �� >p�8 ��(? �8 �����A �8 ����A �8 �� >p�8 ��  �8 �����A �8 �� >p�8 ��8���R �8 �� p�8 ��p�9 ��  �9 �����A p�9 �� >p�9 ��*? �9 �����A �9 ����A �9 �� >p�9 ��)? �9 �����A �9 ����A �9 �� >p�9 ��(? �9 �����A �9 �� >p�9 ��<���R �9 �� p�9 �� p�; ��+? �; �����A p�; �� >p�; ��  �; �����A �; ����A �; �� >p�; �� �; �����A �; ����A �; �� >p�; �� �; �����A �; �� >p�; ��@���R �; �� p�; ��(?p�< �� �< �����A p�< �� >p�< ��+? �< �����A �< ����A �< �� >p�< ��  �< �����A �< ����A �< �� >p�< �� �< �����A �< �� >p�< ��D���R �< �� p�< ��)?p�= �� �= �����A p�= �� >p�= �� �= �����A �= ����A �= �� >p�= ��+? �= �����A �= ����A �= �� >p�= ��  �= �����A �= �� >p�= ��H���R �= �� p�= ��*?p�> ��  �> �����A p�> �� >p�> �� �> �����A �> ����A �> �� >p�> �� �> �����A �> ����A �> �� >p�> ��+? �> �����A �> �� >p�> ��L���R �> �� p�> �� p�@ ��(? �@ �����A p�@ �� >p�@ ��  �@ �����A �@ ����A �@ �� >p�@ ��*? �@ �����A �@ ����A �@ �� >p�@ ��)? �@ �����A �@ �� >p�@ ��P���R �@ �� p�@ ��+?p�A ��)? �A �����A p�A �� >p�A ��(? �A �����A �A ����A �A �� >p�A ��  �A �����A �A ����A �A �� >p�A ��*? �A �����A �A �� >p�A ��T���R �A �� p�A ��p�B ��*? �B �����A p�B �� >p�B ��)? �B �����A �B ����A �B �� >p�B ��(? �B �����A �B ����A �B �� >p�B ��  �B �����A �B �� >p�B ��X���R �B �� p�B ��p�C ��  �C �����A p�C �� >p�C ��*? �C �����A �C ����A �C �� >p�C ��)? �C �����A �C ����A �C �� >p�C ��(? �C �����A �C �� >p�C ��\���R �C �� p�C �� p�E ��+? �E �����A p�E �� >p�E ��  �E �����A �E ����A �E �� >p�E �� �E �����A �E ����A �E �� >p�E �� �E �����A �E �� >p�E ��`���R �E �� p�E ��(?p�F �� �F �����A p�F �� >p�F ��+? �F �����A �F ����A �F �� >p�F ��  �F �����A �F ����A �F �� >p�F �� �F �����A �F �� >p�F ��d���R �F �� p�F ��)?p�G �� �G �����A p�G �� >p�G �� �G �����A �G ����A �G �� >p�G ��+? �G �����A �G ����A �G �� >p�G ��  �G �����A �G �� >p�G ��h���R �G �� p�G ��*?p�H ��  �H �����A p�H �� >p�H �� �H �����A �H ����A �H �� >p�H �� �H �����A �H ����A �H �� >p�H ��+? �H �����A �H �� >p�H ��l���R �H �� p�H �� p�J ��(? �J �����A p�J �� >p�J ��  �J �����A �J ����A �J �� >p�J ��*? �J �����A �J ����A �J �� >p�J ��)? �J �����A �J �� >p�J ��p���R �J �� p�J ��+?p�K ��)? �K �����A p�K �� >p�K ��(? �K �����A �K ����A �K �� >p�K ��  �K �����A �K ����A �K �� >p�K ��*? �K �����A �K �� >p�K ��t���R �K �� p�K ��p�L ��*? �L �����A p�L �� >p�L ��)? �L �����A �L ����A �L �� >p�L ��(? �L �����A �L ����A �L �� >p�L ��  �L �����A �L �� >p�L ��x���R �L �� p�L ��p�M ��  �M �����A p�M �� >p�M ��*? �M �����A �M ����A �M �� >p�M ��)? �M �����A �M ����A �M �� >p�M ��(? �M �����A �M �� >p�M ��|���R �M �� p�M �� p�O ��+? �O �����A p�O �� >p�O ��  �O �����A �O ����A �O �� >p�O �� �O �����A �O ����A �O �� >p�O �� �O �����A �O �� >p�O �����R �O �� p�O ��(?p�P �� �P �����A p�P �� >p�P ��+? �P �����A �P ����A �P �� >p�P ��  �P �����A �P ����A �P �� >p�P �� �P �����A �P �� >p�P �����R �P �� p�P ��)?p�Q �� �Q �����A p�Q �� >p�Q �� �Q �����A �Q ����A �Q �� >p�Q ��+? �Q �����A �Q ����A �Q �� >p�Q ��  �Q �����A �Q �� >p�Q �����R �Q �� p�Q ��*?p�R ��  �R �����A p�R �� >p�R �� �R �����A �R ����A �R �� >p�R �� �R �����A �R ����A �R �� >p�R ��+? �R �����A �R �� >p�R �����R �R �� p�R �� p�T ��(? �T �����A p�T �� >p�T ��  �T �����A �T ����A �T �� >p�T ��*? �T �����A �T ����A �T �� >p�T ��)? �T �����A �T �� >p�T �����R �T �� p�T ��+?p�U ��)? �U �����A p�U �� >p�U ��(? �U �����A �U ����A �U �� >p�U ��  �U �����A �U ����A �U �� >p�U ��*? �U �����A �U �� >p�U �����R �U �� p�U ��,?p�V ��*? �V �����A p�V �� >p�V ��)? �V �����A �V ����A �V �� >p�V ��(? �V �����A �V ����A �V �� >p�V ��  �V �����A �V �� >p�V �����R �V �� p�V ��p�W ��  �W �����A p�W �� >p�W ��*? �W �����A �W ����A �W �� >p�W ��)? �W �����A �W ����A �W �� >p�W ��(? �W �����A �W �� >p�W �����R �W �� p�W ��&�X �����-@ ���AS�X ���o ��<p�Z ��+? �Z �����A p�Z �� >p�Z �� �Z �����A �Z ����A �Z �� >p�Z �� �Z �����A �Z ����A �Z �� >p�Z ��,? �Z �����A �Z �� >p�Z �����R �Z �� p�Z ��(?p�[ ��,? �[ �����A p�[ �� >p�[ ��+? �[ �����A �[ ����A �[ �� >p�[ �� �[ �����A �[ ����A �[ �� >p�[ �� �[ �����A �[ �� >p�[ �����R �[ �� p�[ ��)?p�\ �� �\ �����A p�\ �� >p�\ ��,? �\ �����A �\ ����A �\ �� >p�\ ��+? �\ �����A �\ ����A �\ �� >p�\ �� �\ �����A �\ �� >p�\ �����R �\ �� p�\ ��*?p�] �� �] �����A p�] �� >p�] �� �] �����A �] ����A �] �� >p�] ��,? �] �����A �] ����A �] �� >p�] ��+? �] �����A �] �� >p�] �����R �] �� p�] �� p�_ ��(? �_ �����A p�_ �� >p�_ ��  �_ �����A �_ ����A �_ �� >p�_ ��*? �_ �����A �_ ����A �_ �� >p�_ ��)? �_ �����A �_ �� >p�_ �����R �_ �� p�_ ��+?p�` ��)? �` �����A p�` �� >p�` ��(? �` �����A �` ����A �` �� >p�` ��  �` �����A �` ����A �` �� >p�` ��*? �` �����A �` �� >p�` �����R �` �� p�` ��,?p�a ��*? �a �����A p�a �� >p�a ��)? �a �����A �a ����A �a �� >p�a ��(? �a �����A �a ����A �a �� >p�a ��  �a �����A �a �� >p�a �����R �a �� p�a ��p�b ��  �b �����A p�b �� >p�b ��*? �b �����A �b ����A �b �� >p�b ��)? �b �����A �b ����A �b �� >p�b ��(? �b �����A �b �� >p�b �����R �b �� p�b ��&�c �����-@ ���AS�c ���o ��<p�e ��+? �e �����A p�e �� >p�e �� �e �����A �e ����A �e �� >p�e �� �e �����A �e ����A �e �� >p�e ��,? �e �����A �e �� >p�e �����R �e �� p�e ��(?p�f ��,? �f �����A p�f �� >p�f ��+? �f �����A �f ����A �f �� >p�f �� �f �����A �f ����A �f �� >p�f �� �f �����A �f �� >p�f �����R �f �� p�f ��)?p�g �� �g �����A p�g �� >p�g ��,? �g �����A �g ����A �g �� >p�g ��+? �g �����A �g ����A �g �� >p�g �� �g �����A �g �� >p�g �����R �g �� p�g ��*?p�h �� �h �����A p�h �� >p�h �� �h �����A �h ����A �h �� >p�h ��,? �h �����A �h ����A �h �� >p�h ��+? �h �����A �h �� >p�h �����R �h �� p�h �� p�j ��(? �j �����A p�j �� >p�j ��  �j �����A �j ����A �j �� >p�j ��*? �j �����A �j ����A �j �� >p�j ��)? �j �����A �j �� >p�j �����R �j �� p�j ��+?p�k ��)? �k �����A p�k �� >p�k ��(? �k �����A �k ����A �k �� >p�k ��  �k �����A �k ����A �k �� >p�k ��*? �k �����A �k �� >p�k �����R �k �� p�k ��,?p�l ��*? �l �����A p�l �� >p�l ��)? �l �����A �l ����A �l �� >p�l ��(? �l �����A �l ����A �l �� >p�l ��  �l �����A �l �� >p�l �����R �l �� p�l ��p�m ��  �m �����A p�m �� >p�m ��*? �m �����A �m ����A �m �� >p�m ��)? �m �����A �m ����A �m �� >p�m ��(? �m �����A �m �� >p�m �����R �m �� p�m ��p�p �����-@�p �����A�p �����A �p �� p� ��+? � �����A s� ��  >� �����Ap� �� � �����A � �����A s� ��  > � �����A � �� p� �� � �����A � �����A s� ��  > � �����A � �� p� ��,? � �����A s� ��  > � �� p� ��R � �� p� �� � �����Ao� ��Tp� �� � �����Ao� �����Tp� �� � �����Ao� �����To� �� ���Tp� ��,? � �����A s� ��  >� �����Ap� ��+? � �����A � �����A s� ��  > � �����A � �� p� �� � �����A � �����A s� ��  > � �����A � �� p� �� � �����A s� ��  > � �� p� �����R � �� p� �� � �����Ao� �����Tp� �� � �����Ao� �����Tp� �� � �����Ao� �����To� �� ���Tp� �� � �����A s� ��  >� �����Ap� ��,? � �����A � �����A s� ��  > � �����A � �� p� ��+? � �����A � �����A s� ��  > � �����A � �� p� �� � �����A s� ��  > � �� p� �����R � �� p� �� � �����Ao� �����Tp� �� � �����Ao� �� ���Tp� �� � �����Ao� �� ���To� ��  ���Tp� �� � �����A s� ��  >� �����Ap� �� � �����A � �����A s� ��  > � �����A � �� p� ��,? � �����A � �����A s� ��  > � �����A � �� p� ��+? � �����A s� ��  > � �� p� �� ���R � �� p� �� � �����Ao� �� ���Tp� �� � �����Ao� �� ���Tp� �� � �����Ao� �����To� �� ���T� ����5� ��>���A5� ��>���A5� ��>���A5� ��>���A5� ��>���A5� �� >���A5� ��>���A5� ��>���A5� ��>���A5� ��>���A5� ��!>(���AI ����blowfish.8 1201054007 0 0 664 32637 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<blowfish.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�S����~�=setupBFstate�� ��=(���A~�@s�p�%��@p�%��Sp�%��A���Sp�%����Ap�%�����S~�=memset��%���=~�?buf�a�&��?p�&��Sp�&��A���Sp�&�����Ap�&�����S�&���=~�@keybytes�p�&�����@ &�(�� 8���AS�(������<p�)��8���A p�+��@ �+�����Ap�+��S~�@key�p�+�����@p�+�����Sp�+�� ���@p�+�� ���S~�=memmove��+���=p�+��@ ~�@ivec�p�+�� ���@ &�-�� AO�-���%���<p�.��  �.��<���Ap�.��Sp�.�� ���Sp�.�����Ap�.�����S�.���=W�.���,���<p�0��  �0��<���Ap�0��Sp�0��A���Sp�0�����Ap�0�����S�0���=p�2��@ �2��D���Ap�2��S~�> pbox�p�2��>� Dp�2�����Sp�2��H���Ap�2�����S�2���=p�3��@ �3�����Ap�3��S~�> sbox�p�3��>� Dp�3�����Sp�3�����Ap�3�����S�3���=p�3�����@p�3�����@p�3��@ &�5��H���AS�5���B���<p�6��H���Ap�8��A~�? j�p�8�� ?~�? i�p�8�� ?W�8���I���<W�8���H���<W�8���s���<C�8��� ?&�8�� ?���AP�8���G���<p�9�� ? s�9��Qp�9�� p�:�� ?C�:����:����:�:���p�:��  ?�<�����A p�=�� ? s�=��Q�=�� p�>�� ?C�>����>����:�>���p�>��  ?�@�����A p�A�� ? s�A��Q�A�� p�B�� ?C�B����B����:�B���p�B��  ?�D�����A p�E�� ? s�E��Q�E�� p�F�� ?C�F����F����:�F���p�F��  ?p�H�� ? p�H��  a�H�� Q�H�� D���OW�H���F���<p�K��A W�K���x���<W�K���w���<W�K������< �K�����A &�K�� ���Ap�K��  ?P�K���v���<a�L��?p�L��Sp�L�� ���S~�> bfencrypt��L��� >p�L�� ? p�L��@ p�M��  a�M�� Qp�M��? p�M�� D���Oa�N�� Qp�N��? p�N�� H���OW�N���u���<p�Q��A W�Q������<W�Q������<W�Q������< �Q�����A &�Q�� ���Ap�Q��  ?P�Q������<a�R��?p�R��Sp�R�� ���S�R��� >p�R�� ? p�R��@ p�S��  a�S�� Qp�S��? p�S�� ���Oa�T�� Qp�T��? p�T�� ���OW�T������<p�W��AT�W����~�=bfCBCencrypt��[��=,���Ap�[�����@~�@buf�p�[��@ ~�@n�p�a�����@ �a�����A&�a��AX�a������<W�a������<~�>.string�-�a��;> (n & 7) p�a��>�Dp�a��S~�=_assert��a���=p�a�����@p�a��@ s�c��=���U�c�����As�c��<���U �c�� p�c�� s�c��>���U �c�����A �c�� s�c��?���U �c�����A �c�� ~�?bo�p�c��?s�d��A���U�d�����As�d��@���U �d�� p�d�� s�d��B���U �d�����A �d�� s�d��C���U �d�����A �d�� p�d��?p�f��AW�f������<W�f������<W�f�����< �f�����A �f�����A p�f�� ?&�f�����@P�f������<s�g�����T�g�����As�g��T �g�� p�g�� s�g�����T �g�����A �g�� s�g�����T �g�����A �g�� ~�?bi�p�g��?s�h�����T�h�����As�h�����T �h�� p�h�� s�h�����T �h�����A �h�� p�h�� @s�h�����T �h�����A �h�� p�h��?p�j��?�j��?p�k��?�k��?a�m��?p�m��Sp�m�����S�m��� >p�m�� ?p�m�����@p�m��@ p�o��?p�o��?p�p��?p�p��?p�r��  p�s��? C�t��� o�t�� T�u�����A p�v�� C�v��� o�v�� O�w�����A p�x�� C�x��� o�x�� O�y�����A p�z�� C�z��� o�z�� Op�|��? p�}�� C�}��� o�}�� O�~�����A p��� C���� o��� O������A p��� C���� o��� O������A o��� QW�������<p���?������Ao���C���Up���?������Ao���B���Up���?������Ao���A���Up���? o��� @���Up���?������Ao���?���Up���?������Ao���>���Up���?������Ao���=���Up���? o��� <���U����������~�=bfCBCdecrypt����=4���Ap������@p���@ p������@ ������A&���AX����6��<W����;��<-���;���> == 0�(n -���;���> & 7) == p���>� ���Dp���S����=p������@p���@ s���=���U������As���<���U ��� p��� s���>���U ������A ��� s���?���U ������A ��� p���?s���A���U������As���@���U ��� p��� s���B���U ������A ��� s���C���U ������A ��� p���?p���AW����Y��<W����W��<W������< ������A ������A p��� ?&������@P����V��<s������T������As���T ��� p��� s������T ������A ��� s������T ������A ��� p���?s������T������As������T ��� p��� s������T ������A ��� p��� @s������T ������A ��� p���?p���?~�?xr�p���?p���?p���?a���?p���Sp������S~�>bfdecrypt�����>p��� ?p������@p���@ p���?���?p���?���?p���  p���? C���� o��� T������A p��� C���� o��� O������A p��� C���� o��� O������A p��� C���� o��� Op���? p��� C���� o��� O������A p��� C���� o��� O������A p��� C���� o��� O������A o��� Qp���?p���?p���?p���?W����U��<p���?������Ao���C���Up���?������Ao���B���Up���?������Ao���A���Up���? o��� @���Up���?������Ao���?���Up���?������Ao���>���Up���?������Ao���=���Up���? o��� <���U����������~�=bfECBencrypt����=���Ap���@ p���A W������<W������<W������< ������A ������A p���  ?&��� ���@P������<s������Q������As���Q ��� p��� s������Q ������A ��� s������Q ������A ��� ~�?b�p���?s������Q������As������Q ��� p��� s������Q ������A ��� p��� @s������Q ������A ��� p���?a���?p���Sp������@p������S���� >p��� ? p���@ p���?������Ao������Qp���?������Ao������Qp���?������Ao������Qp���? o��� ���Qp���?������Ao������Qp���?������Ao������Qp���?������Ao������Qp���? o��� QW������<����������~�=bfECBdecrypt����=���Ap���@ p���A W���� ��<W���� ��<W����E��< ������A ������A p���  ?&��� ���@P������<s������Q������As���Q ��� p��� s������Q ������A ��� s������Q ������A ��� p���?s������Q������As������Q ��� p��� s������Q ������A ��� p��� @s������Q ������A ��� p���?a���?p���Sp������@p������S����>p��� ? p���@ p���?������Ao������Qp���?������Ao������Qp���?������Ao������Qp���? o��� ���Qp���?������Ao������Qp���?������Ao������Qp���?������Ao������Qp���? o��� QW������<��������������� >���Ap������@ ~�@b�p� ��@p� ��Op� ��@p� �����Op� ��  � ��D���A~�?pb�p� ��? ������A p���?p���O���p������A ?W����Y��<W����X��<W������< ������A ?&��� ?���AP����W��<p��� ? p���? p��� Q���p��� ������A s���  p���  p��� Qp��� ������A s���  p���  a��� R p������P ��� p��� ������A s���  p���  a��� R p������P ��� s��� p���  a��� R p���� ��P ��� ���p��� ? p���? a��� Qp������O���p��� ������A s���  p���  p��� Qp��� ������A s���  p���  a��� R p������P ��� p��� ������A s���  p���  a��� R p������P ��� s��� p���  a��� R p���� ��P ��� ���W����V��<p���?p���D���O���p���@p���Op� ��@p� �����O�"�����"�����&��>���Ap�&�����@ p�,��@p�,��Op�-��@p�-�����Op�/��  �/��D���Ap�/��? �0�����A p�2��?p�2��D���O�2��p�4�����A ?W�4�����<W�4�����<W�4�����<�4�����A ?&�4�� ?AS�4�����<p�5�� ? p�5��? p�5�� Q�5��p�6�� �6�����A s�6��  p�6��  p�6�� Qp�6�� �6�����A s�6��  p�6��  a�6�� R p�6�����P �6�� p�6�� �6�����A s�6��  p�6��  a�6�� R p�6�����P �6�� s�6�� p�6��  a�6�� R p�6��� ��P �6�� �6��p�9�� ? p�9��? a�9�� Qp�9��O�9��p�:�� �:�����A s�:��  p�:��  p�:�� Qp�:�� �:�����A s�:��  p�:��  a�:�� R p�:�����P �:�� p�:�� �:�����A s�:��  p�:��  a�:�� R p�:�����P �:�� s�:�� p�:��  a�:�� R p�:��� ��P �:�� �:��W�:�����<p�>��?p�>��O�>��p�A��@p�A��Op�B��@p�B�����O�D�����D����-�H��; >j?$A-�H��;��� >A-�H��;��� >.A-�H��; ��� >DspA-�I��;��� >"8 A-�I��;��� >1)A-�I��;��� >.A-�I��;��� >lNA-�J��; ��� >!(EA-�J��;$��� >w8A-�J��;(��� >fTA-�J��;,��� >l 4A-�K��;0��� >)A-�K��;4��� >P|A-�K��;8��� >Մ?A-�K��;<��� > GA-�L��;@��� >A-�L��;D��� >yA-�P��; > 1A-�P��;��� >ߘA-�P��;��� >r/A-�P��; ��� >A-�Q��;��� >A-�Q��;��� >~&jA-�Q��;��� >E|A-�Q��;��� >,A-�R��; ��� >G$A-�R��;$��� >lA-�R��;(��� >A-�R��;,��� >A-�S��;0��� > icA-�S��;4��� >iNWqA-�S��;8��� >XA-�S��;<��� >~=A-�T��;@��� >t A-�T��;D��� >XrA-�T��;H��� >X͋qA-�T��;L��� >JA-�U��;P��� >T{A-�U��;T��� >YZA-�U��;X��� >90A-�U��;\��� >`*A-�V��;`��� >#A-�V��;d��� >`(A-�V��;h��� >yAA-�V��;l��� >8۸A-�W��;p��� >yA-�W��;t��� >:`A-�W��;x��� >lA-�W��;|��� >>A-�X��;��� >wA-�X��;��� >'K1A-�X��;��� >/xA-�X��;��� >`\`UA-�Y��;��� >%UA-�Y��;��� >UA-�Y��;��� >bHWA-�Y��;��� >@cA-�Z��;��� >j9UA-�Z��;��� >*A-�Z��;��� >4\̴A-�Z��;��� >AA-�[��;��� >TA-�[��;��� >r|A-�[��;��� >A-�[��;��� >*ocA-�\��;��� >]ũ+A-�\��;��� >1tA-�\��;��� >>\A-�\��;��� >A-�]��;��� >3֯A-�]��;��� >\$lA-�]��;��� >S2zA-�]��;��� >w(A-�^��;��� >H;A-�^��;��� >KkA-�^��;��� >A-�^��;��� >!(fA-�_��;��� > aA-�_��;��� >!A-�_��;��� >`|HA-�_��;��� >2]A-�`��;��� >]]A-�`��;�� >uA-�`��;�� >#&A-�`��; �� >eA-�a��;�� >>#A-�a��;�� >ŬA-�a��;�� >omA-�a��;�� >9BA-�b��; �� >D .A-�b��;$�� > A-�b��;(�� >JiA-�b��;,�� >^A-�c��;0�� >Bh!A-�c��;4�� >lA-�c��;8�� >a gA-�c��;<�� >ӫA-�d��;@�� >ҠQjA-�d��;D�� >h/TA-�d��;H�� >(A-�d��;L�� >3QA-�e��;P�� >l nA-�e��;T�� >;zA-�e��;X�� >P;A-�e��;\�� >*~A-�f��;`�� >eA-�f��;d�� >v9A-�f��;h�� >>YfA-�f��;l�� >CA-�g��;p�� >A-�g��;t�� >oEA-�g��;x�� >å}A-�g��;|�� >^;A-�h��;�� >uoA-�h��;�� >s A-�h��;�� >D@A-�h��;�� >jVA-�i��;�� >bNA-�i��;�� >w?6A-�i��;�� >rA-�i��;�� >=BA-�j��;�� >$7A-�j��;�� >H A-�j��;�� >A-�j��;�� >IA-�k��;�� >rSA-�k��;�� >{A-�k��;�� >y%A-�k��;�� >A-�l��;�� >PA-�l��;�� >;LyA-�l��;�� >lA-�l��;�� >A-�m��;�� >OA-�m��;�� >`@A-�m��;�� >ž\^A-�m��;�� >c$jA-�n��;�� >ohA-�n��;�� >Sl>A-�n��;�� >9A-�n��;�� >oR;A-�o��;�� >QmA-�o��;�� >,0A-�o��;�� >DEA-�o��;�� > ^A-�p��;��� >A-�p��;�� >J3A-�p��;�� >(fA-�p��; �� >K.A-�q��;�� >WA-�q��;�� >tEA-�q��;�� >9_ A-�q��;�� >ӹA-�r��; �� >yUA-�r��;$�� > 2`A-�r��;(�� >�A-�r��;,�� >yr,@A-�s��;0�� >%gA-�s��;4�� >̣A-�s��;8�� >饎A-�s��;<�� >"2A-�t��;@�� >u<A-�t��;D�� >kaA-�t��;H�� >P/A-�t��;L�� >RA-�u��;P�� >=2A-�u��;T�� >`#A-�u��;X�� >H{1SA-�u��;\�� >�>A-�v��;`�� >W\A-�v��;d�� >oA-�v��;h�� >.VA-�v��;l�� >iA-�w��;p�� >BA-�w��;t�� >~(A-�w��;x�� >2gA-�w��;|�� >sUOA-�x��;�� >'[iA-�x��;�� >XʻA-�x��;�� >]A-�x��;�� >A-�y��;�� >=A-�y��;�� >!A-�y��;�� >lJA-�y��;�� >[-A-�z��;�� >ySA-�z��;�� >eEA-�z��;�� >IA-�z��;�� >KA-�{��;�� >A-�{��;�� >3~ˤA-�{��;�� >AbA-�{��;�� >A-�|��;�� > A-�|��;�� >Lw6A-�|��;�� >~A-�|��;�� >+A-�}��;�� >MەA-�}��;�� >A-�}��;�� >qA-�}��;�� >ՓkA-�~��;�� >юA-�~��;�� >%ǯA-�~��;�� >/[<A-�~��;�� >uA-���;�� >A-���;�� >d+A-���;�� >A-���;�� > A-���;��� >^OA-���;�� >ÏhA-���;�� >A-���; �� >A-���;�� >"//A-���;�� >wA-���;�� >-uA-���;�� >A-���; �� >̠A-���;$�� >toA-���;(�� >A-���;,�� >A-���;0�� >OA-���;4�� >A-���;8�� >;|A-���;<�� >٨A-���;@�� >f_A-���;D�� >wA-���;H�� >s̓A-���;L�� >w!A-���;P�� >e A-���;T�� >wA-���;X�� >BTA-���;\�� >5A-���;`�� > A-���;d�� >>{A-���;h�� >AA-���;l�� >I~A-���;p�� >-%�A-���;t�� >^q A-���;x�� >�h"A-���;|�� >WA-���;�� >6d$A-���;�� > A-���;�� >cUA-���;�� >YA-���;�� >CxA-���;�� >SZA-���;�� >[} A-���;�� >ŹA-���;�� >v&A-���;�� >ϕbA-���;�� >hA-���;�� >AJsNA-���;�� >-GA-���;�� >J{A-���;�� >R�QA-���;�� >)SA-���;�� >?WA-���;�� >ƛA-���;�� >v`+A-���;�� >�tA-���;�� >oA-���;�� >WA-���;�� >kA-���;�� > *A-���;�� >!ecA-���;�� >A-���;�� >.4A-���;�� >dVA-���;�� >]-SA-���;�� >A-���;�� >GA-���;�� >jnA-���;��� >pzKA-���;�� >D)A-���;�� >. uA-���; �� >#&A-���;�� >nA-���;�� >}ߧIA-���;�� >`A-���;�� >fA-���; �� >qA-���;$�� >iA-���;(�� >lRdVA-���;,�� >ឱA-���;0�� >6A-���;4�� >)L uA-���;8�� >@YA-���;<�� >>:A-���;@�� >T?A-���;D�� >eB[A-���;H�� >kA-���;L�� >?A-���;P�� >ҡA-���;T�� >0A-���;X�� >8-MA-���;\�� >]%A-���;`�� > LA-���;d�� >&pA-���;h�� >cA-���;l�� >^A-���;p�� >?kh A-���;t�� >>A-���;x�� ><A-���;|�� >pjkA-���;�� >5hA-���;�� >RA-���;�� >SA-���;�� >7PA-���;�� >>A-���;�� >\A-���;�� >D}A-���;�� >WA-���;�� >7:A-���;�� > PA-���;�� >A-���;�� >�A-���;�� > A-���;�� >t<A-���;�� >Xz%A-���;�� >! A-���;�� >A-���;�� >/|A-���;�� >sG2A-���;�� >G"A-���;�� >:A-���;�� >7A-���;�� >4vA-���;�� >A-���;�� >FaDA-���;�� >A-���;�� >>A-���;�� >AuA-���;�� >8A-���;�� >/;A-���;�� >2A-���;�� >1>A-���;��� >8TNA-���;�� >mOA-���;�� > BoA-���; �� > A-���;�� >,A-���;�� >y|$A-���;�� >ryVA-���;�� >A-���; �� >wA-���;$�� >A-���;(�� >A-���;,�� >.?A-���;0�� >rUA-���;4�� >$qk.A-���;8�� >PA-���;<�� >̈́A-���;@�� >GXzA-���;D�� >tA-���;H�� >A-���;L�� >}KA-���;P�� >:zA-���;T�� >A-���;X�� >fC cA-���;\�� >dA-���;`�� >GA-���;d�� >2A-���;h�� >7;CA-���;l�� >$A-���;p�� >CMA-���;t�� >Qe*A-���;x�� >�PA-���;|�� >:A-���;�� >qA-���;�� >UN1A-���;�� >wA-���;�� >_A-���;�� >V5A-���;�� >kǣA-���;�� >;<A-���;�� > $YA-���;�� >A-���;�� >A-���;�� >,A-���;�� >n<A-���;�� >pEA-���;�� >oA-���;�� > ^A-���;�� >*>ZA-���;�� >wA-���;�� >=NA-���;�� >e)A-���;�� >A-���;�� >։>A-���;�� >%fRA-���;�� >xL.A-���;�� >jA-���;�� >A-���;�� >xA-���;�� >S<A-���;�� >- A-���;�� >NA-���;�� >=+6A-���;�� >&9A-���;�� >`yA-���;��� >#RA-���;�� >A-���;�� >nA-���; �� >fA-���;�� >EA-���;�� >{A-���;�� >7A-���;�� >(A-���; �� >2A-���;$�� >ZlA-���;(�� >!XeA-���;,�� >hA-���;0�� >A-���;4�� >;/A-���;8�� >}*A-���;<�� >/n[A-���;@�� >(!A-���;D�� >pa)A-���;H�� >uGA-���;L�� >aA-���;P�� >0A-���;T�� >aA-���;X�� >4A-���;\�� >cA-���;`�� >\sA-���;d�� >9pLA-���;h�� > A-���;l�� >ުA-���;p�� >A-���;t�� >,b`A-���;x�� >\A-���;|�� >nA-���;�� >dA-���;�� >A-���;�� >i#A-���;�� >PZeA-���;�� >2Zh@A-���;�� >*<A-���;�� >1A-���;�� >!A-���;�� > TA-���;�� >_A-���;�� >~A-���;�� >}=bA-���;�� >7A-���;�� >w-A-���;�� >_A-���;�� >hA-���;�� >)5A-���;�� >A-���;�� >ޖA-���;�� >XxA-���;�� >WA-���;�� >cr"A-���;�� >ÃA-���;�� >FA-���;�� > A-���;�� >T0.SA-���;�� >HُA-���;�� >(1mA-���;�� >XA-���;�� >4A-���;�� >a(A-���;�� >s<|A-���;��� >J]A-���;�� >dA-���;�� >]BA-���; �� >> A-���;�� >EA-���;�� >ꫪA-���;�� >OlA-���;�� >OA-���; �� >BBA-���;$�� >jA-���;(�� >;OeA-���;,�� >!AA-���;0�� >yA-���;4�� >MA-���;8�� >jGKA-���;<�� >Pb=A-���;@�� >bA-���;D�� >F&[A-���;H�� >A-���;L�� >A-���;P�� >$A-���;T�� >tiA-���;X�� > GA-���;\�� >VA-���;`�� >�[ A-���;d�� >HA-���;h�� >tbA-���;l�� >�#A-���;p�� >*BXA-���;t�� >U A-���;x�� >>A-���;|�� >ap?#A-���;�� >r3A-���;�� >A~A-���;�� >_A-���;�� >;"lA-���;�� >Y7|A-���;�� >`tA-���;�� >@A-���;�� >n2wA-���;�� >A-���;�� >PA-���;�� >UA-���;�� >5aA-���;�� >iA-���;�� > A-���;�� >ZA-���;�� > A-���;�� >.zDA-���;�� >4EA-���;�� >gA-���;�� >ɞA-���;�� >sA-���;�� >͈UA-���;�� >y_gA-���;�� >@CgA-���;�� >e4A-���;�� >8>qA-���;�� >(=A-���;�� > mA-���;�� >!>A-���;�� >J=A-���;�� >+A-���;�� >A-���;��� >hZ=A-���;�� >@A-���;�� >&LA-���; �� >4)iA-���;�� > AA-���;�� >vA-���;�� >.kA-���;�� >h�A-���; �� >q$A-���;$�� >j 3A-���;(�� >ԷCA-���;,�� >a�PA-���;0�� >.9A-���;4�� >FE$A-���;8�� >tO!A-���;<�� >@A-���;@�� >MA-���;D�� >A-���;H�� >pA-���;L�� >E/fA-���;P�� > A-���;T�� >A-���;X�� >mA-���;\�� >1A-���;`�� >'A-���;d�� >A9UA-���;h�� >G%A-���;l�� > ʫA-���;p�� >%xP(A-���;t�� >)SA-���;x�� >چ, A-���;|�� >mA-���;�� >bhA-���;�� >�iHA-���;�� >hA-���;�� >'A-���;�� >?OA-���;�� >A-���;�� >A-���;�� >zA-���;�� >|ΪA-���;�� >_7A-���;�� >xA-���;�� >B*k@A-���;�� >5 A-���;�� >A-���;�� >9A-���;�� >N;A-���;�� >A-���;�� >VmKA-���;�� >1f&A-���;�� >A-���;�� >tn:A-���;�� >2C[A-���;�� >AhA-���;�� > xA-���;�� >N A-���;�� >A-���;�� >V@EA-���;�� >'HA-���;�� >::SUA-���;�� > A-���;�� >kA-���;�� >KA-���;� �� >gUA-���; �� >XA-���; �� >c)A-���; �� >3A-���; �� >VJ*A-���; �� >%1?A-���; �� >~^A-���; �� >|1)A-���; �� >A-���;$ �� >p/'A-���;( �� >\A-���;, �� >,(A-���;0 �� >HA-���;4 �� >"mA-���;8 �� >?HA-���;< �� >܆A-���;@ �� >A-���;D �� >AA-���;H �� >yG@A-���;L �� >n]A-���;P �� >Q_2A-���;T �� >A-���;X �� >A-���;\ �� >d5AA-���;` �� >4x{%A-���;d �� >`*`A-���;h �� >A-���;l �� >lcA-���;p �� >´A-���;t �� >2A-���;x �� >OfA-���;| �� >A-���; �� >#kA-���; �� >>3A-���; �� >b $;A-���; �� >"A-���; �� >A-���; �� > A-���; �� > rA-���; �� >(-A-���; �� >ExA-���; �� >A-���; �� >b}dA-���; �� >A-���; �� >oITA-���; �� >H}A-���; �� >'A-���; �� >>A-���; �� >AcG A-���; �� >t.A-���; �� >no:A-���; �� >7A-���; �� >`A-���; �� >A-���; �� >LA-���; �� > knA-���; �� >U{A-���; �� >7,gmA-���; �� >;e'A-���; �� >A-���; �� > )A-���; �� >�A-���; �� >9A-���; �� > iA-���;� �� >{fA-���; �� >}A-���; �� > ϑA-���; �� >^A-���; �� >/A-���; �� >$[QA-���; �� >y{A-���; �� >;vA-���; �� >.97A-���;$ �� >yYA-���;( �� >&A-���;, �� >-1.A-���;0 �� >BhA-���;4 �� >;+jA-���;8 �� >LuA-���;< �� >.xA-���;@ �� >7BjA-���;D �� >QA-���;H �� >满A-���;L �� >PcKA-���;P �� >kA-���;T �� >A-���;X �� >ؽ%=A-���;\ �� >A-���;` �� >YBDA-���;d �� > A-���;h �� >n A-���;l �� >*A-���;p �� >NgdA-���;t �� >_A-���;x �� >鿾A-���;| �� >dA-���; �� >WA-���; �� >A-���; �� >{x`A-���; �� >M``A-���; �� >FA-���; �� >8A-���; �� >EwA-���; �� >6A-���; �� >3kBA-���; �� >qA-���; �� >AA-���; �� >_^�<A-���; �� >WwA-���; �� >$A-���; �� >BFUA-���; �� >a.XA-���; �� >XNA-���; �� >A-���; �� >8tA-���; �� >½A-���; �� >fSA-���; �� >tA-���; �� >UuA-���; �� >FA-���; �� >a&zA-���; �� >A-���; �� >yjA-���; �� >_A-���; �� >YnFA-���; �� >pW A-���; �� >UՌA-���; �� >LA-����;� �� > A-����; �� >A-����; �� >HbA-����; �� >tuA-���; �� >A-���; �� > ܩA-���; �� > -fA-���; �� >3F2A-���; �� >ZA-���;$ �� > A-���;( �� >%JA-���;, �� >nA-���;0 �� >=A-���;4 �� >ߤ A-���;8 �� >A-���;< �� >ih(A-���;@ �� >ڷA-���;D �� >9WA-���;H �� >A-���;L �� >ROA-���;P �� >^PA-���;T �� >A-���;X �� >ĵA-���;\ �� >' A-���;` �� >'A-���;d �� >A?wA-���;h �� >L`A-���;l �� >aA-���;p �� >(zA-���;t �� >A-���;x �� >X`�A-���;| �� >b}0A-���; �� >מA-���; �� >c8#A-���; �� >SA-���; �� >4A-� ��; �� >V˻A-� ��; �� >޶A-� ��; �� >}A-� ��; �� >vYA-� ��; �� > oA-� ��; �� >|KA-� ��; �� >= r9A-� ��; �� >$||A-� ��; �� >_rA-� ��; �� >MrA-� ��; �� >[A-� ��; �� >A-� ��; �� >xUTA-� ��; �� >A-� ��; �� >|=A-� ��; �� >MA-� ��; �� >^PA-� ��; �� >aA-� ��; �� >A-� ��; �� ><QlA-���; �� >oA-���; �� >NVA-���; �� >ο*6A-���; �� >7A-���; �� >42A-���; �� >cA-���; �� >gA-���; �� >�`@A-���;� �� >79:A-���; �� >A-���; �� >7w«A-���; �� >-ZA-���; �� >g\A-���; �� >B7OA-���; �� >@'A-���; �� >A-���; �� >A-���;$ �� >sA-���;( �� >~-A-���;, �� >{�A-���;0 �� >kA-���;4 �� >E!A-���;8 �� >nA-���;< �� >n6jA-���;@ �� >/HWA-���;D �� >ynA-���;H �� >vA-���;L �� >IeA-���;P �� >SA-���;T �� >}ލFA-���;X �� > sA-���;\ �� >MLA-���;` �� >ۻ9)A-���;d �� >PFA-���;h �� >&A-���;l �� >^A-���;p �� >A-���;t �� >Q-jA-���;x �� >cA-���;| �� >"A-���; �� >‰A-���; �� >.$CA-���; �� >A-���; �� >A-���; �� >aA-���; �� >MjA-���; �� >PA-���; �� >[dA-���; �� >&(A-���; �� >::A-���; �� >KA-���; �� >bUA-���; �� >/A-���; �� >RA-���; �� >io?A-���; �� >Y wA-���; �� >A-���; �� >A-���; �� > A-���; �� >>;A-���; �� >ZA-���; �� >4A-���; �� >ٷ,A-���; �� >Q+A-���; �� >:ՖA-���; �� >}}A-���; �� >>A-���; �� >(-}|A-���; �� >%A-���; �� >A-���; �� >rZA-���; �� >LZA-� ��;� �� >q)A-� ��; �� >A-� ��; �� >GA-� ��; �� >A-�!��; �� >A-�!��; �� >W;(A-�!��; �� >)fA-�!��; �� >(.yA-�"��; �� >_xA-�"��;$ �� >U`uA-�"��;( �� >DA-�"��;, �� >^A-�#��;0 �� >mA-�#��;4 �� >mA-�#��;8 �� >%aA-�#��;< �� >dA-�$��;@ �� >A-�$��;D �� >W<A-�$��;H �� >'A-�$��;L �� >*:A-�%��;P �� >m?A-�%��;T �� >!cA-�%��;X �� >fA-�%��;\ �� >&A-�&��;` �� >(3uA-�&��;d �� >UA-�&��;h �� >4VA-�&��;l �� ><A-�'��;p �� >wQ(A-�'��;t �� > A-�'��;x �� >gQ̫A-�'��;| �� >_A-�(��; �� >QMA-�(��; �� >08A-�(��; �� >bX7A-�(��; �� > A-�)��; �� >zA-�)��; �� >{>A-�)��; �� >d!QA-�)��; �� >2OwA-�*��; �� >~㶨A-�*��; �� >F=)A-�*��; �� >iSHA-�*��; �� >dA-�+��; �� >A-�+��; �� >$mA-�+��; �� >-iA-�+��; �� >f! A-�,��; �� > FA-�,��; �� >EdA-�,��; �� >lXA-�,��; �� > A-�-��; �� >[A-�-��; �� >@XA-�-��; �� >A-�-��; �� >kA-�.��; �� >~jA-�.��; �� >EY:A-�.��; �� >D 5>A-�.��; �� >ʹA-�/��; �� >rA-�/��; �� >dA-�/��; �� >fA-�/��; �� >Go<A-�0��;��� >cA-�0��;�� >]/TA-�0��;�� >w®A-�0��; �� >pcNA-�1��;�� > tA-�1��;�� >W[A-�1��;�� >qrA-�1��;�� >]}SA-�2��; �� >@@A-�2��;$�� >NA-�2��;(�� >jF4A-�2��;,�� >A-�3��;0�� >(A-�3��;4�� >:A-�3��;8�� >A-�3��;<�� >HnA-�4��;@�� >;?oA-�4��;D�� > 5A-�4��;H�� >KA-�4��;L�� >'r'A-�5��;P�� >`aA-�5��;T�� >?A-�5��;X�� >+y:A-�5��;\�� >%E4A-�6��;`�� >9A-�6��;d�� >KyQA-�6��;h�� >2/A-�6��;l�� >ɺA-�7��;p�� >~A-�7��;t�� >ǼA-�7��;x�� >A-�7��;|�� >ǪA-�8��;�� >IA-�8��;�� >OA-�8��;�� >A-�8��;�� >8 A-�9��;�� >*9A-�9��;�� >g6A-�9��;�� >|1A-�9��;�� >O+A-�:��;�� >YA-�:��;�� >:CA-�:��;�� >A-�:��;�� >E'A-�;��;�� >,"A-�;��;�� >*A-�;��;�� >qA-�;��;�� >%A-�<��;�� >aA-�<��;�� >뜶A-�<��;�� >YdA-�<��;�� >ѨA-�=��;�� >^A-�=��;�� > jA-�=��;�� >ePA-�=��;�� >BA-�>��;�� >nA-�>��;�� >;ۘA-�>��;�� >LA-�>��;�� >dx2A-�?��;�� >2A-�?��;�� >ߒA-�?��;�� >+4A-�?��;�� >qA-�@��;��� >At A-�@��;�� >4KA-�@��;�� > qA-�@��; �� >2vA-�A��;�� >5A-�A��;�� >./A-�A��;�� >Go A-�A��;�� >A-�B��; �� >TLA-�B��;$�� >A-�B��;(�� >ybA-�B��;,�� >o~>A-�C��;0�� >fA-�C��;4�� >,A-�C��;8�� >ҏA-�C��;<�� >"A-�D��;@�� >W#A-�D��;D�� >#v2A-�D��;H�� >15A-�D��;L�� >VA-�E��;P�� >bA-�E��;T�� >uZA-�E��;X�� >6nA-�E��;\�� >s҈A-�F��;`�� >bA-�F��;d�� >IA-�F��;h�� >PLA-�F��;l�� >VqA-�G��;p�� >A-�G��;t�� > z2A-�G��;x�� >EA-�G��;|�� >{A-�H��;�� >SA-�H��;�� >�bA-�H��;�� >%A-�H��;�� >ҽ5A-�I��;�� >iqA-�I��;�� >"A-�I��;�� >|˶A-�I��;�� >+vA-�J��;�� >>SA-�J��;�� >@A-�J��;�� >`8A-�J��;�� >G%A-�K��;�� > 8A-�K��;�� >vFA-�K��;�� >šwA-�K��;�� >``u A-�L��;�� >N˅A-�L��;�� >؍A-�L��;�� >zA-�L��;�� >~LA-�M��;�� >\HA-�M��;�� >A-�M��;�� >jA-�M��;�� >A-�N��;�� >iԐA-�N��;�� >\A-�N��;�� >-% ?A-�N��;�� >A-�O��;�� >2aNA-�O��;�� >[wA-�O��;�� >ߏWA-�O��;�� >r:A-�O��;���> 0�������5�O�� >H���A5�O�� >���A5�O��> ���AIO����idea.8 1201054008 0 0 664 5852 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<idea.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�>mod��&��>���A~�@x�q�&��@ ~�@y�q�&�����@ w�+�� &�+��AX�+��� ���<w�,�� p�,�����A �,�� w�,�� �,����w�-�� &�-��AX�-������<w�.�� p�.�����A �.�� w�.�� �.����w�/�� w�/��  ~�?.safe�p�/�� ?|�/��?�p�/�� �0�����Aq�0�� p�1��  �1����Aq�1�� w�2�� w�2��  '�2��  L�2���#���<p�2�����A W�2���$���<p�2��A �2�� w�2��  �2�� w�2���2�����2����~�>inv��6��> ���Aq�6��@ w�:�� &�:�����AR�:���1���<w�;�� �;����p�<����Aw�=�� p�=�� p�>��Ap�?�����A W�@���9���<W�@���9���<W�@���M���<&�@�� AO�@���8���<p�A���A����:�A�� �p�A�� p�B�� =�B�� p�B�� �B�� ~�?r2�p�B�� ?p�C�� =�C�� p�C�� �C�� p�D�� p�E��? p�F�� p�G��  W�G���7���<&�I��AP�I���P���< �J����Ap�K�� �K����Aw�K���K�����K����~�>idea_key_setup_decrypt��O��>���A~�@ek�p�O��@p�S��A W�S���\���<W�S���[���<W�S������< �S�����A &�S�� 6���AP�S���Z���<p�T��  ~�? i�p�T��  ? �T��  p�T�� �T��  w�T��`���Q p�T�� S�T���>p�T��@ ~�@ dk�p�T����� @p�T�� ? w�T��q�T�� Up�U��  �U��p�U��  �U�� w�U��d���Pp�U��A �U�� p�U�� a�U�� U q�U�����Pp�V��  �V��p�V��  �V�� w�V��b���Pp�V��A �V�� p�V�� a�V�� U q�V�����Pp�W��  �W��  �W��  w�W��f���Q p�W�� S�W���>p�W��@p�W����� @p�W�� ? a�W�� U q�W�����P&�X�� 0���AP�X������<p�Y��  �Y��p�Y�� �Y�� w�Y��\���Pa�Y�� U q�Y�����Pp�Z��  �Z��p�Z�� �Z�� w�Z��^���Pa�Z�� U q�Z�� ���PW�Z���Y���<�Z����~�= idea_key_setup��`�� = ���A~�@ key�p�`�� @p�`�����@~�? e�p�c�� ?p�e��A W�e������<W�e������<W�e������<C�e��� &�e�� ���AP�e������<s�f�� V�f�����Aa�f�� V s�f�����P �f�� p�f�� q�f�� UW�f������<p�g�����A p�g�����AW�g������<W�g������<W�g������<C�g��� C�g���&�g�� 4���AP�g������<p�h�� �h�����A p�h�� ? w�h�� Q�h�� ���Ap�h�� C�h��� �h�����A p�h�� ? w�h�� R �h�����A �h�� p�h�� q�h�� Up�i�� C�i��� �i�����A&�i��AX�i������< �j�����A ?W�j������<w�l��b���Uq�l�� w�m��d���U q�m�� b���Uw�n��  q�n�� d���Up�o��Sp�o�� �o��h���Ap�o�����S�o���>�o����~�=idea_cipher��s��=(���Ap�s�� @ ~�@text�p�s�����@~�@decrypting�&�z�����@AO�z������<p�z��  �z��h���AW�z������<p�z�� ~�?k�p�z��?p�{��A W�{������<W�{������<W�{������<C�{��� &�{�� ���AP�{������<s�|�� U�|�����Aa�|�� U s�|�����P �|�� ~�?x�q�|�� ?W�|������<p�}��A W�}������<W�}������<W�}���e��<C�}��� &�}�� ���AP�}������<p�~��  �~�����A&�~��AX�~���+��<w���? p��� Sp���  p���  ?a��� Q ���  p���? w��� R p��� ���S����>p���? p��� ? w���q���?a��� R ���  p���  a��� Qw������Ow���? ���  �����A~�?tmp�q���?a��� R ���  a��� Qw������Ow���? ���  �����Aq���?w���? p��� Sa��� R ���  p���  a��� R w������P p��� ���S����>p��� ? p������@w���q���?w���?q���?W����d��<p���  p���  ?a��� Q ���  p���? a��� R w������P p��� Sw���? w���? ���  p��� ���S����>w���q��� w���? w���? ���  w���  q��� ?w���  ���  �����A p��� Sp��� ? a��� Q ���  p���? a��� R w������P p��� ���S����>p��� ? p������@w���q��� w��� w���? ���  �����Aq��� w���?w���  ��� q���?w���?w���  ��� q���?w���?w���  ��� q���?w���?w���  ��� q���?W�������<p���A W����j��<W����i��<W����t��<C���� &��� ���AP����h��<w��� ?������Ao��� Ua��� Uw��� ? ������A o��� ���OW����g��<�����~�=setupIDEAstate����=���A~�@s�p���@p���Sp���A���Sp������Ap������S~�=memset�����=p���@p���Sp������ @p������Sp������Ap������S~�=memmove�����=p������ @p���Sp���@ ������Ap������S���� =~�@ivec�p������@ &��� AO������<p���@ ������Ap���Sp��� ���Sp������Ap������S����=�����I����hmac.8 1201054009 0 0 664 2732 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<hmac.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�>hmac_x����>\��A~�@key�p������@~�@klen�p��� ���@~�@s�p������@ ~�@xlen�&������@���AS�������<p���A�����&���@���AT���� ���<p���A�����&��� AO�������<r������T&���AO�������<W����3���<p���A W�������<W�������<W�������<C���� &��� @���AP�������<~�?pad�o���6���A ?W�������<o���A?p���A W����!���<W���� ���<W����&���<C���� &��� L�������<s���R��� ?W�������<a���? p��� Sp���@���A p��� ���Sp���A���Sp���  ���S~�@x�p������@����p��� &���AX����3���<p���A�����~�@p�p���@ p��� S~�@ len�p������ @ p��� ���Sp���A���Sp���  ���Sp������@����p��� ���@p������@ p���~�@ digest�&������ @AX����B���<p��������p���A W����G���<W����F���<W����K���<C���� &��� @���AP����E���<o���\���A ?W����D���<o���A?p���A W����Q���<W����P���<W����V���<C���� &��� L����O���<s��� R��� ?W����N���<p���ASp���A���S~�? innerdigest�a��� ?p������Sp��� ���Sp������@����a���? p��� Sp���@���A p��� ���Sp���A���Sp���A ���Sp������@����p��� a��� ?p���Sp������@p������Sp������ @p������Sp���  ���Sp������@����p���A����������~�= hmac_sha1���� =$���Ap���@ p��� Sp������ @ p��� ���Sp������@ p��� ���Sp��� ���@ p���  ���Sp������ @ p��� ���Sp������@ p��� ���S~�= sha1�p���=� D p��� ���Sp������A p��� ���S����>����������~�=hmac_md5����=$���Ap���@ p��� Sp������ @ p��� ���Sp������@ p��� ���Sp��� ���@ p���  ���Sp������ @ p��� ���Sp������@ p��� ���S~�=md5�p���=�D p��� ���Sp������A p��� ���S����>����������I����md5.8 1201054009 0 0 664 3828 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<md5.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=md5����=���A~�@s�p��� ���@ &��� AX�������<p������A p��� S~�=malloc�����=&���AX���� ���<p���A�����p��� ���@p���Sp���A���Sp������Ap������S~�=memset�����=p��� ���@ o������A���Rr������R&���AX�������<p���#EgA���Rp���A ���Rp���ܺA���Rp���vT2A���Ro������A���Rp������R&���AO����G���<p������Rp���@���A ��� ~�@len�p������@&��� L����%���<p������@ p������R a��� R ������Ap���S~�@p�p���@p������S~�?i�p��� <?p��� ���S~�=memmove�����=p���<? p��� ���@ ��� ���@ ��� ���R ��� @p������R&���@���AX����G���<p���  ������Ap���Sp������Rp������Sp���  ������Ap������S~�= _md5block����� =p��� ���@ p������R p��� ������A p���  ���R��� ���Qp���A���Rp������@ ���A &��� AO����]���<p���@p���Sp��� <?p��� ���Sp���  ������Ap������S���� =p���<? p��� ���@ p��� p���  ������A p���  ���R��� ���Q��� ���@ ��� @~�@ digest�&������ @AX����n���<&������@AO����l���<p���  ������Ap���Sp���@p������Sp������@p������S����=p��� ���@ p������@ ��� ���Rp��� �����p������R&���AO����u���<p���  ������Ap������R W�������<~�? buf�a���@ ?p���Sp���@p������Sp������@p������S����=p������@ p��� ���@ a���@ ?p���p��� p���A p���  ��� R��� ���Qp���@p���  a���Qp��� &��� 8���AL�������<p���8���A ���  p��� ���@W�������<p���x���A ���  p��� ���@~�? e�p��� 8 ?p��� Sp���A���Sp��� <?p��� ���S����=p��� ���@ p���8 ?o������AOp���<? ������@p���R p������R ��� ����A ������A ~�? x�p���  ?p���R p������R ��� ����A ������A p���  ?p���@ p������@ a��� Qp���Sa��� ?p������Sp������Ap������S~�>encode�����>p���@p���Sp������@ ������Ap������Sp��� ���@ ������Ap������S���� =p��� ���@ p������@p���A p���  ���Q��� ���Qp������ @p���Sp���  ������Ap������Sp������Ap������S����>p��� ���@ r������P&������AX�������<p���� S~�=free������=p���A����������� ��> ���A~�@input�p� �����@ ~�@output�p� ��@ p������@ a��� Qp���W�������<W�������<W�������<&��� L�������<p���  ������A p���O p��� C���� o��� Op��� ������Ap���  C���� o���Pp��� ������Ap���  C���� o���Pp��� ������Ap���  C���� o���PW�������<�����I����md4.8 1201054010 0 0 664 7384 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<md4.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�>tab�-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���; ���> ���A-���; ���>���A-���; ���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���> ���A-���;���>���A-���;���>���A-���; ���>���A-���;!���>���A-���;$���> ���A-���;%���>���A-���;(���> ���A-���;)���> ���A-���;,���> ���A-���;-���>���A-���;0���> ���A-���;1���>���A-���;4���> ���A-���;5���>���A-���;8���>���A-���;9���> ���A-���;<���>���A-���;=���>���A-���;A���>���A-���;D���>���A-���;E���>���A-���;H���>���A-���;I���> ���A-���;L���> ���A-���;M���> ���A-���;P���>���A-���;Q���>���A-���;T���>���A-���;U���>���A-���;X���> ���A-���;Y���> ���A-���;\���> ���A-���;]���> ���A-���;`���>���A-���;a���>���A-���;d���>���A-���;e���>���A-���;h���> ���A-���;i���> ���A-���;l���>���A-���;m���> ���A-���;p���>���A-���;q���>���A-���;t���>���A-���;u���>���A-���;x���> ���A-���;y���> ���A-���;|���>���A-���;}���> ���A-���;���>���A-���;���>���A-���;���> ���A-���;���>���A-���;���> ���A-���;���> ���A-���;���>���A-���;���>���A-���;���>���A-���;���> ���A-���;���> ���A-���;���>���A-���;���> ���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���> ���A-���;���> ���A-���;���>���A-���;���> ���A-���;���> ���A-���;���>���A-���;���>���A-���;���>���A-���;���> ���A-���;���> ���A-���;���>���A-���;���> ���A-���;���>���A-���;���>���A~�>md4block����>t���A~�@p�p���@ ~�@len�p������@ a��� Q~�?end�p���?W���� ���<W�������<W����q���< ���@���A@p���@&���?L�������<~�@s�p������@p������O~�?a�p���?p������@p��� ���O~�?b�p���?p������@p������O~�? c�p��� ?p������@p������O~�? d�p��� ?~�? x�a��� ?p���Sp���@p������Sp���@���Ap������S~�> decode����� >p��� ?p���?p���? ~�? i�p���A ?W����'���<W����&���<W����b���<C���� ?&��� ?0���AP����%���<p��� ? a��� >p��� W�����G���<W�����P���<p���  ��� ?p���  ���� ��� ���  ���W����-���<p���  ��� ?p���  ��� ��� p��� ? ��� ���  ���yZA ���W����-���<p��� ��� ?��� ���nA ���W����-���<p��� ?������A&���AO����.���<&������AO����6���<&������AO����A���<W����-���<s���Q p���  ? ���s������Q p������ s������Q p��� ���A ���  p���  p��� ���  ��� p���p��� ?p���  ?p��� W� ���$���<p� �����@ � �����Op� �����@ � ��  ���Op������@p��� ? ��� ���Op������@ ������Op������@p���@���A p���A ��� O��� ���OW�������<�����~�=md4����=���Ap��� ���@ &��� AX�������<p������A p��� S~�=malloc�����=&���AX����}���<p� ��A� ����p�!�� ���@p�!��Sp�!��A���Sp�!�����Ap�!�����S~�=memset��!���=p�!�� ���@ o�"�����A���Rr�%�����R&�%��AX�%������<p�'��#EgA���Rp�(��A ���Rp�)��ܺA���Rp�*��vT2A���Ro�+�����A���Rp�/�����R&�/��AO�/������<p�0�����Rp�0��@���A �0�� p�1�����@&�1�� L�1������<p�2�����@ p�3�����R a�3�� R �3�����Ap�3��Sp�3��@p�3�����Sp�3�� < ?p�3�� ���S~�=memmove��3���=p�3��< ? p�3�� ���@ �4�� ���@ �5�� ���R �6�� @p�7�����R&�7��@���AX�7������<p�8��  �8�����Ap�8��Sp�8�����Rp�8�����Sp�8�� ���S�8���>p�8�� ���@ p�9��A���Rp�>�����@ �>��A &�?�� AO�?������<p�@��@p�@��Sp�@�� < ?p�@�� ���Sp�@�� ���S�@���>p�@��< ? p�@�� ���@ �A�� ���@ �B�� @~�@digest�&�F�����@AX�F������<&�G�����@AO�G������<p�H��  �H�����Ap�H��Sp�H��@p�H�����Sp�H�����@p�H�����S�H���=p�H�� ���@ p�I�����@ �I�� ���Rp�K�� �K����p�R�����R&�R��AO�R������<p�S��  �S�����Ap�T�����R W�T������<~�?buf�a�V��@?p�V��Sp�V��@p�V�����Sp�V�����@p�V�����S�V���=p�V�����@ p�V�� ���@ a�W��@?p�W��p�Y�� p�Y��A p�Y��  �Y�� R�Y�� ���Qp�Z��@p�Z��  a�Z��Qp�Z�� &�[�� 8���AL�[������<p�\��8���A �\��  p�\�� ���@W�\������<p�^��x���A �^��  p�^�� ���@~�?e�p�_�� 8?p�_�� Sp�_��A���Sp�_�� < ?p�_�� ���S�_���=p�_�� ���@ p�`��8?o�`�����AOp�a��< ? �a�����@p�d��R p�d�����R �d�� ����A �d�����A p�d��  ?p�e��R p�e�����R �e�� ����A �e�����A p�e��  ?p�f��@ p�f�����@ a�f�� Qp�f��Sa�f�� ?p�f�����Sp�f�����Ap�f�����S~�>encode��f���>p�i��@p�i��Sp�i�����@ �i�����Ap�i�����Sp�i�� ���@p�i�����S�i���>p�l�����@p�l��Sp�l�� ���@ �l�����Ap�l�����Sp�l�����Ap�l�����S�l���>p�l�� ���@ r�m�����P&�m�����AX�m���(��<p�n�� S~�=free��n���=p�o��A�o�����o�����w��> ���A~�@input�p�w�����@ ~�@output�p�w��@ p�|�����@ a�|�� Qp�|��W�|���4��<W�|���4��<W�|���L��<&�|�� L�|���3��<p�}��  �}�����A p�}��O p�~�� C�~��� o�~�� Op��� ������Ap���  C���� o���Pp��� ������Ap���  C���� o���Pp��� ������Ap���  C���� o���PW����2��<�������� >���Ap���@ p������@ p������@ a��� Qp��� W����W��<W����V��<W����h��< ������A &���  L����U��<s������R������As���R ��� p��� s������R ������A ��� s������R ������A ��� p���  ������A p���PW����T��<�����5���>���AI����sha1.8 1201054011 0 0 664 3863 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<sha1.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=sha1����=���A~�@s�p��� ���@ &��� AX�������<p������A p��� S~�=malloc�����=&���AX���� ���<p���A�����p��� ���@p���Sp���A���Sp������Ap������S~�=memset�����=p��� ���@ o������A���Rr������R&���AX�������<p���#EgA���Rp���A ���Rp���ܺA���Rp���vT2A���Rp���A���Ro������A���Rp������R&���AO����H���<p������Rp���@���A ��� ~�@len�p������@&��� L����&���<p������@ p������R a��� R ������Ap���S~�@p�p���@p������S~�?i�p��� <?p��� ���S~�=memmove�����=p���<? p��� ���@ ��� ���@ ��� ���R ��� @p������R&���@���AX����H���<p���  ������Ap���Sp������Rp������Sp���  ������Ap������S~�= _sha1block����� =p��� ���@ p������R p��� ������A p���  ���R��� ���Qp���A���Rp������@ ���A &��� AO����^���<p���@p���Sp��� <?p��� ���Sp���  ������Ap������S���� =p���<? p��� ���@ p��� p���  ������A p���  ���R��� ���Q��� ���@ ��� @~�@ digest�&������ @AX����o���<&������@AO����m���<p���  ������Ap���Sp���@p������Sp������@p������S����=p��� ���@ p������@ ��� ���Rp��� �����p������R&���AO����v���<p���  ������Ap������R W�������<~�? buf�a��� ?p���Sp���@p������Sp������@p������S����=p������@ p��� ���@ a��� ?p���p��� p���A p���  ��� R��� ���Qp���@p���  a���Qp��� &��� 8���AL�������<p���8���A ���  p��� ���@W�������<p���x���A ���  p��� ���@~�? e�p��� 8 ?p��� Sp���A���Sp��� <?p��� ���S����=p��� ���@ p���8 ?o������AOp���<? ������@p���R p������R ��� ����A ������A ~�? x�p��� @ ?p���R p������R ��� ����A ������A p��� D ?p���@ p������@ a��� Qp���Sa���@ ?p������Sp������Ap������S~�>encode�����>p���@p���Sp������@ ������Ap������Sp��� ���@ ������Ap������S���� =p��� ���@ p������@ ������Ap���A p���  ���Q��� ���Qp������ @p���Sp���  ������Ap������Sp������Ap������S����>p��� ���@ r������P&������AX�������<p��� S~�=free�����=p���A�������������> ���A~�@input�p������@ ~�@output�p���@ p������@ a��� Qp���W�������<W�������<W�������<&��� L�������<p���  ������A p���O p��� ������Ap���  C���� o���Pp��� ������Ap���  C���� o���Pp��� ������Ap���  C���� o���Pp��� C���� o��� OW�������<�����I����sha1pickle.8 1201054011 0 0 664 2493 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<sha1pickle.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=sha1pickle����=0���A~�@s�p���@ p������P ������A p���VUUUA=��� �p��� ������A���A ��� p��� ������A ���-���A~�?m�p���?p���S~�=malloc�����=p���@ &���AX�������<�����~�>.string�-���;> %8.8ux %-���;���> 8.8ux %8-���;���> .8ux %8.-���;���> 8ux %8.8~�?p�p���?p���Sp���>�D p��� ���Sp������Q p��� ���Sp��� ���Q p���  ���Sp������Q p��� ���Sp������Q p��� ���Sp������Q p��� ���S~�=sprint�����=p���@ p��� p���? a��� Op���Sp���?��� p������Sp���  ������Ap������Sp������Tp��� ���S~�=enc64�����=p���?����������~�= sha1unpickle���� = ���Ap������A p��� S����=&���A~�? s�p��� ?X����=���<p���A�����~�@ p�p��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S~�= strtoul����� =p��� ? p������Pp��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S���� =p��� ? p��� ���Pp��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S���� =p��� ? p������Pp��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S���� =p��� ? p������Pp��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S���� =p��� ? p������Pp��� @ p��� S~�= strlen����� =~�?.safe�p���?p��� ? ������A p��� Sp������A p��� ���Sp��� @ p��� ���Sp���? p���  ���S~�=dec64�����=p��� ? p������Qo������A���Qo������A���Qp��� ����������-���; ���> ux �����5���>(���AI����md5pickle.8 1201054012 0 0 664 2512 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<md5pickle.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=md5pickle����=4���A~�@s�p���@ p������P ������A p���VUUUA=��� �p��� ������A���A ��� p��� ������A ���9���A~�?m�p���?p���S~�=malloc�����=p���@ &���AX�������<�����~�>.string�-���;> %16.16ll-���;���> ux %8.8u-���;���> x %8.8ux-���;���> %8.8ux -���; ���> %8.8ux �~�?p�p���?p���Sp���>�D p��� ���Sp���R p��� ���Sp������R p���  ���Sp������R p��� ���Sp��� ���R p��� ���Sp������R p��� ���Sp������R p��� ���S~�=sprint�����=p���@ p��� p���? a��� Op���Sp���?��� p������Sp���  ������Ap������Sp������Tp��� ���S~�=enc64�����=p���?����������~�= md5unpickle���� = ���Ap������A p��� S����=&���AX����>���<p���A�����~�? s�p��� ?p���S~�@ p�p��� @p������Sa��� @p������Sp������Ap��� ���S~�= strtoull����� =p��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S~�= strtoul����� =p��� ? p������Pp��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S���� =p��� ? p��� ���Pp��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S���� =p��� ? p������Pp��� @ p��� Sa��� @ p��� ���Sp������A p��� ���S���� =p��� ? p������Pp��� @ p��� S~�=strlen�����=~�?.safe�p���?p��� ? ������A p��� Sp������A p��� ���Sp��� @ p��� ���Sp���? p���  ���S~�=dec64�����=p��� ? p������Qo������A���Qo������A���Qp��� ����������5���>(���AI����rc4.8 1201054012 0 0 664 2714 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<rc4.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=setupRC4state����= ���A~�@key�p���@ ~�?state�p��� ?p���? ������A~�?se�p���?p���? W���� ���<W���� ���<W�������<C���� &��� ?L���� ���<p���  ���? o��� QW�������<o���A���Ro���A��Rp���A~�@start�p������@ ~�@n�p������@ a��� Q~�?e�p���?p������@ p���?W�������<W�������<W����2���<C����&���?L�������<s���V~�?t�p���?s���T ��� ���? ������Ap���p���? s��� O o��� Vp���?p���? o��� UC���� &��� ?M����1���<p������@ W�������<�����~�= rc4���� =���Ap���@s������Vp���@s�����Up���@ ~�@ p�p������ @ ~�@ len�p������ @ a��� Qp���?W����A���<W����@���<W����V���<C������� @p������ @&���?L����?���<C���� ������As��� Vp��� ��� ������As��� U~�? ty�p��� ?p��� ?o��� Vo���  Up������ @ ��� ? ������A p���  s��� R ��� OW����>���<p���@o������Op���@o�����O�����~�= rc4skip���� =���Ap���@ s������T p���@ s�����R p���@~�?i�p���A?W����f���<W����e���<W����t���<C����?p���?&������ @P����d���<C���� ������A p���  s���Qp��� ��� ������A s���Ro���Qo���RW����c���<p���@o��� ���Op���@o��� ��O�����~�=rc4back����=���Ap���@ s������T p���@ s�����R p���@p���A?W�������<W�������<W�������<C����?p���?&������ @P�������<p���  s���Qp��� ?s���Rp���p��� ?o���Rp���  o���Q��� ������A /���� ������A W�������<p���@o��� ���Op���@o��� ��O�����I����genrandom.8 1201054013 0 0 664 2604 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<genrandom.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<kernel.h�7�����7�E����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�F����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�F����7�����~�>X917��O��>0���A~�?I�a�U��?p�U��S~�=nsec��U���=~�>x917state�p�V��>�(���Dp�V��Sa�V��?p�V�����Sp�V��A���S~�=triple_block_cipher��V���=~�@nrand�p�Y�����@ �Y�����A�Y���� �Y�����A �Y�� �Y�����A~�?m�p�Y��?p�Z��A W�Z������<W�Z������<W�Z���F���<C�Z��� ~�?i�p�Z�� ?&�Z�� ?P�Z������<a�[�����>p�[��? �[��O p�[��? �[�����O ~�? x�p�[��  ?p�[��  ?p�\��>�(���Dp�\��Sa�\�� ?p�\�����Sp�\��A���S�\���=p�\�����@ &�]�� ���AS�]���+���<p�]�����AW�]���,���<p�]�� p�]�� ~�@ rand�p�^�� @p�^��Sa�^�� ?p�^�����Sp�^�� ���S~�= memcpy��^��� = �_�����A @�`�����A���@p�a��?�a�� ?p�a��?�a�� ?p�b��>�(���Dp�b��Sa�b�� ?p�b�����Sp�b��A���S�b���=p�b��? a�c�����> p�c�� ?p�c��Pp�c�� ?p�c�����PW�c������<�c����~�> X917init��h�� >���A~�? key3�a�o��d ?~�?ulp�p�o��`?p�p��A W�p���O���<W�p���N���<W�p���W���<C�p��� &�p�� ���A~�?n�p�p�� ?P�p���M���<~�=truerand��q���=p�q��? p�q��`? p�q�� QW�q���L���<p�r��>� ���Dp�r��Sa�r��d ?p�r�����Sp�r��A���S~�=setupDES3state��r���=~�?mix�a�s��|?p�s��Sp�s�����Ap�s�����S�s���>p�t�����A>�t����~�=genrandom��x��= ���A~�=_genrandomqlock��z���=&�{��>AX�{���i���<�|��� >~�@p�p�}��@p�}��S~�@n�p�}�����@p�}�����S�}���>~�=_genrandomqunlock��~���=�~����5�~��>��AI~����prng.8 1201054014 0 0 664 992 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<prng.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=prng����=���A~�@p�p���@ ~�@n�p������@ a��� Q~�?e�p���?W���� ���<W�������<W�������<C���� p��� @&��� ?L�������<~�=rand�����=p���@ o���RW�������<�����I����fastrand.8 1201054014 0 0 664 773 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<fastrand.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=fastrand����=���A~�?x�a���?p���Sp������Ap������S~�=genrandom�����=p���?����������I����nfastrand.8 1201054015 0 0 664 1064 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<nfastrand.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=nfastrand����=���A~�@n�&���@AT�������<~�>.string�-���;> nfastran-���;���> d: n toop���>�Dp���S~�=sysfatal�����=p���Ap���A 2���@�p���A ���  ~�?m�p��� ?W�������<W�������<W�������<~�=fastrand�����=&���?M�������<W���� ���<p���A 2���@�p��� ����������-���;���> large��5���>���AI����probably_prime.81201054015 0 0 664 3757 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<probably_prime.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�d����~�=probably_prime����=@���A~�?isprime�p������A?~�@n�p���@p���O&���AP���� ���<~�>.string�-���;> negative-���;���> prime c-���;���> andidatep���>�Dp���S~�=sysfatal�����=~�@nrep�&�!�����@AQ�!��� ���<p�"�����A���@p�$��@ p�$�� S~�=mptoi��$���=p�$��@ &�%�����AX�%������<p�&�����A�&����&�'�����AP�'������<p�(��A�(����p�)�� ���Qp�)��O �)�����A&�)��AX�)������<p�*��A�*����p�-�� S~�=smallprimetest��-���=&�-��AP�-���%���<p�.��A�.����p�1�����A p�1�� Sp�1��A���S~�= uitomp��1��� =~�? x�p�1�� ?p�2��AS~�= mpnew��2��� =p�2��@ p�2�� p�3�� ?p�3��Sp�3�� ���Sp�3�� ���S~�? y�p�3��  ?p�3��  ���S~�= mpexp��3��� =p�4�� ? p�4�� S�4���=&�5�����AO�5���B���<p�6�� ?p�6��S~�=mpfree��6���=p�7�� ?p�7��S�7���=p�8��A�8����p�;��@ p�;�� S~�=mpsignif��;���=~�?nbits�p�<��?p�<��S�<��� =p�<�� p�=��@p�=��S~�=mpone�p�=��=p�=�����S~�?nm1�p�=�� ?p�=�� ���S~�=mpsub��=���=p�>��? p�>�� S~�=mplowbits0��>���=~�?k�p�>��?p�?��AS�?��� =p�?�� p�@��?p�@��Sp�@��?p�@�����S~�?q�p�@�� ?p�@�� ���S~�=mpright��@���=p�@�� ? ~�?rep�p�B��A?W�B���d���<W�B���c���<W�B������<C�B���?p�B��?&�B�����@P�B���b���<p�E��? p�E�� S~�=prng�p�E��=�D p�E�� ���Sp�E��A���S~�=mprand��E���=~�?r�p�F��?p�F��Sp�F��?p�F�����Sp�F�� ?p�F�����S~�=mpmod��F���=p�G��?p�G��S�G���=p�H�� ? p�H�� Sp�H��= p�H�� ���S~�=mpcmp��H���=p�H�� ? &�H��AQ�H������<W�I���a���<p�L�� ?p�L��Sp�L��?p�L�����Sp�L��@p�L�����Sp�L��  ���S�L��� =p�N�� ? p�N�� Sp�N��= p�N�� ���S�N���=p�N�� ? &�N��AO�N������<p�N�� Sp�N��? p�N�� ���S�N���=p�N�� ? &�N��AO�N������<W�N������<W�O������<p�Q�����A W�Q������<W�Q������<W�Q������<C�Q��� ~�?j�p�Q�� ?&�Q�� ?P�Q������<p�R�� Sp�R�� ���Sp�R�� ?p�R�����S~�=mpmul��R���=p�S�� ?p�S��Sp�S��@p�S�����Sp�S�� ?p�S�����S�S���=p�T�� ? p�T�� Sp�T��? p�T�� ���S�T���=p�T�� ? &�T��AX�T������<W�U������<p�V�� Sp�V��= p�V�� ���S�V���=p�V�� ? p�V��? &�V��AX�V������<p�W��A?W�X������<W�X������<p�[��A?W�[���a���<W�O������<p�^�� S�^���=p�_�� ?p�_��S�_���=p�`��?p�`��S�`���=p�a��?p�a��S�a���=p�b��?�b�����b����-�b��;���> ��������5�b��> ���AIb����smallprimetest.81201054017 0 0 664 211769 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<smallprimetest.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7� ����~�>smallprimes�-���;>���A-���;���>���A-���;���>���A-���; ���>���A-���;���> ���A-���;���> ���A-���;���>���A-���;���>���A-���; ���>���A-���;$���>���A-���;(���>���A-���;,���>%���A-���;0���>)���A-���;4���>+���A-���;8���>/���A-���;<���>5���A-���;@���>;���A-���;D���>=���A-���;H���>C���A-���;L���>G���A-���;P���>I���A-���;T���>O���A-���;X���>S���A-���;\���>Y���A-���;`���>a���A-���;d���>e���A-���;h���>g���A-���;l���>k���A-���;p���>m���A-���;t���>q���A-���;x���>���A-���;|���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>���A-���;���>��A-���;���>��A-���;���> ��A-���;���>��A-���;���>��A-���;���>��A-���;���>��A-���;���>%��A-���;���>3��A-���;���>7��A-���;���>9��A-���;��>=��A-���;��>K��A-���; ��>Q��A-���;��>[��A-���;��>]��A-���;��>a��A-���;��>g��A-���; ��>o��A-���;$��>u��A-���;(��>{��A-���;,��>��A-���;0��>��A-���;4��>��A-���;8��>��A-���;<��>��A-���;@��>��A-���;D��>��A-���;H��>��A-���;L��>��A-���;P��>��A-���;T��>��A-���;X��>��A-���;\��>��A-���;`��>��A-���;d��>��A-���;h��>��A-���;l��>��A-���;p��>��A-���;t��>��A-���;x��>��A-���;|��>��A-���;��>��A-���;��> ��A-���;��> ��A-���;��>��A-���;��>#��A-���;��>-��A-���;��>3��A-���;��>9��A-���;��>;��A-���;��>A��A-���;��>K��A-���;��>Q��A-���;��>W��A-���;��>Y��A-� ��;��>_��A-� ��;��>e��A-� ��;��>i��A-� ��;��>k��A-� ��;��>w��A-� ��;��>��A-� ��;��>��A-� ��;��>��A-� ��;��>��A-� ��;��>��A-�!��;��>��A-�!��;��>��A-�!��;��>��A-�!��;��>��A-�!��;��>��A-�!��;��>��A-�!��;��>��A-�!��;��>��A-�!��;���>��A-�!��;��>��A-�"��;��>��A-�"��; ��>��A-�"��;��>��A-�"��;��>��A-�"��;��>��A-�"��;��>��A-�"��; ��>��A-�"��;$��>��A-�"��;(��>��A-�"��;,��>)��A-�#��;0��>+��A-�#��;4��>5��A-�#��;8��>7��A-�#��;<��>;��A-�#��;@��>=��A-�#��;D��>G��A-�#��;H��>U��A-�#��;L��>Y��A-�#��;P��>[��A-�#��;T��>_��A-�$��;X��>m��A-�$��;\��>q��A-�$��;`��>s��A-�$��;d��>w��A-�$��;h��>��A-�$��;l��>��A-�$��;p��>��A-�$��;t��>��A-�$��;x��>��A-�$��;|��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�%��;��>��A-�&��;��>��A-�&��;��>��A-�&��;��>��A-�&��;��> ��A-�&��;��>��A-�&��;��>��A-�&��;��>��A-�&��;��>%��A-�&��;��>'��A-�&��;��>-��A-�'��;��>?��A-�'��;��>C��A-�'��;��>E��A-�'��;��>I��A-�'��;��>O��A-�'��;��>U��A-�'��;��>]��A-�'��;��>c��A-�'��;��>i��A-�'��;��>��A-�(��;��>��A-�(��;��>��A-�(��;���>��A-�(��;��>��A-�(��;��>��A-�(��; ��>��A-�(��;��>��A-�(��;��>��A-�(��;��>��A-�(��;��>��A-�)��; ��>��A-�)��;$��>��A-�)��;(��>��A-�)��;,��>��A-�)��;0��>��A-�)��;4��>��A-�)��;8��>��A-�)��;<��>��A-�)��;@��> ��A-�)��;D��> ��A-�*��;H��>��A-�*��;L��>��A-�*��;P��>��A-�*��;T��>��A-�*��;X��>'��A-�*��;\��>)��A-�*��;`��>/��A-�*��;d��>Q��A-�*��;h��>W��A-�*��;l��>]��A-�+��;p��>e��A-�+��;t��>w��A-�+��;x��>��A-�+��;|��>��A-�+��;��>��A-�+��;��>��A-�+��;��>��A-�+��;��>��A-�+��;��>��A-�+��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�,��;��>��A-�-��;��>��A-�-��;��>��A-�-��;��>��A-�-��;��> ��A-�-��;��>��A-�-��;��>��A-�-��;��>��A-�-��;��>#��A-�-��;��>+��A-�-��;��>/��A-�.��;��>=��A-�.��;��>A��A-�.��;��>G��A-�.��;��>I��A-�.��;��>M��A-�.��;��>S��A-�.��;���>U��A-�.��;��>[��A-�.��;��>e��A-�.��; ��>y��A-�/��;��>��A-�/��;��>��A-�/��;��>��A-�/��;��>��A-�/��; ��>��A-�/��;$��>��A-�/��;(��>��A-�/��;,��>��A-�/��;0��>��A-�/��;4��>��A-�0��;8��>��A-�0��;<��>��A-�0��;@��>��A-�0��;D��>��A-�0��;H��>��A-�0��;L��>��A-�0��;P��>��A-�0��;T��>��A-�0��;X��> ��A-�0��;\��>��A-�1��;`��>��A-�1��;d��>'��A-�1��;h��>7��A-�1��;l��>E��A-�1��;p��>K��A-�1��;t��>O��A-�1��;x��>Q��A-�1��;|��>U��A-�1��;��>W��A-�1��;��>a��A-�2��;��>m��A-�2��;��>s��A-�2��;��>y��A-�2��;��>��A-�2��;��>��A-�2��;��>��A-�2��;��>��A-�2��;��>��A-�2��;��>��A-�2��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�3��;��>��A-�4��;��>��A-�4��;��>��A-�4��;��>!��A-�4��;��>#��A-�4��;��>'��A-�4��;��>)��A-�4��;��>3��A-�4��;��>?��A-�4��;��>A��A-�4��;��>Q��A-�5��;���>S��A-�5��;��>Y��A-�5��;��>]��A-�5��; ��>_��A-�5��;��>i��A-�5��;��>q��A-�5��;��>��A-�5��;��>��A-�5��; ��>��A-�5��;$��>��A-�6��;(��>��A-�6��;,��>��A-�6��;0��>��A-�6��;4��>��A-�6��;8��>��A-�6��;<��>��A-�6��;@��>��A-�6��;D��>��A-�6��;H��>��A-�6��;L��>��A-�7��;P��>��A-�7��;T��>��A-�7��;X��> ��A-�7��;\��> ��A-�7��;`��> ��A-�7��;d��># ��A-�7��;h��>% ��A-�7��;l��>+ ��A-�7��;p��>/ ��A-�7��;t��>5 ��A-�8��;x��>C ��A-�8��;|��>I ��A-�8��;��>M ��A-�8��;��>O ��A-�8��;��>U ��A-�8��;��>Y ��A-�8��;��>_ ��A-�8��;��>k ��A-�8��;��>q ��A-�8��;��>w ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�9��;��> ��A-�:��;��> ��A-�:��;��> ��A-�:��;��> ��A-�:��;��> ��A-�:��;��> ��A-�:��;��> ��A-�:��;��> ��A-�:��;��>! ��A-�:��;��>1 ��A-�:��;��>9 ��A-�;��;��>= ��A-�;��;��>I ��A-�;��;��>W ��A-�;��;��>a ��A-�;��;���>c ��A-�;��;��>g ��A-�;��;��>o ��A-�;��; ��>u ��A-�;��;��>{ ��A-�;��;��> ��A-�<��;��> ��A-�<��;��> ��A-�<��; ��> ��A-�<��;$��> ��A-�<��;(��> ��A-�<��;,��> ��A-�<��;0��> ��A-�<��;4��> ��A-�<��;8��> ��A-�<��;<��> ��A-�=��;@��> ��A-�=��;D��> ��A-�=��;H��> ��A-�=��;L��> ��A-�=��;P��> ��A-�=��;T��> ��A-�=��;X��> ��A-�=��;\��> ��A-�=��;`��> ��A-�=��;d��> ��A-�>��;h��> ��A-�>��;l��> ��A-�>��;p��> ��A-�>��;t��># ��A-�>��;x��>) ��A-�>��;|��>- ��A-�>��;��>? ��A-�>��;��>G ��A-�>��;��>Q ��A-�>��;��>W ��A-�?��;��>] ��A-�?��;��>e ��A-�?��;��>o ��A-�?��;��>{ ��A-�?��;��> ��A-�?��;��> ��A-�?��;��> ��A-�?��;��> ��A-�?��;��> ��A-�?��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�@��;��> ��A-�A��;��> ��A-�A��;��> ��A-�A��;��>% ��A-�A��;��>/ ��A-�A��;��>1 ��A-�A��;��>A ��A-�A��;��>[ ��A-�A��;��>_ ��A-�A��;���>a ��A-�A��;��>m ��A-�B��;��>s ��A-�B��; ��>w ��A-�B��;��> ��A-�B��;��> ��A-�B��;��> ��A-�B��;��> ��A-�B��; ��> ��A-�B��;$��> ��A-�B��;(��> ��A-�B��;,��> ��A-�C��;0��> ��A-�C��;4��> ��A-�C��;8��> ��A-�C��;<��> ��A-�C��;@��> ��A-�C��;D��> ��A-�C��;H��> ��A-�C��;L��> ��A-�C��;P��> ��A-�C��;T��> ��A-�D��;X��> ��A-�D��;\��> ��A-�D��;`��> ��A-�D��;d��>! ��A-�D��;h��>+ ��A-�D��;l��>- ��A-�D��;p��>= ��A-�D��;t��>? ��A-�D��;x��>O ��A-�D��;|��>U ��A-�E��;��>i ��A-�E��;��>y ��A-�E��;��> ��A-�E��;��> ��A-�E��;��> ��A-�E��;��> ��A-�E��;��> ��A-�E��;��> ��A-�E��;��> ��A-�E��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�F��;��> ��A-�G��;��> ��A-�G��;��> ��A-�G��;��> ��A-�G��;��>��A-�G��;��>��A-�G��;��>!��A-�G��;��>'��A-�G��;��>/��A-�G��;��>5��A-�G��;��>;��A-�H��;��>K��A-�H��;��>W��A-�H��;���>Y��A-�H��;��>]��A-�H��;��>k��A-�H��; ��>q��A-�H��;��>u��A-�H��;��>}��A-�H��;��>��A-�H��;��>��A-�I��; ��>��A-�I��;$��>��A-�I��;(��>��A-�I��;,��>��A-�I��;0��>��A-�I��;4��>��A-�I��;8��>��A-�I��;<��>��A-�I��;@��>��A-�I��;D��>��A-�J��;H��>��A-�J��;L��>��A-�J��;P��>��A-�J��;T��> ��A-�J��;X��> ��A-�J��;\��>��A-�J��;`��>%��A-�J��;d��>)��A-�J��;h��>1��A-�J��;l��>C��A-�K��;p��>G��A-�K��;t��>M��A-�K��;x��>O��A-�K��;|��>S��A-�K��;��>Y��A-�K��;��>[��A-�K��;��>g��A-�K��;��>k��A-�K��;��>��A-�K��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�L��;��>��A-�M��;��>��A-�M��;��>��A-�M��;��>��A-�M��;��>��A-�M��;��>��A-�M��;��>��A-�M��;��>��A-�M��;��>!��A-�M��;��>%��A-�M��;��>+��A-�N��;��>9��A-�N��;��>=��A-�N��;��>?��A-�N��;��>Q��A-�N��;��>i��A-�N��;��>s��A-�N��;� ��>y��A-�N��; ��>{��A-�N��; ��>��A-�N��; ��>��A-�O��; ��>��A-�O��; ��>��A-�O��; ��>��A-�O��; ��>��A-�O��; ��>��A-�O��;$ ��>��A-�O��;( ��>��A-�O��;, ��>��A-�O��;0 ��>��A-�O��;4 ��>��A-�P��;8 ��>��A-�P��;< ��>��A-�P��;@ ��>��A-�P��;D ��>��A-�P��;H ��>��A-�P��;L ��> ��A-�P��;P ��>��A-�P��;T ��>'��A-�P��;X ��>-��A-�P��;\ ��>9��A-�Q��;` ��>E��A-�Q��;d ��>G��A-�Q��;h ��>Y��A-�Q��;l ��>_��A-�Q��;p ��>c��A-�Q��;t ��>i��A-�Q��;x ��>o��A-�Q��;| ��>��A-�Q��; ��>��A-�Q��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�R��; ��>��A-�S��; ��>��A-�S��; ��>��A-�S��; ��>��A-�S��; ��> ��A-�S��; ��>��A-�S��; ��>��A-�S��; ��>#��A-�S��; ��>)��A-�S��; ��>+��A-�S��; ��>1��A-�T��; ��>7��A-�T��; ��>A��A-�T��; ��>G��A-�T��; ��>S��A-�T��; ��>_��A-�T��; ��>q��A-�T��; ��>s��A-�T��; ��>y��A-�T��; ��>}��A-�T��; ��>��A-�U��;� ��>��A-�U��; ��>��A-�U��; ��>��A-�U��; ��>��A-�U��; ��>��A-�U��; ��>��A-�U��; ��>��A-�U��; ��>��A-�U��; ��>��A-�U��;$ ��>��A-�V��;( ��>��A-�V��;, ��>��A-�V��;0 ��> ��A-�V��;4 ��>��A-�V��;8 ��>'��A-�V��;< ��>-��A-�V��;@ ��>7��A-�V��;D ��>C��A-�V��;H ��>E��A-�V��;L ��>I��A-�W��;P ��>O��A-�W��;T ��>W��A-�W��;X ��>]��A-�W��;\ ��>g��A-�W��;` ��>i��A-�W��;d ��>m��A-�W��;h ��>{��A-�W��;l ��>��A-�W��;p ��>��A-�W��;t ��>��A-�X��;x ��>��A-�X��;| ��>��A-�X��; ��>��A-�X��; ��>��A-�X��; ��>��A-�X��; ��>��A-�X��; ��>��A-�X��; ��>��A-�X��; ��>��A-�X��; ��>��A-�Y��; ��>��A-�Y��; ��>��A-�Y��; ��>��A-�Y��; ��>��A-�Y��; ��>��A-�Y��; ��>��A-�Y��; ��>!��A-�Y��; ��>/��A-�Y��; ��>3��A-�Y��; ��>;��A-�Z��; ��>E��A-�Z��; ��>M��A-�Z��; ��>Y��A-�Z��; ��>k��A-�Z��; ��>o��A-�Z��; ��>q��A-�Z��; ��>u��A-�Z��; ��>��A-�Z��; ��>��A-�Z��; ��>��A-�[��; ��>��A-�[��; ��>��A-�[��; ��>��A-�[��; ��>��A-�[��;� ��>��A-�[��; ��>��A-�[��; ��>��A-�[��; ��>��A-�[��; ��>��A-�[��; ��> ��A-�\��; ��>��A-�\��; ��>��A-�\��; ��>��A-�\��;$ ��>%��A-�\��;( ��>)��A-�\��;, ��>+��A-�\��;0 ��>7��A-�\��;4 ��>=��A-�\��;8 ��>A��A-�\��;< ��>C��A-�]��;@ ��>I��A-�]��;D ��>_��A-�]��;H ��>e��A-�]��;L ��>g��A-�]��;P ��>k��A-�]��;T ��>}��A-�]��;X ��>��A-�]��;\ ��>��A-�]��;` ��>��A-�]��;d ��>��A-�^��;h ��>��A-�^��;l ��>��A-�^��;p ��>��A-�^��;t ��>��A-�^��;x ��>��A-�^��;| ��>��A-�^��; ��>��A-�^��; ��>��A-�^��; ��>��A-�^��; ��>��A-�_��; ��> ��A-�_��; ��>��A-�_��; ��>��A-�_��; ��>��A-�_��; ��>��A-�_��; ��>��A-�_��; ��>%��A-�_��; ��>3��A-�_��; ��>9��A-�_��; ��>=��A-�`��; ��>E��A-�`��; ��>O��A-�`��; ��>U��A-�`��; ��>i��A-�`��; ��>m��A-�`��; ��>o��A-�`��; ��>u��A-�`��; ��>��A-�`��; ��>��A-�`��; ��>��A-�a��; ��>��A-�a��; ��>��A-�a��; ��>��A-�a��; ��>��A-�a��; ��>��A-�a��; ��>��A-�a��; ��>��A-�a��; ��>��A-�a��;� ��>��A-�a��; ��>��A-�b��; ��>��A-�b��; ��>��A-�b��; ��>��A-�b��; ��>��A-�b��; ��>��A-�b��; ��> ��A-�b��; ��>��A-�b��;$ ��>#��A-�b��;( ��>'��A-�b��;, ��>3��A-�c��;0 ��>A��A-�c��;4 ��>]��A-�c��;8 ��>c��A-�c��;< ��>w��A-�c��;@ ��>{��A-�c��;D ��>��A-�c��;H ��>��A-�c��;L ��>��A-�c��;P ��>��A-�c��;T ��>��A-�d��;X ��>��A-�d��;\ ��>��A-�d��;` ��>��A-�d��;d ��>��A-�d��;h ��>��A-�d��;l ��>��A-�d��;p ��>��A-�d��;t ��>��A-�d��;x ��>��A-�d��;| ��>��A-�e��; ��>��A-�e��; ��>��A-�e��; ��>��A-�e��; ��>��A-�e��; ��>5��A-�e��; ��>7��A-�e��; ��>;��A-�e��; ��>C��A-�e��; ��>I��A-�e��; ��>M��A-�f��; ��>U��A-�f��; ��>g��A-�f��; ��>q��A-�f��; ��>w��A-�f��; ��>}��A-�f��; ��>��A-�f��; ��>��A-�f��; ��>��A-�f��; ��>��A-�f��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�g��; ��>��A-�h��; ��>��A-�h��; ��>��A-�h��;� ��>��A-�h��; ��>��A-�h��; ��>��A-�h��; ��>��A-�h��; ��>1��A-�h��; ��>3��A-�h��; ��>E��A-�h��; ��>I��A-�i��; ��>Q��A-�i��;$ ��>[��A-�i��;( ��>y��A-�i��;, ��>��A-�i��;0 ��>��A-�i��;4 ��>��A-�i��;8 ��>��A-�i��;< ��>��A-�i��;@ ��>��A-�i��;D ��>��A-�j��;H ��>��A-�j��;L ��>��A-�j��;P ��>��A-�j��;T ��>��A-�j��;X ��>��A-�j��;\ ��>��A-�j��;` ��>��A-�j��;d ��>��A-�j��;h ��>��A-�j��;l ��>��A-�k��;p ��>��A-�k��;t ��>!��A-�k��;x ��>#��A-�k��;| ��>-��A-�k��; ��>/��A-�k��; ��>5��A-�k��; ��>?��A-�k��; ��>M��A-�k��; ��>Q��A-�k��; ��>i��A-�l��; ��>k��A-�l��; ��>{��A-�l��; ��>}��A-�l��; ��>��A-�l��; ��>��A-�l��; ��>��A-�l��; ��>��A-�l��; ��>��A-�l��; ��>��A-�l��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�m��; ��>��A-�n��; ��>#��A-�n��; ��>%��A-�n��; ��>/��A-�n��; ��>1��A-�n��; ��>7��A-�n��; ��>;��A-�n��;���>A��A-�n��;��>G��A-�n��;��>O��A-�n��; ��>U��A-�o��;��>Y��A-�o��;��>e��A-�o��;��>k��A-�o��;��>s��A-�o��; ��>��A-�o��;$��>��A-�o��;(��>��A-�o��;,��>��A-�o��;0��>��A-�o��;4��>��A-�p��;8��>��A-�p��;<��>��A-�p��;@��>��A-�p��;D��>��A-�p��;H��>��A-�p��;L��>��A-�p��;P��> ��A-�p��;T��>��A-�p��;X��>��A-�p��;\��>'��A-�q��;`��>+��A-�q��;d��>-��A-�q��;h��>3��A-�q��;l��>=��A-�q��;p��>E��A-�q��;t��>K��A-�q��;x��>O��A-�q��;|��>U��A-�q��;��>s��A-�q��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�r��;��>��A-�s��;��>��A-�s��;��> ��A-�s��;��>��A-�s��;��>!��A-�s��;��>#��A-�s��;��>5��A-�s��;��>9��A-�s��;��>?��A-�s��;��>A��A-�s��;��>K��A-�t��;��>S��A-�t��;��>]��A-�t��;��>c��A-�t��;��>i��A-�t��;��>q��A-�t��;��>u��A-�t��;��>{��A-�t��;��>}��A-�t��;��>��A-�t��;��>��A-�u��;���>��A-�u��;��>��A-�u��;��>��A-�u��; ��>��A-�u��;��>��A-�u��;��>��A-�u��;��>��A-�u��;��>��A-�u��; ��>��A-�u��;$��>��A-�v��;(��>��A-�v��;,��>��A-�v��;0��>��A-�v��;4��>��A-�v��;8��>��A-�v��;<��> ��A-�v��;@��>��A-�v��;D��>��A-�v��;H��>%��A-�v��;L��>+��A-�w��;P��>/��A-�w��;T��>=��A-�w��;X��>I��A-�w��;\��>M��A-�w��;`��>O��A-�w��;d��>m��A-�w��;h��>q��A-�w��;l��>��A-�w��;p��>��A-�w��;t��>��A-�x��;x��>��A-�x��;|��>��A-�x��;��>��A-�x��;��>��A-�x��;��>��A-�x��;��>��A-�x��;��>��A-�x��;��>��A-�x��;��>��A-�x��;��>��A-�y��;��>��A-�y��;��>��A-�y��;��>��A-�y��;��> ��A-�y��;��>��A-�y��;��>��A-�y��;��>9��A-�y��;��>I��A-�y��;��>K��A-�y��;��>Q��A-�z��;��>g��A-�z��;��>u��A-�z��;��>{��A-�z��;��>��A-�z��;��>��A-�z��;��>��A-�z��;��>��A-�z��;��>��A-�z��;��>��A-�z��;��>��A-�{��;��>��A-�{��;��>��A-�{��;��>��A-�{��;��>��A-�{��;���>��A-�{��;��>��A-�{��;��>��A-�{��; ��>��A-�{��;��> ��A-�{��;��> ��A-�|��;��> ��A-�|��;��>' ��A-�|��; ��>) ��A-�|��;$��>- ��A-�|��;(��>3 ��A-�|��;,��>G ��A-�|��;0��>M ��A-�|��;4��>Q ��A-�|��;8��>_ ��A-�|��;<��>c ��A-�}��;@��>e ��A-�}��;D��>i ��A-�}��;H��>w ��A-�}��;L��>} ��A-�}��;P��> ��A-�}��;T��> ��A-�}��;X��> ��A-�}��;\��> ��A-�}��;`��> ��A-�}��;d��> ��A-�~��;h��> ��A-�~��;l��> ��A-�~��;p��> ��A-�~��;t��> ��A-�~��;x��> ��A-�~��;|��> ��A-�~��;��> ��A-�~��;��> !��A-�~��;��>!��A-�~��;��>5!��A-���;��>A!��A-���;��>I!��A-���;��>O!��A-���;��>Y!��A-���;��>[!��A-���;��>_!��A-���;��>s!��A-���;��>}!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>!��A-���;��>"��A-���;��> "��A-���;��>"��A-���;��>"��A-���;���>!"��A-���;��>%"��A-���;��>+"��A-���; ��>1"��A-���;��>9"��A-���;��>K"��A-���;��>O"��A-���;��>c"��A-���; ��>g"��A-���;$��>s"��A-���;(��>u"��A-���;,��>"��A-���;0��>"��A-���;4��>"��A-���;8��>"��A-���;<��>"��A-���;@��>"��A-���;D��>"��A-���;H��>"��A-���;L��>"��A-���;P��>"��A-���;T��>"��A-���;X��>"��A-���;\��>"��A-���;`��>"��A-���;d��>#��A-���;h��> #��A-���;l��> #��A-���;p��>'#��A-���;t��>)#��A-���;x��>/#��A-���;|��>3#��A-���;��>5#��A-���;��>E#��A-���;��>Q#��A-���;��>S#��A-���;��>Y#��A-���;��>c#��A-���;��>k#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>#��A-���;��>$��A-���;��> $��A-���;��>$��A-���;��>$��A-���;��>)$��A-���;��>=$��A-���;��>A$��A-���;��>C$��A-���;��>M$��A-���;��>_$��A-���;���>g$��A-���;��>k$��A-���;��>y$��A-���; ��>}$��A-���;��>$��A-���;��>$��A-���;��>$��A-���;��>$��A-���; ��>$��A-���;$��>$��A-���;(��>$��A-���;,��>$��A-���;0��>$��A-���;4��>$��A-���;8��>$��A-���;<��>$��A-���;@��>$��A-���;D��>$��A-���;H��>$��A-���;L��>$��A-���;P��>$��A-���;T��>%��A-���;X��>%��A-���;\��>%��A-���;`��>%��A-���;d��>'%��A-���;h��>1%��A-���;l��>=%��A-���;p��>C%��A-���;t��>K%��A-���;x��>O%��A-���;|��>s%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>%��A-���;��>&��A-���;��> &��A-���;��>&��A-���;��>&��A-���;��>'&��A-���;��>)&��A-���;��>5&��A-���;��>;&��A-���;��>?&��A-���;��>K&��A-���;��>S&��A-���;��>Y&��A-���;��>e&��A-���;��>i&��A-���;��>o&��A-���;��>{&��A-���;��>&��A-���;���>&��A-���;��>&��A-���;��>&��A-���; ��>&��A-���;��>&��A-���;��>&��A-���;��>&��A-���;��>&��A-���; ��>&��A-���;$��>&��A-���;(��>&��A-���;,��>&��A-���;0��>&��A-���;4��>'��A-���;8��>'��A-���;<��>5'��A-���;@��>7'��A-���;D��>M'��A-���;H��>S'��A-���;L��>U'��A-���;P��>_'��A-���;T��>k'��A-���;X��>m'��A-���;\��>s'��A-���;`��>w'��A-���;d��>'��A-���;h��>'��A-���;l��>'��A-���;p��>'��A-���;t��>'��A-���;x��>'��A-���;|��>'��A-���;��>'��A-���;��>'��A-���;��>'��A-���;��>'��A-���;��>'��A-���;��>'��A-���;��>(��A-���;��>(��A-���;��> (��A-���;��>(��A-���;��>(��A-���;��>(��A-���;��>!(��A-���;��>1(��A-���;��>=(��A-���;��>?(��A-���;��>I(��A-���;��>Q(��A-���;��>[(��A-���;��>](��A-���;��>a(��A-���;��>g(��A-���;��>u(��A-���;��>(��A-���;��>(��A-���;��>(��A-���;��>(��A-���;��>(��A-���;��>(��A-���;��>(��A-���;��>(��A-���;��>(��A-���;���>(��A-���;��>(��A-���;��>(��A-���; ��>)��A-���;��>)��A-���;��>)��A-���;��>!)��A-���;��>#)��A-���; ��>?)��A-���;$��>G)��A-���;(��>])��A-���;,��>e)��A-���;0��>i)��A-���;4��>o)��A-���;8��>u)��A-���;<��>)��A-���;@��>)��A-���;D��>)��A-���;H��>)��A-���;L��>)��A-���;P��>)��A-���;T��>)��A-���;X��>)��A-���;\��>)��A-���;`��>)��A-���;d��>)��A-���;h��>)��A-���;l��>)��A-���;p��>)��A-���;t��>)��A-���;x��>*��A-���;|��>*��A-���;��>*��A-���;��>%*��A-���;��>/*��A-���;��>O*��A-���;��>U*��A-���;��>_*��A-���;��>e*��A-���;��>k*��A-���;��>m*��A-���;��>s*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>*��A-���;��>+��A-���;��>'+��A-���;��>1+��A-���;��>3+��A-���;��>=+��A-���;��>?+��A-���;��>K+��A-���;��>O+��A-���;���>U+��A-���;��>i+��A-���;��>m+��A-���; ��>o+��A-���;��>{+��A-���;��>+��A-���;��>+��A-���;��>+��A-���; ��>+��A-���;$��>+��A-���;(��>+��A-���;,��>+��A-���;0��>+��A-���;4��>+��A-���;8��>+��A-���;<��>+��A-���;@��>+��A-���;D��>+��A-���;H��> ,��A-���;L��>,��A-���;P��>,��A-���;T��>#,��A-���;X��>/,��A-���;\��>5,��A-���;`��>9,��A-���;d��>A,��A-���;h��>W,��A-���;l��>Y,��A-���;p��>i,��A-���;t��>w,��A-���;x��>,��A-���;|��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>,��A-���;��>-��A-���;��>-��A-���;��>-��A-���;��>;-��A-���;��>C-��A-���;��>I-��A-���;��>M-��A-���;��>a-��A-���;��>e-��A-���;��>q-��A-���;��>-��A-���;��>-��A-���;��>-��A-���;��>-��A-���;��>-��A-���;��>-��A-���;��>-��A-���;��>-��A-���;��>-��A-���;���>-��A-���;��>.��A-���;��>.��A-���; ��>.��A-���;��> .��A-���;��>.��A-���;��>.��A-���;��>%.��A-���; ��>-.��A-���;$��>3.��A-���;(��>7.��A-���;,��>9.��A-���;0��>?.��A-���;4��>W.��A-���;8��>[.��A-���;<��>o.��A-���;@��>y.��A-���;D��>.��A-���;H��>.��A-���;L��>.��A-���;P��>.��A-���;T��>.��A-���;X��>.��A-���;\��>.��A-���;`��>.��A-���;d��>.��A-���;h��>.��A-���;l��>.��A-���;p��>.��A-���;t��>.��A-���;x��>.��A-���;|��>.��A-���;��>/��A-���;��> /��A-���;��> /��A-���;��>/��A-���;��>'/��A-���;��>)/��A-���;��>A/��A-���;��>E/��A-���;��>K/��A-���;��>M/��A-���;��>Q/��A-���;��>W/��A-���;��>o/��A-���;��>u/��A-���;��>}/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>/��A-���;��>0��A-���;��> 0��A-���;��>#0��A-���;���>)0��A-���;��>70��A-���;��>;0��A-���; ��>U0��A-���;��>Y0��A-���;��>[0��A-���;��>g0��A-���;��>q0��A-���; ��>y0��A-���;$��>}0��A-���;(��>0��A-���;,��>0��A-���;0��>0��A-���;4��>0��A-���;8��>0��A-���;<��>0��A-���;@��>0��A-���;D��>0��A-���;H��>0��A-���;L��>0��A-���;P��>0��A-���;T��>0��A-���;X��>0��A-���;\��>0��A-���;`��>0��A-���;d��>0��A-���;h��>1��A-���;l��> 1��A-���;p��>1��A-���;t��>!1��A-���;x��>'1��A-���;|��>-1��A-���;��>91��A-���;��>C1��A-���;��>E1��A-���;��>K1��A-���;��>]1��A-���;��>a1��A-���;��>g1��A-���;��>m1��A-���;��>s1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��>1��A-���;��> 2��A-���;��>2��A-���;��>2��A-���;��>2��A-���;��>)2��A-���;��>52��A-���;��>Y2��A-���;��>]2��A-���;��>c2��A-���;��>k2��A-���;���>o2��A-���;��>u2��A-���;��>w2��A-���; ��>{2��A-���;��>2��A-���;��>2��A-���;��>2��A-���;��>2��A-���; ��>2��A-���;$��>2��A-���;(��>2��A-���;,��>2��A-���;0��>2��A-���;4��>2��A-���;8��>2��A-���;<��>2��A-���;@��>2��A-���;D��>2��A-���;H��>2��A-���;L��>3��A-���;P��>%3��A-���;T��>+3��A-���;X��>/3��A-���;\��>53��A-���;`��>A3��A-���;d��>G3��A-���;h��>[3��A-���;l��>_3��A-���;p��>g3��A-���;t��>k3��A-���;x��>s3��A-���;|��>y3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>3��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>74��A-���;��>E4��A-���;��>U4��A-���;��>W4��A-���;��>c4��A-���;��>i4��A-���;��>m4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;��>4��A-���;���>4��A-���;��>4��A-���;��>4��A-���; ��>4��A-���;��>4��A-���;��> 5��A-���;��>5��A-���;��>5��A-���; ��>-5��A-���;$��>35��A-���;(��>;5��A-���;,��>A5��A-���;0��>Q5��A-���;4��>e5��A-���;8��>o5��A-���;<��>q5��A-���;@��>w5��A-���;D��>{5��A-���;H��>}5��A-���;L��>5��A-���;P��>5��A-���;T��>5��A-���;X��>5��A-���;\��>5��A-���;`��>5��A-���;d��>5��A-���;h��>5��A-���;l��>5��A-���;p��>5��A-���;t��>5��A-���;x��>5��A-���;|��>5��A-���;��>5��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>#6��A-���;��>16��A-���;��>56��A-���;��>76��A-���;��>;6��A-���;��>M6��A-���;��>O6��A-���;��>S6��A-���;��>Y6��A-���;��>a6��A-���;��>k6��A-���;��>m6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>6��A-���;��>7��A-���;��>7��A-���;��>7��A-���;��>7��A-���;��>?7��A-���;���>E7��A-���;��>I7��A-���;��>O7��A-���; ��>]7��A-���;��>a7��A-���;��>u7��A-���;��>7��A-���;��>7��A-���; ��>7��A-���;$��>7��A-���;(��>7��A-���;,��>7��A-���;0��>7��A-���;4��>7��A-���;8��>7��A-���;<��>7��A-���;@��>7��A-���;D��>8��A-���;H��> 8��A-���;L��>!8��A-���;P��>38��A-���;T��>58��A-���;X��>A8��A-���;\��>G8��A-���;`��>K8��A-���;d��>S8��A-���;h��>W8��A-���;l��>_8��A-���;p��>e8��A-���;t��>o8��A-���;x��>q8��A-���;|��>}8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>8��A-���;��>9��A-���;��>9��A-���;��>#9��A-���;��>%9��A-���;��>)9��A-���;��>/9��A-���;��>=9��A-���;��>A9��A-���;��>M9��A-���;��>[9��A-���;��>k9��A-���;��>y9��A-���;��>}9��A-���;��>9��A-���;��>9��A-���;��>9��A-���;��>9��A-���;��>9��A-���;��>9��A-���;���>9��A-���;��>9��A-���;��>9��A-���; ��>9��A-���;��>9��A-���;��>9��A-���;��>9��A-���;��>9��A-���; ��>9��A-���;$��>9��A-���;(��>9��A-���;,��>:��A-���;0��>:��A-���;4��>:��A-���;8��>:��A-���;<��>':��A-���;@��>+:��A-���;D��>1:��A-���;H��>K:��A-���;L��>Q:��A-���;P��>[:��A-���;T��>c:��A-���;X��>g:��A-���;\��>m:��A-���;`��>y:��A-���;d��>:��A-���;h��>:��A-���;l��>:��A-���;p��>:��A-���;t��>:��A-���;x��>:��A-���;|��>:��A-���;��>:��A-���;��>:��A-���;��>:��A-���;��>:��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>!;��A-���;��>#;��A-���;��>-;��A-���;��>9;��A-���;��>E;��A-���;��>S;��A-���;��>Y;��A-���;��>_;��A-���;��>q;��A-���;��>{;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;��>;��A-���;���>;��A-���;��>;��A-���;��><��A-���; ��> <��A-���;��><��A-���;��><��A-���;��><��A-���;��>)<��A-���; ��>5<��A-���;$��>C<��A-���;(��>O<��A-���;,��>S<��A-���;0��>[<��A-���;4��>e<��A-���;8��>k<��A-���;<��>q<��A-���;@��><��A-���;D��><��A-���;H��><��A-���;L��><��A-���;P��><��A-���;T��><��A-���;X��><��A-���;\��><��A-���;`��><��A-���;d��><��A-���;h��><��A-���;l��><��A-���;p��>=��A-���;t��> =��A-���;x��>=��A-���;|��>=��A-���;��>=��A-���;��>!=��A-���;��>-=��A-���;��>3=��A-���;��>7=��A-���;��>?=��A-���;��>C=��A-���;��>o=��A-���;��>s=��A-���;��>u=��A-���;��>y=��A-���;��>{=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>=��A-���;��>>��A-���;��> >��A-���;��>>��A-���;��>>��A-���;��>>��A-���;��>#>��A-���;��>)>��A-���;��>/>��A-���;���>3>��A-���;��>A>��A-���;��>W>��A-���; ��>c>��A-���;��>e>��A-���;��>w>��A-���;��>>��A-���;��>>��A-���; ��>>��A-���;$��>>��A-���;(��>>��A-���;,��>>��A-���;0��>>��A-���;4��>>��A-���;8��>>��A-���;<��>>��A-���;@��>>��A-���;D��>>��A-���;H��>>��A-���;L��>>��A-���;P��>>��A-���;T��> ?��A-���;X��> ?��A-���;\��>7?��A-���;`��>;?��A-���;d��>=?��A-���;h��>A?��A-���;l��>Y?��A-���;p��>_?��A-���;t��>e?��A-���;x��>g?��A-���;|��>y?��A-���;��>}?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>?��A-���;��>@��A-���;��>!@��A-���;��>%@��A-���;��>+@��A-���;��>1@��A-���;��>?@��A-���;��>C@��A-���;��>E@��A-���;��>]@��A-���;��>a@��A-���;��>g@��A-���;��>m@��A-���;��>@��A-���;��>@��A-���;��>@��A-���;��>@��A-���;��>@��A-���;��>@��A-���;��>@��A-���;��>@��A-���;���>@��A-���;��>@��A-���;��>@��A-���; ��>@��A-���;��> A��A-���;��> A��A-���;��>A��A-���;��>A��A-���; ��>!A��A-���;$��>3A��A-���;(��>5A��A-���;,��>;A��A-���;0��>?A��A-���;4��>YA��A-���;8��>eA��A-���;<��>kA��A-���;@��>wA��A-���;D��>{A��A-���;H��>A��A-���;L��>A��A-���;P��>A��A-���;T��>A��A-���;X��>A��A-���;\��>A��A-���;`��>A��A-���;d��>A��A-���;h��>A��A-���;l��>A��A-���;p��>B��A-���;t��>B��A-���;x��>B��A-���;|��>B��A-���;��>#B��A-���;��>)B��A-���;��>/B��A-���;��>CB��A-���;��>SB��A-���;��>UB��A-���;��>[B��A-���;��>aB��A-���;��>sB��A-���;��>}B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>B��A-���;��>C��A-���;��>C��A-���;��>C��A-���;��>%C��A-���;��>'C��A-���;��>3C��A-���;��>7C��A-���;��>9C��A-���;��>OC��A-���;���>WC��A-���;��>iC��A-���;��>C��A-���; ��>C��A-���;��>C��A-���;��>C��A-���;��>C��A-���;��>C��A-���; ��>C��A-���;$��>C��A-���;(��>C��A-���;,��>C��A-���;0��>C��A-���;4��>C��A-���;8��>C��A-���;<��>C��A-���;@��>C��A-���;D��>C��A-���;H��> D��A-���;L��> D��A-���;P��>D��A-���;T��>#D��A-���;X��>)D��A-���;\��>;D��A-���;`��>?D��A-���;d��>ED��A-���;h��>KD��A-���;l��>QD��A-���;p��>SD��A-���;t��>YD��A-���;x��>eD��A-���;|��>oD��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>D��A-���;��>E��A-���;��>E��A-���;��>E��A-���;��>+E��A-���;��>1E��A-���;��>AE��A-���;��>IE��A-���;��>SE��A-���;��>UE��A-���;��>aE��A-���;��>wE��A-���;��>}E��A-���;��>E��A-���;��>E��A-���;��>E��A-���;��>E��A-���;��>E��A-���;��>E��A-���;��>E��A-���;� ��>E��A-���; ��>E��A-���; ��>E��A-���; ��>E��A-���; ��>E��A-���; ��>F��A-���; ��>F��A-���; ��> F��A-���; ��>F��A-���;$ ��>%F��A-���;( ��>'F��A-���;, ��>3F��A-���;0 ��>9F��A-���;4 ��>=F��A-���;8 ��>CF��A-���;< ��>EF��A-���;@ ��>]F��A-���;D ��>yF��A-���;H ��>{F��A-���;L ��>F��A-���;P ��>F��A-���;T ��>F��A-���;X ��>F��A-���;\ ��>F��A-���;` ��>F��A-���;d ��>F��A-���;h ��>F��A-���;l ��>F��A-���;p ��>F��A-���;t ��>F��A-���;x ��>F��A-���;| ��>F��A-���; ��>F��A-���; ��>F��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>#G��A-���; ��>)G��A-���; ��>/G��A-���; ��>5G��A-���; ��>9G��A-���; ��>KG��A-���; ��>MG��A-���; ��>QG��A-���; ��>]G��A-���; ��>oG��A-���; ��>qG��A-���; ��>}G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>G��A-���; ��>H��A-���; ��>H��A-���;�!��> H��A-���;!��>H��A-���;!��>H��A-���; !��>H��A-���;!��>1H��A-���;!��>=H��A-���;!��>GH��A-���;!��>UH��A-���; !��>YH��A-���;$!��>[H��A-���;(!��>kH��A-���;,!��>mH��A-���;0!��>yH��A-���;4!��>H��A-���;8!��>H��A-���;<!��>H��A-���;@!��>H��A-���;D!��>H��A-���;H!��>H��A-���;L!��>H��A-���;P!��>H��A-���;T!��>I��A-���;X!��> I��A-���;\!��>I��A-���;`!��>I��A-���;d!��>+I��A-���;h!��>7I��A-���;l!��>=I��A-���;p!��>EI��A-���;t!��>UI��A-���;x!��>cI��A-���;|!��>iI��A-���;!��>mI��A-���;!��>sI��A-���;!��>I��A-���;!��>I��A-���;!��>I��A-���;!��>I��A-���;!��>I��A-���;!��>I��A-���;!��>I��A-���;!��>I��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>#J��A-���;!��>9J��A-���;!��>AJ��A-���;!��>EJ��A-���;!��>WJ��A-���;!��>]J��A-���;!��>kJ��A-���;!��>}J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;!��>J��A-���;�"��>K��A-���;"��> K��A-���;"��> K��A-���; "��>K��A-���;"��>K��A-���;"��>%K��A-���;"��>1K��A-���;"��>;K��A-���; "��>CK��A-���;$"��>IK��A-���;("��>YK��A-���;,"��>eK��A-���;0"��>mK��A-���;4"��>wK��A-���;8"��>K��A-���;<"��>K��A-���;@"��>K��A-���;D"��>K��A-���;H"��>K��A-���;L"��>K��A-���;P"��>K��A-���;T"��>K��A-���;X"��>K��A-���;\"��>K��A-���;`"��>K��A-���;d"��>K��A-���;h"��>K��A-���;l"��>K��A-���;p"��>K��A-���;t"��>L��A-���;x"��>L��A-���;|"��> L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>!L��A-���;"��>-L��A-���;"��>3L��A-���;"��>KL��A-���;"��>UL��A-���;"��>WL��A-���;"��>aL��A-���;"��>gL��A-���;"��>sL��A-���;"��>yL��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>L��A-���;"��>M��A-���;"��>M��A-���;"��>M��A-���;"��>'M��A-���;"��>)M��A-���;"��>/M��A-���;"��>3M��A-���;"��>AM��A-���;"��>QM��A-���;�#��>YM��A-���;#��>eM��A-���;#��>kM��A-���; #��>M��A-���;#��>M��A-���;#��>M��A-���;#��>M��A-���;#��>M��A-���; #��>M��A-���;$#��>M��A-���;(#��>M��A-���;,#��>M��A-���;0#��>M��A-���;4#��>M��A-���;8#��>M��A-���;<#��>M��A-���;@#��>M��A-���;D#��>N��A-���;H#��> N��A-���;L#��>N��A-���;P#��>N��A-���;T#��>N��A-���;X#��>+N��A-���;\#��>5N��A-���;`#��>7N��A-���;d#��>=N��A-���;h#��>ON��A-���;l#��>SN��A-���;p#��>_N��A-���;t#��>gN��A-���;x#��>yN��A-���;|#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>N��A-���;#��>O��A-���;#��> O��A-���;#��>O��A-���;#��>%O��A-���;#��>-O��A-���;#��>?O��A-���;#��>IO��A-���;#��>cO��A-���;#��>gO��A-���;#��>mO��A-���;#��>uO��A-���;#��>{O��A-���;#��>O��A-���;#��>O��A-���;#��>O��A-���;#��>O��A-���;#��>O��A-���;#��>O��A-���;�$��>O��A-���;$��>O��A-���;$��>O��A-���; $��>O��A-���;$��>O��A-���;$��>O��A-���;$��>O��A-���;$��>O��A-���; $��>P��A-���;$$��>P��A-���;($��>P��A-���;,$��>)P��A-���;0$��>5P��A-���;4$��>?P��A-���;8$��>EP��A-���;<$��>GP��A-���;@$��>SP��A-���;D$��>qP��A-���;H$��>wP��A-���;L$��>P��A-���;P$��>P��A-���;T$��>P��A-���;X$��>P��A-���;\$��>P��A-���;`$��>P��A-���;d$��>P��A-���;h$��>P��A-���;l$��>P��A-���;p$��>P��A-���;t$��>P��A-���;x$��>Q��A-���;|$��> Q��A-���;$��> Q��A-���;$��>Q��A-���;$��>Q��A-���;$��>#Q��A-���;$��>%Q��A-���;$��>5Q��A-���;$��>GQ��A-���;$��>IQ��A-���;$��>qQ��A-���;$��>yQ��A-���;$��>Q��A-���;$��>Q��A-���;$��>Q��A-���;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-����;$��>Q��A-���;$��> R��A-���;$��>R��A-���;$��>R��A-���;$��>R��A-���;$��>R��A-���;$��>R��A-���;$��>'R��A-���;$��>CR��A-���;�%��>ER��A-���;%��>KR��A-���;%��>aR��A-���; %��>mR��A-���;%��>sR��A-���;%��>R��A-���;%��>R��A-���;%��>R��A-���; %��>R��A-���;$%��>R��A-���;(%��>R��A-���;,%��>R��A-���;0%��>R��A-���;4%��>R��A-���;8%��>R��A-���;<%��>R��A-���;@%��>R��A-���;D%��>R��A-���;H%��>R��A-���;L%��>R��A-���;P%��>S��A-���;T%��>S��A-���;X%��>#S��A-���;\%��>AS��A-���;`%��>ES��A-���;d%��>GS��A-���;h%��>KS��A-���;l%��>]S��A-���;p%��>cS��A-���;t%��>S��A-���;x%��>S��A-���;|%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��>S��A-���;%��> T��A-���;%��>T��A-���;%��>T��A-���;%��>T��A-���;%��>5T��A-���;%��>7T��A-���;%��>;T��A-���;%��>AT��A-���;%��>IT��A-���;%��>ST��A-���;%��>UT��A-���;%��>_T��A-���;%��>aT��A-���;%��>kT��A-���;%��>mT��A-���;%��>qT��A-���;%��>T��A-���;%��>T��A-���;%��>T��A-���;�&��>T��A-���;&��>T��A-���;&��>T��A-���; &��>T��A-���;&��>T��A-���;&��>T��A-���;&��>T��A-���;&��>T��A-� ��; &��>T��A-� ��;$&��>U��A-� ��;(&��> U��A-� ��;,&��>U��A-� ��;0&��>'U��A-� ��;4&��>+U��A-� ��;8&��>9U��A-� ��;<&��>=U��A-� ��;@&��>OU��A-� ��;D&��>QU��A-� ��;H&��>[U��A-� ��;L&��>cU��A-� ��;P&��>gU��A-� ��;T&��>oU��A-� ��;X&��>yU��A-� ��;\&��>U��A-� ��;`&��>U��A-� ��;d&��>U��A-� ��;h&��>U��A-� ��;l&��>U��A-� ��;p&��>U��A-� ��;t&��>U��A-� ��;x&��>U��A-� ��;|&��>U��A-� ��;&��>U��A-� ��;&��>U��A-� ��;&��> V��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>#V��A-� ��;&��>/V��A-� ��;&��>3V��A-� ��;&��>9V��A-� ��;&��>?V��A-� ��;&��>KV��A-� ��;&��>MV��A-� ��;&��>]V��A-� ��;&��>_V��A-� ��;&��>kV��A-� ��;&��>qV��A-� ��;&��>uV��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>V��A-� ��;&��>V��A-���;&��>V��A-���;&��>V��A-���;&��>V��A-���;&��>W��A-���;&��>W��A-���;&��>W��A-���;�'��> W��A-���;'��>W��A-���;'��>W��A-���; '��>#W��A-���;'��>GW��A-���;'��>MW��A-���;'��>_W��A-���;'��>aW��A-���; '��>mW��A-���;$'��>wW��A-���;('��>}W��A-���;,'��>W��A-���;0'��>W��A-���;4'��>W��A-���;8'��>W��A-���;<'��>W��A-���;@'��>W��A-���;D'��>W��A-���;H'��>W��A-���;L'��>W��A-���;P'��>W��A-���;T'��>X��A-���;X'��> X��A-���;\'��>X��A-���;`'��>X��A-���;d'��>'X��A-���;h'��>+X��A-���;l'��>-X��A-���;p'��>UX��A-���;t'��>[X��A-���;x'��>]X��A-���;|'��>mX��A-���;'��>oX��A-���;'��>sX��A-���;'��>{X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>X��A-���;'��>Y��A-���;'��>Y��A-���;'��>Y��A-���;'��>!Y��A-���;'��>EY��A-���;'��>KY��A-���;'��>MY��A-���;'��>WY��A-���;'��>]Y��A-���;'��>uY��A-���;'��>{Y��A-���;'��>Y��A-���;'��>Y��A-���;'��>Y��A-���;�(��>Y��A-���;(��>Y��A-���;(��>Y��A-���; (��>Y��A-���;(��>Y��A-���;(��>Y��A-���;(��>Y��A-���;(��>Y��A-���; (��>Y��A-���;$(��>Y��A-���;((��>Y��A-���;,(��>Z��A-���;0(��> Z��A-���;4(��>Z��A-���;8(��>Z��A-���;<(��>Z��A-���;@(��>Z��A-���;D(��>)Z��A-���;H(��>/Z��A-���;L(��>;Z��A-���;P(��>MZ��A-���;T(��>[Z��A-���;X(��>gZ��A-���;\(��>wZ��A-���;`(��>Z��A-���;d(��>Z��A-���;h(��>Z��A-���;l(��>Z��A-���;p(��>Z��A-���;t(��>Z��A-���;x(��>Z��A-���;|(��>Z��A-���;(��>Z��A-���;(��>Z��A-���;(��>Z��A-���;(��>Z��A-���;(��>Z��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>%[��A-���;(��>+[��A-���;(��>=[��A-���;(��>I[��A-���;(��>K[��A-���;(��>g[��A-���;(��>y[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>[��A-���;(��>\��A-���;(��> \��A-���;(��> \��A-���;(��>\��A-���;(��>\��A-���;(��>)\��A-���;�)��>/\��A-���;)��>3\��A-���;)��>9\��A-���; )��>G\��A-���;)��>K\��A-���;)��>M\��A-���;)��>Q\��A-���;)��>o\��A-���; )��>u\��A-���;$)��>w\��A-���;()��>}\��A-���;,)��>\��A-���;0)��>\��A-���;4)��>\��A-���;8)��>\��A-���;<)��>\��A-���;@)��>\��A-���;D)��>\��A-���;H)��>\��A-���;L)��>\��A-���;P)��>\��A-���;T)��>\��A-���;X)��>\��A-���;\)��>]��A-���;`)��> ]��A-���;d)��>]��A-���;h)��>]��A-���;l)��>]��A-���;p)��>1]��A-���;t)��>=]��A-���;x)��>A]��A-���;|)��>G]��A-���;)��>O]��A-���;)��>U]��A-���;)��>[]��A-���;)��>e]��A-���;)��>g]��A-���;)��>m]��A-���;)��>y]��A-���;)��>]��A-���;)��>]��A-���;)��>]��A-���;)��>]��A-���;)��>]��A-���;)��>]��A-���;)��>]��A-� ��;)��>]��A-� ��;)��>]��A-� ��;)��>]��A-� ��;)��>]��A-� ��;)��>]��A-� ��;)��>]��A-� ��;)��>^��A-� ��;)��> ^��A-� ��;)��>^��A-� ��;)��>^��A-�!��;)��>!^��A-�!��;)��>'^��A-�!��;)��>+^��A-�!��;)��>-^��A-�!��;)��>1^��A-�!��;)��>9^��A-�!��;)��>E^��A-�!��;)��>I^��A-�!��;�*��>W^��A-�!��;*��>i^��A-�"��;*��>s^��A-�"��; *��>u^��A-�"��;*��>^��A-�"��;*��>^��A-�"��;*��>^��A-�"��;*��>^��A-�"��; *��>^��A-�"��;$*��>^��A-�"��;(*��>^��A-�"��;,*��>^��A-�#��;0*��>^��A-�#��;4*��> _��A-�#��;8*��>_��A-�#��;<*��>'_��A-�#��;@*��>3_��A-�#��;D*��>5_��A-�#��;H*��>;_��A-�#��;L*��>G_��A-�#��;P*��>W_��A-�#��;T*��>]_��A-�$��;X*��>c_��A-�$��;\*��>e_��A-�$��;`*��>w_��A-�$��;d*��>{_��A-�$��;h*��>_��A-�$��;l*��>_��A-�$��;p*��>_��A-�$��;t*��>_��A-�$��;x*��>_��A-�$��;|*��>_��A-�%��;*��>_��A-�%��;*��>_��A-�%��;*��>_��A-�%��;*��>_��A-�%��;*��>_��A-�%��;*��>`��A-�%��;*��>#`��A-�%��;*��>/`��A-�%��;*��>7`��A-�%��;*��>S`��A-�&��;*��>_`��A-�&��;*��>e`��A-�&��;*��>k`��A-�&��;*��>s`��A-�&��;*��>y`��A-�&��;*��>`��A-�&��;*��>`��A-�&��;*��>`��A-�&��;*��>`��A-�&��;*��>`��A-�'��;*��>`��A-�'��;*��>`��A-�'��;*��>`��A-�'��;*��>`��A-�'��;*��>`��A-�'��;*��> a��A-�'��;*��>a��A-�'��;*��>a��A-�'��;*��>a��A-�'��;*��>-a��A-�(��;*��>9a��A-�(��;*��>Ka��A-�(��;�+��>Ua��A-�(��;+��>Wa��A-�(��;+��>[a��A-�(��; +��>oa��A-�(��;+��>ya��A-�(��;+��>a��A-�(��;+��>a��A-�(��;+��>a��A-�)��; +��>a��A-�)��;$+��>a��A-�)��;(+��>a��A-�)��;,+��>a��A-�)��;0+��>a��A-�)��;4+��>a��A-�)��;8+��>a��A-�)��;<+��>a��A-�)��;@+��>a��A-�)��;D+��> b��A-�*��;H+��>b��A-�*��;L+��>b��A-�*��;P+��>!b��A-�*��;T+��>'b��A-�*��;X+��>;b��A-�*��;\+��>Ab��A-�*��;`+��>Kb��A-�*��;d+��>Qb��A-�*��;h+��>Sb��A-�*��;l+��>_b��A-�+��;p+��>eb��A-�+��;t+��>b��A-�+��;x+��>b��A-�+��;|+��>b��A-�+��;+��>b��A-�+��;+��>b��A-�+��;+��>b��A-�+��;+��>b��A-�+��;+��>b��A-�+��;+��>b��A-�,��;+��>b��A-�,��;+��>b��A-�,��;+��>b��A-�,��;+��>b��A-�,��;+��>b��A-�,��;+��>c��A-�,��;+��> c��A-�,��;+��>c��A-�,��;+��>c��A-�,��;+��>/c��A-�-��;+��>Ac��A-�-��;+��>Cc��A-�-��;+��>Oc��A-�-��;+��>_c��A-�-��;+��>gc��A-�-��;+��>mc��A-�-��;+��>qc��A-�-��;+��>wc��A-�-��;+��>}c��A-�-��;+��>c��A-�.��;+��>c��A-�.��;+��>c��A-�.��;+��>c��A-�.��;+��>c��A-�.��;+��>c��A-�.��;+��>c��A-�.��;�,��>c��A-�.��;,��>c��A-�.��;,��>d��A-�.��; ,��>d��A-�/��;,��> d��A-�/��;,��>d��A-�/��;,��>!d��A-�/��;,��>'d��A-�/��; ,��>+d��A-�/��;$,��>9d��A-�/��;(,��>Cd��A-�/��;,,��>Id��A-�/��;0,��>Od��A-�/��;4,��>]d��A-�0��;8,��>gd��A-�0��;<,��>ud��A-�0��;@,��>d��A-�0��;D,��>d��A-�0��;H,��>d��A-�0��;L,��>d��A-�0��;P,��>d��A-�0��;T,��>d��A-�0��;X,��>d��A-�0��;\,��>d��A-�1��;`,��>d��A-�1��;d,��>d��A-�1��;h,��>d��A-�1��;l,��>d��A-�1��;p,��>d��A-�1��;t,��> e��A-�1��;x,��>e��A-�1��;|,��>!e��A-�1��;,��>/e��A-�1��;,��>9e��A-�2��;,��>?e��A-�2��;,��>Ke��A-�2��;,��>Me��A-�2��;,��>Se��A-�2��;,��>We��A-�2��;,��>_e��A-�2��;,��>qe��A-�2��;,��>}e��A-�2��;,��>e��A-�2��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�3��;,��>e��A-�4��;,��>f��A-�4��;,��>f��A-�4��;,��>f��A-�4��;,��>)f��A-�4��;,��>1f��A-�4��;,��>;f��A-�4��;,��>Af��A-�4��;,��>Gf��A-�4��;,��>Mf��A-�4��;,��>[f��A-�5��;�-��>af��A-�5��;-��>sf��A-�5��;-��>}f��A-�5��; -��>f��A-�5��;-��>f��A-�5��;-��>f��A-�5��;-��>f��A-�5��;-��>f��A-�5��; -��>f��A-�5��;$-��>f��A-�6��;(-��>f��A-�6��;,-��>f��A-�6��;0-��>f��A-�6��;4-��>f��A-�6��;8-��>f��A-�6��;<-��>f��A-�6��;@-��>g��A-�6��;D-��>g��A-�6��;H-��>g��A-�6��;L-��>g��A-�7��;P-��>'g��A-�7��;T-��>1g��A-�7��;X-��>7g��A-�7��;\-��>?g��A-�7��;`-��>Eg��A-�7��;d-��>Qg��A-�7��;h-��>[g��A-�7��;l-��>og��A-�7��;p-��>yg��A-�7��;t-��>g��A-�8��;x-��>g��A-�8��;|-��>g��A-�8��;-��>g��A-�8��;-��>g��A-�8��;-��>g��A-�8��;-��>g��A-�8��;-��>g��A-�8��;-��>g��A-�8��;-��>h��A-�8��;-��> h��A-�9��;-��>h��A-�9��;-��>h��A-�9��;-��>-h��A-�9��;-��>9h��A-�9��;-��>;h��A-�9��;-��>?h��A-�9��;-��>Eh��A-�9��;-��>Kh��A-�9��;-��>Mh��A-�9��;-��>Wh��A-�:��;-��>Yh��A-�:��;-��>]h��A-�:��;-��>ch��A-�:��;-��>ih��A-�:��;-��>kh��A-�:��;-��>qh��A-�:��;-��>h��A-�:��;-��>h��A-�:��;-��>h��A-�:��;-��>h��A-�;��;-��>h��A-�;��;-��>h��A-�;��;-��>h��A-�;��;-��>h��A-�;��;�.��>h��A-�;��;.��>h��A-�;��;.��>h��A-�;��; .��>h��A-�;��;.��>i��A-�;��;.��> i��A-�<��;.��> i��A-�<��;.��>i��A-�<��; .��>)i��A-�<��;$.��>/i��A-�<��;(.��>Ci��A-�<��;,.��>Gi��A-�<��;0.��>Ii��A-�<��;4.��>Oi��A-�<��;8.��>ei��A-�<��;<.��>ki��A-�=��;@.��>qi��A-�=��;D.��>i��A-�=��;H.��>i��A-�=��;L.��>i��A-�=��;P.��>i��A-�=��;T.��>i��A-�=��;X.��>i��A-�=��;\.��>i��A-�=��;`.��>i��A-�=��;d.��>i��A-�>��;h.��>i��A-�>��;l.��>i��A-�>��;p.��>i��A-�>��;t.��>i��A-�>��;x.��>i��A-�>��;|.��>j��A-�>��;.��>+j��A-�>��;.��>7j��A-�>��;.��>=j��A-�>��;.��>Kj��A-�?��;.��>gj��A-�?��;.��>ij��A-�?��;.��>uj��A-�?��;.��>{j��A-�?��;.��>j��A-�?��;.��>j��A-�?��;.��>j��A-�?��;.��>j��A-�?��;.��>j��A-�?��;.��>j��A-�@��;.��>j��A-�@��;.��>j��A-�@��;.��>j��A-�@��;.��>k��A-�@��;.��>k��A-�@��;.��>k��A-�@��;.��>#k��A-�@��;.��>'k��A-�@��;.��>-k��A-�@��;.��>9k��A-�A��;.��>Ak��A-�A��;.��>Wk��A-�A��;.��>Yk��A-�A��;.��>_k��A-�A��;.��>uk��A-�A��;.��>k��A-�A��;.��>k��A-�A��;.��>k��A-�A��;�/��>k��A-�A��;/��>k��A-�B��;/��>k��A-�B��; /��>k��A-�B��;/��>k��A-�B��;/��>k��A-�B��;/��>k��A-�B��;/��>k��A-�B��; /��>l��A-�B��;$/��>l��A-�B��;(/��>)l��A-�B��;,/��>+l��A-�C��;0/��>1l��A-�C��;4/��>5l��A-�C��;8/��>Ul��A-�C��;</��>Yl��A-�C��;@/��>[l��A-�C��;D/��>_l��A-�C��;H/��>el��A-�C��;L/��>gl��A-�C��;P/��>sl��A-�C��;T/��>wl��A-�D��;X/��>}l��A-�D��;\/��>l��A-�D��;`/��>l��A-�D��;d/��>l��A-�D��;h/��>l��A-�D��;l/��>l��A-�D��;p/��>l��A-�D��;t/��>l��A-�D��;x/��>l��A-�D��;|/��>l��A-�E��;/��>l��A-�E��;/��>l��A-�E��;/��>l��A-�E��;/��>l��A-�E��;/��>l��A-�E��;/��> m��A-�E��;/��>m��A-�E��;/��>%m��A-�E��;/��>'m��A-�E��;/��>+m��A-�F��;/��>1m��A-�F��;/��>9m��A-�F��;/��>?m��A-�F��;/��>Om��A-�F��;/��>]m��A-�F��;/��>am��A-�F��;/��>sm��A-�F��;/��>{m��A-�F��;/��>m��A-�F��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�G��;/��>m��A-�H��;/��>n��A-�H��;/��>n��A-�H��;�0��>n��A-�H��;0��>)n��A-�H��;0��>3n��A-�H��; 0��>;n��A-�H��;0��>En��A-�H��;0��>un��A-�H��;0��>wn��A-�H��;0��>{n��A-�I��; 0��>n��A-�I��;$0��>n��A-�I��;(0��>n��A-�I��;,0��>n��A-�I��;00��>n��A-�I��;40��>n��A-�I��;80��>n��A-�I��;<0��>n��A-�I��;@0��>n��A-�I��;D0��>n��A-�J��;H0��>n��A-�J��;L0��>n��A-�J��;P0��> o��A-�J��;T0��>o��A-�J��;X0��>o��A-�J��;\0��>o��A-�J��;`0��>/o��A-�J��;d0��>=o��A-�J��;h0��>Mo��A-�J��;l0��>So��A-�K��;p0��>ao��A-�K��;t0��>eo��A-�K��;x0��>yo��A-�K��;|0��>}o��A-�K��;0��>o��A-�K��;0��>o��A-�K��;0��>o��A-�K��;0��>o��A-�K��;0��>o��A-�K��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�L��;0��>o��A-�M��;0��>o��A-�M��;0��>o��A-�M��;0��>o��A-�M��;0��>o��A-�M��;0��>p��A-�M��;0��>p��A-�M��;0��>p��A-�M��;0��>'p��A-�M��;0��>3p��A-�M��;0��>9p��A-�N��;0��>Op��A-�N��;0��>Qp��A-�N��;0��>Wp��A-�N��;0��>cp��A-�N��;0��>up��A-�N��;0��>yp��A-�N��;�1��>p��A-�N��;1��>p��A-�N��;1��>p��A-�N��; 1��>p��A-�O��;1��>p��A-�O��;1��>p��A-�O��;1��>p��A-�O��;1��>p��A-�O��; 1��>p��A-�O��;$1��>p��A-�O��;(1��>p��A-�O��;,1��>p��A-�O��;01��>p��A-�O��;41��>q��A-�P��;81��>q��A-�P��;<1��>!q��A-�P��;@1��>3q��A-�P��;D1��>Qq��A-�P��;H1��>Yq��A-�P��;L1��>]q��A-�P��;P1��>_q��A-�P��;T1��>cq��A-�P��;X1��>iq��A-�P��;\1��>q��A-�Q��;`1��>q��A-�Q��;d1��>q��A-�Q��;h1��>q��A-�Q��;l1��>q��A-�Q��;p1��>q��A-�Q��;t1��>q��A-�Q��;x1��>q��A-�Q��;|1��>q��A-�Q��;1��>q��A-�Q��;1��>q��A-�R��;1��>q��A-�R��;1��>q��A-�R��;1��>r��A-�R��;1��>r��A-�R��;1��>r��A-�R��;1��>r��A-�R��;1��>%r��A-�R��;1��>/r��A-�R��;1��>;r��A-�R��;1��>Cr��A-�S��;1��>Ur��A-�S��;1��>gr��A-�S��;1��>qr��A-�S��;1��>wr��A-�S��;1��>r��A-�S��;1��>r��A-�S��;1��>r��A-�S��;1��>r��A-�S��;1��>r��A-�S��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>r��A-�T��;1��>s��A-�U��;�2��> s��A-�U��;2��>!s��A-�U��;2��>+s��A-�U��; 2��>=s��A-�U��;2��>Ws��A-�U��;2��>[s��A-�U��;2��>as��A-�U��;2��>s��A-�U��; 2��>s��A-�U��;$2��>s��A-�V��;(2��>s��A-�V��;,2��>s��A-�V��;02��>s��A-�V��;42��>s��A-�V��;82��>s��A-�V��;<2��>s��A-�V��;@2��>s��A-�V��;D2��>s��A-�V��;H2��>s��A-�V��;L2��>s��A-�W��;P2��>s��A-�W��;T2��>t��A-�W��;X2��>t��A-�W��;\2��>-t��A-�W��;`2��>9t��A-�W��;d2��>?t��A-�W��;h2��>At��A-�W��;l2��>]t��A-�W��;p2��>kt��A-�W��;t2��>{t��A-�X��;x2��>t��A-�X��;|2��>t��A-�X��;2��>t��A-�X��;2��>t��A-�X��;2��>t��A-�X��;2��>t��A-�X��;2��>t��A-�X��;2��>t��A-�X��;2��>t��A-�X��;2��>t��A-�Y��;2��>t��A-�Y��;2��>t��A-�Y��;2��>u��A-�Y��;2��>u��A-�Y��;2��>%u��A-�Y��;2��>;u��A-�Y��;2��>=u��A-�Y��;2��>Mu��A-�Y��;2��>_u��A-�Y��;2��>ku��A-�Z��;2��>wu��A-�Z��;2��>u��A-�Z��;2��>u��A-�Z��;2��>u��A-�Z��;2��>u��A-�Z��;2��>u��A-�Z��;2��>u��A-�Z��;2��>u��A-�Z��;2��>u��A-�Z��;2��>u��A-�[��;2��>u��A-�[��;2��>u��A-�[��;2��>u��A-�[��;2��>u��A-�[��;�3��>u��A-�[��;3��>u��A-�[��;3��>u��A-�[��; 3��>v��A-�[��;3��>v��A-�[��;3��>!v��A-�\��;3��>-v��A-�\��;3��>3v��A-�\��; 3��>=v��A-�\��;$3��>?v��A-�\��;(3��>Uv��A-�\��;,3��>cv��A-�\��;03��>iv��A-�\��;43��>ov��A-�\��;83��>sv��A-�\��;<3��>v��A-�]��;@3��>v��A-�]��;D3��>v��A-�]��;H3��>v��A-�]��;L3��>v��A-�]��;P3��>v��A-�]��;T3��>v��A-�]��;X3��>v��A-�]��;\3��>v��A-�]��;`3��>w��A-�]��;d3��>w��A-�^��;h3��>w��A-�^��;l3��>w��A-�^��;p3��>!w��A-�^��;t3��>-w��A-�^��;x3��>5w��A-�^��;|3��>Aw��A-�^��;3��>Kw��A-�^��;3��>Yw��A-�^��;3��>]w��A-�^��;3��>_w��A-�_��;3��>qw��A-�_��;3��>w��A-�_��;3��>w��A-�_��;3��>w��A-�_��;3��>w��A-�_��;3��>w��A-�_��;3��>w��A-�_��;3��>w��A-�_��;3��>w��A-�_��;3��>w��A-�`��;3��>w��A-�`��;3��>w��A-�`��;3��>w��A-�`��;3��>w��A-�`��;3��>x��A-�`��;3��>%x��A-�`��;3��>+x��A-�`��;3��>5x��A-�`��;3��>=x��A-�`��;3��>Sx��A-�a��;3��>Yx��A-�a��;3��>ax��A-�a��;3��>mx��A-�a��;3��>wx��A-�a��;3��>yx��A-�a��;3��>x��A-�a��;3��>x��A-�a��;3��>x��A-�a��;�4��>x��A-�a��;4��>x��A-�b��;4��>x��A-�b��; 4��>x��A-�b��;4��>x��A-�b��;4��>x��A-�b��;4��>x��A-�b��;4��>x��A-�b��; 4��>x��A-�b��;$4��>x��A-�b��;(4��>y��A-�b��;,4��>y��A-�c��;04��>%y��A-�c��;44��>+y��A-�c��;84��>9y��A-�c��;<4��>?y��A-�c��;@4��>Ky��A-�c��;D4��>Wy��A-�c��;H4��>]y��A-�c��;L4��>gy��A-�c��;P4��>iy��A-�c��;T4��>sy��A-�d��;X4��>y��A-�d��;\4��>y��A-�d��;`4��>y��A-�d��;d4��>y��A-�d��;h4��>y��A-�d��;l4��>y��A-�d��;p4��>y��A-�d��;t4��>y��A-�d��;x4��>y��A-�d��;|4��>y��A-�e��;4��>y��A-�e��;4��>y��A-�e��;4��>y��A-�e��;4��>y��A-�e��;4��>y��A-�e��;4��>z��A-�e��;4��>z��A-�e��;4��>z��A-�e��;4��>z��A-�e��;4��>z��A-�f��;4��>#z��A-�f��;4��>'z��A-�f��;4��>-z��A-�f��;4��>Kz��A-�f��;4��>Wz��A-�f��;4��>Yz��A-�f��;4��>_z��A-�f��;4��>ez��A-�f��;4��>iz��A-�f��;4��>}z��A-�g��;4��>z��A-�g��;4��>z��A-�g��;4��>z��A-�g��;4��>z��A-�g��;4��>z��A-�g��;4��>z��A-�g��;4��>z��A-�g��;4��>z��A-�g��;4��>{��A-�g��;4��>{��A-�h��;4��>{��A-�h��;4��>{��A-�h��;�5��>+{��A-�h��;5��>5{��A-�h��;5��>7{��A-�h��; 5��>;{��A-�h��;5��>O{��A-�h��;5��>U{��A-�h��;5��>_{��A-�h��;5��>q{��A-�i��; 5��>w{��A-�i��;$5��>{��A-�i��;(5��>{��A-�i��;,5��>{��A-�i��;05��>{��A-�i��;45��>{��A-�i��;85��>{��A-�i��;<5��>{��A-�i��;@5��>{��A-�i��;D5��>{��A-�j��;H5��>{��A-�j��;L5��>{��A-�j��;P5��>{��A-�j��;T5��>{��A-�j��;X5��>|��A-�j��;\5��>|��A-�j��;`5��>|��A-�j��;d5��>1|��A-�j��;h5��>7|��A-�j��;l5��>I|��A-�k��;p5��>g|��A-�k��;t5��>i|��A-�k��;x5��>s|��A-�k��;|5��>|��A-�k��;5��>|��A-�k��;5��>|��A-�k��;5��>|��A-�k��;5��>|��A-�k��;5��>|��A-�k��;5��>|��A-�l��;5��>|��A-�l��;5��>|��A-�l��;5��>}��A-�l��;5��> }��A-�l��;5��>}��A-�l��;5��>}��A-�l��;5��>3}��A-�l��;5��>9}��A-�l��;5��>;}��A-�l��;5��>?}��A-�m��;5��>E}��A-�m��;5��>M}��A-�m��;5��>S}��A-�m��;5��>Y}��A-�m��;5��>c}��A-�m��;5��>u}��A-�m��;5��>w}��A-�m��;5��>}��A-�m��;5��>}��A-�m��;5��>}��A-�n��;5��>}��A-�n��;5��>}��A-�n��;5��>}��A-�n��;5��>}��A-�n��;5��>}��A-�n��;5��>}��A-�n��;�6��>}��A-�n��;6��>}��A-�n��;6��>}��A-�n��; 6��>~��A-�o��;6��>~��A-�o��;6��>)~��A-�o��;6��>+~��A-�o��;6��>/~��A-�o��; 6��>5~��A-�o��;$6��>A~��A-�o��;(6��>C~��A-�o��;,6��>G~��A-�o��;06��>U~��A-�o��;46��>a~��A-�p��;86��>g~��A-�p��;<6��>k~��A-�p��;@6��>q~��A-�p��;D6��>s~��A-�p��;H6��>y~��A-�p��;L6��>}~��A-�p��;P6��>~��A-�p��;T6��>~��A-�p��;X6��>~��A-�p��;\6��>~��A-�q��;`6��>~��A-�q��;d6��>~��A-�q��;h6��>~��A-�q��;l6��>~��A-�q��;p6��>~��A-�q��;t6��>~��A-�q��;x6��>~��A-�q��;|6��>~��A-�q��;6��>~��A-�q��;6��>��A-�r��;6��>��A-�r��;6��>��A-�r��;6��>1��A-�r��;6��>3��A-�r��;6��>9��A-�r��;6��>=��A-�r��;6��>C��A-�r��;6��>K��A-�r��;6��>[��A-�r��;6��>a��A-�s��;6��>c��A-�s��;6��>m��A-�s��;6��>y��A-�s��;6��>��A-�s��;6��>��A-�s��;6��>��A-�s��;6��>��A-�s��;6��>��A-�s��;6��>��A-�s��;6��>��A-�t��;6��>��A-�t��;6��>��A-�t��;6��>��A-�t��;6��> ��A-�t��;6��>��A-�t��;6��>��A-�t��;6��>��A-�t��;6��>!��A-�t��;6��>#��A-�t��;6��>?��A-�u��;�7��>A��A-�u��;7��>G��A-�u��;7��>K��A-�u��; 7��>e��A-�u��;7��>w��A-�u��;7��>��A-�u��;7��>��A-�u��;7��>��A-�u��; 7��>��A-�u��;$7��>��A-�v��;(7��>��A-�v��;,7��>��A-�v��;07��>ɀ��A-�v��;47��>ˀ��A-�v��;87��>׀��A-�v��;<7��>ۀ��A-�v��;@7��>��A-�v��;D7��>��A-�v��;H7��>��A-�v��;L7��>��A-�w��;P7��>��A-�w��;T7��> ��A-�w��;X7��>��A-�w��;\7��>��A-�w��;`7��>/��A-�w��;d7��>1��A-�w��;h7��>;��A-�w��;l7��>C��A-�w��;p7��>S��A-�w��;t7��>Y��A-�x��;x7��>_��A-�x��;|7��>}��A-�x��;7��>��A-�x��;7��>��A-�x��;7��>��A-�x��;7��>��A-�x��;7��>��A-�x��;7��>��A-�x��;7��>��A-�x��;7��>��A-�y��;7��>ǁ��A-�y��;7��>߁��A-�y��;7��>��A-�y��;7��> ��A-�y��;7��>��A-�y��;7��>��A-�y��;7��>%��A-�y��;7��>1��A-�y��;7��>3��A-�y��;7��>?��A-�z��;7��>C��A-�z��;7��>E��A-�z��;7��>I��A-�z��;7��>O��A-�z��;7��>a��A-�z��;7��>o��A-�z��;7��>{��A-�z��;7��>��A-�z��;7��>��A-�z��;7��>��A-�{��;7��>��A-�{��;7��>��A-�{��;7��>��A-�{��;7��>ǂ��A-�{��;�8��>ς��A-�{��;8��>Ղ��A-�{��;8��>߂��A-�{��; 8��>��A-�{��;8��>��A-�{��;8��>��A-�|��;8��> ��A-�|��;8��>��A-�|��; 8��>!��A-�|��;$8��>)��A-�|��;(8��>-��A-�|��;,8��>3��A-�|��;08��>5��A-�|��;48��>?��A-�|��;88��>A��A-�|��;<8��>M��A-�}��;@8��>Q��A-�}��;D8��>S��A-�}��;H8��>W��A-�}��;L8��>]��A-�}��;P8��>e��A-�}��;T8��>i��A-�}��;X8��>o��A-�}��;\8��>��A-�}��;`8��>��A-�}��;d8��>��A-�~��;h8��>��A-�~��;l8��>˃��A-�~��;p8��>Ճ��A-�~��;t8��>׃��A-�~��;x8��>݃��A-�~��;|8��>��A-�~��;8��>��A-�~��;8��>��A-�~��;8��>��A-�~��;8��>��A-���;8��>��A-���;8��>��A-���;8��>#��A-���;8��>%��A-���;8��>;��A-���;8��>A��A-���;8��>G��A-���;8��>O��A-���;8��>a��A-���;8��>e��A-���;8��>w��A-���;8��>��A-���;8��>��A-���;8��>��A-���;8��>��A-���;8��>��A-���;8��>��A-���;8��>̈́��A-���;8��>��A-���;8��>��A-���;8��>��A-���;8��>��A-���;8��> ��A-���;8��> ��A-���;8��>K��A-���;8��>O��A-���;8��>Q��A-���;8��>]��A-���;�9��>c��A-���;9��>m��A-���;9��>o��A-���; 9��>{��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���; 9��>��A-���;$9��>ͅ��A-���;(9��>Ӆ��A-���;,9��>Յ��A-���;09��>ۅ��A-���;49��>��A-���;89��>��A-���;<9��>��A-���;@9��>��A-���;D9��>��A-���;H9��> ��A-���;L9��>��A-���;P9��>��A-���;T9��>!��A-���;X9��>/��A-���;\9��>9��A-���;`9��>?��A-���;d9��>A��A-���;h9��>M��A-���;l9��>c��A-���;p9��>u��A-���;t9��>}��A-���;x9��>��A-���;|9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>Æ��A-���;9��>ņ��A-���;9��>φ��A-���;9��>ц��A-���;9��>׆��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>+��A-���;9��>/��A-���;9��>5��A-���;9��>G��A-���;9��>Y��A-���;9��>[��A-���;9��>k��A-���;9��>q��A-���;9��>w��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>��A-���;9��>Ň��A-���;�:��>LJ��A-���;:��>ˇ��A-���;:��>݇��A-���; :��>��A-���;:��>��A-���;:��>��A-���;:��>��A-���;:��>��A-���; :��>!��A-���;$:��>7��A-���;(:��>=��A-���;,:��>C��A-���;0:��>Q��A-���;4:��>a��A-���;8:��>g��A-���;<:��>{��A-���;@:��>��A-���;D:��>��A-���;H:��>��A-���;L:��>��A-���;P:��>ψ��A-���;T:��>ӈ��A-���;X:��>��A-���;\:��>��A-���;`:��>��A-���;d:��>��A-���;h:��> ��A-���;l:��> ��A-���;p:��>��A-���;t:��>��A-���;x:��>#��A-���;|:��>'��A-���;:��>-��A-���;:��>9��A-���;:��>E��A-���;:��>M��A-���;:��>Q��A-���;:��>W��A-���;:��>c��A-���;:��>��A-���;:��>��A-���;:��>��A-���;:��>��A-���;:��>��A-���;:��>É��A-���;:��>ω��A-���;:��>щ��A-���;:��>ۉ��A-���;:��>��A-���;:��>��A-���;:��>��A-���;:��>��A-���;:��> ��A-���;:��>��A-���;:��>#��A-���;:��>5��A-���;:��>A��A-���;:��>I��A-���;:��>O��A-���;:��>[��A-���;:��>_��A-���;:��>m��A-���;:��>w��A-���;:��>y��A-���;�;��>��A-���;;��>��A-���;;��>��A-���; ;��>��A-���;;��>��A-���;;��>NJ��A-���;;��>ˊ��A-���;;��>͊��A-���; ;��>ъ��A-���;$;��>׊��A-���;(;��>��A-���;,;��>��A-���;0;��>��A-���;4;��> ��A-���;8;��> ��A-���;<;��>��A-���;@;��>!��A-���;D;��>W��A-���;H;��>]��A-���;L;��>��A-���;P;��>��A-���;T;��>��A-���;X;��>��A-���;\;��>��A-���;`;��>��A-���;d;��>Ջ��A-���;h;��>ً��A-���;l;��>ۋ��A-���;p;��>��A-���;t;��>��A-���;x;��>��A-���;|;��>��A-���;;��> ��A-���;;��>��A-���;;��>��A-���;;��>'��A-���;;��>9��A-���;;��>;��A-���;;��>G��A-���;;��>S��A-���;;��>]��A-���;;��>o��A-���;;��>{��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>Ō��A-���;;��>݌��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��>��A-���;;��> ��A-���;;��> ��A-���;;��>#��A-���;;��>)��A-���;;��>7��A-���;;��>A��A-���;�<��>[��A-���;<��>_��A-���;<��>q��A-���; <��>y��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���; <��>��A-���;$<��>��A-���;(<��>ō��A-���;,<��>ˍ��A-���;0<��>Ӎ��A-���;4<��>ٍ��A-���;8<��>ߍ��A-���;<<��>��A-���;@<��>��A-���;D<��>��A-���;H<��>��A-���;L<��>��A-���;P<��>%��A-���;T<��>Q��A-���;X<��>c��A-���;\<��>i��A-���;`<��>s��A-���;d<��>u��A-���;h<��>y��A-���;l<��>��A-���;p<��>��A-���;t<��>��A-���;x<��>��A-���;|<��>��A-���;<��>��A-���;<��>��A-���;<��>ǎ��A-���;<��>ώ��A-���;<��>ӎ��A-���;<��>ێ��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>#��A-���;<��>-��A-���;<��>?��A-���;<��>E��A-���;<��>K��A-���;<��>S��A-���;<��>Y��A-���;<��>e��A-���;<��>i��A-���;<��>q��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>��A-���;<��>ɏ��A-���;�=��>Տ��A-���;=��>��A-���;=��>��A-���; =��>��A-���;=��>��A-���;=��> ��A-���;=��>��A-���;=��>#��A-���; =��>%��A-���;$=��>1��A-���;(=��>7��A-���;,=��>;��A-���;0=��>A��A-���;4=��>C��A-���;8=��>O��A-���;<=��>S��A-���;@=��>m��A-���;D=��>s��A-���;H=��>��A-���;L=��>��A-���;P=��>��A-���;T=��>��A-���;X=��>��A-���;\=��>��A-���;`=��>��A-���;d=��>��A-���;h=��>Ő��A-���;l=��>ߐ��A-���;p=��>��A-���;t=��>��A-���;x=��>��A-���;|=��>��A-���;=��>'��A-���;=��>3��A-���;=��>=��A-���;=��>E��A-���;=��>O��A-���;=��>Q��A-���;=��>a��A-���;=��>g��A-���;=��>{��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>ɑ��A-���;=��>ّ��A-���;=��>ۑ��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>��A-���;=��>!��A-���;=��>/��A-���;=��>A��A-���;=��>G��A-���;=��>W��A-���;=��>k��A-���;=��>q��A-���;=��>u��A-���;�>��>}��A-���;>��>��A-���;>��>��A-���; >��>��A-���;>��>��A-���;>��>��A-���;>��>��A-���;>��>��A-���; >��>��A-���;$>��>��A-���;(>��>Ò��A-���;,>��>Œ��A-���;0>��>˒��A-���;4>��>Ւ��A-���;8>��>ג��A-���;<>��>��A-���;@>��>��A-���;D>��>��A-���;H>��> ��A-���;L>��>��A-���;P>��>��A-���;T>��>��A-���;X>��>;��A-���;\>��>=��A-���;`>��>C��A-���;d>��>U��A-���;h>��>s��A-���;l>��>��A-���;p>��>��A-���;t>��>��A-���;x>��>��A-���;|>��>��A-���;>��>Ǔ��A-���;>��>ד��A-���;>��>ݓ��A-���;>��>��A-���;>��>��A-���;>��>��A-���;>��>��A-���;>��> ��A-���;>��>��A-���;>��>?��A-���;>��>E��A-���;>��>K��A-���;>��>O��A-���;>��>c��A-���;>��>g��A-���;>��>i��A-���;>��>m��A-���;>��>{��A-���;>��>��A-���;>��>��A-���;>��>��A-���;>��>��A-���;>��>Ô��A-���;>��>��A-���;>��>��A-���;>��>��A-���;>��> ��A-���;>��>��A-���;>��>!��A-���;>��>'��A-���;>��>-��A-���;>��>5��A-���;�?��>9��A-���;?��>K��A-���;?��>W��A-���; ?��>]��A-���;?��>_��A-���;?��>u��A-���;?��>��A-���;?��>��A-���; ?��>��A-���;$?��>��A-���;(?��>��A-���;,?��>��A-���;0?��>��A-���;4?��>��A-���;8?��>��A-���;<?��>��A-���;@?��>ϕ��A-���;D?��>��A-���;H?��>��A-���;L?��>��A-���;P?��>��A-���;T?��>/��A-���;X?��>1��A-���;\?��>5��A-���;`?��>;��A-���;d?��>=��A-���;h?��>e��A-���;l?��>��A-���;p?��>��A-���;t?��>��A-���;x?��>��A-���;|?��>��A-���;?��>��A-���;?��>˖��A-���;?��>і��A-���;?��>Ӗ��A-���;?��>��A-���;?��>��A-���;?��>��A-���;?��>��A-���;?��> ��A-���;?��>��A-���;?��>��A-���;?��>%��A-���;?��>+��A-���;?��>3��A-���;?��>7��A-���;?��>9��A-���;?��>C��A-���;?��>I��A-���;?��>Q��A-���;?��>[��A-���;?��>]��A-���;?��>o��A-���;?��>��A-���;?��>��A-���;?��>��A-���;?��>��A-���;?��>��A-���;?��>��A-���;?��>×��A-���;?��>͗��A-���;?��>ӗ��A-���;?��>ٗ��A-���;�@��>��A-���;@��>��A-���;@��>��A-���; @��> ��A-���;@��> ��A-���;@��>��A-���;@��>)��A-���;@��>/��A-���; @��>;��A-���;$@��>A��A-���;(@��>Q��A-���;,@��>k��A-���;0@��>o��A-���;4@��>��A-���;8@��>��A-���;<@��>��A-���;@@��>��A-���;D@��>��A-���;H@��>��A-���;L@��>��A-���;P@��>Ø��A-���;T@��>ɘ��A-���;X@��>Ϙ��A-���;\@��>ݘ��A-���;`@��>��A-���;d@��>��A-���;h@��>��A-���;l@��>��A-���;p@��> ��A-���;t@��>��A-���;x@��>��A-���;|@��>)��A-���;@��>1��A-���;@��>;��A-���;@��>=��A-���;@��>A��A-���;@��>G��A-���;@��>I��A-���;@��>S��A-���;@��>}��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>Ǚ��A-���;@��>˙��A-���;@��>͙��A-���;@��>י��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>��A-���;@��>%��A-���;@��>K��A-���;@��>O��A-���;@��>U��A-���;@��>W��A-���;@��>a��A-���;@��>u��A-���;�A��>��A-���;A��>��A-���;A��>��A-���; A��>��A-���;A��>��A-���;A��>Ú��A-���;A��>ǚ��A-���;A��>Ϛ��A-���; A��>��A-���;$A��>��A-���;(A��>��A-���;,A��>��A-���;0A��>��A-���;4A��>��A-���;8A��>'��A-���;<A��>/��A-���;@A��>5��A-���;DA��>E��A-���;HA��>Q��A-���;LA��>Y��A-���;PA��>c��A-���;TA��>o��A-���;XA��>w��A-���;\A��>��A-���;`A��>��A-���;dA��>��A-���;hA��>��A-���;lA��>��A-���;pA��>��A-���;tA��>��A-���;xA��>��A-���;|A��>��A-���;A��>ś��A-���;A��>˛��A-���;A��>ϛ��A-���;A��>ݛ��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>#��A-���;A��>+��A-���;A��>/��A-���;A��>5��A-���;A��>I��A-���;A��>M��A-���;A��>_��A-���;A��>e��A-���;A��>g��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>ל��A-���;A��>ٜ��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;A��>��A-���;�B��>'��A-���;B��>-��A-���;B��>1��A-���; B��>=��A-���;B��>U��A-���;B��>[��A-���;B��>a��A-���;B��>��A-���; B��>��A-���;$B��>��A-���;(B��>��A-���;,B��>Ý��A-���;0B��>��A-���;4B��>��A-���;8B��>��A-���;<B��>��A-���;@B��> ��A-���;DB��>��A-���;HB��>#��A-���;LB��>'��A-���;PB��>-��A-���;TB��>3��A-���;XB��>;��A-���;\B��>G��A-���;`B��>Q��A-���;dB��>S��A-���;hB��>_��A-���;lB��>o��A-���;pB��>��A-���;tB��>��A-���;xB��>��A-���;|B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>#��A-���;B��>/��A-���;B��>7��A-���;B��>;��A-���;B��>C��A-���;B��>S��A-���;B��>a��A-���;B��>m��A-���;B��>s��A-���;B��>w��A-���;B��>}��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>��A-���;B��>ǟ��A-���;B��>ߟ��A-���;B��>��A-���;B��>��A-���;B��>��A-���;�C��>��A-���;C��> ��A-���;C��>!��A-���; C��>3��A-���;C��>9��A-���;C��>?��A-���;C��>O��A-���;C��>W��A-���; C��>[��A-���;$C��>a��A-���;(C��>u��A-���;,C��>y��A-���;0C��>��A-���;4C��>��A-���;8C��>��A-���;<C��>��A-���;@C��>��A-���;DC��>��A-���;HC��>ɠ��A-���;LC��>٠��A-���;PC��>۠��A-���;TC��>ߠ��A-���;XC��>��A-���;\C��>��A-���;`C��>��A-���;dC��>��A-���;hC��>��A-���;lC��> ��A-���;pC��>��A-���;tC��>��A-���;xC��>��A-���;|C��>)��A-���;C��>/��A-���;C��>5��A-���;C��>A��A-���;C��>S��A-���;C��>u��A-���;C��>}��A-���;C��>��A-���;C��>��A-���;C��>��A-���;C��>��A-���;C��>��A-���;C��>��A-���;C��>á��A-���;C��>š��A-���;C��>��A-���;C��>��A-���;C��>��A-���;C��>��A-���;C��>��A-���;C��>#��A-���;C��>)��A-���;C��>/��A-���;C��>1��A-���;C��>C��A-���;C��>G��A-���;C��>M��A-���;C��>k��A-���;C��>y��A-���;C��>}��A-���;C��>��A-���;C��>��A-���;C��>��A-���;�D��>��A-���;D��>��A-���;D��>��A-���; D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>Ţ��A-���; D��>Ѣ��A-���;$D��>ע��A-���;(D��>��A-���;,D��>��A-���;0D��> ��A-���;4D��>��A-���;8D��>!��A-���;<D��>+��A-���;@D��>1��A-���;DD��>I��A-���;HD��>Q��A-���;LD��>U��A-���;PD��>s��A-���;TD��>y��A-���;XD��>{��A-���;\D��>��A-���;`D��>��A-���;dD��>��A-���;hD��>��A-���;lD��>��A-���;pD��>��A-���;tD��>��A-���;xD��>ǣ��A-���;|D��>գ��A-���;D��>ۣ��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>!��A-���;D��>#��A-���;D��>'��A-���;D��>;��A-���;D��>M��A-���;D��>W��A-���;D��>Y��A-���;D��>c��A-���;D��>i��A-���;D��>u��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>ä��A-���;D��>Ť��A-���;D��>ˤ��A-���;D��>Ѥ��A-���;D��>դ��A-���;D��>��A-���;D��>��A-���;D��>��A-���;D��>��A-���;�E��>��A-���;E��>��A-���;E��>)��A-���; E��>+��A-���;E��>5��A-���;E��>;��A-���;E��>C��A-���;E��>S��A-���; E��>[��A-���;$E��>a��A-���;(E��>m��A-���;,E��>w��A-���;0E��>��A-���;4E��>��A-���;8E��>��A-���;<E��>��A-���;@E��>��A-���;DE��>��A-���;HE��>��A-���;LE��>��A-���;PE��>ť��A-���;TE��>˥��A-���;XE��>ӥ��A-���;\E��>٥��A-���;`E��>ݥ��A-���;dE��>ߥ��A-���;hE��>��A-���;lE��>��A-���;pE��>��A-���;tE��>��A-���;xE��>��A-���;|E��> ��A-���;E��>%��A-���;E��>=��A-���;E��>I��A-���;E��>K��A-���;E��>Q��A-���;E��>]��A-���;E��>s��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>ɦ��A-���;E��>ͦ��A-���;E��>Ϧ��A-���;E��>զ��A-���;E��>ߦ��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>��A-���;E��>#��A-���;E��>)��A-���;E��>-��A-���;E��>E��A-���;E��>M��A-���;E��>W��A-���;E��>Y��A-���;�F��>e��A-���;F��>k��A-���;F��>o��A-���; F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���; F��>��A-���;$F��>ɧ��A-���;(F��>ѧ��A-���;,F��>ק��A-���;0F��>��A-���;4F��>��A-���;8F��>��A-���;<F��>��A-���;@F��> ��A-���;DF��>��A-���;HF��>)��A-���;LF��>+��A-���;PF��>7��A-���;TF��>;��A-���;XF��>U��A-���;\F��>_��A-���;`F��>m��A-���;dF��>}��A-���;hF��>��A-���;lF��>��A-���;pF��>��A-���;tF��>��A-���;xF��>��A-���;|F��>Ǩ��A-���;F��>ר��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>1��A-���;F��>7��A-���;F��>9��A-���;F��>C��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>٩��A-���;F��>ߩ��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>��A-���;F��>5��A-���;F��>9��A-���;F��>;��A-���;F��>G��A-���;F��>M��A-���;F��>W��A-���;F��>Y��A-���;�G��>]��A-���;G��>k��A-���;G��>q��A-���; G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���; G��>��A-���;$G��>Ū��A-���;(G��>ɪ��A-���;,G��>��A-���;0G��>��A-���;4G��>��A-���;8G��>��A-���;<G��>��A-���;@G��> ��A-���;DG��> ��A-���;HG��>��A-���;LG��>��A-���;PG��>M��A-���;TG��>[��A-���;XG��>q��A-���;\G��>s��A-���;`G��>��A-���;dG��>��A-���;hG��>��A-���;lG��>��A-���;pG��>��A-���;tG��>��A-���;xG��>��A-���;|G��>ū��A-���;G��>ӫ��A-���;G��>׫��A-���;G��>ݫ��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��> ��A-���;G��>��A-���;G��>��A-���;G��>'��A-���;G��>7��A-���;G��>9��A-���;G��>E��A-���;G��>O��A-���;G��>W��A-���;G��>[��A-���;G��>a��A-���;G��>c��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>٬��A-���;G��>��A-���;G��>��A-���;G��>��A-���;G��>��A-���;�H��>��A-���;H��>��A-���;H��>��A-���; H��>��A-���;H��>?��A-���;H��>E��A-���;H��>S��A-���;H��>]��A-���; H��>_��A-���;$H��>e��A-���;(H��>��A-���;,H��>��A-���;0H��>��A-���;4H��>í��A-���;8H��>˭��A-���;<H��>ѭ��A-���;@H��>խ��A-���;DH��>ۭ��A-���;HH��>��A-���;LH��>��A-���;PH��>��A-���;TH��>��A-���;XH��>��A-���;\H��>��A-���;`H��>��A-���;dH��>#��A-���;hH��>+��A-���;lH��>I��A-���;pH��>M��A-���;tH��>O��A-���;xH��>Y��A-���;|H��>a��A-���;H��>g��A-���;H��>k��A-���;H��>q��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>Ů��A-���;H��>Ѯ��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��> ��A-���;H��>��A-���;H��>'��A-���;H��>+��A-���;H��>3��A-���;H��>C��A-���;H��>O��A-���;H��>W��A-���;H��>]��A-���;H��>m��A-���;H��>u��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>��A-���;H��>��A-���;�I��>��A-���;I��>��A-���;I��>��A-���; I��>ϯ��A-���;I��>կ��A-���;I��>��A-���;I��>��A-���;I��>��A-���; I��>��A-���;$I��>?��A-���;(I��>A��A-���;,I��>G��A-���;0I��>K��A-���;4I��>Q��A-���;8I��>S��A-���;<I��>i��A-���;@I��>{��A-���;DI��>}��A-���;HI��>��A-���;LI��>��A-���;PI��>��A-���;TI��>��A-���;XI��>˰��A-���;\I��>ϰ��A-���;`I��>��A-���;dI��>��A-���;hI��>��A-���;lI��>��A-���;pI��>��A-���;tI��>��A-���;xI��>��A-���;|I��>��A-���;I��>��A-���;I��>��A-���;I��>1��A-���;I��>A��A-���;I��>M��A-���;I��>[��A-���;I��>e��A-���;I��>s��A-���;I��>y��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>ӱ��A-���;I��>ݱ��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>��A-���;I��>-��A-���;I��>?��A-���;I��>I��A-���;I��>[��A-���;I��>c��A-���;I��>i��A-���;I��>m��A-���;I��>{��A-���;I��>��A-���;�J��>��A-���;J��>��A-���;J��>��A-���; J��>��A-���;J��>ò��A-���;J��>Dz��A-���;J��>Ӳ��A-���;J��>��A-���; J��>��A-���;$J��>��A-���;(J��>��A-���;,J��> ��A-���;0J��>��A-���;4J��>��A-���;8J��>'��A-���;<J��>-��A-���;@J��>?��A-���;DJ��>E��A-���;HJ��>w��A-���;LJ��>}��A-���;PJ��>��A-���;TJ��>��A-���;XJ��>��A-���;\J��>��A-���;`J��>��A-���;dJ��>ų��A-���;hJ��>˳��A-���;lJ��>��A-���;pJ��>��A-���;tJ��>��A-���;xJ��>��A-���;|J��> ��A-���;J��> ��A-���;J��>��A-���;J��>��A-���;J��>5��A-���;J��>=��A-���;J��>C��A-���;J��>I��A-���;J��>[��A-���;J��>e��A-���;J��>g��A-���;J��>k��A-���;J��>w��A-���;J��>��A-���;J��>��A-���;J��>��A-���;J��>��A-���;J��>��A-���;J��>��A-���;J��>Ǵ��A-���;J��>ݴ��A-���;J��>��A-���;J��>��A-���;J��>��A-���;J��>��A-���;J��> ��A-���;J��>��A-���;J��>-��A-���;J��>?��A-���;J��>K��A-���;J��>g��A-���;J��>i��A-���;J��>o��A-���;�K��>s��A-���;K��>y��A-���;K��>��A-���; K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���; K��>��A-���;$K��>յ��A-���;(K��>ߵ��A-���;,K��>��A-���;0K��>��A-���;4K��>��A-���;8K��>��A-���;<K��> ��A-���;@K��>��A-���;DK��>)��A-���;HK��>/��A-���;LK��>3��A-���;PK��>9��A-���;TK��>G��A-���;XK��>W��A-���;\K��>Y��A-���;`K��>_��A-���;dK��>c��A-���;hK��>o��A-���;lK��>��A-���;pK��>��A-���;tK��>��A-���;xK��>��A-���;|K��>��A-���;K��>��A-���;K��>��A-���;K��>׶��A-���;K��>۶��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��> ��A-���;K��>��A-���;K��>��A-���;K��>)��A-���;K��>5��A-���;K��>G��A-���;K��>U��A-���;K��>m��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>˷��A-���;K��>ѷ��A-���;K��>ӷ��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>��A-���;K��>!��A-���;K��>'��A-���;�L��>+��A-���;L��>-��A-���;L��>9��A-���; L��>U��A-���;L��>g��A-���;L��>u��A-���;L��>��A-���;L��>��A-���; L��>��A-���;$L��>��A-���;(L��>��A-���;,L��>��A-���;0L��>��A-���;4L��>Ǹ��A-���;8L��>͸��A-���;<L��>ո��A-���;@L��>��A-���;DL��>��A-���;HL��>��A-���;LL��>��A-���;PL��>��A-���;TL��>��A-���;XL��>��A-���;\L��>/��A-���;`L��>9��A-���;dL��>;��A-���;hL��>G��A-���;lL��>Q��A-���;pL��>c��A-���;tL��>��A-���;xL��>��A-���;|L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>˹��A-���;L��>ѹ��A-���;L��>ݹ��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��> ��A-����;L��>��A-����;L��>%��A-����;L��>)��A-����;L��>+��A-����;L��>A��A-����;L��>S��A-����;L��>U��A-����;L��>_��A-����;L��>a��A-����;L��>e��A-���;L��>y��A-���;L��>}��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;L��>��A-���;�M��>��A-���;M��>˺��A-���;M��>ݺ��A-���; M��>��A-���;M��>��A-���;M��>��A-���;M��> ��A-���;M��>��A-���; M��>'��A-���;$M��>-��A-���;(M��>=��A-���;,M��>C��A-���;0M��>K��A-���;4M��>O��A-���;8M��>[��A-���;<M��>a��A-���;@M��>i��A-���;DM��>m��A-���;HM��>��A-���;LM��>��A-���;PM��>��A-���;TM��>��A-���;XM��>ɻ��A-���;\M��>ϻ��A-���;`M��>ۻ��A-���;dM��>��A-���;hM��>��A-���;lM��>��A-���;pM��>��A-���;tM��>��A-���;xM��>#��A-���;|M��>3��A-���;M��>;��A-���;M��>A��A-���;M��>E��A-���;M��>]��A-���;M��>o��A-���;M��>w��A-���;M��>��A-���;M��>��A-���;M��>��A-���;M��>��A-���;M��>��A-���;M��>��A-���;M��>Ѽ��A-���;M��>ռ��A-���;M��>��A-���;M��>��A-���;M��>��A-���;M��> ��A-���;M��>��A-���;M��>��A-���;M��>��A-���;M��>5��A-���;M��>A��A-���;M��>O��A-���;M��>Y��A-���;M��>_��A-���;M��>a��A-���;M��>g��A-���;M��>k��A-���;M��>q��A-���;M��>��A-���;M��>��A-���;�N��>��A-���;N��>��A-���;N��>��A-���; N��>��A-���;N��>��A-���;N��>ͽ��A-���;N��>ѽ��A-���;N��>��A-� ��; N��>��A-� ��;$N��>��A-� ��;(N��>��A-� ��;,N��> ��A-� ��;0N��>��A-� ��;4N��>!��A-� ��;8N��>%��A-� ��;<N��>'��A-� ��;@N��>[��A-� ��;DN��>]��A-� ��;HN��>o��A-� ��;LN��>u��A-� ��;PN��>y��A-� ��;TN��>��A-� ��;XN��>��A-� ��;\N��>��A-� ��;`N��>��A-� ��;dN��>��A-� ��;hN��>��A-� ��;lN��>��A-� ��;pN��>��A-� ��;tN��>��A-� ��;xN��>Ͼ��A-� ��;|N��>پ��A-� ��;N��>۾��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>��A-� ��;N��> ��A-� ��;N��>3��A-� ��;N��>9��A-� ��;N��>M��A-� ��;N��>]��A-� ��;N��>_��A-� ��;N��>k��A-� ��;N��>q��A-� ��;N��>{��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>��A-� ��;N��>Ͽ��A-� ��;N��>տ��A-� ��;N��>ݿ��A-� ��;N��>��A-� ��;N��>��A-���;N��>��A-���;N��>��A-���;N��>��A-���;N��>��A-���;N��>��A-���;N��>)��A-���;�O��>/��A-���;O��>1��A-���;O��>7��A-���; O��>;��A-���;O��>G��A-���;O��>e��A-���;O��>m��A-���;O��>}��A-���; O��>��A-���;$O��>��A-���;(O��>��A-���;,O��>��A-���;0O��>��A-���;4O��>��A-���;8O��>��A-���;<O��>��A-���;@O��>��A-���;DO��>��A-���;HO��>��A-���;LO��>��A-���;PO��>��A-���;TO��> ��A-���;XO��>��A-���;\O��>��A-���;`O��>+��A-���;dO��>3��A-���;hO��>7��A-���;lO��>E��A-���;pO��>I��A-���;tO��>[��A-���;xO��>s��A-���;|O��>y��A-���;O��>{��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>!��A-���;O��>/��A-���;O��>?��A-���;O��>K��A-���;O��>M��A-���;O��>S��A-���;O��>]��A-���;O��>w��A-���;O��>{��A-���;O��>}��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;O��>��A-���;�P��>��A-���;P��>��A-���;P��>��A-���; P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���; P��>��A-���;$P��>%��A-���;(P��>G��A-���;,P��>I��A-���;0P��>O��A-���;4P��>e��A-���;8P��>g��A-���;<P��>q��A-���;@P��>��A-���;DP��>��A-���;HP��>��A-���;LP��>��A-���;PP��>��A-���;TP��>��A-���;XP��>��A-���;\P��>��A-���;`P��>��A-���;dP��>��A-���;hP��>��A-���;lP��>��A-���;pP��>��A-���;tP��>��A-���;xP��>��A-���;|P��>��A-���;P��>��A-���;P��>��A-���;P��>-��A-���;P��>3��A-���;P��>7��A-���;P��>U��A-���;P��>W��A-���;P��>a��A-���;P��>o��A-���;P��>s��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��>��A-���;P��> ��A-���;P��>��A-���;P��>��A-���;P��>A��A-���;P��>G��A-���;P��>Q��A-���;P��>_��A-���;P��>k��A-���;P��>o��A-���;�Q��>u��A-���;Q��>w��A-���;Q��>��A-���; Q��>��A-���;Q��>��A-���;Q��>��A-���;Q��>��A-���;Q��>��A-���; Q��>��A-���;$Q��>��A-���;(Q��>��A-���;,Q��>��A-���;0Q��>��A-���;4Q��>#��A-���;8Q��>5��A-���;<Q��>A��A-���;@Q��>O��A-���;DQ��>U��A-���;HQ��>Y��A-���;LQ��>e��A-���;PQ��>��A-���;TQ��>��A-���;XQ��>��A-���;\Q��>��A-���;`Q��>��A-���;dQ��>��A-���;hQ��>��A-���;lQ��>��A-���;pQ��>��A-���;tQ��>��A-���;xQ��>��A-���;|Q��>��A-���;Q��>��A-���;Q��> ��A-���;Q��>��A-���;Q��>��A-���;Q��>-��A-���;Q��>1��A-���;Q��>9��A-���;Q��>W��A-���;Q��>c��A-���;Q��>g��A-���;Q��>s��A-���;Q��>u��A-���;Q��>��A-���;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-� ��;Q��>��A-�!��;Q��>��A-�!��;Q��>��A-�!��;Q��>'��A-�!��;Q��>)��A-�!��;Q��>9��A-�!��;Q��>?��A-�!��;Q��>S��A-�!��;Q��>W��A-�!��;�R��>k��A-�!��;R��>��A-�"��;R��>��A-�"��; R��>��A-�"��;R��>��A-�"��;R��>��A-�"��;R��>��A-�"��;R��>��A-�"��; R��>��A-�"��;$R��>��A-�"��;(R��>��A-�"��;,R��>��A-�#��;0R��>��A-�#��;4R��>��A-�#��;8R��>��A-�#��;<R��>��A-�#��;@R��>��A-�#��;DR��>��A-�#��;HR��>��A-�#��;LR��>��A-�#��;PR��>��A-�#��;TR��>��A-�$��;XR��>/��A-�$��;\R��>7��A-�$��;`R��>=��A-�$��;dR��>A��A-�$��;hR��>S��A-�$��;lR��>_��A-�$��;pR��>k��A-�$��;tR��>y��A-�$��;xR��>}��A-�$��;|R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�%��;R��>��A-�&��;R��>��A-�&��;R��>��A-�&��;R��>��A-�&��;R��> ��A-�&��;R��>%��A-�&��;R��>7��A-�&��;R��>9��A-�&��;R��>K��A-�&��;R��>U��A-�&��;R��>[��A-�'��;R��>i��A-�'��;R��>s��A-�'��;R��>u��A-�'��;R��>��A-�'��;R��>��A-�'��;R��>��A-�'��;R��>��A-�'��;R��>��A-�'��;R��>��A-�'��;R��>��A-�(��;R��>��A-�(��;R��>��A-�(��;�S��>��A-�(��;S��>��A-�(��;S��>��A-�(��; S��>��A-�(��;S��>��A-�(��;S��> ��A-�(��;S��>��A-�(��;S��>)��A-�)��; S��>5��A-�)��;$S��>;��A-�)��;(S��>S��A-�)��;,S��>Y��A-�)��;0S��>c��A-�)��;4S��>e��A-�)��;8S��>q��A-�)��;<S��>��A-�)��;@S��>��A-�)��;DS��>��A-�*��;HS��>��A-�*��;LS��>��A-�*��;PS��>��A-�*��;TS��>��A-�*��;XS��>��A-�*��;\S��>��A-�*��;`S��>��A-�*��;dS��>��A-�*��;hS��>��A-�*��;lS��> ��A-�+��;pS��>��A-�+��;tS��>��A-�+��;xS��>#��A-�+��;|S��>+��A-�+��;S��>A��A-�+��;S��>C��A-�+��;S��>M��A-�+��;S��>Y��A-�+��;S��>a��A-�+��;S��>��A-�,��;S��>��A-�,��;S��>��A-�,��;S��>��A-�,��;S��>��A-�,��;S��>��A-�,��;S��>��A-�,��;S��>��A-�,��;S��>��A-�,��;S��> ��A-�,��;S��>��A-�-��;S��>��A-�-��;S��>%��A-�-��;S��>1��A-�-��;S��>=��A-�-��;S��>?��A-�-��;S��>I��A-�-��;S��>Q��A-�-��;S��>W��A-�-��;S��>[��A-�-��;S��>c��A-�.��;S��>g��A-�.��;S��>��A-�.��;S��>��A-�.��;S��>��A-�.��;S��>��A-�.��;S��>��A-�.��;�T��>��A-�.��;T��>��A-�.��;T��>��A-�.��; T��>��A-�/��;T��>��A-�/��;T��>��A-�/��;T��>��A-�/��;T��>��A-�/��; T��> ��A-�/��;$T��>��A-�/��;(T��>!��A-�/��;,T��>/��A-�/��;0T��>G��A-�/��;4T��>M��A-�0��;8T��>Q��A-�0��;<T��>e��A-�0��;@T��>{��A-�0��;DT��>}��A-�0��;HT��>��A-�0��;LT��>��A-�0��;PT��>��A-�0��;TT��>��A-�0��;XT��>��A-�0��;\T��>��A-�1��;`T��>��A-�1��;dT��>��A-�1��;hT��>��A-�1��;lT��>��A-�1��;pT��>��A-�1��;tT��>��A-�1��;xT��>��A-�1��;|T��>��A-�1��;T��> ��A-�1��;T��>��A-�2��;T��>7��A-�2��;T��>;��A-�2��;T��>M��A-�2��;T��>U��A-�2��;T��>_��A-�2��;T��>a��A-�2��;T��>e��A-�2��;T��>m��A-�2��;T��>y��A-�2��;T��>}��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�3��;T��>��A-�4��;T��>��A-�4��;T��>��A-�4��;T��>��A-�4��;T��>��A-�4��;T��>��A-�4��;T��>!��A-�4��;T��>3��A-�4��;T��>=��A-�4��;T��>K��A-�4��;T��>O��A-�5��;�U��>i��A-�5��;U��>o��A-�5��;U��>��A-�5��; U��>��A-�5��;U��>��A-�5��;U��>��A-�5��;U��>��A-�5��;U��>��A-�5��; U��>��A-�5��;$U��>��A-�6��;(U��>��A-�6��;,U��>��A-�6��;0U��>��A-�6��;4U��>��A-�6��;8U��>��A-�6��;<U��>-��A-�6��;@U��>/��A-�6��;DU��>A��A-�6��;HU��>W��A-�6��;LU��>Y��A-�7��;PU��>]��A-�7��;TU��>i��A-�7��;XU��>k��A-�7��;\U��>q��A-�7��;`U��>w��A-�7��;dU��>}��A-�7��;hU��>��A-�7��;lU��>��A-�7��;pU��>��A-�7��;tU��>��A-�8��;xU��>��A-�8��;|U��>��A-�8��;U��>��A-�8��;U��>��A-�8��;U��>��A-�8��;U��>��A-�8��;U��>��A-�8��;U��> ��A-�8��;U��>��A-�8��;U��>��A-�9��;U��>��A-�9��;U��>5��A-�9��;U��>;��A-�9��;U��>G��A-�9��;U��>Y��A-�9��;U��>a��A-�9��;U��>e��A-�9��;U��>y��A-�9��;U��>��A-�9��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�:��;U��>��A-�;��;U��>��A-�;��;U��>��A-�;��;U��>��A-�;��;U��>��A-�;��;�V��>!��A-�;��;V��>+��A-�;��;V��>C��A-�;��; V��>K��A-�;��;V��>U��A-�;��;V��>i��A-�<��;V��>u��A-�<��;V��>{��A-�<��; V��>��A-�<��;$V��>��A-�<��;(V��>��A-�<��;,V��>��A-�<��;0V��>��A-�<��;4V��>��A-�<��;8V��>��A-�<��;<V��>��A-�=��;@V��>��A-�=��;DV��>��A-�=��;HV��>��A-�=��;LV��>'��A-�=��;PV��>/��A-�=��;TV��>3��A-�=��;XV��>;��A-�=��;\V��>K��A-�=��;`V��>Y��A-�=��;dV��>_��A-�>��;hV��>c��A-�>��;lV��>i��A-�>��;pV��>��A-�>��;tV��>��A-�>��;xV��>��A-�>��;|V��>��A-�>��;V��>��A-�>��;V��>��A-�>��;V��>��A-�>��;V��>��A-�?��;V��>��A-�?��;V��>��A-�?��;V��>��A-�?��;V��>��A-�?��;V��>��A-�?��;V��>��A-�?��;V��>��A-�?��;V��>��A-�?��;V��> ��A-�?��;V��> ��A-�@��;V��>��A-�@��;V��>��A-�@��;V��>#��A-�@��;V��>1��A-�@��;V��>5��A-�@��;V��>7��A-�@��;V��>I��A-�@��;V��>Y��A-�@��;V��>_��A-�@��;V��>e��A-�A��;V��>g��A-�A��;V��>w��A-�A��;V��>��A-�A��;V��>��A-�A��;V��>��A-�A��;V��>��A-�A��;V��>��A-�A��;V��>��A-�A��;�W��>��A-�A��;W��>��A-�B��;W��>��A-�B��; W��>��A-�B��;W��>��A-�B��;W��>��A-�B��;W��>��A-�B��;W��>-��A-�B��; W��>1��A-�B��;$W��>C��A-�B��;(W��>U��A-�B��;,W��>]��A-�C��;0W��>a��A-�C��;4W��>{��A-�C��;8W��>��A-�C��;<W��>��A-�C��;@W��>��A-�C��;DW��>��A-�C��;HW��>��A-�C��;LW��>��A-�C��;PW��>��A-�C��;TW��>��A-�D��;XW��>��A-�D��;\W��>��A-�D��;`W��>��A-�D��;dW��> ��A-�D��;hW��> ��A-�D��;lW��>��A-�D��;pW��>��A-�D��;tW��>!��A-�D��;xW��>'��A-�D��;|W��>?��A-�E��;W��>E��A-�E��;W��>M��A-�E��;W��>W��A-�E��;W��>k��A-�E��;W��>{��A-�E��;W��>��A-�E��;W��>��A-�E��;W��>��A-�E��;W��>��A-�E��;W��>��A-�F��;W��>��A-�F��;W��>��A-�F��;W��>��A-�F��;W��>��A-�F��;W��>��A-�F��;W��>��A-�F��;W��>��A-�F��;W��>#��A-�F��;W��>%��A-�F��;W��>)��A-�G��;W��>+��A-�G��;W��>/��A-�G��;W��>7��A-�G��;W��>M��A-�G��;W��>U��A-�G��;W��>g��A-�G��;W��>s��A-�G��;W��>��A-�G��;W��>��A-�G��;W��>��A-�H��;W��>��A-�H��;W��>��A-�H��;�X��>��A-�H��;X��>��A-�H��;X��>��A-�H��; X��>��A-�H��;X��>��A-�H��;X��>��A-�H��;X��>%��A-�H��;X��>3��A-�I��; X��>9��A-�I��;$X��>C��A-�I��;(X��>E��A-�I��;,X��>O��A-�I��;0X��>Q��A-�I��;4X��>W��A-�I��;8X��>m��A-�I��;<X��>o��A-�I��;@X��>s��A-�I��;DX��>y��A-�J��;HX��>��A-�J��;LX��>��A-�J��;PX��>��A-�J��;TX��>��A-�J��;XX��>��A-�J��;\X��>��A-�J��;`X��>��A-�J��;dX��>��A-�J��;hX��>��A-�J��;lX��>��A-�K��;pX��>��A-�K��;tX��>��A-�K��;xX��>��A-�K��;|X��> ��A-�K��;X��> ��A-�K��;X��>��A-�K��;X��>��A-�K��;X��>��A-�K��;X��>#��A-�K��;X��>)��A-�L��;X��>?��A-�L��;X��>Q��A-�L��;X��>Y��A-�L��;X��>]��A-�L��;X��>_��A-�L��;X��>q��A-�L��;X��>w��A-�L��;X��>{��A-�L��;X��>}��A-�L��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�M��;X��>��A-�N��;X��>��A-�N��;X��>#��A-�N��;X��>%��A-�N��;X��>1��A-�N��;X��>;��A-�N��;X��>C��A-�N��;�Y��>U��A-�N��;Y��>g��A-�N��;Y��>k��A-�N��; Y��>s��A-�O��;Y��>��A-�O��;Y��>��A-�O��;Y��>��A-�O��;Y��>��A-�O��; Y��>��A-�O��;$Y��>��A-�O��;(Y��>��A-�O��;,Y��>��A-�O��;0Y��>��A-�O��;4Y��>��A-�P��;8Y��>��A-�P��;<Y��> ��A-�P��;@Y��>'��A-�P��;DY��>1��A-�P��;HY��>9��A-�P��;LY��>?��A-�P��;PY��>I��A-�P��;TY��>Q��A-�P��;XY��>a��A-�P��;\Y��>o��A-�Q��;`Y��>u��A-�Q��;dY��>{��A-�Q��;hY��>��A-�Q��;lY��>��A-�Q��;pY��>��A-�Q��;tY��>��A-�Q��;xY��>��A-�Q��;|Y��>��A-�Q��;Y��>��A-�Q��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�R��;Y��>��A-�S��;Y��>#��A-�S��;Y��>5��A-�S��;Y��>9��A-�S��;Y��>S��A-�S��;Y��>W��A-�S��;Y��>_��A-�S��;Y��>i��A-�S��;Y��>o��A-�S��;Y��>}��A-�S��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�T��;Y��>��A-�U��;�Z��>��A-�U��;Z��>��A-�U��;Z��>��A-�U��; Z��> ��A-�U��;Z��>��A-�U��;Z��>)��A-�U��;Z��>;��A-�U��;Z��>=��A-�U��; Z��>A��A-�U��;$Z��>M��A-�V��;(Z��>O��A-�V��;,Z��>Y��A-�V��;0Z��>[��A-�V��;4Z��>a��A-�V��;8Z��>m��A-�V��;<Z��>w��A-�V��;@Z��>}��A-�V��;DZ��>��A-�V��;HZ��>��A-�V��;LZ��>��A-�W��;PZ��>��A-�W��;TZ��>��A-�W��;XZ��>��A-�W��;\Z��>��A-�W��;`Z��>��A-�W��;dZ��>��A-�W��;hZ��>��A-�W��;lZ��>��A-�W��;pZ��>��A-�W��;tZ��> ��A-�X��;xZ��>��A-�X��;|Z��>��A-�X��;Z��>+��A-�X��;Z��>3��A-�X��;Z��>7��A-�X��;Z��>=��A-�X��;Z��>K��A-�X��;Z��>U��A-�X��;Z��>[��A-�X��;Z��>g��A-�Y��;Z��>i��A-�Y��;Z��>s��A-�Y��;Z��>��A-�Y��;Z��>��A-�Y��;Z��>��A-�Y��;Z��>��A-�Y��;Z��>��A-�Y��;Z��>��A-�Y��;Z��>��A-�Y��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>��A-�Z��;Z��>'��A-�Z��;Z��>-��A-�[��;Z��>5��A-�[��;Z��>E��A-�[��;Z��>S��A-�[��;Z��>q��A-�[��;�[��>{��A-�[��;[��>��A-�[��;[��>��A-�[��; [��>��A-�[��;[��>��A-�[��;[��>��A-�\��;[��>��A-�\��;[��>��A-�\��; [��>��A-�\��;$[��>��A-�\��;([��>��A-�\��;,[��>��A-�\��;0[��>%��A-�\��;4[��>)��A-�\��;8[��>1��A-�\��;<[��>5��A-�]��;@[��>C��A-�]��;D[��>O��A-�]��;H[��>Y��A-�]��;L[��>a��A-�]��;P[��>m��A-�]��;T[��>q��A-�]��;X[��>w��A-�]��;\[��>��A-�]��;`[��>��A-�]��;d[��>��A-�^��;h[��>��A-�^��;l[��>��A-�^��;p[��>��A-�^��;t[��>��A-�^��;x[��>��A-�^��;|[��>��A-�^��;[��>��A-�^��;[��>��A-�^��;[��>��A-�^��;[��>��A-�_��;[��>��A-�_��;[��>��A-�_��;[��>��A-�_��;[��>��A-�_��;[��>+��A-�_��;[��>-��A-�_��;[��>=��A-�_��;[��>C��A-�_��;[��>W��A-�_��;[��>[��A-�`��;[��>u��A-�`��;[��>y��A-�`��;[��>��A-�`��;[��>��A-�`��;[��>��A-�`��;[��>��A-�`��;[��>��A-�`��;[��>��A-�`��;[��>��A-�`��;[��>��A-�a��;[��>��A-�a��;[��>��A-�a��;[��>��A-�a��;[��>��A-�a��;[��>��A-�a��;[��>��A-�a��;[��>#��A-�a��;[��>'��A-�a��;�\��>)��A-�a��;\��>9��A-�b��;\��>;��A-�b��; \��>M��A-�b��;\��>Q��A-�b��;\��>W��A-�b��;\��>_��A-�b��;\��>c��A-�b��; \��>i��A-�b��;$\��>u��A-�b��;(\��>w��A-�b��;,\��>}��A-�c��;0\��>��A-�c��;4\��>��A-�c��;8\��>��A-�c��;<\��>��A-�c��;@\��>��A-�c��;D\��>��A-�c��;H\��>��A-�c��;L\��>��A-�c��;P\��>��A-�c��;T\��> ��A-�d��;X\��>��A-�d��;\\��>��A-�d��;`\��>#��A-�d��;d\��>+��A-�d��;h\��>1��A-�d��;l\��>;��A-�d��;p\��>G��A-�d��;t\��>I��A-�d��;x\��>S��A-�d��;|\��>U��A-�e��;\��>m��A-�e��;\��>q��A-�e��;\��>��A-�e��;\��>��A-�e��;\��>��A-�e��;\��>��A-�e��;\��>��A-�e��;\��>��A-�e��;\��>��A-�e��;\��>��A-�f��;\��>��A-�f��;\��>��A-�f��;\��>��A-�f��;\��>!��A-�f��;\��>%��A-�f��;\��>7��A-�f��;\��>?��A-�f��;\��>E��A-�f��;\��>K��A-�f��;\��>W��A-�g��;\��>g��A-�g��;\��>m��A-�g��;\��>u��A-�g��;\��>��A-�g��;\��>��A-�g��;\��>��A-�g��;\��>��A-�g��;\��>��A-�g��;\��>��A-�g��;\��> ��A-�h��;\��>��A-�h��;\��>��A-�h��;�]��>��A-�h��;]��>��A-�h��;]��>!��A-�h��; ]��>)��A-�h��;]��>9��A-�h��;]��>?��A-�h��;]��>S��A-�h��;]��>W��A-�i��; ]��>c��A-�i��;$]��>o��A-�i��;(]��>u��A-�i��;,]��>��A-�i��;0]��>��A-�i��;4]��>��A-�i��;8]��>��A-�i��;<]��>��A-�i��;@]��>��A-�i��;D]��>��A-�j��;H]��>��A-�j��;L]��>��A-�j��;P]��>��A-�j��;T]��>��A-�j��;X]��>��A-�j��;\]��>��A-�j��;`]��>��A-�j��;d]��>��A-�j��;h]��>��A-�j��;l]��>��A-�k��;p]��> ��A-�k��;t]��>��A-�k��;x]��>��A-�k��;|]��>/��A-�k��;]��>=��A-�k��;]��>G��A-�k��;]��>I��A-�k��;]��>S��A-�k��;]��>U��A-�k��;]��>a��A-�l��;]��>g��A-�l��;]��>k��A-�l��;]��>��A-�l��;]��>��A-�l��;]��>��A-�l��;]��>��A-�l��;]��>��A-�l��;]��>��A-�l��;]��>��A-�l��;]��>��A-�m��;]��>��A-�m��;]��>��A-�m��;]��>��A-�m��;]��>��A-�m��;]��>��A-�m��;]��>��A-�m��;]��>��A-�m��;]��>��A-�m��;]��>1��A-�m��;]��>3��A-�n��;]��>7��A-�n��;]��>=��A-�n��;]��>K��A-�n��;]��>O��A-�n��;]��>Q��A-�n��;]��>i��A-�n��;�^��>u��A-�n��;^��>y��A-�n��;^��>��A-�n��; ^��>��A-�o��;^��>��A-�o��;^��>��A-�o��;^��>��A-�o��;^��>��A-�o��; ^��>��A-�o��;$^��>��A-�o��;(^��>��A-�o��;,^��>��A-�o��;0^��>��A-�o��;4^��> ��A-�p��;8^��>��A-�p��;<^��>��A-�p��;@^��>��A-�p��;D^��>-��A-�p��;H^��>3��A-�p��;L^��>;��A-�p��;P^��>K��A-�p��;T^��>Q��A-�p��;X^��>_��A-�p��;\^��>c��A-�q��;`^��>i��A-�q��;d^��>{��A-�q��;h^��>��A-�q��;l^��>��A-�q��;p^��>��A-�q��;t^��>��A-�q��;x^��>��A-�q��;|^��>��A-�q��;^��>��A-�q��;^��>��A-�r��;^��>��A-�r��;^��>��A-�r��;^��>/��A-�r��;^��>5��A-�r��;^��>C��A-�r��;^��>M��A-�r��;^��>_��A-�r��;^��>m��A-�r��;^��>q��A-�r��;^��>}��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�s��;^��>��A-�t��;^��>��A-�t��;^��>��A-�t��;^��>��A-�t��;^��>��A-�t��;^��>��A-�t��;^��> ��A-�t��;^��>1��A-�t��;^��>9��A-�t��;^��>?��A-�t��;^��>[��A-�u��;�_��>a��A-�u��;_��>c��A-�u��;_��>o��A-�u��; _��>��A-�u��;_��>��A-�u��;_��>��A-�u��;_��>��A-�u��;_��>��A-�u��; _��>��A-�u��;$_��>��A-�v��;(_��>��A-�v��;,_��>��A-�v��;0_��>��A-�v��;4_��>��A-�v��;8_��> ��A-�v��;<_��>��A-�v��;@_��>!��A-�v��;D_��>)��A-�v��;H_��>M��A-�v��;L_��>Q��A-�w��;P_��>]��A-�w��;T_��>i��A-�w��;X_��>o��A-�w��;\_��>{��A-�w��;`_��>��A-�w��;d_��>��A-�w��;h_��>��A-�w��;l_��>��A-�w��;p_��>��A-�w��;t_��>��A-�x��;x_��>��A-�x��;|_��>��A-�x��;_��>��A-�x��;_��>��A-�x��;_��>��A-�x��;_��>��A-�x��;_��>��A-�x��;_��>��A-�x��;_��>��A-�x��;_��>/��A-�y��;_��>7��A-�y��;_��>=��A-�y��;_��>A��A-�y��;_��>U��A-�y��;_��>Y��A-�y��;_��>[��A-�y��;_��>e��A-�y��;_��>k��A-�y��;_��>y��A-�y��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�z��;_��>��A-�{��;_��>��A-�{��;_��> ��A-�{��;_��>��A-�{��;_��>��A-�{��;�`��>!��A-�{��;`��>I��A-�{��;`��>O��A-�{��; `��>c��A-�{��;`��>g��A-�{��;`��>s��A-�|��;`��>{��A-�|��;`��>��A-�|��; `��>��A-�|��;$`��>��A-�|��;(`��>��A-�|��;,`��>��A-�|��;0`��>��A-�|��;4`��>��A-�|��;8`��>��A-�|��;<`��>��A-�}��;@`��>��A-�}��;D`��>'��A-�}��;H`��>/��A-�}��;L`��>E��A-�}��;P`��>M��A-�}��;T`��>c��A-�}��;X`��>k��A-�}��;\`��>q��A-�}��;``��>��A-�}��;d`��>��A-�~��;h`��>��A-�~��;l`��>��A-�~��;p`��>��A-�~��;t`��>��A-�~��;x`��>��A-�~��;|`��>��A-�~��;`��>��A-�~��;`��>��A-�~��;`��>��A-�~��;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>+��A-���;`��>/��A-���;`��>5��A-���;`��>C��A-���;`��>G��A-���;`��>O��A-���;`��>g��A-���;`��>k��A-���;`��>q��A-���;`��>w��A-���;`��>y��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;`��>��A-���;�a��>��A-���;a��>��A-���;a��>��A-���; a��>!��A-���;a��>7��A-���;a��>=��A-���;a��>U��A-���;a��>u��A-���; a��>{��A-���;$a��>��A-���;(a��>��A-���;,a��>��A-���;0a��>��A-���;4a��>��A-���;8a��>��A-���;<a��>��A-���;@a��>��A-���;Da��>��A-���;Ha��> ��A-���;La��>��A-���;Pa��>��A-���;Ta��>��A-���;Xa��>#��A-���;\a��>'��A-���;`a��>3��A-���;da��>;��A-���;ha��>A��A-���;la��>W��A-���;pa��>_��A-���;ta��>e��A-���;xa��>i��A-���;|a��>w��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��> ��A-���;a��>��A-���;a��>A��A-���;a��>Y��A-���;a��>[��A-���;a��>_��A-���;a��>g��A-���;a��>s��A-���;a��>w��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��>��A-���;a��> ��A-���;�b��> ��A-���;b��>��A-���;b��>!��A-���; b��>%��A-���;b��>+��A-���;b��>E��A-���;b��>K��A-���;b��>U��A-���; b��>c��A-���;$b��>u��A-���;(b��>��A-���;,b��>��A-���;0b��>��A-���;4b��>��A-���;8b��>��A-���;<b��>��A-���;@b��>��A-���;Db��>��A-���;Hb��>��A-���;Lb��>��A-���;Pb��>��A-���;Tb��>��A-���;Xb��>��A-���;\b��> ��A-���;`b��>��A-���;db��>!��A-���;hb��>)��A-���;lb��>5��A-���;pb��>G��A-���;tb��>Q��A-���;xb��>c��A-���;|b��>k��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��> ��A-���;b��> ��A-���;b��>5��A-���;b��>7��A-���;b��>S��A-���;b��>[��A-���;b��>a��A-���;b��>g��A-���;b��>y��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;b��>��A-���;�c��> ��A-���;c��>��A-���;c��>-��A-���; c��>1��A-���;c��>C��A-���;c��>O��A-���;c��>Q��A-���;c��>U��A-���; c��>c��A-���;$c��>i��A-���;(c��>s��A-���;,c��>y��A-���;0c��>��A-���;4c��>��A-���;8c��>��A-���;<c��>��A-���;@c��>��A-���;Dc��>��A-���;Hc��>��A-���;Lc��>��A-���;Pc��>��A-���;Tc��>��A-���;Xc��>��A-���;\c��>��A-���;`c��>��A-���;dc��>��A-���;hc��>��A-���;lc��>��A-���;pc��> ��A-���;tc��>!��A-���;xc��>'��A-���;|c��>-��A-���;c��>5��A-���;c��>G��A-���;c��>Y��A-���;c��>c��A-���;c��>e��A-���;c��>o��A-���;c��>q��A-���;c��>w��A-���;c��>{��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>��A-���;c��>%��A-���;c��>1��A-���;c��>7��A-���;c��>;��A-���;c��>A��A-���;�d��>O��A-���;d��>_��A-���;d��>a��A-���; d��>m��A-���;d��>q��A-���;d��>w��A-���;d��>��A-���;d��>��A-���; d��>��A-���;$d��>��A-���;(d��>��A-���;,d��>��A-���;0d��>��A-���;4d��>��A-���;8d��> ��A-���;<d��>��A-���;@d��>!��A-���;Dd��>%��A-���;Hd��>?��A-���;Ld��>C��A-���;Pd��>Q��A-���;Td��>[��A-���;Xd��>m��A-���;\d��>{��A-���;`d��>��A-���;dd��>��A-���;hd��>��A-���;ld��>��A-���;pd��>��A-���;td��>��A-���;xd��>��A-���;|d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>-��A-���;d��>/��A-���;d��>?��A-���;d��>G��A-���;d��>M��A-���;d��>u��A-���;d��>}��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>��A-���;d��>)��A-���;d��>7��A-���;d��>A��A-���;d��>C��A-���;d��>O��A-���;d��>Y��A-���;d��>a��A-���;d��>e��A-���;d��>m��A-���;d��>s��A-���;�e��>y��A-���;e��>��A-���;e��>��A-���; e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���; e��>��A-���;$e��>��A-���;(e��> ��A-���;,e��>��A-���;0e��>��A-���;4e��>+��A-���;8e��>1��A-���;<e��>Q��A-���;@e��>U��A-���;De��>g��A-���;He��>m��A-���;Le��>o��A-���;Pe��>{��A-���;Te��>��A-���;Xe��>��A-���;\e��>��A-���;`e��>��A-���;de��>��A-���;he��>��A-���;le��>��A-���;pe��>��A-���;te��>��A-���;xe��>��A-���;|e��>��A-���;e��>��A-���;e��> ��A-���;e��>��A-���;e��>'��A-���;e��>/��A-���;e��>A��A-���;e��>K��A-���;e��>M��A-���;e��>W��A-���;e��>_��A-���;e��>c��A-���;e��>i��A-���;e��>u��A-���;e��>{��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��>��A-���;e��> ��A-���;e��>��A-���;e��>+��A-���;e��>/��A-���;e��>I��A-���;e��>M��A-���;�f��>[��A-���;f��>e��A-���;f��>q��A-���; f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���; f��>��A-���;$f��>��A-���;(f��>��A-���;,f��>��A-���;0f��>��A-���;4f��>��A-���;8f��>��A-���;<f��>��A-���;@f��>��A-���;Df��>��A-���;Hf��>��A-���;Lf��>��A-���;Pf��>+��A-���;Tf��>-��A-���;Xf��>3��A-���;\f��>?��A-���;`f��>I��A-���;df��>Q��A-���;hf��>]��A-���;lf��>a��A-���;pf��>o��A-���;tf��>s��A-���;xf��>y��A-���;|f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>��A-���;f��>�A-���;f��>#�A-���;f��>'�A-���;f��>-�A-���;f��>/�A-���;f��>3�A-���;f��>;�A-���;f��>K�A-���;f��>Y�A-���;f��>k�A-���;f��>�A-���;f��>�A-���;f��>�A-���;f��>�A-���;f��>�A-���;f��>�A-���;f��>�A-���;f��>�A-���;f��>�A-���;f��>�A-���;�g��>�A-���;g��>�A-���;g��>�A-���; g��>�A-���;g��>�A-���;g��>#�A-���;g��>)�A-���;g��>7�A-���; g��>;�A-���;$g��>=�A-���;(g��>Y�A-���;,g��>q�A-���;0g��>y�A-���;4g��>}�A-���;8g��>�A-���;<g��>�A-���;@g��>�A-���;Dg��>�A-���;Hg��>�A-���;Lg��>�A-���;Pg��>�A-���;Tg��>!�A-���;Xg��>'�A-���;\g��>+�A-���;`g��>7�A-���;dg��>9�A-���;hg��>E�A-���;lg��>I�A-���;pg��>O�A-���;tg��>c�A-���;xg��>m�A-���;|g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��> �A-���;g��> �A-���;g��>�A-���;g��>!�A-���;g��>)�A-���;g��>9�A-���;g��>E�A-���;g��>S�A-���;g��>]�A-���;g��>{�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;g��>�A-���;�h��>�A-���;h��>�A-���;h��>�A-���; h��>�A-���;h��>#�A-���;h��>%�A-���;h��>/�A-���;h��>=�A-���; h��>C�A-���;$h��>I�A-���;(h��>g�A-���;,h��>k�A-���;0h��>s�A-���;4h��>�A-���;8h��>�A-���;<h��>�A-���;@h��>�A-���;Dh��>�A-���;Hh��>�A-���;Lh��>�A-���;Ph��>�A-���;Th��>�A-���;Xh��>�A-���;\h��>�A-���;`h��>�A-���;dh��>�A-���;hh��>�A-���;lh��>�A-���;ph��>�A-���;th��>1�A-���;xh��>9�A-���;|h��>C�A-���;h��>E�A-���;h��>Q�A-���;h��>U�A-���;h��>a�A-���;h��>m�A-���;h��>s�A-���;h��>u�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��>�A-���;h��> �A-���;h��>�A-���;h��>�A-���;h��>)�A-���;h��>?�A-���;h��>G�A-���;h��>Q�A-���;h��>S�A-���;h��>]�A-���;h��>c�A-���;h��>e�A-���;h��>i�A-���;h��>w�A-���;h��>}�A-���;�i��>�A-���;i��>�A-���;i��>�A-���; i��>�A-���;i��>�A-���;i��>�A-���;i��>�A-���;i��>�A-���; i��>�A-���;$i��>�A-���;(i��>�A-���;,i��>�A-���;0i��>�A-���;4i��>�A-���;8i��>�A-���;<i��>�A-���;@i��>�A-���;Di��>#�A-���;Hi��>/�A-���;Li��>C�A-���;Pi��>_�A-���;Ti��>s�A-���;Xi��>}�A-���;\i��>�A-���;`i��>�A-���;di��>�A-���;hi��>�A-���;li��>�A-���;pi��>�A-���;ti��>�A-���;xi��>�A-���;|i��>�A-���;i��>�A-���;i��>�A-���;i��>�A-���;i��>�A-���;i��>�A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��>+ �A-���;i��>3 �A-���;i��>= �A-���;i��>W �A-���;i��>[ �A-���;i��>] �A-���;i��>c �A-���;i��>g �A-���;i��>u �A-���;i��>y �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��> �A-���;i��>- �A-���;�j��>3 �A-���;j��>A �A-���;j��>K �A-���; j��>o �A-���;j��>q �A-���;j��>u �A-���;j��>{ �A-���;j��> �A-���; j��> �A-���;$j��> �A-���;(j��> �A-���;,j��> �A-���;0j��> �A-���;4j��> �A-���;8j��> �A-���;<j��> �A-���;@j��>% �A-���;Dj��>/ �A-���;Hj��>U �A-���;Lj��>[ �A-���;Pj��>_ �A-���;Tj��>a �A-���;Xj��>y �A-���;\j��>} �A-���;`j��> �A-���;dj��> �A-���;hj��> �A-���;lj��> �A-���;pj��> �A-���;tj��> �A-���;xj��> �A-���;|j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��>3 �A-���;j��>= �A-���;j��>K �A-���;j��>O �A-���;j��>[ �A-���;j��>g �A-���;j��>i �A-���;j��>y �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��> �A-���;j��>! �A-���;j��># �A-���;j��>' �A-���;�k��>- �A-���;k��>5 �A-���;k��>? �A-���; k��>S �A-���;k��>c �A-���;k��> �A-���;k��> �A-���;k��> �A-���; k��> �A-���;$k��> �A-���;(k��> �A-���;,k��> �A-���;0k��> �A-���;4k��> �A-���;8k��> �A-���;<k��> �A-���;@k��>�A-���;Dk��>�A-���;Hk��>�A-���;Lk��>�A-���;Pk��>+�A-���;Tk��>G�A-���;Xk��>I�A-���;\k��>M�A-���;`k��>S�A-���;dk��>e�A-���;hk��>q�A-���;lk��>w�A-���;pk��>�A-���;tk��>�A-���;xk��>�A-���;|k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��> �A-���;k��>�A-���;k��>�A-���;k��>3�A-���;k��>7�A-���;k��>?�A-���;k��>Q�A-���;k��>W�A-���;k��>[�A-���;k��>a�A-���;k��>i�A-���;k��>s�A-���;k��>u�A-���;k��>y�A-���;k��>{�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>�A-���;k��>-�A-���;k��>;�A-���;k��>A�A-���;k��>M�A-���;�l��>i�A-���;l��>k�A-���;l��>�A-���; l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���; l��>�A-���;$l��>�A-���;(l��>�A-���;,l��>�A-���;0l��>�A-���;4l��>�A-���;8l��>�A-���;<l��> �A-���;@l��>�A-���;Dl��>)�A-���;Hl��>+�A-���;Ll��>5�A-���;Pl��>G�A-���;Tl��>g�A-���;Xl��>m�A-���;\l��>q�A-���;`l��>s�A-���;dl��>y�A-���;hl��>�A-���;ll��>�A-���;pl��>�A-���;tl��>�A-���;xl��>�A-���;|l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��> �A-���;l��>�A-���;l��>!�A-���;l��>%�A-���;l��>'�A-���;l��>7�A-���;l��>9�A-���;l��>?�A-���;l��>O�A-���;l��>U�A-���;l��>]�A-���;l��>a�A-���;l��>i�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;l��>�A-���;�m��>�A-���;m��>�A-���;m��>'�A-���; m��>3�A-���;m��>9�A-���;m��>;�A-���;m��>Q�A-���;m��>W�A-���; m��>Y�A-���;$m��>e�A-���;(m��>k�A-���;,m��>�A-���;0m��>�A-���;4m��>�A-���;8m��>�A-���;<m��>�A-���;@m��>�A-���;Dm��>�A-���;Hm��>�A-���;Lm��>�A-���;Pm��>�A-���;Tm��>�A-���;Xm��>�A-���;\m��>�A-���;`m��>�A-���;dm��> �A-���;hm��>�A-���;lm��>5�A-���;pm��>=�A-���;tm��>I�A-���;xm��>a�A-���;|m��>q�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��> �A-���;m��>�A-���;m��>%�A-���;m��>'�A-���;m��>-�A-���;m��>9�A-���;m��>C�A-���;m��>E�A-���;m��>O�A-���;m��>U�A-���;m��>W�A-���;m��>c�A-���;m��>o�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;m��>�A-���;�n��>�A-���;n��>�A-���;n��>�A-���; n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���; n��>�A-���;$n��>)�A-���;(n��>A�A-���;,n��>E�A-���;0n��>Q�A-���;4n��>Y�A-���;8n��>]�A-���;<n��>_�A-���;@n��>w�A-���;Dn��>}�A-���;Hn��>�A-���;Ln��>�A-���;Pn��>�A-���;Tn��>�A-���;Xn��>�A-���;\n��>�A-���;`n��>�A-���;dn��>�A-���;hn��>�A-���;ln��>�A-���;pn��>�A-���;tn��>�A-���;xn��>�A-���;|n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��> �A-���;n��>�A-���;n��>�A-���;n��>/�A-���;n��>1�A-���;n��>7�A-���;n��>;�A-���;n��>O�A-���;n��>g�A-���;n��>q�A-���;n��>}�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��> �A-���;n��>�A-���;n��>�A-���;n��>�A-���;n��>!�A-���;n��>'�A-���;n��>=�A-���;n��>Q�A-���;n��>a�A-���;�o��>m�A-���;o��>�A-���;o��>�A-���; o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���; o��>�A-���;$o��>�A-���;(o��>�A-���;,o��>�A-���;0o��>�A-���;4o��>�A-���;8o��>�A-���;<o��>�A-���;@o��>�A-���;Do��> �A-���;Ho��>�A-���;Lo��>#�A-���;Po��>/�A-���;To��>3�A-���;Xo��>9�A-���;\o��>?�A-���;`o��>S�A-���;do��>_�A-���;ho��>k�A-���;lo��>o�A-���;po��>u�A-���;to��>�A-���;xo��>�A-���;|o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>#�A-���;o��>%�A-���;o��>;�A-���;o��>=�A-���;o��>M�A-���;o��>O�A-���;o��>U�A-���;o��>_�A-���;o��>s�A-���;o��>y�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��>�A-���;o��> �A-���;o��>�A-���;�p��>�A-���;p��>!�A-���;p��>-�A-���; p��>1�A-���;p��>7�A-���;p��>U�A-���;p��>c�A-���;p��>g�A-���; p��>o�A-���;$p��>�A-���;(p��>�A-���;,p��>�A-���;0p��>�A-���;4p��>�A-���;8p��>�A-���;<p��>�A-���;@p��>�A-���;Dp��>�A-���;Hp��>�A-���;Lp��>�A-���;Pp��>�A-���;Tp��>�A-���;Xp��>�A-���;\p��>�A-���;`p��>�A-���;dp��>�A-���;hp��>#�A-���;lp��>;�A-���;pp��>?�A-���;tp��>]�A-���;xp��>q�A-���;|p��>w�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��> �A-���;p��>�A-���;p��>%�A-���;p��>1�A-���;p��>5�A-���;p��>;�A-���;p��>M�A-���;p��>O�A-���;p��>S�A-���;p��>e�A-���;p��>g�A-���;p��>w�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;p��>�A-���;�q��>�A-���;q��>�A-���;q��>�A-���; q��>�A-���;q��>+�A-���;q��>=�A-���;q��>K�A-���;q��>W�A-���; q��>]�A-���;$q��>o�A-���;(q��>s�A-���;,q��>�A-���;0q��>�A-���;4q��>�A-���;8q��>�A-���;<q��>�A-���;@q��>�A-���;Dq��>�A-���;Hq��>�A-���;Lq��>�A-���;Pq��>�A-���;Tq��>�A-���;Xq��>�A-���;\q��>�A-���;`q��> �A-���;dq��>-�A-���;hq��>3�A-���;lq��>9�A-���;pq��>K�A-���;tq��>Q�A-���;xq��>Y�A-���;|q��>c�A-���;q��>o�A-���;q��>u�A-���;q��>}�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��>�A-���;q��> �A-���;q��> �A-���;q��>+ �A-���;q��>7 �A-���;q��>[ �A-���;q��>_ �A-���;q��>w �A-���;q��>y �A-���;q��> �A-���;q��> �A-���;q��> �A-���;q��> �A-���;q��> �A-���;q��> �A-���;q��> �A-���;�r��> �A-���;r��> �A-���;r��> �A-���; r��> �A-���;r��>!�A-���;r��>!!�A-���;r��>%!�A-���;r��>+!�A-���; r��>?!�A-���;$r��>C!�A-���;(r��>W!�A-���;,r��>]!�A-���;0r��>m!�A-���;4r��>s!�A-���;8r��>u!�A-���;<r��>!�A-���;@r��>!�A-���;Dr��>!�A-���;Hr��>!�A-���;Lr��>!�A-���;Pr��>!�A-���;Tr��>!�A-���;Xr��>!�A-���;\r��>!�A-���;`r��>!�A-���;dr��>!�A-���;hr��>!�A-���;lr��>!�A-���;pr��>!�A-���;tr��>"�A-���;xr��>'"�A-���;|r��>/"�A-���;r��>5"�A-���;r��>9"�A-���;r��>G"�A-���;r��>M"�A-���;r��>S"�A-���;r��>q"�A-���;r��>u"�A-���;r��>{"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��>"�A-���;r��> #�A-���;r��> #�A-���;r��>#�A-���;r��>#�A-���;r��>##�A-���;r��>7#�A-���;r��>A#�A-���;r��>G#�A-���;r��>M#�A-���;r��>[#�A-���;r��>e#�A-���;r��>q#�A-���;r��>s#�A-���;�s��>#�A-���;s��>#�A-���;s��>#�A-���; s��>#�A-���;s��>#�A-���;s��>#�A-���;s��>#�A-���;s��>#�A-���; s��>#�A-���;$s��>#�A-���;(s��>#�A-���;,s��>$�A-���;0s��> $�A-���;4s��>$�A-���;8s��>$�A-���;<s��>-$�A-���;@s��>E$�A-���;Ds��>K$�A-���;Hs��>O$�A-���;Ls��>[$�A-���;Ps��>i$�A-���;Ts��>m$�A-���;Xs��>u$�A-���;\s��>y$�A-���;`s��>$�A-���;ds��>$�A-���;hs��>$�A-���;ls��>$�A-���;ps��>$�A-���;ts��>$�A-���;xs��>$�A-���;|s��>$�A-���;s��>$�A-���;s��>%�A-���;s��>%�A-���;s��> %�A-���;s��>%�A-���;s��>%�A-���;s��>!%�A-���;s��>G%�A-���;s��>K%�A-���;s��>e%�A-���;s��>}%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>%�A-���;s��>&�A-���;s��> &�A-���;s��>&�A-���;s��>+&�A-���;s��>;&�A-���;s��>A&�A-���;s��>I&�A-���;s��>S&�A-���;�t��>Y&�A-���;t��>g&�A-���;t��>q&�A-���; t��>}&�A-���;t��>&�A-���;t��>&�A-���;t��>&�A-���;t��>&�A-���; t��>&�A-���;$t��>&�A-���;(t��>&�A-���;,t��>&�A-���;0t��>&�A-���;4t��>'�A-���;8t��>'�A-���;<t��> '�A-���;@t��>'�A-���;Dt��>'�A-���;Ht��>!'�A-���;Lt��>%'�A-���;Pt��>3'�A-���;Tt��>9'�A-���;Xt��>?'�A-���;\t��>['�A-���;`t��>a'�A-���;dt��>c'�A-���;ht��>m'�A-���;lt��>y'�A-���;pt��>'�A-���;tt��>'�A-���;xt��>'�A-���;|t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>'�A-���;t��>(�A-���;t��> (�A-���;t��>(�A-���;t��>(�A-���;t��>-(�A-����;t��>9(�A-����;t��>M(�A-����;t��>](�A-����;t��>k(�A-����;t��>(�A-����;t��>(�A-����;t��>(�A-����;t��>(�A-����;t��>(�A-����;t��>(�A-���;t��>(�A-���;t��>(�A-���;t��>(�A-���;t��>(�A-���;t��>(�A-���;t��>(�A-���;t��>(�A-���;t��>)�A-���;�u��>/)�A-���;u��>1)�A-���;u��>;)�A-���; u��>C)�A-���;u��>G)�A-���;u��>[)�A-���;u��>a)�A-���;u��>s)�A-���; u��>})�A-���;$u��>)�A-���;(u��>)�A-���;,u��>)�A-���;0u��>)�A-���;4u��>)�A-���;8u��>)�A-���;<u��>)�A-���;@u��>)�A-���;Du��>)�A-���;Hu��>)�A-���;Lu��>)�A-���;Pu��>*�A-���;Tu��>*�A-���;Xu��>-*�A-���;\u��>7*�A-���;`u��>O*�A-���;du��>Q*�A-���;hu��>[*�A-���;lu��>c*�A-���;pu��>s*�A-���;tu��>*�A-���;xu��>*�A-���;|u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>*�A-���;u��>+�A-���;u��>#+�A-���;u��>5+�A-���;u��>;+�A-���;u��>?+�A-���;u��>W+�A-���;u��>i+�A-���;u��>k+�A-���;u��>{+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>+�A-���;u��>,�A-���;u��>,�A-���;�v��>,�A-���;v��>,�A-���;v��>%,�A-���; v��>/,�A-���;v��>G,�A-���;v��>I,�A-���;v��>S,�A-���;v��>k,�A-� ��; v��>q,�A-� ��;$v��>w,�A-� ��;(v��>,�A-� ��;,v��>,�A-� ��;0v��>,�A-� ��;4v��>,�A-� ��;8v��>,�A-� ��;<v��>,�A-� ��;@v��>,�A-� ��;Dv��>,�A-� ��;Hv��>,�A-� ��;Lv��>,�A-� ��;Pv��>,�A-� ��;Tv��> -�A-� ��;Xv��>-�A-� ��;\v��>%-�A-� ��;`v��>--�A-� ��;dv��>Q-�A-� ��;hv��>U-�A-� ��;lv��>a-�A-� ��;pv��>o-�A-� ��;tv��>s-�A-� ��;xv��>-�A-� ��;|v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>-�A-� ��;v��>.�A-� ��;v��> .�A-� ��;v��>.�A-� ��;v��>#.�A-� ��;v��>'.�A-� ��;v��>/.�A-� ��;v��>9.�A-� ��;v��>A.�A-� ��;v��>G.�A-� ��;v��>i.�A-� ��;v��>k.�A-� ��;v��>w.�A-� ��;v��>.�A-� ��;v��>.�A-� ��;v��>.�A-���;v��>.�A-���;v��>.�A-���;v��>.�A-���;v��>.�A-���;v��>.�A-���;v��>.�A-���;�w��>.�A-���;w��>.�A-���;w��>.�A-���; w��>.�A-���;w��>.�A-���;w��>.�A-���;w��>/�A-���;w��>/�A-���; w��>/�A-���;$w��>/�A-���;(w��>+/�A-���;,w��>1/�A-���;0w��>5/�A-���;4w��>I/�A-���;8w��>O/�A-���;<w��>[/�A-���;@w��>q/�A-���;Dw��>w/�A-���;Hw��>y/�A-���;Lw��>/�A-���;Pw��>/�A-���;Tw��>/�A-���;Xw��>/�A-���;\w��>/�A-���;`w��>/�A-���;dw��>/�A-���;hw��>/�A-���;lw��>/�A-���;pw��>/�A-���;tw��>/�A-���;xw��>/�A-���;|w��>/�A-���;w��>/�A-���;w��>0�A-���;w��>0�A-���;w��>'0�A-���;w��>+0�A-���;w��>E0�A-���;w��>K0�A-���;w��>i0�A-���;w��>m0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>0�A-���;w��>1�A-���;w��>)1�A-���;w��>91�A-���;w��>;1�A-���;w��>M1�A-���;w��>S1�A-���;w��>W1�A-���;w��>]1�A-���;w��>c1�A-���;w��>o1�A-���;w��>q1�A-���;�x��>{1�A-���;x��>1�A-���;x��>1�A-���; x��>1�A-���;x��>1�A-���;x��>1�A-���;x��>1�A-���;x��>1�A-���; x��>1�A-���;$x��>1�A-���;(x��>1�A-���;,x��>2�A-���;0x��> 2�A-���;4x��>2�A-���;8x��>A2�A-���;<x��>[2�A-���;@x��>e2�A-���;Dx��>g2�A-���;Hx��>2�A-���;Lx��>2�A-���;Px��>2�A-���;Tx��>2�A-���;Xx��>2�A-���;\x��>2�A-���;`x��>2�A-���;dx��>2�A-���;hx��>2�A-���;lx��>2�A-���;px��>2�A-���;tx��>2�A-���;xx��>2�A-���;|x��>2�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>33�A-���;x��>93�A-���;x��>=3�A-���;x��>c3�A-���;x��>i3�A-���;x��>s3�A-���;x��>y3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>3�A-���;x��>4�A-���;x��> 4�A-���;x��>4�A-���;x��>'4�A-���;x��>)4�A-���;x��>-4�A-���;x��>54�A-���;x��>G4�A-���;x��>Q4�A-���;x��>]4�A-���;x��>4�A-���;�y��>4�A-���;y��>4�A-���;y��>4�A-���; y��>4�A-���;y��>4�A-���;y��>4�A-���;y��>4�A-���;y��>4�A-���; y��>5�A-���;$y��>5�A-���;(y��>#5�A-���;,y��>+5�A-���;0y��>/5�A-���;4y��>15�A-���;8y��>75�A-���;<y��>M5�A-���;@y��>S5�A-���;Dy��>Y5�A-���;Hy��>a5�A-���;Ly��>}5�A-���;Py��>5�A-���;Ty��>5�A-���;Xy��>5�A-���;\y��>5�A-���;`y��>5�A-���;dy��>5�A-���;hy��>5�A-���;ly��>5�A-���;py��>5�A-���;ty��>5�A-���;xy��>5�A-���;|y��>5�A-���;y��>5�A-���;y��>6�A-���;y��>6�A-���;y��>!6�A-���;y��>%6�A-���;y��>'6�A-���;y��>36�A-���;y��>?6�A-���;y��>C6�A-���;y��>I6�A-���;y��>[6�A-���;y��>y6�A-���;y��>6�A-���;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>6�A-� ��;y��>7�A-�!��;y��> 7�A-�!��;y��>7�A-�!��;y��>7�A-�!��;y��>)7�A-�!��;y��>57�A-�!��;y��>G7�A-�!��;y��>K7�A-�!��;y��>M7�A-�!��;�z��>Q7�A-�!��;z��>S7�A-�"��;z��>7�A-�"��; z��>7�A-�"��;z��>7�A-�"��;z��>7�A-�"��;z��>7�A-�"��;z��>7�A-�"��; z��>7�A-�"��;$z��>7�A-�"��;(z��>7�A-�"��;,z��>7�A-�#��;0z��>7�A-�#��;4z��>7�A-�#��;8z��>7�A-�#��;<z��>7�A-�#��;@z��>8�A-�#��;Dz��>8�A-�#��;Hz��>8�A-�#��;Lz��>8�A-�#��;Pz��>#8�A-�#��;Tz��>C8�A-�$��;Xz��>G8�A-�$��;\z��>_8�A-�$��;`z��>e8�A-�$��;dz��>k8�A-�$��;hz��>s8�A-�$��;lz��>}8�A-�$��;pz��>8�A-�$��;tz��>8�A-�$��;xz��>8�A-�$��;|z��>8�A-�%��;z��>8�A-�%��;z��>8�A-�%��;z��>8�A-�%��;z��>8�A-�%��;z��> 9�A-�%��;z��>9�A-�%��;z��>9�A-�%��;z��>9�A-�%��;z��>'9�A-�%��;z��>-9�A-�&��;z��>19�A-�&��;z��>?9�A-�&��;z��>O9�A-�&��;z��>Q9�A-�&��;z��>]9�A-�&��;z��>g9�A-�&��;z��>i9�A-�&��;z��>o9�A-�&��;z��>{9�A-�&��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�'��;z��>9�A-�(��;z��>:�A-�(��;z��>:�A-�(��;�{��>-:�A-�(��;{��>?:�A-�(��;{��>A:�A-�(��; {��>W:�A-�(��;{��>Y:�A-�(��;{��>i:�A-�(��;{��>k:�A-�(��;{��>:�A-�)��; {��>:�A-�)��;${��>:�A-�)��;({��>:�A-�)��;,{��>:�A-�)��;0{��>:�A-�)��;4{��>:�A-�)��;8{��>:�A-�)��;<{��>:�A-�)��;@{��>:�A-�)��;D{��>:�A-�*��;H{��> ;�A-�*��;L{��>;�A-�*��;P{��>;�A-�*��;T{��>;�A-�*��;X{��>%;�A-�*��;\{��>);�A-�*��;`{��>+;�A-�*��;d{��>/;�A-�*��;h{��>=;�A-�*��;l{��>I;�A-�+��;p{��>a;�A-�+��;t{��>k;�A-�+��;x{��>m;�A-�+��;|{��>y;�A-�+��;{��>;�A-�+��;{��>;�A-�+��;{��>;�A-�+��;{��>;�A-�+��;{��>;�A-�+��;{��>;�A-�,��;{��>;�A-�,��;{��>;�A-�,��;{��>;�A-�,��;{��>;�A-�,��;{��>;�A-�,��;{��><�A-�,��;{��> <�A-�,��;{��><�A-�,��;{��><�A-�,��;{��><�A-�-��;{��>!<�A-�-��;{��>%<�A-�-��;{��>9<�A-�-��;{��>C<�A-�-��;{��>]<�A-�-��;{��>i<�A-�-��;{��>u<�A-�-��;{��>y<�A-�-��;{��>{<�A-�-��;{��><�A-�.��;{��><�A-�.��;{��><�A-�.��;{��><�A-�.��;{��><�A-�.��;{��><�A-�.��;{��><�A-�.��;�|��><�A-�.��;|��><�A-�.��;|��><�A-�.��; |��><�A-�/��;|��><�A-�/��;|��><�A-�/��;|��>=�A-�/��;|��> =�A-�/��; |��>=�A-�/��;$|��>=�A-�/��;(|��>-=�A-�/��;,|��>/=�A-�/��;0|��>3=�A-�/��;4|��>G=�A-�0��;8|��>Q=�A-�0��;<|��>W=�A-�0��;@|��>=�A-�0��;D|��>=�A-�0��;H|��>=�A-�0��;L|��>=�A-�0��;P|��>=�A-�0��;T|��>=�A-�0��;X|��>=�A-�0��;\|��>=�A-�1��;`|��>=�A-�1��;d|��>=�A-�1��;h|��>=�A-�1��;l|��>=�A-�1��;p|��>=�A-�1��;t|��>>�A-�1��;x|��> >�A-�1��;||��>>�A-�1��;|��>1>�A-�1��;|��>7>�A-�2��;|��>e>�A-�2��;|��>m>�A-�2��;|��>w>�A-�2��;|��>}>�A-�2��;|��>>�A-�2��;|��>>�A-�2��;|��>>�A-�2��;|��>>�A-�2��;|��>>�A-�2��;|��>>�A-�3��;|��>>�A-�3��;|��>>�A-�3��;|��>>�A-�3��;|��>>�A-�3��;|��>>�A-�3��;|��>>�A-�3��;|��>?�A-�3��;|��>?�A-�3��;|��> ?�A-�3��;|��>?�A-�4��;|��>%?�A-�4��;|��>'?�A-�4��;|��>+?�A-�4��;|��>??�A-�4��;|��>I?�A-�4��;|��>U?�A-�4��;|��>a?�A-�4��;|��>i?�A-�4��;|��>m?�A-�4��;|��>?�A-�5��;�}��>?�A-�5��;}��>?�A-�5��;}��>?�A-�5��; }��>?�A-�5��;}��>?�A-�5��;}��>?�A-�5��;}��>?�A-�5��;}��>?�A-�5��; }��>?�A-�5��;$}��> @�A-�6��;(}��> @�A-�6��;,}��>@�A-�6��;0}��>@�A-�6��;4}��>!@�A-�6��;8}��>/@�A-�6��;<}��>3@�A-�6��;@}��>5@�A-�6��;D}��>S@�A-�6��;H}��>W@�A-�6��;L}��>Y@�A-�7��;P}��>]@�A-�7��;T}��>e@�A-�7��;X}��>o@�A-�7��;\}��>u@�A-�7��;`}��>w@�A-�7��;d}��>@�A-�7��;h}��>@�A-�7��;l}��>@�A-�7��;p}��>@�A-�7��;t}��>@�A-�8��;x}��>@�A-�8��;|}��>@�A-�8��;}��>@�A-�8��;}��>@�A-�8��;}��>A�A-�8��;}��> A�A-�8��;}��>A�A-�8��;}��>A�A-�8��;}��>)A�A-�8��;}��>+A�A-�9��;}��>/A�A-�9��;}��>7A�A-�9��;}��>=A�A-�9��;}��>AA�A-�9��;}��>UA�A-�9��;}��>[A�A-�9��;}��>gA�A-�9��;}��>}A�A-�9��;}��>A�A-�9��;}��>A�A-�:��;}��>A�A-�:��;}��>A�A-�:��;}��>A�A-�:��;}��>A�A-�:��;}��>A�A-�:��;}��>A�A-�:��;}��>A�A-�:��;}��>B�A-�:��;}��>B�A-�:��;}��>%B�A-�;��;}��>'B�A-�;��;}��>3B�A-�;��;}��>7B�A-�;��;}��>=B�A-�;��;�~��>CB�A-�;��;~��>KB�A-�;��;~��>aB�A-�;��; ~��>cB�A-�;��;~��>uB�A-�;��;~��>B�A-�<��;~��>B�A-�<��;~��>B�A-�<��; ~��>B�A-�<��;$~��>B�A-�<��;(~��>B�A-�<��;,~��>B�A-�<��;0~��>B�A-�<��;4~��>B�A-�<��;8~��>B�A-�<��;<~��>B�A-�=��;@~��>B�A-�=��;D~��> C�A-�=��;H~��>!C�A-�=��;L~��>#C�A-�=��;P~��>'C�A-�=��;T~��>)C�A-�=��;X~��>EC�A-�=��;\~��>GC�A-�=��;`~��>KC�A-�=��;d~��>]C�A-�>��;h~��>cC�A-�>��;l~��>iC�A-�>��;p~��>oC�A-�>��;t~��>{C�A-�>��;x~��>}C�A-�>��;|~��>C�A-�>��;~��>C�A-�>��;~��>C�A-�>��;~��>C�A-�>��;~��>C�A-�?��;~��>C�A-�?��;~��>C�A-�?��;~��>C�A-�?��;~��>D�A-�?��;~��>%D�A-�?��;~��>5D�A-�?��;~��>;D�A-�?��;~��>AD�A-�?��;~��>OD�A-�?��;~��>gD�A-�@��;~��>sD�A-�@��;~��>wD�A-�@��;~��>D�A-�@��;~��>D�A-�@��;~��>D�A-�@��;~��>D�A-�@��;~��>D�A-�@��;~��>D�A-�@��;~��>D�A-�@��;~��>D�A-�A��;~��>E�A-�A��;~��>E�A-�A��;~��>E�A-�A��;~��>E�A-�A��;~��>E�A-�A��;~��>E�A-�A��;~��>!E�A-�A��;~��>+E�A-�A��;���>9E�A-�A��;��>CE�A-�B��;��>EE�A-�B��; ��>IE�A-�B��;��>cE�A-�B��;��>oE�A-�B��;��>E�A-�B��;��>E�A-�B��; ��>E�A-�B��;$��>E�A-�B��;(��>E�A-�B��;,��>E�A-�C��;0��>E�A-�C��;4��>E�A-�C��;8��>E�A-�C��;<��>E�A-�C��;@��>E�A-�C��;D��>E�A-�C��;H��>E�A-�C��;L��>E�A-�C��;P��>F�A-�C��;T��>F�A-�D��;X��>F�A-�D��;\��>)F�A-�D��;`��>QF�A-�D��;d��>eF�A-�D��;h��>iF�A-�D��;l��>kF�A-�D��;p��>{F�A-�D��;t��>F�A-�D��;x��>F�A-�D��;|��>F�A-�E��;��>F�A-�E��;��>F�A-�E��;��>F�A-�E��;��>F�A-�E��;��>F�A-�E��;��>F�A-�E��;��>F�A-�E��;��>F�A-�E��;��>G�A-�E��;��>G�A-�F��;��>G�A-�F��;��>1G�A-�F��;��>=G�A-�F��;��>AG�A-�F��;��>OG�A-�F��;��>eG�A-�F��;��>yG�A-�F��;��>G�A-�F��;��>G�A-�F��;��>G�A-�G��;��>G�A-�G��;��>G�A-�G��;��>G�A-�G��;��>G�A-�G��;��>G�A-�G��;��>G�A-�G��;��>G�A-�G��;��>H�A-�G��;��>H�A-�G��;��>H�A-�H��;��>+H�A-�H��;��>1H�A-�H��;���>OH�A-�H��;��>UH�A-�H��;��>[H�A-�H��; ��>]H�A-�H��;��>cH�A-�H��;��>yH�A-�H��;��>H�A-�H��;��>H�A-�I��; ��>H�A-�I��;$��>H�A-�I��;(��>H�A-�I��;,��>H�A-�I��;0��>H�A-�I��;4��>H�A-�I��;8��>H�A-�I��;<��>H�A-�I��;@��>H�A-�I��;D��>H�A-�J��;H��>H�A-�J��;L��>I�A-�J��;P��>I�A-�J��;T��>I�A-�J��;X��>'I�A-�J��;\��>KI�A-�J��;`��>SI�A-�J��;d��>YI�A-�J��;h��>]I�A-�J��;l��>_I�A-�K��;p��>{I�A-�K��;t��>}I�A-�K��;x��>I�A-�K��;|��>I�A-�K��;��>I�A-�K��;��>I�A-�K��;��>I�A-�K��;��>I�A-�K��;��>I�A-�K��;��>I�A-�L��;��>I�A-�L��;��>I�A-�L��;��>I�A-�L��;��>I�A-�L��;��>I�A-�L��;��>J�A-�L��;��>J�A-�L��;��>J�A-�L��;��>J�A-�L��;��>)J�A-�M��;��>+J�A-�M��;Ā��>5J�A-�M��;Ȁ��>GJ�A-�M��;̀��>OJ�A-�M��;Ѐ��>mJ�A-�M��;Ԁ��>J�A-�M��;؀��>J�A-�M��;܀��>J�A-�M��;��>J�A-�M��;��>J�A-�N��;��>J�A-�N��;��>J�A-�N��;��>J�A-�N��;��>J�A-�N��;��>J�A-�N��;��>J�A-�N��;���>J�A-�N��;��>K�A-�N��;��>K�A-�N��; ��>K�A-�O��;��>3K�A-�O��;��>9K�A-�O��;��>IK�A-�O��;��>KK�A-�O��; ��>[K�A-�O��;$��>yK�A-�O��;(��>{K�A-�O��;,��>K�A-�O��;0��>K�A-�O��;4��>K�A-�P��;8��>K�A-�P��;<��>K�A-�P��;@��>K�A-�P��;D��>K�A-�P��;H��>K�A-�P��;L��>K�A-�P��;P��>K�A-�P��;T��>L�A-�P��;X��>L�A-�P��;\��>#L�A-�Q��;`��>-L�A-�Q��;d��>9L�A-�Q��;h��>EL�A-�Q��;l��>YL�A-�Q��;p��>_L�A-�Q��;t��>cL�A-�Q��;x��>eL�A-�Q��;|��>oL�A-�Q��;��>uL�A-�Q��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�R��;��>L�A-�S��;��>L�A-�S��;��>L�A-�S��;��> M�A-�S��;��>1M�A-�S��;��>7M�A-�S��;ā��>AM�A-�S��;ȁ��>SM�A-�S��;́��>UM�A-�S��;Ё��>qM�A-�S��;ԁ��>sM�A-�T��;؁��>yM�A-�T��;܁��>M�A-�T��;��>M�A-�T��;��>M�A-�T��;��>M�A-�T��;��>M�A-�T��;��>M�A-�T��;��>M�A-�T��;��>M�A-�T��;��>M�A-�U��;���>M�A-�U��;��> N�A-�U��;��> N�A-�U��; ��>N�A-�U��;��>N�A-�U��;��>-N�A-�U��;��>CN�A-�U��;��>IN�A-�U��; ��>]N�A-�U��;$��>aN�A-�V��;(��>gN�A-�V��;,��>sN�A-�V��;0��>uN�A-�V��;4��>{N�A-�V��;8��>N�A-�V��;<��>N�A-�V��;@��>N�A-�V��;D��>N�A-�V��;H��>N�A-�V��;L��>N�A-�W��;P��>N�A-�W��;T��>N�A-�W��;X��>N�A-�W��;\��>N�A-�W��;`��>N�A-�W��;d��>O�A-�W��;h��>!O�A-�W��;l��>9O�A-�W��;p��>;O�A-�W��;t��>EO�A-�X��;x��>GO�A-�X��;|��>MO�A-�X��;��>SO�A-�X��;��>WO�A-�X��;��>]O�A-�X��;��>O�A-�X��;��>O�A-�X��;��>O�A-�X��;��>O�A-�X��;��>O�A-�Y��;��>O�A-�Y��;��>O�A-�Y��;��>O�A-�Y��;��>P�A-�Y��;��> P�A-�Y��;��> P�A-�Y��;��>5P�A-�Y��;��>=P�A-�Y��;��>CP�A-�Y��;Ă��>_P�A-�Z��;Ȃ��>aP�A-�Z��;̂��>eP�A-�Z��;Ђ��>sP�A-�Z��;Ԃ��>yP�A-�Z��;؂��>P�A-�Z��;܂��>P�A-�Z��;��>P�A-�Z��;��>P�A-�Z��;��>P�A-�Z��;��>P�A-�[��;��>P�A-�[��;��>P�A-�[��;��>P�A-�[��;��>P�A-�[��;���>P�A-�[��;��>P�A-�[��;��>P�A-�[��; ��>P�A-�[��;��>Q�A-�[��;��>Q�A-�\��;��>Q�A-�\��;��>Q�A-�\��; ��>'Q�A-�\��;$��>3Q�A-�\��;(��>EQ�A-�\��;,��>OQ�A-�\��;0��>QQ�A-�\��;4��>UQ�A-�\��;8��>aQ�A-�\��;<��>cQ�A-�]��;@��>mQ�A-�]��;D��>uQ�A-�]��;H��>Q�A-�]��;L��>Q�A-�]��;P��>Q�A-�]��;T��>Q�A-�]��;X��>Q�A-�]��;\��>Q�A-�]��;`��>Q�A-�]��;d��>Q�A-�^��;h��>Q�A-�^��;l��>Q�A-�^��;p��>Q�A-�^��;t��>R�A-�^��;x��>R�A-�^��;|��> R�A-�^��;��>!R�A-�^��;��>-R�A-�^��;��>3R�A-�^��;��>;R�A-�_��;��>GR�A-�_��;��>cR�A-�_��;��>eR�A-�_��;��>R�A-�_��;��>R�A-�_��;��>R�A-�_��;��>R�A-�_��;��>R�A-�_��;��>R�A-�_��;��>R�A-�`��;��>R�A-�`��;��>R�A-�`��;��>R�A-�`��;ă��>R�A-�`��;ȃ��>S�A-�`��;̃��>5S�A-�`��;Ѓ��>;S�A-�`��;ԃ��>CS�A-�`��;؃��>IS�A-�`��;܃��>MS�A-�a��;��>US�A-�a��;��>S�A-�a��;��>S�A-�a��;��>S�A-�a��;��>S�A-�a��;��>S�A-�a��;��>S�A-�a��;��>S�A-�a��;���>S�A-�a��;��>S�A-�b��;��>S�A-�b��; ��>S�A-�b��;��>S�A-�b��;��>T�A-�b��;��> T�A-�b��;��>T�A-�b��; ��>+T�A-�b��;$��>?T�A-�b��;(��>CT�A-�b��;,��>OT�A-�c��;0��>QT�A-�c��;4��>]T�A-�c��;8��>mT�A-�c��;<��>oT�A-�c��;@��>T�A-�c��;D��>T�A-�c��;H��>T�A-�c��;L��>T�A-�c��;P��>T�A-�c��;T��>T�A-�d��;X��>T�A-�d��;\��>T�A-�d��;`��>T�A-�d��;d��>T�A-�d��;h��>T�A-�d��;l��>T�A-�d��;p��>U�A-�d��;t��>U�A-�d��;x��>U�A-�d��;|��>U�A-�e��;��>)U�A-�e��;��>?U�A-�e��;��>WU�A-�e��;��>kU�A-�e��;��>oU�A-�e��;��>}U�A-�e��;��>U�A-�e��;��>U�A-�e��;��>U�A-�e��;��>U�A-�f��;��>U�A-�f��;��>U�A-�f��;��>U�A-�f��;��>U�A-�f��;��>U�A-�f��;��>U�A-�f��;��>U�A-�f��;Ą��>U�A-�f��;Ȅ��>U�A-�f��;̄��>V�A-�g��;Є��>V�A-�g��;Ԅ��>V�A-�g��;؄��>V�A-�g��;܄��>#V�A-�g��;��>%V�A-�g��;��>=V�A-�g��;��>GV�A-�g��;��>MV�A-�g��;��>OV�A-�g��;��>YV�A-�h��;��>[V�A-�h��;��>aV�A-�h��;���>wV�A-�h��;��>V�A-�h��;��>V�A-�h��; ��>V�A-�h��;��>V�A-�h��;��>V�A-�h��;��>V�A-�h��;��>V�A-�i��; ��>V�A-�i��;$��>V�A-�i��;(��>V�A-�i��;,��>V�A-�i��;0��>V�A-�i��;4��>V�A-�i��;8��>V�A-�i��;<��>W�A-�i��;@��>W�A-�i��;D��>-W�A-�j��;H��>=W�A-�j��;L��>EW�A-�j��;P��>IW�A-�j��;T��>OW�A-�j��;X��>gW�A-�j��;\��>mW�A-�j��;`��>{W�A-�j��;d��>W�A-�j��;h��>W�A-�j��;l��>W�A-�k��;p��>W�A-�k��;t��>W�A-�k��;x��>W�A-�k��;|��>W�A-�k��;��>W�A-�k��;��>W�A-�k��;��>W�A-�k��;��>W�A-�k��;��>X�A-�k��;��>X�A-�l��;��>X�A-�l��;��>5X�A-�l��;��>AX�A-�l��;��>iX�A-�l��;��>qX�A-�l��;��>X�A-�l��;��>X�A-�l��;��>X�A-�l��;��>X�A-�l��;��>X�A-�m��;��>X�A-�m��;ą��>X�A-�m��;ȅ��>X�A-�m��;̅��>Y�A-�m��;Ѕ��>Y�A-�m��;ԅ��>Y�A-�m��;؅��>Y�A-�m��;܅��>;Y�A-�m��;��>MY�A-�m��;��>[Y�A-�n��;��>gY�A-�n��;��>kY�A-�n��;��>Y�A-�n��;��>Y�A-�n��;��>Y�A-�n��;��>Y�A-�n��;���>Y�A-�n��;��>Y�A-�n��;��>Y�A-�n��; ��>Y�A-�o��;��> Z�A-�o��;��>Z�A-�o��;��>Z�A-�o��;��>!Z�A-�o��; ��>CZ�A-�o��;$��>KZ�A-�o��;(��>QZ�A-�o��;,��>UZ�A-�o��;0��>WZ�A-�o��;4��>[Z�A-�p��;8��>iZ�A-�p��;<��>Z�A-�p��;@��>Z�A-�p��;D��>Z�A-�p��;H��>Z�A-�p��;L��>Z�A-�p��;P��>Z�A-�p��;T��>Z�A-�p��;X��>Z�A-�p��;\��>Z�A-�q��;`��>Z�A-�q��;d��>Z�A-�q��;h��>Z�A-�q��;l��>Z�A-�q��;p��>Z�A-�q��;t��> [�A-�q��;x��>[�A-�q��;|��>[�A-�q��;��>#[�A-�q��;��>)[�A-�r��;��>3[�A-�r��;��>A[�A-�r��;��>G[�A-�r��;��>W[�A-�r��;��>i[�A-�r��;��>w[�A-�r��;��>[�A-�r��;��>[�A-�r��;��>[�A-�r��;��>[�A-�s��;��>[�A-�s��;��>[�A-�s��;��>[�A-�s��;��>[�A-�s��;��>[�A-�s��;Ć��>[�A-�s��;Ȇ��>[�A-�s��;̆��>[�A-�s��;І��>[�A-�s��;Ԇ��>[�A-�t��;؆��> \�A-�t��;܆��>\�A-�t��;��>\�A-�t��;��>\�A-�t��;��>#\�A-�t��;��>1\�A-�t��;��>A\�A-�t��;��>e\�A-�t��;��>s\�A-�t��;��>y\�A-�u��;���>}\�A-�u��;��>\�A-�u��;��>\�A-�u��; ��>\�A-�u��;��>\�A-�u��;��>\�A-�u��;��>\�A-�u��;��>\�A-�u��; ��>\�A-�u��;$��>\�A-�v��;(��>\�A-�v��;,��>]�A-�v��;0��>]�A-�v��;4��>%]�A-�v��;8��>+]�A-�v��;<��>1]�A-�v��;@��>7]�A-�v��;D��>E]�A-�v��;H��>I]�A-�v��;L��>W]�A-�w��;P��>c]�A-�w��;T��>i]�A-�w��;X��>s]�A-�w��;\��>]�A-�w��;`��>]�A-�w��;d��>]�A-�w��;h��>]�A-�w��;l��>]�A-�w��;p��>]�A-�w��;t��>]�A-�x��;x��>]�A-�x��;|��>]�A-�x��;��>]�A-�x��;��>]�A-�x��;��>]�A-�x��;��>]�A-�x��;��>]�A-�x��;��>^�A-�x��;��> ^�A-�x��;��>^�A-�y��;��>!^�A-�y��;��>5^�A-�y��;��>9^�A-�y��;��>;^�A-�y��;��>E^�A-�y��;��>G^�A-�y��;��>Q^�A-�y��;��>Y^�A-�y��;��>^�A-�y��;ć��>^�A-�z��;ȇ��>^�A-�z��;̇��>^�A-�z��;Ї��>^�A-�z��;ԇ��>^�A-�z��;؇��>^�A-�z��;܇��>^�A-�z��;��>^�A-�z��;��>^�A-�z��;��>^�A-�z��;��>^�A-�{��;��> _�A-�{��;��>#_�A-�{��;��>)_�A-�{��;��>+_�A-�{��;���>5_�A-�{��;��>=_�A-�{��;��>C_�A-�{��; ��>S_�A-�{��;��>g_�A-�{��;��>k_�A-�|��;��>y_�A-�|��;��>_�A-�|��; ��>_�A-�|��;$��>_�A-�|��;(��>_�A-�|��;,��>_�A-�|��;0��>_�A-�|��;4��>_�A-�|��;8��>_�A-�|��;<��>_�A-�}��;@��>_�A-�}��;D��>_�A-�}��;H��>_�A-�}��;L��>_�A-�}��;P��>_�A-�}��;T��>_�A-�}��;X��>_�A-�}��;\��> `�A-�}��;`��>`�A-�}��;d��>%`�A-�~��;h��>3`�A-�~��;l��>=`�A-�~��;p��>K`�A-�~��;t��>O`�A-�~��;x��>U`�A-�~��;|��>W`�A-�~��;��>[`�A-�~��;��>i`�A-�~��;��>s`�A-�~��;��>`�A-���;��>`�A-���;��>`�A-���;��>`�A-���;��>`�A-���;��>`�A-���;��>`�A-���;��>`�A-���;��>`�A-���;��>a�A-���;��>a�A-���;��> a�A-���;��>a�A-���;��>!a�A-���;Ĉ��>#a�A-���;Ȉ��>'a�A-���;̈��>Ea�A-���;Ј��>Ga�A-���;Ԉ��>ea�A-���;؈��>ia�A-���;܈��>qa�A-���;��>a�A-���;��>a�A-���;��>a�A-���;��>a�A-���;��>a�A-���;��>a�A-���;��>a�A-���;��>a�A-���;���>a�A-���;��>a�A-���;��>a�A-���; ��>b�A-���;��>b�A-���;��>b�A-���;��>#b�A-���;��>5b�A-���; ��>7b�A-���;$��>Ib�A-���;(��>Ob�A-���;,��>Ub�A-���;0��>kb�A-���;4��>}b�A-���;8��>b�A-���;<��>b�A-���;@��>b�A-���;D��>b�A-���;H��>b�A-���;L��>b�A-���;P��>b�A-���;T��>b�A-���;X��>b�A-���;\��>c�A-���;`��>c�A-���;d��>c�A-���;h��>c�A-���;l��>%c�A-���;p��>3c�A-���;t��>Cc�A-���;x��>[c�A-���;|��>ac�A-���;��>mc�A-���;��>uc�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>c�A-���;��>d�A-���;��>d�A-���;��>d�A-���;��>d�A-���;��>d�A-���;ĉ��>d�A-���;ȉ��>/d�A-���;̉��>9d�A-���;Љ��>?d�A-���;ԉ��>]d�A-���;؉��>ed�A-���;܉��>kd�A-���;��>qd�A-���;��>ud�A-���;��>d�A-���;��>d�A-���;��>d�A-���;��>d�A-���;��>d�A-���;��>d�A-���;���>d�A-���;��>d�A-���;��>d�A-���; ��>d�A-���;��>d�A-���;��>e�A-���;��>e�A-���;��>e�A-���; ��>e�A-���;$��>)e�A-���;(��>=e�A-���;,��>Ae�A-���;0��>Ce�A-���;4��>Ge�A-���;8��>ee�A-���;<��>ke�A-���;@��>ye�A-���;D��>e�A-���;H��>e�A-���;L��>e�A-���;P��>e�A-���;T��>e�A-���;X��>e�A-���;\��>e�A-���;`��>e�A-���;d��>e�A-���;h��>e�A-���;l��>f�A-���;p��>+f�A-���;t��>7f�A-���;x��>?f�A-���;|��>Uf�A-���;��>if�A-���;��>mf�A-���;��>{f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>f�A-���;��>g�A-���;��>g�A-���;��>#g�A-���;��>'g�A-���;Ċ��>/g�A-���;Ȋ��>5g�A-���;̊��>9g�A-���;Њ��>?g�A-���;Ԋ��>Ag�A-���;؊��>]g�A-���;܊��>cg�A-���;��>ig�A-���;��>g�A-���;��>g�A-���;��>g�A-���;��>g�A-���;��>g�A-���;��>g�A-���;��>g�A-���;���>g�A-���;��>g�A-���;��>g�A-���; ��> h�A-���;��>h�A-���;��>h�A-���;��>h�A-���;��>+h�A-���; ��>;h�A-���;$��>=h�A-���;(��>Ch�A-���;,��>Ih�A-���;0��>Mh�A-���;4��>Sh�A-���;8��>[h�A-���;<��>mh�A-���;@��>h�A-���;D��>h�A-���;H��>h�A-���;L��>h�A-���;P��>h�A-���;T��>h�A-���;X��>h�A-���;\��>h�A-���;`��>h�A-���;d��>h�A-���;h��>h�A-���;l��>h�A-���;p��>h�A-���;t��>h�A-���;x��>h�A-���;|��>h�A-���;��>i�A-���;��>i�A-���;��>+i�A-���;��>-i�A-���;��>3i�A-���;��>?i�A-���;��>Ii�A-���;��>Wi�A-���;��>[i�A-���;��>i�A-���;��>i�A-���;��>i�A-���;��>i�A-���;��>i�A-���;��>i�A-���;��>i�A-���;��>i�A-���;ċ��>i�A-���;ȋ��>i�A-���;̋��>i�A-���;Ћ��>i�A-���;ԋ��>i�A-���;؋��>i�A-���;܋��> j�A-���;��> j�A-���;��>j�A-���;��>j�A-���;��>#j�A-���;��>-j�A-���;��>3j�A-���;��>Aj�A-���;��>Qj�A-���;���>Yj�A-���;��>_j�A-���;��>kj�A-���; ��>uj�A-���;��>wj�A-���;��>j�A-���;��>j�A-���;��>j�A-���; ��>j�A-���;$��>j�A-���;(��>j�A-���;,��>j�A-���;0��>j�A-���;4��>j�A-���;8��>j�A-���;<��>j�A-���;@��>j�A-���;D��>j�A-���;H��> k�A-���;L��>k�A-���;P��>k�A-���;T��>k�A-���;X��>;k�A-���;\��>Ak�A-���;`��>Ik�A-���;d��>wk�A-���;h��>}k�A-���;l��>k�A-���;p��>k�A-���;t��>k�A-���;x��>k�A-���;|��>k�A-���;��>k�A-���;��>k�A-���;��>k�A-���;��>k�A-���;��>k�A-���;��>k�A-���;��>k�A-���;��>k�A-���;��>l�A-���;��>l�A-���;��>-l�A-���;��>7l�A-���;��>9l�A-���;��>Cl�A-���;��>El�A-���;��>Il�A-���;��>Ol�A-���;Č��>al�A-���;Ȍ��>cl�A-���;̌��>gl�A-���;Ќ��>{l�A-���;Ԍ��>l�A-���;،��>l�A-���;܌��>l�A-���;��>l�A-���;��>l�A-���;��>l�A-���;��>l�A-���;��>l�A-���;��>l�A-���;��>l�A-���;��>m�A-���;���>'m�A-���;��>)m�A-���;��>/m�A-���; ��>3m�A-���;��>5m�A-���;��>9m�A-���;��>?m�A-���;��>Sm�A-���; ��>Ym�A-���;$��>qm�A-���;(��>um�A-���;,��>wm�A-���;0��>{m�A-���;4��>m�A-���;8��>m�A-���;<��>m�A-���;@��>m�A-���;D��>m�A-���;H��>m�A-���;L��>n�A-���;P��>n�A-���;T��>n�A-���;X��>+n�A-���;\��>An�A-���;`��>Cn�A-���;d��>[n�A-���;h��>qn�A-���;l��>sn�A-���;p��>n�A-���;t��>n�A-���;x��>n�A-���;|��>n�A-���;��>n�A-���;��>n�A-���;��>n�A-���;��>n�A-���;��>n�A-���;��>n�A-���;��>n�A-���;��>n�A-���;��>n�A-���;��>o�A-���;��>o�A-���;��>o�A-���;��>o�A-���;��>-o�A-���;��>7o�A-���;��>9o�A-���;��>Qo�A-���;č��>ao�A-���;ȍ��>io�A-���;̍��>oo�A-���;Ѝ��>o�A-���;ԍ��>o�A-���;؍��>o�A-���;܍��>o�A-���;��>o�A-���;��>o�A-���;��>o�A-���;��>o�A-���;��>o�A-���;��>o�A-���;��>o�A-���;��> p�A-���;���>p�A-���;��>-p�A-���;��>5p�A-���; ��>Ap�A-���;��>Sp�A-���;��>cp�A-���;��>ep�A-���;��>qp�A-���; ��>wp�A-���;$��>{p�A-���;(��>p�A-���;,��>p�A-���;0��>p�A-���;4��>p�A-���;8��>p�A-���;<��>p�A-���;@��>p�A-���;D��>p�A-���;H��>p�A-���;L��>p�A-���;P��>p�A-���;T��>p�A-���;X��>p�A-���;\��> q�A-���;`��>q�A-���;d��>1q�A-���;h��>Aq�A-���;l��>Cq�A-���;p��>Mq�A-���;t��>Oq�A-���;x��>Sq�A-���;|��>_q�A-���;��>aq�A-���;��>mq�A-���;��>wq�A-���;��>q�A-���;��>q�A-���;��>q�A-���;��>q�A-���;��>q�A-���;��>q�A-���;��>q�A-���;��>q�A-���;��>q�A-���;��>r�A-���;��>r�A-���;��>r�A-���;��>3r�A-���;��>9r�A-���;Ď��>=r�A-���;Ȏ��>Er�A-���;̎��>Ir�A-���;Ў��>[r�A-���;Ԏ��>cr�A-���;؎��>gr�A-���;܎��>ur�A-���;��>yr�A-���;��>r�A-���;��>r�A-���;��>r�A-���;��>r�A-���;��>r�A-���;��>r�A-���;��>r�A-���;���>r�A-���;��>r�A-���;��>r�A-���; ��>s�A-���;��>s�A-���;��>s�A-���;��>!s�A-���;��>-s�A-���; ��>3s�A-���;$��>Ws�A-���;(��>_s�A-���;,��>ks�A-���;0��>os�A-���;4��>qs�A-���;8��>us�A-���;<��>}s�A-���;@��>s�A-���;D��>s�A-���;H��>s�A-���;L��>s�A-���;P��>s�A-���;T��>s�A-���;X��>s�A-���;\��>s�A-���;`��>s�A-���;d��>s�A-���;h��>s�A-���;l��>s�A-���;p��>t�A-���;t��>t�A-���;x��>t�A-���;|��>t�A-���;��>#t�A-���;��>)t�A-���;��>/t�A-���;��>7t�A-���;��>Ot�A-���;��>Ut�A-���;��>_t�A-���;��>kt�A-���;��>t�A-���;��>t�A-���;��>t�A-���;��>t�A-���;��>t�A-���;��>t�A-���;��>t�A-���;��>t�A-���;��>t�A-���;ď��>t�A-���;ȏ��>t�A-���;̏��>t�A-���;Џ��>t�A-���;ԏ��>t�A-���;؏��>u�A-���;܏��>'u�A-���;��>+u�A-���;��>3u�A-���;��>=u�A-���;��>Iu�A-���;��>Qu�A-���;��>]u�A-���;��>mu�A-���;��>su�A-���;���>u�A-���;��>u�A-���;��>u�A-���; ��>u�A-���;��>u�A-���;��>u�A-���;��>u�A-���;��>u�A-���; ��>u�A-���;$��>u�A-���;(��>u�A-���;,��>u�A-���;0��>v�A-���;4��>v�A-���;8��>'v�A-���;<��>-v�A-���;@��>/v�A-���;D��>9v�A-���;H��>;v�A-���;L��>Ev�A-���;P��>Kv�A-���;T��>qv�A-���;X��>}v�A-���;\��>v�A-���;`��>v�A-���;d��>v�A-���;h��>v�A-���;l��>v�A-���;p��>v�A-���;t��>v�A-���;x��>v�A-���;|��>v�A-���;��>v�A-���;��>v�A-���;��>v�A-���;��>v�A-���;��>w�A-���;��> w�A-���;��>w�A-���;��>+w�A-���;��>5w�A-���;��>;w�A-���;��>Ow�A-���;��>aw�A-���;��>w�A-���;��>w�A-���;��>w�A-���;��>w�A-���;��>w�A-���;Đ��>w�A-���;Ȑ��>w�A-���;̐��>w�A-���;А��>w�A-���;Ԑ��>w�A-���;ؐ��>w�A-���;ܐ��>x�A-���;��>x�A-���;��> x�A-���;��>x�A-���;��>!x�A-���;��>%x�A-���;��>Cx�A-���;��>Ix�A-���;��>Kx�A-���;���>Qx�A-���;��>ax�A-���;��>yx�A-���; ��>x�A-���;��>x�A-���;��>x�A-���;��>x�A-���;��>x�A-���; ��>x�A-���;$��>x�A-���;(��>x�A-���;,��>x�A-���;0��>x�A-���;4��>x�A-���;8��>x�A-���;<��>y�A-���;@��>y�A-���;D��>)y�A-���;H��>-y�A-���;L��>Ey�A-���;P��>Ky�A-���;T��>My�A-���;X��>Yy�A-���;\��>y�A-���;`��>y�A-���;d��>y�A-���;h��>y�A-���;l��>y�A-���;p��>y�A-���;t��>y�A-���;x��>y�A-���;|��>y�A-���;��>y�A-���;��>y�A-���;��>y�A-���;��>z�A-���;��> z�A-���;��>z�A-���;��>z�A-���;��>z�A-���;��>5z�A-���;��>7z�A-���;��>;z�A-���;��>Oz�A-���;��>Sz�A-���;��>Yz�A-���;��>}z�A-���;��>z�A-���;��>z�A-���;đ��>z�A-���;ȑ��>z�A-���;̑��>z�A-���;Б��>z�A-���;ԑ��>z�A-���;ؑ��>z�A-���;ܑ��>z�A-���;��>z�A-���;��>z�A-���;��>z�A-���;��>z�A-���;��>{�A-���;��>1{�A-���;��>9{�A-���;��>O{�A-���;���>]{�A-���;��>g{�A-���;��>{�A-���; ��>{�A-���;��>{�A-���;��>{�A-���;��>{�A-���;��>{�A-���; ��>{�A-���;$��>{�A-���;(��>{�A-���;,��>{�A-���;0��>{�A-���;4��>|�A-���;8��>|�A-���;<��>|�A-���;@��>/|�A-���;D��>W|�A-���;H��>Y|�A-���;L��>]|�A-���;P��>c|�A-���;T��>e|�A-���;X��>k|�A-���;\��>u|�A-���;`��>|�A-���;d��>|�A-���;h��>|�A-���;l��>|�A-���;p��>|�A-���;t��>|�A-���;x��>|�A-���;|��>|�A-���;��>|�A-���;��>|�A-���;��> }�A-���;��> }�A-���;��>}�A-���;��>}�A-���;��>#}�A-���;��>)}�A-���;��>+}�A-���;��>/}�A-���;��>G}�A-���;��>I}�A-���;��>M}�A-���;��>q}�A-���;��>s}�A-���;��>}�A-���;��>}�A-���;Ē��>}�A-���;Ȓ��>}�A-���;̒��>}�A-���;В��>}�A-���;Ԓ��>}�A-���;ؒ��>}�A-���;ܒ��>~�A-���;��>%~�A-���;��>1~�A-���;��>3~�A-���;��>7~�A-���;��>9~�A-���;��>C~�A-���;��>E~�A-���;��>O~�A-���;���>W~�A-���;��>[~�A-���;��>~�A-���; ��>~�A-���;��>~�A-���;��>~�A-���;��>~�A-���;��>~�A-���; ��>~�A-���;$��>~�A-���;(��>~�A-���;,��>~�A-���;0��>~�A-���;4��>~�A-���;8��>~�A-���;<��> �A-���;@��>!�A-���;D��>5�A-���;H��>K�A-���;L��>Q�A-���;P��>_�A-���;T��>�A-���;X��>�A-���;\��>�A-���;`��>�A-���;d��>�A-���;h��>�A-���;l��>�A-���;p��>�A-���;t��>�A-���;x��>�A-���;|��> �A-���;��>�A-���;��>�A-���;��>�A-���;��>+�A-���;��>A�A-���;��>I�A-���;��>S�A-���;��>U�A-���;��>g�A-���;��>k�A-���;��>s�A-���;��>}�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;ē��>�A-���;ȓ��>�A-���;̓��>ˀ�A-���;Г��>׀�A-���;ԓ��>�A-���;ؓ��>�A-���;ܓ��>�A-���;��>�A-���;��> �A-���;��>%�A-���;��>=�A-���;��>C�A-���;��>O�A-���;��>Q�A-���;��>g�A-���;���>m�A-���;��>�A-���;��>�A-���; ��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���; ��>Ձ�A-���;$��>ہ�A-���;(��>�A-���;,��>�A-���;0��>�A-���;4��>�A-���;8��>!�A-���;<��>3�A-���;@��>5�A-���;D��>9�A-���;H��>G�A-���;L��>M�A-���;P��>Q�A-���;T��>S�A-���;X��>]�A-���;\��>_�A-���;`��>o�A-���;d��>q�A-���;h��>{�A-���;l��>�A-���;p��>�A-���;t��>�A-���;x��>�A-���;|��>�A-���;��>�A-���;��>ł�A-���;��>ɂ�A-���;��>ς�A-���;��>�A-���;��>�A-���;��>�A-���;��> �A-���;��>�A-���;��>�A-���;��>%�A-���;��>/�A-���;��>;�A-���;��>=�A-���;��>A�A-���;��>C�A-���;��>M�A-���;Ĕ��>e�A-���;Ȕ��>m�A-���;̔��>w�A-���;Д��>�A-���;Ԕ��>�A-���;ؔ��>�A-���;ܔ��>�A-���;��>�A-���;��>�A-���;��>̓�A-���;��>ك�A-���;��>�A-���;��>�A-���;��>�A-���;��>'�A-���;���>+�A-���;��>1�A-���;��>?�A-���; ��>E�A-���;��>I�A-���;��>Q�A-���;��>g�A-���;��>o�A-���; ��>�A-���;$��>�A-���;(��>�A-���;,��>Ä�A-���;0��>DŽ�A-���;4��>Ʉ�A-���;8��>߄�A-���;<��>�A-���;@��>�A-���;D��>�A-���;H��>�A-���;L��>�A-���;P��>�A-���;T��>�A-���;X��>'�A-���;\��>;�A-���;`��>M�A-���;d��>S�A-���;h��>_�A-���;l��>i�A-���;p��>{�A-���;t��>}�A-���;x��>�A-���;|��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>˅�A-���;��>х�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>%�A-���;��>)�A-���;��>=�A-���;ĕ��>C�A-���;ȕ��>S�A-���;̕��>Y�A-���;Е��>y�A-���;ԕ��>�A-���;ؕ��>�A-���;ܕ��>�A-���;��>�A-���;��>�A-���;��>ˆ�A-���;��>ц�A-���;��>ن�A-���;��>�A-���;��>�A-���;��> �A-���;���>!�A-���;��>7�A-���;��>9�A-���; ��>I�A-���;��>W�A-���;��>]�A-���;��>a�A-���;��>o�A-���; ��>u�A-���;$��>�A-���;(��>�A-���;,��>�A-���;0��>�A-���;4��>Ç�A-���;8��>ɇ�A-���;<��>ه�A-���;@��>�A-���;D��>�A-���;H��>�A-���;L��> �A-���;P��> �A-���;T��>�A-���;X��>'�A-���;\��>)�A-���;`��>3�A-���;d��>;�A-���;h��>A�A-���;l��>_�A-���;p��>k�A-���;t��>u�A-���;x��>�A-���;|��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>È�A-���;��>ň�A-���;��>ψ�A-���;��>�A-���;��>�A-���;��>�A-���;��> �A-���;��>)�A-���;��>=�A-���;��>A�A-���;��>U�A-���;Ė��>[�A-���;Ȗ��>_�A-���;̖��>}�A-���;Ж��>�A-���;Ԗ��>�A-���;ؖ��>�A-���;ܖ��>�A-���;��>�A-���;��>�A-���;��>ˉ�A-���;��>׉�A-���;��>݉�A-���;��>�A-���;��>�A-���;��>+�A-���;���>1�A-���;��>?�A-���;��>C�A-���; ��>I�A-���;��>O�A-���;��>]�A-���;��>u�A-���;��>{�A-���; ��>�A-���;$��>�A-���;(��>�A-���;,��>�A-���;0��>�A-���;4��>NJ�A-���;8��>ي�A-���;<��>�A-���;@��>�A-���;D��>�A-���;H��>�A-���;L��>�A-���;P��>�A-���;T��>�A-���;X��>�A-���;\��>'�A-���;`��>)�A-���;d��>5�A-���;h��>?�A-���;l��>M�A-���;p��>S�A-���;t��>W�A-���;x��>Y�A-���;|��>e�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>ˋ�A-���;��>Ջ�A-���;��>݋�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>#�A-���;��>+�A-���;ė��>5�A-���;ȗ��>I�A-���;̗��>[�A-���;З��>e�A-���;ԗ��>k�A-���;ؗ��>q�A-���;ܗ��>}�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>Ō�A-���;���>͌�A-���;��>ߌ�A-���;��>�A-���; ��>�A-���;��>�A-���;��> �A-���;��>�A-���;��>�A-���; ��>1�A-���;$��>=�A-���;(��>E�A-���;,��>W�A-���;0��>[�A-���;4��>i�A-���;8��>m�A-���;<��>s�A-���;@��>u�A-���;D��>�A-���;H��>�A-���;L��>�A-���;P��>�A-���;T��>ɍ�A-���;X��>͍�A-���;\��>ύ�A-���;`��>�A-���;d��>�A-���;h��>�A-���;l��>�A-���;p��>�A-���;t��>�A-���;x��>!�A-���;|��>)�A-���;��>3�A-���;��>E�A-���;��>K�A-���;��>Y�A-���;��>c�A-���;��>o�A-���;��>q�A-���;��>}�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;Ę��>Վ�A-���;Ș��>׎�A-���;̘��>ێ�A-���;И��>�A-���;Ԙ��>�A-���;ؘ��>�A-���;ܘ��>�A-���;��>%�A-���;��>/�A-���;��>5�A-���;��>7�A-���;��>;�A-���;��>I�A-���;��>U�A-���;��>Y�A-���;���>a�A-���;��>k�A-���;��>m�A-���; ��>s�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���; ��>�A-���;$��>�A-���;(��>׏�A-���;,��>ߏ�A-���;0��>�A-���;4��>�A-���;8��> �A-���;<��>!�A-���;@��>%�A-���;D��>3�A-���;H��>=�A-���;L��>Q�A-���;P��>a�A-���;T��>c�A-���;X��>g�A-���;\��>{�A-���;`��>�A-���;d��>�A-���;h��>�A-���;l��>�A-���;p��>�A-���;t��>�A-���;x��>�A-���;|��>�A-���;��>ϐ�A-���;��>Ӑ�A-���;��>�A-���;��>�A-���;��>�A-���;��> �A-���;��>�A-���;��>�A-���;��>�A-���;��>-�A-���;��>i�A-���;��>k�A-���;��>q�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;ę��>�A-���;ș��>ˑ�A-���;̙��>ב�A-���;Й��>ݑ�A-���;ԙ��>�A-���;ؙ��>�A-���;ܙ��>�A-���;��>�A-���;��>�A-���;��>)�A-���;��>7�A-���;��>G�A-���;��>Y�A-���;��>_�A-���;��>�A-���;���>�A-���;��>�A-���;��>�A-���; ��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���; ��>Ӓ�A-���;$��>�A-���;(��>�A-���;,��> �A-���;0��>�A-���;4��>1�A-���;8��>?�A-���;<��>E�A-���;@��>y�A-���;D��>{�A-���;H��>�A-���;L��>�A-���;P��>�A-���;T��>�A-���;X��>�A-���;\��>ۓ�A-���;`��>ߓ�A-���;d��>�A-���;h��>�A-���;l��>�A-���;p��>�A-���;t��>�A-���;x��>�A-���;|��>!�A-���;��>/�A-���;��>;�A-���;��>W�A-���;��>i�A-���;��>}�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>Ô�A-���;��>۔�A-���;��>�A-���;��>�A-���;Ě��>�A-���;Ț��>�A-���;̚��>�A-���;К��>�A-���;Ԛ��>�A-���;ؚ��>+�A-���;ܚ��>Y�A-���;��>k�A-���;��>y�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;���>ѕ�A-���;��>ߕ�A-���;��>�A-���; ��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>!�A-���; ��>+�A-���;$��>-�A-���;(��>7�A-���;,��>9�A-���;0��>=�A-���;4��>C�A-���;8��>I�A-���;<��>U�A-���;@��>a�A-���;D��>o�A-���;H��>u�A-���;L��>{�A-���;P��>�A-���;T��>�A-���;X��>�A-���;\��>�A-���;`��>�A-���;d��>�A-���;h��>Ӗ�A-���;l��>Ֆ�A-���;p��>�A-���;t��>�A-���;x��>�A-���;|��>�A-���;��>�A-���;��>'�A-���;��>)�A-���;��>/�A-���;��>3�A-���;��>Y�A-���;��>_�A-���;��>i�A-���;��>u�A-���;��>w�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>�A-���;��>ɗ�A-���;ě��>ϗ�A-���;ț��>�A-���;̛��> �A-���;Л��>�A-���;ԛ��>�A-���;؛��>�A-���;ܛ��>+�A-���;��>A�A-���;��>O�A-���;��>Y�A-���;��>_�A-���;��>e�A-���;��>g�A-���;��>q�A-���;��>�A-���;���>�A-���;��>�A-���;��>�A-���; ��>�A-���;��>˘�A-���;��>Ә�A-���;��>�A-���;��>�A-���; ��>�A-���;$��>�A-���;(��>�A-���;,��>�A-���;0��>�A-���;4��> �A-���;8��>�A-���;<��>�A~�>divides�� ��>$���A~�@divisor�p� �����@ ~�?d�p� ��A?~�@dividend�p� ��@p� �����O /� ��� W� ��� ���<W� ��� ���<W� ��� ���</� ��� &� �� AU� ������<p� ��@p� �� ���O~�?i�p� �� ?a� �� Op� ��Op� ��?a� ��?p� ��Sp� �� ���S~�?q�a� ��?p� �����S~�=mpdigdiv�� ���=p� �����@ p� ��? p� �� |� ��?�p� ��? � �� p� �� ?W� ������<&� ��?AX� ���$���<p� �����AW� ���%���<p� ��A� ����� ����~�= smallprimetest�� �� =���A~�@ p�p� �� @ p� ��A W� ���.���<W� ���-���<W� ���E���<C� ��� &� �� '��AP� ���,���<p� �� ?p� �� > p� �����R&� �����AX� ���9���<p� �� ���Rp� ��O&� �� T� ���:���<W� ���;���<W� ���,���<p� �� Sp� �� ���S� ���>p� ��? p� �� @ &� ��AO� ���D���<p� ��A� ����W� ���+���<p� ��A� ����� ����5� ��>@��AI ����genprime.8 1201054017 0 0 664 1670 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<genprime.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�+����~�=genprime����=���A~�@p�p���@p���S~�@n�p������@p������S~�=mpbits�����=p���@p��� ���Op���Sp������@ ������A����� ������A ��� ������Ap������S~�=genrandom�����=p������@p���@ p��� ������A����� ������A ��� ������Ap������Rp������A p��� /���� p��� ������A ������A ��� ������A ��� ���  p� �����Rp� �� ���R a� ��Pp� ��  /� ��� � �� Op�!�����Rp�!�� ���R a�!��P�!�� Op�"�� ���R�"�����AOW�)���3���<W�)���3���<W�)���B���<p�&�� S~�@accuracy�p�&�����@ p�&�� ���S~�=probably_prime��&���=p�&��@ &�&��AO�&���;���<W�'���2���<p�(�� S~�=mptwo�p�(��=p�(�����Sp�(�� ���S~�= mpadd��(��� =p�(��@ W�(���1���<�(����I(����dsaprimes.8 1201054018 0 0 664 4969 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<dsaprimes.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�q����~�>Hrand����>���A~�@s�p���@~�?u�p���?~�=fastrand�����=p���? ������A?p���P� ���=p� ��? � �����A?p� ��P�!���=p�!��? �!�����A?p�!��P�"���=p�"��? �"�����A?p�"��P�#���=p�#��? p�#��P�#����~�>Hincr��'��>���Ap�'��@ p�*��A W�*������<W�*������<W�*���&���<C�*��� &�*�� ���AP�*������<�+�����A Rs�+�� R&�+��AO�+���%���<W�,������<W�,������<�,����~�=DSAprimes��1��=���A~�?n�p�3�����A?~�?b�p�3��?���A?p�7�����A p�7�� S~�= mpnew��7��� =p�7�� ~�= mpone�p�8�� =p�8��Sp�8����Ap�8�����S~�? two1023�p�8��  ?p�8�� ���S~�= mpleft��8��� =p�9��AS�9��� =p�9�� p�:�� =p�:��Sp�:��?p�:�����S~�? mb�p�:��  ?p�:�� ���S�:��� =p�;�����A p�;�� S�;��� =~�?W�p�;��x?p�<�����A p�<�� S�<��� =~�?Vk�p�<��|?p�=��AS�=��� =~�?X�p�=��t?p�>��AS�>��� =~�?q2�p�>��p?W�?���N���<W�K���Y���<W�K���Q���<W�K������<~�@q�p�K��@ p�K�� Sp�K�����A p�K�� ���S~�=probably_prime��K���=~�@seed�p�K�����@ &�K��AX�K���P���<~�?s�a�A��?p�A��S�A���>~�?sj�a�B��?p�B��Sa�B��?p�B�����Sp�B�����Ap�B�����S~�=memcpy��B���=a�C��?p�C��Sp�C�����Ap�C�����S~�?Hs�a�C��?p�C�����Sp�C��A ���S~�=sha1��C���=a�D��?p�D��S�D���>a�E��?p�E��Sp�E�����Ap�E�����S~�?Hs1�a�E��?p�E�����Sp�E��A ���S�E���=p�F��A W�F���{���<W�F���z���<W�F������<C�F��� &�F�� ���AP�F���y���<s�G�� ?�G�� ?W�G���x���<�H�����A?�I�����A?a�J��?p�J��Sp�J�����Ap�J�����Sp�J��@p�J�����S~�=letomp��J���=W�J���O���<&�L�� AO�L������<p�M�� Sa�M��?p�M�����Sp�M�����Ap�M�����S~�=memmove��M���=~�?i�p�N��A?~�?j�p�O�����A?a�P��?p�P��S�P���>p�Q��@p�Q��Sp�Q�����Ap�Q�����Sp�Q��p?p�Q�����S�Q��� =W�R������<W�R������<W�R�����<&�R��?���AP�R������<~�?sjk�a�S��?p�S��Sa�S��?p�S�����Sp�S�����Ap�S�����S�S���=p�T��A W�T������<W�T������<W�T������<C�T��� ~�? k�p�T��  ?&�T�� ?Q�T������<a�U��?p�U��Sp�U�����Ap�U�����Sa�U��?p�U�����Sp�U��A ���S�U���=a�V��?p�V��Sp�V�����Ap�V�����Sp�V��|?p�V�����S�V���=p�V��|? p�W�� ?&�W��?X�W������<p�X�� Sp�X�� ?p�X�����Sp�X�� ���S~�=!mpmod��X���!=p�X��|? p�Y�� Sp�Y�� ?=�Y�����Ap�Y�����Sp�Y�� ���S�Y��� =p�Y��x? p�Z�� Sp�Z��|?p�Z�����Sp�Z�� ���S~�="mpadd��Z���"=a�[��?p�[��S�[���>p�[�� ? W�[������<p�]��x?p�]��Sp�]�� ?p�]�����Sp�]��t?p�]�����S�]���"=p�^��t?p�^��Sp�^��p?p�^�����Sp�^��x?p�^�����S�^���!=p�^��x? p�_�� Sp�_�� =p�_�����Sp�_�� ���S~�=#mpsub��_���#=p�`��t?p�`��Sp�`��x?p�`�����S~�@$p�p�`�����$@p�`�����S�`���#=p�a�����$@ p�a�� Sp�a�� ? p�a�� ���S~�=%mpcmp��a���%=&�a��AU�a�����<p�a�����$@ p�a�� Sp�a�����A p�a�� ���S�a���=&�a��AX�a�����<W�a�����<W�b�����<C�c���?p�d��?C�d��� �d��?p�e��A W�e�����<W�e�����<W�e�����<C�e��� p�e��?C�e���&�e�� p�e��  ?P�e�����<a�f��?p�f��S�f���>p�f�� ? W�f��� ��<W�f������<W�h���M���<W�b�����<p�j��p?p�j��S~�=&mpfree��j���&=p�k��t?p�k��S�k���&=p�l��|?p�l��S�l���&=p�m��x?p�m��S�m���&=p�n�� ?p�n��S�n���&=p�o�� ?p�o��S�o���&=�o����Io����gensafeprime.8 1201054018 0 0 664 2296 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<gensafeprime.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�4����~�=gensafeprime����= ���A~�@n�p������@ /���� p��� S~�=mpnew�����=~�?q�p���?W���� ���<W���� ���<W����)���<W���� ���<W�������<p���?p���Sp������@/����p������S~�@accuracy�p��� ���@p������S~�=genprime�����=p���?p���Sp������Ap������S~�@p�p���@p������S~�=mpleft�����=p���@ p��� S~�= mpone�p��� =p������Sp��� ���S~�= mpadd����� =p� ��@ p� �� Sp� �� ���@ p� �� ���S~�= probably_prime�� ��� =&� ��AO� ���(���<W�!������<W�!������<p�%��AS�%���=~�? b�p�%�� ?W�&���/���<W�&���/���<W�&���d���<W�&���1���<W�&���.���<p�'�����@p�'��S~�= genrandom�p�'��=� Dp�'�����S~�@alpha�p�'�����@p�'�����S~�=mprand��'���=p�'�����@ p�(�� Sp�(��@p�(�����Sp�(�� ���S~�=mpmod��(���=p�(�����@ p�)�� Sp�)�� ���Sp�)�� ?p�)�����S~�=mpmul��)���=p�)�� ? p�*�� Sp�*��@p�*�����Sp�*�� ���S�*���=p�+�� ? p�+�� Sp�+�� = p�+�� ���S~�=mpcmp��+���=&�+��AX�+���R���<W�,���-���<p�-�����@p�-��Sp�-��?p�-�����Sp�-��@p�-�����Sp�-�� ?p�-�� ���S~�=mpexp��-���=p�.�� ? p�.�� Sp�.�� = p�.�� ���S�.���=&�.��AO�.���c���<W�/���.���<W�/���-���<p�1�� ?p�1��S~�=mpfree��1���=p�2��?p�2��S�2���=�2����I2����genstrongprime.81201054019 0 0 664 3388 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<genstrongprime.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�I����~�=genstrongprime����=(���A~�@n�p������@ &��� @���AP�������<p���@���A p���  p��� ���@&��� ���A���A ������A p��� S~�=mpnew�����=p��� ~�?s�p���?p���Sp������@&������A���A������A ���Ap������S~�@accuracy�p������@p������S~�=genprime�����=p� �����@ &� �� ���A� ��A � �����A p� �� S� ���=~�?t�p� ��?p�!��? p�!�� S~�=mpsignif��!���=p�!�����@ �!�� p�!��  �!��A~�? .safe�p�!�� ?p�!��?p�!��Sp�!�� ?p�!�����Sp�!�����@p�!�����S�!���=p�$�����A p�$�� S�$���=~�? i�p�$�� ?p�%��AS�%���=~�? r�p�%�� ?p�&�����Ap�&��Sp�&�� ?p�&�����S~�= itomp��&��� =p�&��? p�'�� Sp�'�����Ap�'�����Sp�'�� ���S~�= mpleft��'��� =p�(�� ?p�(��Sp�(��?p�(�����Sp�(�� ?p�(�����S~�=mpmul��(���=p�(�� ? p�)�� S~�=mpone�p�)��=p�)�����Sp�)�� ���S~�=mpadd��)���=W�.���P���<W�.���P���<W�.���_���<p�+�� ? p�+�� Sp�+�����A p�+�� ���S~�=probably_prime��+���=p�+�� ? &�+��AO�+���Y���<W�,���O���<p�-�� Sp�-��?p�-�����Sp�-�� ���S�-���=W�-���N���<p�1�����Ap�1��S~�@p�p�1��@p�1�����S�1��� =p�1��@ p�2�� ?p�2��Sp�2�� ���Sp�2�� ���S~�=mpsub��2���=p�2��@ p�3��?p�3��Sp�3�� ���Sp�3�� ?p�3�����Sp�3��  ���S~�=mpexp��3���=p�3��@ p�4��?p�4��Sp�4�� ���Sp�4�� ���S�4���=p�4��@ p�5�� Sp�5�����Ap�5�����Sp�5�� ���S�5��� =p�5��@ p�6�� Sp�6��=p�6�����Sp�6�� ���S�6���=p�9�����Ap�9��Sp�9�� ?p�9�����S�9��� =p�9�� ? p�:�� Sp�:�����Ap�:�����Sp�:�� ���S�:��� =p�:�� ? p�;�� Sp�;��?p�;�����Sp�;�� ���S�;���=p�;�� ? p�<�� ?p�<��Sp�<�� ���Sp�<�� ���S�<���=p�<��@ p�=�� Sp�=�� ?p�=�����Sp�=�� ���S�=���=W�B������<W�B������<W�B������<p�?��@ p�?�� Sp�?�����@ p�?�� ���S�?���=p�?��@ &�?��AO�?������<W�@������<p�A�� Sp�A�� ?p�A�����Sp�A�� ���S�A���=W�A������<p�D�� ?p�D��S~�=mpfree��D���=p�E��?p�E��S�E���=p�F�� ?p�F��S�F���=p�G��?p�G��S�G���=�G����IG����rsagen.8 1201054020 0 0 664 3754 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<rsagen.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�V����~�=rsagen����=L���A~�@nlen�p���@ &��� ���A���A ������A p��� S~�=mpnew�����=~�?p�p���?p���@ &��� ���A���A ������A p��� S����=~�?q�p���?p���@ p��� S����=~�?n�p���?~�@elen�p������@ p��� S����=~�?e�p���?p���AS����=~�? d�p��� ?p���@ p��� S����=~�? phi�p��� ?p�"��?p�"��Sp�"��@&�"�����A�"��A�"�����Ap�"�����S~�@ rounds�p�"����� @p�"�����S~�= genprime��"��� =p�#��? p�#�� S~�= mpsignif��#��� =p�#��@ �#�� p�#�� C�#���~�?.safe�p�#��?p�#��?p�#��Sp�#��?p�#�����Sp�#����� @p�#�����S�#��� =p�$��?p�$��Sp�$��?p�$�����Sp�$��?p�$�����S~�=mpmul��$���=p�%��?p�%��S~�=mpone�p�%��=p�%�����Sp�%��?p�%�����S~�=mpsub��%���=p�&��?p�&��Sp�&��=p�&�����Sp�&�� ?p�&�����S�&���=p�'��?p�'��Sp�'�� ?p�'�����Sp�'�� ?p�'�����S�'���=p�*��AS�*���=~�?t1�p�*��?p�+��AS�+���=~�?t2�p�+��?p�,�����@p�,��S~�=genrandom�p�,��=�Dp�,�����Sp�,��?p�,�����S~�=mprand��,���=p�-��? p�-�� S~�=mptwo�p�-��= p�-�� ���S~�=mpcmp��-���=&�-��AQ�-���l���<p�.�����Ap�.��Sp�.��?p�.�����S~�=itomp��.���=W�8���o���<W�8���o���<W�8������<p�4��?p�4��Sp�4�� ?p�4�����Sp�4��?p�4�����Sp�4�� ?p�4�� ���Sp�4��?p�4�����S~�=mpextendedgcd��4���=p�5��? p�5�� Sp�5��= p�5�� ���S�5���=p�5��? &�5��AX�5������<W�6���n���<p�7��=p�7��Sp�7�� ���Sp�7�� ���S~�=mpadd��7���=W�7���m���<p�9��?p�9��S~�=mpfree��9���=p�:��?p�:��S�:���=p�=��AS�=���=p�=�� p�>��?p�>��Sp�>��?p�>�����S~�?c2�p�>�� ?p�>�� ���S~�=mpinvert��>���=p�A��AS�A���=~�?kq�p�A��?p�B��AS�B���=~�?kp�p�B��?p�C��?p�C��Sp�C��=p�C�����Sp�C�� ?p�C�����S�C���=p�D�� ?p�D��Sp�D�� ?p�D�����Sp�D��?p�D�����S~�= mpmod��D��� =p�E��?p�E��Sp�E��=p�E�����Sp�E�� ?p�E�����S�E���=p�F�� ?p�F��Sp�F�� ?p�F�����Sp�F��?p�F�����S�F��� =~�=!rsaprivalloc��H���!=p�I��? p�I�� ���Op�J��? p�J�� Op�K�� ? p�K�� ���Op�L��? p�L�� ���Op�M��? p�M�� ���Op�N��? p�N��  ���Op�O��? p�O�� ���O~�?"rsa�p�P��"?p�P��? p�P�� ���Op�R�� ?p�R��S�R���=p�T��"?�T�����T����IT����rsafill.8 1201054020 0 0 664 3464 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<rsafill.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�M����~�=rsafill����=(���A~�@p�p��� ���@ p��� Sp��� ���A p��� ���S~�=probably_prime�����=&���AO�������<~�@q�p������@ p��� Sp��� ���A p��� ���S����=&���AO�������<W�������<~�>.string�-���;> rsafill:-���;���> p or q -���;���> not primp���>�Dp���S~�=werrstr�����=p���A�����p���AS~�=mpnew�����=p��� p� �� ���@p� ��Sp� �����@p� �����S~�?x�p� �� ?p� �� ���S~�= mpmul�� ��� =~�@ n�p�!�� @ p�!�� Sp�!��? p�!�� ���S~�= mpcmp��!��� =&�!��AO�!���.���<-�"��;���> e�rsafil-�"��; ���> l: n != p�"��>����Dp�"��S�"���=p�#��?p�#��S~�= mpfree��#��� =p�$��A�$����p�&��AS�&���=p�&�� p�'�� ���@p�'��S~�= mpone�p�'�� =p�'�����S~�?c2�p�'�� ?p�'�� ���S~�=mpsub��'���=p�(�����@p�(��Sp�(�� =p�(�����Sp�(��?p�(�����S�(���=p�(��? p�)��?p�)��Sp�)�� ���Sp�)�� ���S�)��� =~�@e�p�*�����@p�*��S~�@d�p�*�����@p�*�����Sp�*��?p�*�����S�*��� =p�*��? p�+��?p�+��Sp�+�� ���Sp�+�� ���S~�=mpmod��+���=p�,��? p�,�� Sp�,�� = p�,�� ���S�,��� =&�,��AO�,���d���<-�-��;(���> p*q�rsaf-�-��;0���> ill: e*d-�-��;8���> != 1 mo-�-��;@���> d (p-1)*p�-��>�,���Dp�-��S�-���=p�.��?p�.��S�.��� =p�/��?p�/��S�/��� =p�0��A�0����p�4�� ���@p�4��Sp�4�����@p�4�����Sp�4��?p�4�����S~�=mpinvert��4���=p�7��AS�7���=~�?kq�p�7��?p�8��AS�8���=~�?kp�p�8��?p�9�� ���@p�9��Sp�9�� =p�9�����Sp�9��?p�9�����S�9���=p�:�����@p�:��Sp�:��?p�:�����Sp�:��?p�:�����S�:���=p�;�����@p�;��Sp�;�� =p�;�����Sp�;��?p�;�����S�;���=p�<�����@p�<��Sp�<��?p�<�����Sp�<��?p�<�����S�<���=~�=rsaprivalloc��>���=~�?rsa�p�>��?p�?�����@ p�?�� S~�=mpcopy��?���=p�?��? p�?�����Pp�@�� @ p�@�� S�@���=p�@��? p�@��Pp�A�����@ p�A�� S�A���=p�A��? p�A�����Qp�B��? p�B�� ���Qp�C��? p�C�� ���Qp�D�� ���@ p�D�� S�D���=p�D��? p�D�� ���Pp�E�����@ p�E�� S�E���=p�E��? p�E�����Qp�F��? p�F�� ���Qp�H��?p�H��S�H��� =p�J��?�J�����J����-�J��;H���> (q-1)���5�J��>P���AIJ����rsaencrypt.8 1201054021 0 0 664 1065 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<rsaencrypt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�����~�=rsaencrypt����=���A~�@out�p������@ &��� AX�������<p���AS~�=mpnew�����=p��� ~�@in�p������@p���S~�@rsa�p���@p������Op������Sp���@p���Op������Sp��� ���@p���  ���S~�=mpexp�����=p������@����������I����rsadecrypt.8 1201054022 0 0 664 1990 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<rsadecrypt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�5����~�=rsadecrypt����= ���A~�@out�&������@AX�������<p���AS~�=mpnew�����=p������@p� ��AS� ���=p� �� ~�@in�p�!�����@p�!��S~�@rsa�p�!��@p�!�� ���Op�!�����S~�?v1�p�!�� ?p�!�� ���S~�=mpmod��!���=p�"��AS�"���=p�"�� p�#�����@p�#��Sp�#��@p�#�����Op�#�����S~�?v2�p�#�� ?p�#�� ���S�#���=p�#��? p�#��@ p�&�� Sp�&�����Pp�&�����Sp�&�� ���Pp�&�����Sp�&��  ���S~�= mpexp��&��� =p�&��@ p�&��? p�'�� Sp�'�����Qp�'�����Sp�'�����Qp�'�����Sp�'��  ���S�'��� =p�'��? p�*�� Sp�*��?p�*�����Sp�*�� ���S~�= mpsub��*��� =p�*��? p�+�� Sp�+��@p�+�����Op�+�����Sp�+�� ���S~�= mpmul��+��� =p�+��? p�,�� Sp�,��@p�,�����Op�,�����Sp�,�� ���S�,���=p�-��?p�-��Sp�-��@p�-�� ���Op�-�����Sp�-�����@p�-�����S�-��� =p�-�����@ p�.��?p�.��Sp�.�� ���Sp�.�� ���S~�= mpadd��.��� =p�0��?p�0��S~�= mpfree��0��� =p�1��?p�1��S�1��� =p�3�����@�3�����3����I3����rsaalloc.8 1201054022 0 0 664 2027 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<rsaalloc.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�D����~�=rsapuballoc����=���Ap������A p��� Sp������A p��� ���S~�=mallocz�����=p��� &���A~�?rsa�p���?X�������<~�>.string�-���;> rsapubalp���>�Dp���S~�=sysfatal�����=p���? p��� ����������~�=rsapubfree�� ��=���A~�@rsa�p� ��@ &�"�� AX�"������<�#����p�$�����Pp�$��S~�=mpfree��$���=p�%��@p�%��Op�%��S�%���=p�&��@p�&��S~�= free��&��� =�&����~�= rsaprivalloc��+�� =���Ap�/�� ���A p�/�� Sp�/�����A p�/�� ���S�/���=p�/�� &�0��A~�? rsa�p�0�� ?X�0���/���<-�1��;���> loc�rsap-�1��;���> rivallocp�1��>� ���Dp�1��S�1���=p�1�� ? p�2�� �2�����2����~�= rsaprivfree��6�� =���A~�@ rsa�p�6�� @ &�8�� AX�8���7���<�9����p�:�����Pp�:��S�:���=p�;�� @p�;��Op�;��S�;���=p�<�� @p�<�����Op�<��S�<���=p�=�� @p�=�� ���Op�=��S�=���=p�>�� @p�>�����Op�>��S�>���=p�?�� @p�?�����Op�?��S�?���=p�@�� @p�@�����Op�@��S�@���=p�A�� @p�A�����Op�A��S�A���=p�B�� @p�B��S�B��� =�B����-�B��;���> ��������5�B��> ���AIB����rsaprivtopub.8 1201054023 0 0 664 1065 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<rsaprivtopub.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7� ����~�=rsaprivtopub����=���A~�=rsapuballoc�����=&���A~�?pub�p���?X�������<p���A�����~�@priv�p���@ p���P p��� S~�=mpcopy�����=p���? p���Pp���@ p������P p��� S����=p���? p������Qp��� ����������I����eggen.8 1201054024 0 0 664 1534 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<eggen.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�%����~�=eggen����= ���A~�=egprivalloc�����=~�?priv�p���?~�?pub�p���?p���AS~�=mpnew�����=p���? p���Pp���AS����=p���? p������Pp���AS����=p���? p������Pp���AS����=p���? p���? p��� ���Pp� ��Qp� ��Sp� �����Qp� �����S~�@nlen�p� ��@p� �����S~�@rounds�p� �����@p� �� ���S~�=gensafeprime�� ���=p�!��@/�!���p�!��S~�= genrandom�p�!��=� Dp�!�����Sp�!��?p�!�� ���Op�!�����S~�= mprand��!��� =p�!��? p�"�����Pp�"��Sp�"��?p�"�� ���Op�"�����Sp�"��Pp�"�����Sp�"�����Pp�"�� ���S~�= mpexp��"��� =p�#��?�#�����#����I#����egencrypt.8 1201054024 0 0 664 2633 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<egencrypt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�6����~�=egencrypt����=<���A~�@pub�p���@ p���P p������P~�?alpha�p���?~�?p�p��� ?p��� S~�=mpsignif�����=~�?plen�p���? ��� ���A����� ������A ��� ������A������A~�?shift�p���?~�@out�&������@AX�������<p���AS~�= mpnew����� =p������@p���AS���� =~�? pm1�p��� ?p� ��AS� ��� =~�? m�p� �� ?p�!��AS�!��� =~�? gamma�p�!�� ?p�"��AS�"��� =~�? delta�p�"�� ?~�@in�p�#�����@p�#��Sp�#��?p�#�����Sp�#�� ?p�#�����S~�=mpmod��#���=W�$���+���<W�$���+���<W�$���D���<W�$���-���<W�$���*���<p�%��? p�%�� S~�=genrandom�p�%��=�D p�%�� ���Sp�%��A���S~�=mprand��%���=~�=mpone�p�&��= p�&�� S~�?k�p�&��?p�&�����S~�=mpcmp��&���=&�&��AQ�&���A���<p�&��? p�&�� Sp�&�� ? p�&�� ���S�&���=&�&��AU�&���B���<W�&���C���<W�'���*���<W�'���)���<p�)��?p�)��Sp�)��?p�)�����Sp�)��?p�)�����Sp�)�� ?p�)�� ���S~�=mpexp��)���=p�*��@p�*�����Op�*��Sp�*��?p�*�����Sp�*��?p�*�����Sp�*�� ?p�*�� ���S�*���=p�*�� ? p�+�� ?p�+��Sp�+�� ���Sp�+�� ���S~�=mpmul��+���=p�+�� ? p�,�� Sp�,��?p�,�����Sp�,�� ���S�,���=p�-�� ?p�-��Sp�-��?p�-�����Sp�-�����@p�-�����S~�=mpleft��-���=p�-�����@ p�.�� ?p�.��Sp�.�� ���Sp�.�� ���S~�=mpadd��.���=p�/�� ?p�/��S~�=mpfree��/���=p�0�� ?p�0��S�0���=p�1��?p�1��S�1���=p�2�� ?p�2��S�2���=p�3�� ?p�3��S�3���=p�4�����@�4�����4����I4����egdecrypt.8 1201054025 0 0 664 2001 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<egdecrypt.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�,����~�=egdecrypt����=0���A~�@priv�p���@p���O~�?p�p���?p���S~�=mpsignif�����=C���� ������A����� ������A ��� ������A������A~�?shift�p���?~�@out�&������@AX�������<p���AS~�=mpnew�����=p������@p���AS����=~�?gamma�p���?p� ��AS� ���=~�? delta�p� �� ?~�@ in�p�!����� @p�!��Sp�!��?p�!�����Sp�!��?p�!�����S~�= mpright��!��� =p�"��?p�"��Sp�"��?p�"�����Sp�"�� ?p�"�����S~�= mpleft��"��� =p�"�� ? p�#����� @p�#��Sp�#�� ���Sp�#�� ���S~�= mpsub��#��� =p�$��?p�$��Sp�$��@p�$�� ���Op�$�����Sp�$��?p�$�����Sp�$�����@p�$�� ���S~�=mpexp��$���=p�%�����@p�%��Sp�%��?p�%�����Sp�%��?p�%�����S~�=mpinvert��%���=p�&��?p�&��Sp�&�� ?p�&�����Sp�&�����@p�&�����S~�=mpmul��&���=p�&�����@ p�'�� Sp�'��?p�'�����Sp�'�� ���S~�=mpmod��'���=p�(��?p�(��S~�=mpfree��(���=p�)�� ?p�)��S�)���=p�*�����@�*�����*����I*����egalloc.8 1201054025 0 0 664 2324 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<egalloc.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�V����~�=egpuballoc����=���Ap��� ���A p��� Sp������A p��� ���S~�=mallocz�����=p��� &���A~�?eg�p���?X�������<~�>.string�-���;> egpuballp���>�Dp���S~�=sysfatal�����=p���? p��� ����������~�=egpubfree�� ��=���A~�@eg�p� ��@ &�"�� AX�"������<�#����p�$��Pp�$��S~�=mpfree��$���=p�%��@p�%�����Op�%��S�%���=p�&��@p�&�����Op�&��S�&���=p�'��@p�'��S~�= free��'��� =�'����~�= egprivalloc��,�� =���Ap�0�����A p�0�� Sp�0�����A p�0�� ���S�0���=p�0�� &�1��A~�? eg�p�1�� ?X�1���3���<-�2��;���> oc�egprip�2��>� ���Dp�2��S�2���=p�2�� ? p�3�� �3�����3����~�= egprivfree��7�� =���A~�@ eg�p�7�� @ &�9�� AX�9���;���<�:����p�;��Pp�;��S�;���=p�<�� @p�<�����Op�<��S�<���=p�=�� @p�=�����Op�=��S�=���=p�>�� @p�>�� ���Op�>��S�>���=p�?�� @p�?��S�?��� =�?����~�=egsigalloc��C��=���Ap�G�����A p�G�� Sp�G�����A p�G�� ���S�G���=p�G�� &�H��A~�?eg�p�H��?X�H���\���<-�I��;���> valloc�e-�I��;���> gsigallop�I��>����Dp�I��S�I���=p�I��? p�J�� �J�����J����~�=egsigfree��N��=���A~�@eg�p�N��@ &�P�� AX�P���d���<�Q����p�R��Pp�R��S�R���=p�S��@p�S�����Op�S��S�S���=p�T��@p�T��S�T��� =�T����-�T��; ���> c�������5�T��>(���AIT����egprivtopub.8 1201054026 0 0 664 1136 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<egprivtopub.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�!����~�=egprivtopub����=���A~�=egpuballoc�����=&���A~�?pub�p���?X�������<p���A�����~�@priv�p���@ p���P p��� S~�=mpcopy�����=p���? p���Pp���@ p������P p��� S����=p���? p������Pp���@ p������P p��� S����=p���? p������Qp��� ����������I����egsign.8 1201054027 0 0 664 2831 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<egsign.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�;����~�=egsign����=D���A~�@priv�p���@ p���P p������P~�?alpha�p���?~�?p�p��� ?p��� S~�=mpsignif�����=~�?plen�p���?p���AS~�=mpnew�����=~�?pm1�p���?p���AS����=~�? kinv�p��� ?p���AS����=~�? r�p��� ?p� ��AS� ���=~�? s�p� �� ?p�!��AS�!���=~�? k�p�!�� ?p�"��?p�"��S~�= mpone�p�"�� =p�"�����Sp�"��?p�"�����S~�=mpsub��"���=W�#���"���<W�#���"���<W�#���Q���<W�#���$���<W�#���!���<p�$��?p�$��S~�=genrandom�p�$��=�Dp�$�����Sp�$�� ?p�$�����S~�=mprand��$���=p�%�� = p�%�� Sp�%�� ? p�%�� ���S~�=mpcmp��%���=&�%��AQ�%���:���<p�%�� ? p�%�� Sp�%��? p�%�� ���S�%���=&�%��AP�%���:���<W�%���;���<W�&��� ���<p�'�� ?p�'��Sp�'��?p�'�����Sp�'�� ?p�'�����Sp�'�� ?p�'�� ���Sp�'�� ?p�'�����S~�=mpextendedgcd��'���=p�(�� ? p�(�� Sp�(�� = p�(�� ���S�(���=p�(�� ? &�(��AO�(���O���<W�)��� ���<W�*���!���<W�*��� ���<p�,�� Sp�,��?p�,�����Sp�,�� ���S~�=mpmod��,���=p�-��?p�-��Sp�-�� ?p�-�����Sp�-��?p�-�����Sp�-�� ?p�-�� ���S~�=mpexp��-���=p�.��@p�.�� ���Op�.��Sp�.�� ?p�.�����Sp�.�� ?p�.�����S~�=mpmul��.���=p�.�� ? p�/�� Sp�/��?p�/�����Sp�/�� ���S�/���=p�/�� ? ~�@m�p�0�����@p�0��Sp�0�� ���Sp�0�� ���S�0���=p�0�� ? p�1�� ?p�1��Sp�1�� ���Sp�1�� ���S�1���=p�1�� ? p�2�� Sp�2��?p�2�����Sp�2�� ���S�2���=~�=egsigalloc��3���=p�4�� ? p�4�� O~�?sig�p�5��?p�5�� ? p�5�� ���Op�6��?p�6��S~�=mpfree��6���=p�7�� ?p�7��S�7���=p�8�� ?p�8��S�8���=p�9��?�9�����9����I9����egverify.8 1201054027 0 0 664 2149 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<egverify.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�-����~�=egverify����=8���A~�@pub�p���@ ~�@sig�p������@ p���Q~�?p�p���?p������Q~�?alpha�p���?p���P p������P~�?s�p���?~�?rv�p���A?~�?r�p��� ?p��� S~�= mpone�p��� = p��� ���S~�= mpcmp����� =&���AU�������<p���? p��� Sp���? p��� ���S���� =&���AP�������<W�������<p���?�����p���AS~�= mpnew����� =~�? v1�p��� ?p���AS���� =~�? rs�p��� ?p� ��AS� ��� =~�?v2�p� ��?p�!��@p�!�����Op�!��Sp�!��?p�!�����Sp�!��?p�!�����Sp�!�� ?p�!�� ���S~�=mpexp��!���=p�"��?p�"��Sp�"��?p�"�����Sp�"��?p�"�����Sp�"�� ?p�"�� ���S�"���=p�"�� ? p�#�� Sp�#�� ?p�#�����Sp�#�� ���S~�=mpmul��#���=p�#�� ? p�$�� Sp�$��?p�$�����Sp�$�� ���S~�=mpmod��$���=p�%��?p�%��S~�@m�p�%�����@p�%�����Sp�%��?p�%�����Sp�%��?p�%�� ���S�%���=p�&�� ? p�&�� Sp�&��? p�&�� ���S�&��� =&�&��AX�&���U���<p�'��A?p�(�� ?p�(��S~�=mpfree��(���=p�)�� ?p�)��S�)���=p�*��?p�*��S�*���=p�+��?�+�����+����I+����dsagen.8 1201054028 0 0 664 3077 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<dsagen.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�J����~�=dsagen����=0���A~�=dsaprivalloc�����=~�@opub�p���@ ~�?priv�p���?~�?pub�p���?&�!�� AO�!������<p�"��Q p�"�� S~�=mpcopy��"���=p�"��? p�"��Pp�#��@ p�#�����P p�#�� S�#���=p�#��? p�#�����PW�#���!���<p�%��AS~�=mpnew��%���=p�%��? p�%��Pp�&��AS�&���=p�&��? p�&�����Qp�'�����Qp�'��Sp�'��Qp�'�����Sp�'��A���S~�=DSAprimes��'���=p�)��?p�)��Op�)�����O�)�����A~�? bits�p�)�� ?p�+��AS�+���=p�+��? p�+�����Pp�,��AS�,���=p�,��? p�,�� ���Pp�-��AS�-���=p�-��? p�-�����Pp�2��AS�2���=~�? exp�p�2�� ?p�3��AS�3���=~�? g�p�3�� ?p�4��AS�4���=~�? r�p�4�� ?p�5��?p�5��Op�5��S~�= mpone�p�5�� =p�5�����Sp�5�� ?p�5�����S~�=mpsub��5���=p�5�� ? p�6�� Sp�6��?p�6�����Op�6�����Sp�6�� ���Sp�6�� ?p�6�� ���S~�=mpdiv��6���=p�7�� ? p�7�� S~�=mpzero�p�7��= p�7�� ���S~�=mpcmp��7���=&�7��AO�7���V���<~�>.string�-�8��;> dsagen fp�8��>�Dp�8��S~�=sysfatal��8���=W�9���Y���<W�9���Y���<W�9���}���<W�9���[���<W�9���X���<p�:�� ?p�:��S~�=genrandom�p�:��=�Dp�:�����Sp�:�� ?p�:�����S~�=mprand��:���=p�:�� ? p�;�� Sp�;��?p�;��Op�;�����Sp�;�� ���S~�=mpmod��;���=p�;��? p�<�� ?p�<��Sp�<�� ?p�<�����Sp�<��Pp�<�����Sp�<�����Pp�<�� ���S~�=mpexp��<���=p�=��? p�=�����P p�=�� Sp�=�� = p�=�� ���S�=���=&�=��AO�=���|���<W�>���X���<W�>���W���<p�@�� ?p�@��S~�=mpfree��@���=p�A�� ?p�A��S�A���=p�D�� ?p�D��Sp�D��=�Dp�D�����Sp�D��?p�D�����Op�D�����S�D���=p�D��? p�E�����Pp�E��Sp�E��?p�E��Op�E�����Sp�E�����Pp�E�����S�E���=p�E��? p�F�����Pp�F��Sp�F��?p�F�����Op�F�����Sp�F��Pp�F�����Sp�F�� ���Pp�F�� ���S�F���=p�H��?�H�����H����-�H��;���> oul up��5�H��>���AIH����dsaalloc.8 1201054029 0 0 664 2427 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<dsaalloc.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�X����~�=dsapuballoc����=���Ap������A p��� Sp������A p��� ���S~�=mallocz�����=p��� &���A~�?dsa�p���?X�������<~�>.string�-���;> dsapubalp���>�Dp���S~�=sysfatal�����=p���? p��� ����������~�=dsapubfree�� ��=���A~�@dsa�p� ��@ &�"�� AX�"������<�#����p�$��Pp�$��S~�=mpfree��$���=p�%��@p�%�����Op�%��S�%���=p�&��@p�&�����Op�&��S�&���=p�'��@p�'�� ���Op�'��S�'���=p�(��@p�(��S~�= free��(��� =�(����~�= dsaprivalloc��-�� =���Ap�1�����A p�1�� Sp�1�����A p�1�� ���S�1���=p�1�� &�2��A~�? dsa�p�2�� ?X�2���7���<-�3��;���> loc�dsap-�3��;���> rivallocp�3��>� ���Dp�3��S�3���=p�3�� ? p�4�� �4�����4����~�= dsaprivfree��8�� =���A~�@ dsa�p�8�� @ &�:�� AX�:���?���<�;����p�<��Pp�<��S�<���=p�=�� @p�=�����Op�=��S�=���=p�>�� @p�>�����Op�>��S�>���=p�?�� @p�?�� ���Op�?��S�?���=p�@�� @p�@�����Op�@��S�@���=p�A�� @p�A��S�A��� =�A����~�=dsasigalloc��E��=���Ap�I�����A p�I�� Sp�I�����A p�I�� ���S�I���=p�I�� &�J��A~�?dsa�p�J��?X�J���d���<-�K��;���> �dsasigap�K��>����Dp�K��S�K���=p�K��? p�L�� �L�����L����~�=dsasigfree��P��=���A~�@dsa�p�P��@ &�R�� AX�R���l���<�S����p�T��Pp�T��S�T���=p�U��@p�U�����Op�U��S�U���=p�V��@p�V��S�V��� =�V����-�V��; ���> lloc����5�V��>(���AIV����dsaprivtopub.8 1201054029 0 0 664 1172 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<dsaprivtopub.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7� ����~�=dsaprivtopub����=���A~�=dsapuballoc�����=~�?pub�p���?~�@priv�p���@ p���P p��� S~�=mpcopy�����=p���? p���Pp���@ p������P p��� S����=p���? p������Pp���@ p������P p��� S����=p���? p������Pp���@ p��� ���P p��� S����=p���? p��� ���Qp��� ����������I����dsasign.8 1201054030 0 0 664 3111 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<dsasign.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�D����~�=dsasign����=H���A~�@priv�p���@ p������P p���P~�?p�p���?~�?pub�p��� ?p������P~�?alpha�p���?~�?q�p��� ?p��� S~�=mpsignif�����=~�?qlen�p���?p���AS~�= mpnew����� =~�? qm1�p��� ?p���AS���� =~�? kinv�p��� ?p���AS���� =~�? r�p��� ?p� ��AS� ��� =~�? s�p� �� ?p�!��AS�!��� =~�?k�p�!��?p�"��?p�"�����Op�"��S~�=mpone�p�"��=p�"�����Sp�"�� ?p�"�����S~�=mpsub��"���=W�%���&���<W�%���&���<W�%���W���<W�%���(���<W�%���%���<p�&��?p�&��S~�=genrandom�p�&��=�Dp�&�����Sp�&��?p�&�����S~�=mprand��&���=p�'��= p�'�� Sp�'��? p�'�� ���S~�=mpcmp��'���=&�'��AQ�'���?���<p�'��? p�'�� Sp�'��? p�'�����P p�'�� ���S�'���=&�'��AP�'���?���<W�'���@���<W�(���$���<p�)��?p�)��Sp�)��?p�)�����Sp�)�� ?p�)�����Sp�)�� ?p�)�� ���Sp�)�� ?p�)�����S~�=mpextendedgcd��)���=p�*�� ? p�*�� Sp�*��= p�*�� ���S�*���=&�*��AO�*���U���<~�>.string�-�+��;> dsasign:-�+��;���> pub->q -�+��;���> not primp�+��>�Dp�+��S~�=sysfatal��+���=W�,���%���<W�,���$���<p�0�� ?p�0��Sp�0��?p�0�����Op�0�����Sp�0�� ?p�0�����S~�=mpmod��0���=p�3��?p�3��Sp�3��?p�3�����Sp�3��?p�3�����Sp�3�� ?p�3�� ���S~�=mpexp��3���=p�3�� ? p�4�� Sp�4��?p�4�����Sp�4�� ���S�4���=p�7�� ?p�7��Sp�7��@p�7�����Op�7�����Sp�7�� ?p�7�����S~�=mpmul��7���=p�7�� ? p�8�� S~�@m�p�8�����@p�8�����Sp�8�� ���S~�=mpadd��8���=p�8�� ? p�9�� Sp�9�� ?p�9�����Sp�9�� ���S�9���=p�9�� ? p�:�� Sp�:��?p�:�����Sp�:�� ���S�:���=~�=dsasigalloc��<���=p�=�� ? p�=�� O~�?sig�p�>��?p�>�� ? p�>�� ���Op�?�� ?p�?��S~�=mpfree��?���=p�@��?p�@��S�@���=p�A�� ?p�A��S�A���=p�B��?�B�����B����-�B��;���> e�������5�B��> ���AIB����dsaverify.8 1201054031 0 0 664 3007 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<dsaverify.c�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<os.h�7������~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<libmp�~�E<port�~�E<lib9.h�7������~�E</�~�E<386�~�E<include�~�E<u.h�7������7�E�����~�E</�~�E<sys�~�E<include�~�E<libc.h�7�F�����~�E<libc.a�7�G����A7�����7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<mp.h�7�����7�����~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<port�~�E<..�~�E<..�~�E<include�~�E<libsec.h�7�����7�����7�>����~�=dsaverify����=0���A~�?rv�p���A?~�@sig�p������@ p���P p��� S~�=mpone�p���= p��� ���S~�=mpcmp�����=&���AU�������<p������@ p���P p��� S~�@pub�p���@ p������P p��� ���S����=&���AP�������<W�������<p���?�����p������@ p������P p��� Sp���= p��� ���S����=&���AU����(���<p������@ p������P p��� Sp���@ p������P p��� ���S����=&���AP����(���<W����*���<p���?�����p���AS~�=mpnew�����=~�?u1�p���?p���AS����=~�? u2�p��� ?p� ��AS� ���=~�? v�p� �� ?p�!��AS�!���=p�!�� p�$�����@p�$�����Op�$��Sp�$��@p�$�����Op�$�����Sp�$��?p�$�����S~�? sinv�p�$��  ?p�$��  ���Sp�$�� ?p�$�����S~�= mpextendedgcd��$��� =p�%��? p�%�� Sp�%��= p�%�� ���S�%���=&�%��AO�%���K���<W�&������<p�)�� ?p�)��S~�@ m�p�)����� @p�)�����Sp�)��?p�)�����S~�=mpmul��)���=p�)��? p�*�� Sp�*��@p�*�����Op�*�����Sp�*�� ���S~�=mpmod��*���=p�+�����@p�+��Op�+��Sp�+�� ?p�+�����Sp�+�� ?p�+�����S�+���=p�+�� ? p�,�� Sp�,��@p�,�����Op�,�����Sp�,�� ���S�,���=p�,��@ p�/�����Pp�/��Sp�/��?p�/�����Sp�/��Pp�/�����Sp�/�� ?p�/�� ���S~�=mpexp��/���=p�/��@ p�0�� ���Pp�0��Sp�0�� ?p�0�����Sp�0��Pp�0�����Sp�0�� ?p�0�� ���S�0���=p�0�� ? p�1�� ?p�1��Sp�1�� ���Sp�1�� ���S�1���=p�1�� ? p�2�� Sp�2��@p�2��Op�2�����Sp�2�� ���S�2���=p�2�� ? p�3�� Sp�3��@p�3�����Op�3�����Sp�3�� ���S�3���=p�5�� ? p�5�� Sp�5�����@ p�5��P p�5�� ���S�5���=&�5��AX�5������<p�6��A?W�&������<p�8�� ?p�8��S~�=mpfree��8���=p�9��?p�9��S�9���=p�:�� ?p�:��S�:���=p�;�� ?p�;��S�;���=p�<��?�<�����<����I<����md5block.8 1201054034 0 0 664 6350 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<Plan9-386�~�E<md5block.s�7������7������~�=_md5block��m���=���A~�@data�p�p���@~�@len� �p������@~�?edata�p�r���?p�t���@ ~�@state�p�w������@p�x���Up�y������U p�z������U p�{��� ���U p�|��� �|���  �|��� �|��� a�|���xjO �|���T�|������A �|��� p�}��� �}���  �}����}��� a�}���VQ �}������T �}��� ���A �}��� p�~����~���  �~��� �~��� a�~���p $P �~������T �~������A �~���  p���� ���� ���� ����a����νR ���� ���T �������A ����  p���� ����  ���� ���� a����|O �������T�������A ���� p���� ����  �������� a����*ƇGQ �������T ���� ���A ���� p��������  ���� ���� a����F0P �������T �������A ����  p���� ���� ���� ����a����FR �������T �������A ����  p���� ����  ���� ���� a����ؘiO ���� ���T�������A ���� p���� ����  �������� a����DQ ����$���T ���� ���A ���� p��������  ���� ���� a����[P ����(���T �������A ����  p���� ���� ���� ����a����\R ����,���T �������A ����  p���� ����  ���� ���� a����"kO ����0���T�������A ���� p���� ����  �������� a����qQ ����4���T ���� ���A ���� p��������  ���� ���� a����CyP ����8���T �������A ����  p���� ���� ���� ����a����!IR ����<���T �������A ����  p���� ����  ���� ���� a����b%O �������T�������A ���� p��������  ���� ���� a����@@Q �������T ���� ���A ���� p���� ���� ���� ����a����QZ^&P ����,���T �������A ����  p���� ����  �������� a����ǶR ����T �������A ����  p���� ����  ���� ���� a����]/O �������T�������A ���� p��������  ���� ���� a����SDQ ����(���T ���� ���A ���� p���� ���� ���� ����a����P ����<���T �������A ����  p���� ����  �������� a����R �������T �������A ����  p���� ����  ���� ���� a����!O ����$���T�������A ���� p��������  ���� ���� a����7Q ����8���T ���� ���A ���� p���� ���� ���� ����a���� P ���� ���T �������A ����  p���� ����  �������� a����ZER ���� ���T �������A ����  p���� ����  ���� ���� a����O ����4���T�������A ���� p��������  ���� ���� a����Q �������T ���� ���A ���� p���� ���� ���� ����a����ogP �������T �������A ����  p���� ����  �������� a����L*R ����0���T �������A ����  p���� ���� ���� a����B9O �������T�������A ���� p�������� ���� a����qQ ���� ���T ���� ���A ���� p���� �������� a����"amP ����,���T �������A ����  p���� ���� ����a���� 8R ����8���T �������A ����  p���� ���� ���� a����D꾤O �������T�������A ���� p�������� ���� a����KQ �������T ���� ���A ���� p���� �������� a����`KP �������T �������A ����  p���� ���� ����a����pR ����(���T �������A ����  p���� ���� ���� a����~(O ����4���T�������A ���� p�������� ���� a����'Q ����T ���� ���A ���� p���� �������� a����0P ���� ���T �������A ����  p���� ���� ����a����R �������T �������A ����  p���� ���� ���� a����9O ����$���T�������A ���� p�������� ���� a����Q ����0���T ���� ���A ���� p���� �������� a����|P ����<���T �������A ����  p���� ���� ����a����eVR �������T �������A ����  p���� ����A���� ���� a����D")O ����T�������A ���� p���� ����A�������� a����*CQ �������T ���� ���A ���� p���� ����A���� ����a����#P ����8���T �������A ����  p��������A���� ���� a����9R �������T �������A ����  p���� ����A���� ���� a����Y[eO ����0���T�������A ���� p���� ����A�������� a���� Q ���� ���T ���� ���A ���� p���� ����A���� ����a����}P ����(���T �������A ����  p��������A���� ���� a����]R �������T �������A ����  p���� ����A���� ���� a����O~oO ���� ���T�������A ���� p���� ����A�������� a����,Q ����<���T ���� ���A ���� p���� ����A���� ����a����CP �������T �������A ����  p��������A���� ���� a����NR ����4���T �������A ����  p���� ����A���� ���� a����~SO �������T�������A ���� p���� ����A�������� a����5:Q ����,���T ���� ���A ���� p���� ����A���� ����a����*P �������T �������A ����  p��������A���� ���� a����ӆR ����$���T �������A ����  ����@���A p�������@ ����V ���� ���V ���� ���V ����  ���Vp����?&���� ~�<mainloop�M��������<������I�����I�����sha1block.8 1201054034 0 0 664 5826 ` ~�E</�~�E<sys�~�E<src�~�E<cmd�~�E<limbo�~�E<libsec�~�E<Plan9-386�~�E<sha1block.s�7������7������~�=_sha1block�����=`��A~�@data�p�a���@~�@len� �a������@~�?edata�p�c���?~�?aw15�a�d���?~�?w15�p�f���?~�?aw40�a�f���\? ~�?w40�p�h��� ?~�? aw60�a�h��� ? ~�? w60�p�j���  ?~�? aw80�a�j��� ?~�? w80�p�l��� ?~�? warray�a�n��� ? ~�@state�p�q������@p�r���Vp�s������V ~�?tmp1�p�t��� ?p�u������V p�v��� ���V p�w������Vp�y���@ p�{���R�{������A��{������A�p�{���Ta�{���yZVp�{����{������A �{���p�{��� �{���  �{���?�{���  �{����{������A?~�?tmp2�p�}���?p�}������R�}������A��}������A�p�}������Ta�}��� yZV p�}����}������A �}��� p�}���?�}���  �}����}���  �}��� �}������Ap����?p�������R�������A��������A�p�������Ta���� yZV p���� �������A ���� p�������� ����?���� ���� �������A?p���� ���R�������A��������A�p���� ���Ta����yZVp���� �������A ����p����?���� ���� ���� �����������A p����?p�������R�������A��������A�p�������Ta����yZVp�����������A ����p���� ����? ���� ����? �����������A p����? �������A �������A &���� ?~�<loop1�M��������<p����R�������A��������A�p����Ta����yZVp�����������A ����p���� ����  ����?����  �����������A? �������A p���� @p����? p����T����T����T����T�������Ap�������Ta���� yZV p�����������A ���� p���� ����  ��������  ���� �������Ap����T����T����T����T�������Ap�������Ta���� yZV p���� �������A ���� p��������  ��������  ���� �������Ap����T����T����T����T�������Ap���� ���Ta���� yZV p���� �������A ���� p�������� ���� ���� ���� �������A p����T����T����T�������T�������Ap�������Ta����yZVp���� �������A ����p���� ���� ���� ���� �����������A �������A p����T����T����T����T�������Ap����Ta����nVp�����������A ����p���� ���� ����  �����������A p����T����T����T����T�������Ap�������Ta���� nV p�����������A ���� p�������� ����  ���� �������Ap����T����T����T����T�������Ap�������Ta���� nV p���� �������A ���� p������������  ���� �������Ap����T����T����T����T�������Ap���� ���Ta���� nV p���� �������A ���� p���� �������� ���� �������A p����T����T����T�������T�������Ap�������Ta����nVp���� �������A ����p���� ���� ���� �����������A �������A &���� ?~�<loop2�M��������<p����T����T����T����T�������Ap����Ta����ܼVp�����������A ����p���� ���� ����  ���� ���� ����  �����������A p����T����T����T����T�������Ap�������Ta���� ܼV p�����������A ���� p�������� ���� ���� �������� ���� �������Ap����T����T����T����T�������Ap�������Ta���� ܼV p���� �������A ���� p������������ ���� �������� ���� �������Ap����T����T����T����T�������Ap���� ���Ta���� ܼV p���� �������A ���� p���� ��������  �������� ����  ���� �������A p����T����T����T�������T�������Ap�������Ta����ܼVp���� �������A ����p���� ���� ����  �������� ����  �����������A �������A &����  ?~�<loop3�M�������<p����T����T����T����T�������Ap����Ta����bVp�����������A ����p���� ���� ����  �����������A p����T����T����T����T�������Ap�������Ta���� bV p�����������A ���� p�������� ����  ���� �������Ap����T����T����T����T�������Ap�������Ta���� bV p���� �������A ���� p������������  ���� �������Ap����T����T����T����T�������Ap���� ���Ta���� bV p���� �������A ���� p���� �������� ���� �������A p����T����T����T�������T�������Ap�������Ta����bVp���� �������A ����p���� ���� ���� �����������A �������A &����  ?~�<loop4�M�����`��<p�������@ ����V ���� ���V ���� ���V ����  ���V �������Vp����?&����@~�<mainloop�M����� ���<������I�����I����� ���� ����a����QZ^&P ����,���T �������A ����  p���� ����  �������� a����ǶR ����T �������A ����  p���� ����  ���� ���� a����]/O �������T�������A ���� pold_contrib//root/sys/src/cmd/limbo/libsec/mkfile��������������������������������������������������� 664 � 0 � 0 � 404 10745512550 21143�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������</$objtype/mkfile # TARGMODEL not SYSTARG for now DIRS=port Plan9-$objtype SHELLTYPE=rc %:QV: for (j in $DIRS) { { test -d $j && { echo '@{builtin cd' $j ';' mk $MKFLAGS $stem'}' @{builtin cd $j; mk $MKFLAGS $stem} } } || test ! -e $j } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/���������������������������������������������������� 775 � 0 � 0 � 0 11411740025 20746��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/aes.c����������������������������������������������� 664 � 0 � 0 � 175127 10231466546 21753�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * this code is derived from the following source, * and modified to fit into the plan 9 libsec interface. * most of the changes are confined to the top section, * with the exception of converting Te4 and Td4 into u8 rather than u32 arrays. * * rijndael-alg-fst.c * * @version 3.0 (December 2000) * * Optimised ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> * @author Paulo Barreto <paulo.barreto@terra.com.br> * * This code is hereby placed in the public domain. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "os.h" #include <libsec.h> typedef uchar u8; typedef u32int u32; #define FULL_UNROLL static const u32 Td0[256]; static const u32 Td1[256]; static const u32 Td2[256]; static const u32 Td3[256]; static const u8 Te4[256]; static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); static int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); static int rijndaelKeySetup(u32 erk[/*4*(Nr + 1)*/], u32 drk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); static void rijndaelEncrypt(const u32int rk[], int Nr, const uchar pt[16], uchar ct[16]); static void rijndaelDecrypt(const u32int rk[], int Nr, const uchar ct[16], uchar pt[16]); void setupAESstate(AESstate *s, uchar key[], int keybytes, uchar *ivec) { memset(s, 0, sizeof(*s)); if(keybytes > AESmaxkey) keybytes = AESmaxkey; memmove(s->key, key, keybytes); s->keybytes = keybytes; s->rounds = rijndaelKeySetup(s->ekey, s->dkey, s->key, keybytes * 8); if(ivec != nil) memmove(s->ivec, ivec, AESbsize); if(keybytes==16 || keybytes==24 || keybytes==32) s->setup = 0xcafebabe; // else rijndaelKeySetup was invalid } // Define by analogy with desCBCencrypt; AES modes are not standardized yet. // Because of the way that non-multiple-of-16 buffers are handled, // the decryptor must be fed buffers of the same size as the encryptor. void aesCBCencrypt(uchar *p, int len, AESstate *s) { uchar *p2, *ip, *eip; uchar q[AESbsize]; for(; len >= AESbsize; len -= AESbsize){ p2 = p; ip = s->ivec; for(eip = ip+AESbsize; ip < eip; ) *p2++ ^= *ip++; rijndaelEncrypt(s->ekey, s->rounds, p, q); memmove(s->ivec, q, AESbsize); memmove(p, q, AESbsize); p += AESbsize; } if(len > 0){ ip = s->ivec; rijndaelEncrypt(s->ekey, s->rounds, ip, q); memmove(s->ivec, q, AESbsize); for(eip = ip+len; ip < eip; ) *p++ ^= *ip++; } } void aesCBCdecrypt(uchar *p, int len, AESstate *s) { uchar *ip, *eip, *tp; uchar tmp[AESbsize], q[AESbsize]; for(; len >= AESbsize; len -= AESbsize){ memmove(tmp, p, AESbsize); rijndaelDecrypt(s->dkey, s->rounds, p, q); memmove(p, q, AESbsize); tp = tmp; ip = s->ivec; for(eip = ip+AESbsize; ip < eip; ){ *p++ ^= *ip; *ip++ = *tp++; } } if(len > 0){ ip = s->ivec; rijndaelEncrypt(s->ekey, s->rounds, ip, q); memmove(s->ivec, q, AESbsize); for(eip = ip+len; ip < eip; ) *p++ ^= *ip++; } } /* * this function has been changed for plan 9. * Expand the cipher key into the encryption and decryption key schedules. * * @return the number of rounds for the given cipher key size. */ static int rijndaelKeySetup(u32 erk[/*4*(Nr + 1)*/], u32 drk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { int Nr, i; /* expand the cipher key: */ Nr = rijndaelKeySetupEnc(erk, cipherKey, keyBits); /* * invert the order of the round keys and * apply the inverse MixColumn transform to all round keys but the first and the last */ drk[0 ] = erk[4*Nr ]; drk[1 ] = erk[4*Nr + 1]; drk[2 ] = erk[4*Nr + 2]; drk[3 ] = erk[4*Nr + 3]; drk[4*Nr ] = erk[0 ]; drk[4*Nr + 1] = erk[1 ]; drk[4*Nr + 2] = erk[2 ]; drk[4*Nr + 3] = erk[3 ]; erk += 4 * Nr; for (i = 1; i < Nr; i++) { drk += 4; erk -= 4; drk[0] = Td0[Te4[(erk[0] >> 24) ]] ^ Td1[Te4[(erk[0] >> 16) & 0xff]] ^ Td2[Te4[(erk[0] >> 8) & 0xff]] ^ Td3[Te4[(erk[0] ) & 0xff]]; drk[1] = Td0[Te4[(erk[1] >> 24) ]] ^ Td1[Te4[(erk[1] >> 16) & 0xff]] ^ Td2[Te4[(erk[1] >> 8) & 0xff]] ^ Td3[Te4[(erk[1] ) & 0xff]]; drk[2] = Td0[Te4[(erk[2] >> 24) ]] ^ Td1[Te4[(erk[2] >> 16) & 0xff]] ^ Td2[Te4[(erk[2] >> 8) & 0xff]] ^ Td3[Te4[(erk[2] ) & 0xff]]; drk[3] = Td0[Te4[(erk[3] >> 24) ]] ^ Td1[Te4[(erk[3] >> 16) & 0xff]] ^ Td2[Te4[(erk[3] >> 8) & 0xff]] ^ Td3[Te4[(erk[3] ) & 0xff]]; } return Nr; } /* Te0[x] = S [x].[02, 01, 01, 03]; Te1[x] = S [x].[03, 02, 01, 01]; Te2[x] = S [x].[01, 03, 02, 01]; Te3[x] = S [x].[01, 01, 03, 02]; Te4[x] = S [x] Td0[x] = Si[x].[0e, 09, 0d, 0b]; Td1[x] = Si[x].[0b, 0e, 09, 0d]; Td2[x] = Si[x].[0d, 0b, 0e, 09]; Td3[x] = Si[x].[09, 0d, 0b, 0e]; Td4[x] = Si[x] */ static const u32 Te0[256] = { 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, }; static const u32 Te1[256] = { 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, }; static const u32 Te2[256] = { 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, }; static const u32 Te3[256] = { 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, }; static const u8 Te4[256] = { 0x63U, 0x7cU, 0x77U, 0x7bU, 0xf2U, 0x6bU, 0x6fU, 0xc5U, 0x30U, 0x01U, 0x67U, 0x2bU, 0xfeU, 0xd7U, 0xabU, 0x76U, 0xcaU, 0x82U, 0xc9U, 0x7dU, 0xfaU, 0x59U, 0x47U, 0xf0U, 0xadU, 0xd4U, 0xa2U, 0xafU, 0x9cU, 0xa4U, 0x72U, 0xc0U, 0xb7U, 0xfdU, 0x93U, 0x26U, 0x36U, 0x3fU, 0xf7U, 0xccU, 0x34U, 0xa5U, 0xe5U, 0xf1U, 0x71U, 0xd8U, 0x31U, 0x15U, 0x04U, 0xc7U, 0x23U, 0xc3U, 0x18U, 0x96U, 0x05U, 0x9aU, 0x07U, 0x12U, 0x80U, 0xe2U, 0xebU, 0x27U, 0xb2U, 0x75U, 0x09U, 0x83U, 0x2cU, 0x1aU, 0x1bU, 0x6eU, 0x5aU, 0xa0U, 0x52U, 0x3bU, 0xd6U, 0xb3U, 0x29U, 0xe3U, 0x2fU, 0x84U, 0x53U, 0xd1U, 0x00U, 0xedU, 0x20U, 0xfcU, 0xb1U, 0x5bU, 0x6aU, 0xcbU, 0xbeU, 0x39U, 0x4aU, 0x4cU, 0x58U, 0xcfU, 0xd0U, 0xefU, 0xaaU, 0xfbU, 0x43U, 0x4dU, 0x33U, 0x85U, 0x45U, 0xf9U, 0x02U, 0x7fU, 0x50U, 0x3cU, 0x9fU, 0xa8U, 0x51U, 0xa3U, 0x40U, 0x8fU, 0x92U, 0x9dU, 0x38U, 0xf5U, 0xbcU, 0xb6U, 0xdaU, 0x21U, 0x10U, 0xffU, 0xf3U, 0xd2U, 0xcdU, 0x0cU, 0x13U, 0xecU, 0x5fU, 0x97U, 0x44U, 0x17U, 0xc4U, 0xa7U, 0x7eU, 0x3dU, 0x64U, 0x5dU, 0x19U, 0x73U, 0x60U, 0x81U, 0x4fU, 0xdcU, 0x22U, 0x2aU, 0x90U, 0x88U, 0x46U, 0xeeU, 0xb8U, 0x14U, 0xdeU, 0x5eU, 0x0bU, 0xdbU, 0xe0U, 0x32U, 0x3aU, 0x0aU, 0x49U, 0x06U, 0x24U, 0x5cU, 0xc2U, 0xd3U, 0xacU, 0x62U, 0x91U, 0x95U, 0xe4U, 0x79U, 0xe7U, 0xc8U, 0x37U, 0x6dU, 0x8dU, 0xd5U, 0x4eU, 0xa9U, 0x6cU, 0x56U, 0xf4U, 0xeaU, 0x65U, 0x7aU, 0xaeU, 0x08U, 0xbaU, 0x78U, 0x25U, 0x2eU, 0x1cU, 0xa6U, 0xb4U, 0xc6U, 0xe8U, 0xddU, 0x74U, 0x1fU, 0x4bU, 0xbdU, 0x8bU, 0x8aU, 0x70U, 0x3eU, 0xb5U, 0x66U, 0x48U, 0x03U, 0xf6U, 0x0eU, 0x61U, 0x35U, 0x57U, 0xb9U, 0x86U, 0xc1U, 0x1dU, 0x9eU, 0xe1U, 0xf8U, 0x98U, 0x11U, 0x69U, 0xd9U, 0x8eU, 0x94U, 0x9bU, 0x1eU, 0x87U, 0xe9U, 0xceU, 0x55U, 0x28U, 0xdfU, 0x8cU, 0xa1U, 0x89U, 0x0dU, 0xbfU, 0xe6U, 0x42U, 0x68U, 0x41U, 0x99U, 0x2dU, 0x0fU, 0xb0U, 0x54U, 0xbbU, 0x16U, }; static const u32 Td0[256] = { 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, }; static const u32 Td1[256] = { 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, }; static const u32 Td2[256] = { 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, }; static const u32 Td3[256] = { 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, }; static const u8 Td4[256] = { 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, }; static const u32 rcon[] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; #define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) #ifdef _MSC_VER #define GETU32(p) SWAP(*((u32 *)(p))) #define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } #else #define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) #define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } #endif /** * Expand the cipher key into the encryption key schedule. * * @return the number of rounds for the given cipher key size. */ static int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { int i = 0; u32 temp; rk[0] = GETU32(cipherKey ); rk[1] = GETU32(cipherKey + 4); rk[2] = GETU32(cipherKey + 8); rk[3] = GETU32(cipherKey + 12); if (keyBits == 128) { for (;;) { temp = rk[3]; rk[4] = rk[0] ^ (Te4[(temp >> 16) & 0xff] << 24) ^ (Te4[(temp >> 8) & 0xff] << 16) ^ (Te4[(temp ) & 0xff] << 8) ^ (Te4[(temp >> 24) ] ) ^ rcon[i]; rk[5] = rk[1] ^ rk[4]; rk[6] = rk[2] ^ rk[5]; rk[7] = rk[3] ^ rk[6]; if (++i == 10) { return 10; } rk += 4; } } rk[4] = GETU32(cipherKey + 16); rk[5] = GETU32(cipherKey + 20); if (keyBits == 192) { for (;;) { temp = rk[ 5]; rk[ 6] = rk[ 0] ^ (Te4[(temp >> 16) & 0xff] << 24) ^ (Te4[(temp >> 8) & 0xff] << 16) ^ (Te4[(temp ) & 0xff] << 8) ^ (Te4[(temp >> 24) ] ) ^ rcon[i]; rk[ 7] = rk[ 1] ^ rk[ 6]; rk[ 8] = rk[ 2] ^ rk[ 7]; rk[ 9] = rk[ 3] ^ rk[ 8]; if (++i == 8) { return 12; } rk[10] = rk[ 4] ^ rk[ 9]; rk[11] = rk[ 5] ^ rk[10]; rk += 6; } } rk[6] = GETU32(cipherKey + 24); rk[7] = GETU32(cipherKey + 28); if (keyBits == 256) { for (;;) { temp = rk[ 7]; rk[ 8] = rk[ 0] ^ (Te4[(temp >> 16) & 0xff] << 24) ^ (Te4[(temp >> 8) & 0xff] << 16) ^ (Te4[(temp ) & 0xff] << 8) ^ (Te4[(temp >> 24) ] ) ^ rcon[i]; rk[ 9] = rk[ 1] ^ rk[ 8]; rk[10] = rk[ 2] ^ rk[ 9]; rk[11] = rk[ 3] ^ rk[10]; if (++i == 7) { return 14; } temp = rk[11]; rk[12] = rk[ 4] ^ (Te4[(temp >> 24) ] << 24) ^ (Te4[(temp >> 16) & 0xff] << 16) ^ (Te4[(temp >> 8) & 0xff] << 8) ^ (Te4[(temp ) & 0xff] ); rk[13] = rk[ 5] ^ rk[12]; rk[14] = rk[ 6] ^ rk[13]; rk[15] = rk[ 7] ^ rk[14]; rk += 8; } } return 0; } /** * Expand the cipher key into the decryption key schedule. * * @return the number of rounds for the given cipher key size. */ static int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { int Nr, i, j; u32 temp; /* expand the cipher key: */ Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); /* invert the order of the round keys: */ for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; } /* apply the inverse MixColumn transform to all round keys but the first and the last: */ for (i = 1; i < Nr; i++) { rk += 4; rk[0] = Td0[Te4[(rk[0] >> 24) ]] ^ Td1[Te4[(rk[0] >> 16) & 0xff]] ^ Td2[Te4[(rk[0] >> 8) & 0xff]] ^ Td3[Te4[(rk[0] ) & 0xff]]; rk[1] = Td0[Te4[(rk[1] >> 24) ]] ^ Td1[Te4[(rk[1] >> 16) & 0xff]] ^ Td2[Te4[(rk[1] >> 8) & 0xff]] ^ Td3[Te4[(rk[1] ) & 0xff]]; rk[2] = Td0[Te4[(rk[2] >> 24) ]] ^ Td1[Te4[(rk[2] >> 16) & 0xff]] ^ Td2[Te4[(rk[2] >> 8) & 0xff]] ^ Td3[Te4[(rk[2] ) & 0xff]]; rk[3] = Td0[Te4[(rk[3] >> 24) ]] ^ Td1[Te4[(rk[3] >> 16) & 0xff]] ^ Td2[Te4[(rk[3] >> 8) & 0xff]] ^ Td3[Te4[(rk[3] ) & 0xff]]; } return Nr; } static void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { u32 s0, s1, s2, s3, t0, t1, t2, t3; #ifndef FULL_UNROLL int r; #endif /* ?FULL_UNROLL */ /* * map byte array block to cipher state * and add initial round key: */ s0 = GETU32(pt ) ^ rk[0]; s1 = GETU32(pt + 4) ^ rk[1]; s2 = GETU32(pt + 8) ^ rk[2]; s3 = GETU32(pt + 12) ^ rk[3]; #ifdef FULL_UNROLL /* round 1: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; /* round 2: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; /* round 3: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; /* round 4: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; /* round 5: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; /* round 6: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; /* round 7: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; /* round 8: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; /* round 9: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; if (Nr > 10) { /* round 10: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; /* round 11: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; if (Nr > 12) { /* round 12: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; /* round 13: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; } } rk += Nr << 2; #else /* !FULL_UNROLL */ /* * Nr - 1 full rounds: */ r = Nr >> 1; for (;;) { t0 = Te0[(s0 >> 24) ] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[(s3 ) & 0xff] ^ rk[4]; t1 = Te0[(s1 >> 24) ] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[(s0 ) & 0xff] ^ rk[5]; t2 = Te0[(s2 >> 24) ] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[(s1 ) & 0xff] ^ rk[6]; t3 = Te0[(s3 >> 24) ] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[(s2 ) & 0xff] ^ rk[7]; rk += 8; if (--r == 0) { break; } s0 = Te0[(t0 >> 24) ] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[(t3 ) & 0xff] ^ rk[0]; s1 = Te0[(t1 >> 24) ] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[(t0 ) & 0xff] ^ rk[1]; s2 = Te0[(t2 >> 24) ] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[(t1 ) & 0xff] ^ rk[2]; s3 = Te0[(t3 >> 24) ] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[(t2 ) & 0xff] ^ rk[3]; } #endif /* ?FULL_UNROLL */ /* * apply last round and * map cipher state to byte array block: */ s0 = (Te4[(t0 >> 24) ] << 24) ^ (Te4[(t1 >> 16) & 0xff] << 16) ^ (Te4[(t2 >> 8) & 0xff] << 8) ^ (Te4[(t3 ) & 0xff] ) ^ rk[0]; PUTU32(ct , s0); s1 = (Te4[(t1 >> 24) ] << 24) ^ (Te4[(t2 >> 16) & 0xff] << 16) ^ (Te4[(t3 >> 8) & 0xff] << 8) ^ (Te4[(t0 ) & 0xff] ) ^ rk[1]; PUTU32(ct + 4, s1); s2 = (Te4[(t2 >> 24) ] << 24) ^ (Te4[(t3 >> 16) & 0xff] << 16) ^ (Te4[(t0 >> 8) & 0xff] << 8) ^ (Te4[(t1 ) & 0xff] ) ^ rk[2]; PUTU32(ct + 8, s2); s3 = (Te4[(t3 >> 24) ] << 24) ^ (Te4[(t0 >> 16) & 0xff] << 16) ^ (Te4[(t1 >> 8) & 0xff] << 8) ^ (Te4[(t2 ) & 0xff] ) ^ rk[3]; PUTU32(ct + 12, s3); } static void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { u32 s0, s1, s2, s3, t0, t1, t2, t3; #ifndef FULL_UNROLL int r; #endif /* ?FULL_UNROLL */ /* * map byte array block to cipher state * and add initial round key: */ s0 = GETU32(ct ) ^ rk[0]; s1 = GETU32(ct + 4) ^ rk[1]; s2 = GETU32(ct + 8) ^ rk[2]; s3 = GETU32(ct + 12) ^ rk[3]; #ifdef FULL_UNROLL /* round 1: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; /* round 2: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; /* round 3: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; /* round 4: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; /* round 5: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; /* round 6: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; /* round 7: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; /* round 8: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; /* round 9: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; if (Nr > 10) { /* round 10: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; /* round 11: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; if (Nr > 12) { /* round 12: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; /* round 13: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; } } rk += Nr << 2; #else /* !FULL_UNROLL */ /* * Nr - 1 full rounds: */ r = Nr >> 1; for (;;) { t0 = Td0[(s0 >> 24) ] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[(s1 ) & 0xff] ^ rk[4]; t1 = Td0[(s1 >> 24) ] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[(s2 ) & 0xff] ^ rk[5]; t2 = Td0[(s2 >> 24) ] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[(s3 ) & 0xff] ^ rk[6]; t3 = Td0[(s3 >> 24) ] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[(s0 ) & 0xff] ^ rk[7]; rk += 8; if (--r == 0) { break; } s0 = Td0[(t0 >> 24) ] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[(t1 ) & 0xff] ^ rk[0]; s1 = Td0[(t1 >> 24) ] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[(t2 ) & 0xff] ^ rk[1]; s2 = Td0[(t2 >> 24) ] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[(t3 ) & 0xff] ^ rk[2]; s3 = Td0[(t3 >> 24) ] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[(t0 ) & 0xff] ^ rk[3]; } #endif /* ?FULL_UNROLL */ /* * apply last round and * map cipher state to byte array block: */ s0 = (Td4[(t0 >> 24) ] << 24) ^ (Td4[(t3 >> 16) & 0xff] << 16) ^ (Td4[(t2 >> 8) & 0xff] << 8) ^ (Td4[(t1 ) & 0xff] ) ^ rk[0]; PUTU32(pt , s0); s1 = (Td4[(t1 >> 24) ] << 24) ^ (Td4[(t0 >> 16) & 0xff] << 16) ^ (Td4[(t3 >> 8) & 0xff] << 8) ^ (Td4[(t2 ) & 0xff] ) ^ rk[1]; PUTU32(pt + 4, s1); s2 = (Td4[(t2 >> 24) ] << 24) ^ (Td4[(t1 >> 16) & 0xff] << 16) ^ (Td4[(t0 >> 8) & 0xff] << 8) ^ (Td4[(t3 ) & 0xff] ) ^ rk[2]; PUTU32(pt + 8, s2); s3 = (Td4[(t3 >> 24) ] << 24) ^ (Td4[(t2 >> 16) & 0xff] << 16) ^ (Td4[(t1 >> 8) & 0xff] << 8) ^ (Td4[(t0 ) & 0xff] ) ^ rk[3]; PUTU32(pt + 12, s3); } #ifdef INTERMEDIATE_VALUE_KAT static void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { int r; u32 s0, s1, s2, s3, t0, t1, t2, t3; /* * map byte array block to cipher state * and add initial round key: */ s0 = GETU32(block ) ^ rk[0]; s1 = GETU32(block + 4) ^ rk[1]; s2 = GETU32(block + 8) ^ rk[2]; s3 = GETU32(block + 12) ^ rk[3]; rk += 4; /* * Nr - 1 full rounds: */ for (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) { t0 = Te0[(s0 >> 24) ] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[(s3 ) & 0xff] ^ rk[0]; t1 = Te0[(s1 >> 24) ] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[(s0 ) & 0xff] ^ rk[1]; t2 = Te0[(s2 >> 24) ] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[(s1 ) & 0xff] ^ rk[2]; t3 = Te0[(s3 >> 24) ] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[(s2 ) & 0xff] ^ rk[3]; s0 = t0; s1 = t1; s2 = t2; s3 = t3; rk += 4; } /* * apply last round and * map cipher state to byte array block: */ if (rounds == Nr) { t0 = (Te4[(s0 >> 24) ] << 24) ^ (Te4[(s1 >> 16) & 0xff] << 16) ^ (Te4[(s2 >> 8) & 0xff] << 8) ^ (Te4[(s3 ) & 0xff] ) ^ rk[0]; t1 = (Te4[(s1 >> 24) ] << 24) ^ (Te4[(s2 >> 16) & 0xff] << 16) ^ (Te4[(s3 >> 8) & 0xff] << 8) ^ (Te4[(s0 ) & 0xff] ) ^ rk[1]; t2 = (Te4[(s2 >> 24) ] << 24) ^ (Te4[(s3 >> 16) & 0xff] << 16) ^ (Te4[(s0 >> 8) & 0xff] << 8) ^ (Te4[(s1 ) & 0xff] ) ^ rk[2]; t3 = (Te4[(s3 >> 24) ] << 24) ^ (Te4[(s0 >> 16) & 0xff] << 16) ^ (Te4[(s1 >> 8) & 0xff] << 8) ^ (Te4[(s2 ) & 0xff] ) ^ rk[3]; s0 = t0; s1 = t1; s2 = t2; s3 = t3; } PUTU32(block , s0); PUTU32(block + 4, s1); PUTU32(block + 8, s2); PUTU32(block + 12, s3); } static void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { int r; u32 s0, s1, s2, s3, t0, t1, t2, t3; /* * map byte array block to cipher state * and add initial round key: */ s0 = GETU32(block ) ^ rk[0]; s1 = GETU32(block + 4) ^ rk[1]; s2 = GETU32(block + 8) ^ rk[2]; s3 = GETU32(block + 12) ^ rk[3]; rk += 4; /* * Nr - 1 full rounds: */ for (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) { t0 = Td0[(s0 >> 24) ] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[(s1 ) & 0xff] ^ rk[0]; t1 = Td0[(s1 >> 24) ] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[(s2 ) & 0xff] ^ rk[1]; t2 = Td0[(s2 >> 24) ] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[(s3 ) & 0xff] ^ rk[2]; t3 = Td0[(s3 >> 24) ] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[(s0 ) & 0xff] ^ rk[3]; s0 = t0; s1 = t1; s2 = t2; s3 = t3; rk += 4; } /* * complete the last round and * map cipher state to byte array block: */ t0 = (Td4[(s0 >> 24) ] << 24) ^ (Td4[(s3 >> 16) & 0xff] << 16) ^ (Td4[(s2 >> 8) & 0xff] << 8) ^ (Td4[(s1 ) & 0xff] ); t1 = (Td4[(s1 >> 24) ] << 24) ^ (Td4[(s0 >> 16) & 0xff] << 16) ^ (Td4[(s3 >> 8) & 0xff] << 8) ^ (Td4[(s2 ) & 0xff] ); t2 = (Td4[(s2 >> 24) ] << 24) ^ (Td4[(s1 >> 16) & 0xff] << 16) ^ (Td4[(s0 >> 8) & 0xff] << 8) ^ (Td4[(s3 ) & 0xff] ); t3 = (Td4[(s3 >> 24) ] << 24) ^ (Td4[(s2 >> 16) & 0xff] << 16) ^ (Td4[(s1 >> 8) & 0xff] << 8) ^ (Td4[(s0 ) & 0xff] ); if (rounds == Nr) { t0 ^= rk[0]; t1 ^= rk[1]; t2 ^= rk[2]; t3 ^= rk[3]; } PUTU32(block , t0); PUTU32(block + 4, t1); PUTU32(block + 8, t2); PUTU32(block + 12, t3); } #endif /* INTERMEDIATE_VALUE_KAT */ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; /* round 6: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; s2 = Td0[t2 >> 24] ^ Td1[(old_contrib//root/sys/src/cmd/limbo/libsec/port/blowfish.c������������������������������������������ 664 � 0 � 0 � 46334 7445406043 22754�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // Blowfish block cipher. See: // Lecture Notes in Computer Science 809 // Fast Software Encryption // Cambridge Security Workshop, Cambridge, England (1993) static u32int sbox[1024]; static u32int pbox[BFrounds+2]; static void bfencrypt(u32int *, BFstate *); static void bfdecrypt(u32int *, BFstate *); void setupBFstate(BFstate *s, uchar key[], int keybytes, uchar *ivec) { int i, j; u32int n, buf[2]; memset(s, 0, sizeof(*s)); memset(buf, 0, sizeof buf); if (keybytes > sizeof(s->key)) keybytes = sizeof(s->key); memmove(s->key, key, keybytes); if (ivec != nil) memmove(s->ivec, ivec, sizeof(s->ivec)); else memset(s->ivec, 0, sizeof(s->ivec)); memmove(s->pbox, pbox, sizeof(pbox)); memmove(s->sbox, sbox, sizeof(sbox)); if (keybytes > 4*(BFrounds + 2)) keybytes = 4*(BFrounds + 2); for(i=j=0; i < BFrounds+2; i++) { n = key[j]; j = (j+1) % keybytes; n <<= 8; n |= key[j]; j = (j+1) % keybytes; n <<= 8; n |= key[j]; j = (j+1) % keybytes; n <<= 8; n |= key[j]; j = (j+1) % keybytes; s->pbox[i] ^= n; } for(i=0; i < BFrounds+2; i += 2) { bfencrypt(buf, s); s->pbox[i] = buf[0]; s->pbox[i+1] = buf[1]; } for(i=0; i < 1024; i += 2) { bfencrypt(buf, s); s->sbox[i] = buf[0]; s->sbox[i+1] = buf[1]; } s->setup = 0xcafebabe; } void bfCBCencrypt(uchar *buf, int n, BFstate *s) { int i; uchar *p; u32int bo[2], bi[2], b; assert((n & 7) == 0); bo[0] = s->ivec[0] | ((u32int) s->ivec[1]<<8) | ((u32int)s->ivec[2]<<16) | ((u32int)s->ivec[3]<<24); bo[1] = s->ivec[4] | ((u32int) s->ivec[5]<<8) | ((u32int)s->ivec[6]<<16) | ((u32int)s->ivec[7]<<24); for(i=0; i < n; i += 8, buf += 8) { bi[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); bi[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); bi[0] ^= bo[0]; bi[1] ^= bo[1]; bfencrypt(bi, s); bo[0] = bi[0]; bo[1] = bi[1]; p = buf; b = bo[0]; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p++ = b; b = bo[1]; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p = b; } s->ivec[7] = bo[1] >> 24; s->ivec[6] = bo[1] >> 16; s->ivec[5] = bo[1] >> 8; s->ivec[4] = bo[1]; s->ivec[3] = bo[0] >> 24; s->ivec[2] = bo[0] >> 16; s->ivec[1] = bo[0] >> 8; s->ivec[0] = bo[0]; return; } void bfCBCdecrypt(uchar *buf, int n, BFstate *s) { int i; uchar *p; u32int b, bo[2], bi[2], xr[2]; assert((n & 7) == 0); bo[0] = s->ivec[0] | ((u32int) s->ivec[1]<<8) | ((u32int)s->ivec[2]<<16) | ((u32int)s->ivec[3]<<24); bo[1] = s->ivec[4] | ((u32int) s->ivec[5]<<8) | ((u32int)s->ivec[6]<<16) | ((u32int)s->ivec[7]<<24); for(i=0; i < n; i += 8, buf += 8) { bi[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); bi[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); xr[0] = bi[0]; xr[1] = bi[1]; bfdecrypt(bi, s); bo[0] ^= bi[0]; bo[1] ^= bi[1]; p = buf; b = bo[0]; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p++ = b; b = bo[1]; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p++ = b; b >>= 8; *p = b; bo[0] = xr[0]; bo[1] = xr[1]; } s->ivec[7] = bo[1] >> 24; s->ivec[6] = bo[1] >> 16; s->ivec[5] = bo[1] >> 8; s->ivec[4] = bo[1]; s->ivec[3] = bo[0] >> 24; s->ivec[2] = bo[0] >> 16; s->ivec[1] = bo[0] >> 8; s->ivec[0] = bo[0]; return; } void bfECBencrypt(uchar *buf, int n, BFstate *s) { int i; u32int b[2]; for(i=0; i < n; i += 8, buf += 8) { b[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); b[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); bfencrypt(b, s); buf[7] = b[1] >> 24; buf[6] = b[1] >> 16; buf[5] = b[1] >> 8; buf[4] = b[1]; buf[3] = b[0] >> 24; buf[2] = b[0] >> 16; buf[1] = b[0] >> 8; buf[0] = b[0]; } return; } void bfECBdecrypt(uchar *buf, int n, BFstate *s) { int i; u32int b[2]; for(i=0; i < n; i += 8, buf += 8) { b[0] = buf[0] | ((u32int) buf[1]<<8) | ((u32int)buf[2]<<16) | ((u32int)buf[3]<<24); b[1] = buf[4] | ((u32int) buf[5]<<8) | ((u32int)buf[6]<<16) | ((u32int)buf[7]<<24); bfdecrypt(b, s); buf[7] = b[1] >> 24; buf[6] = b[1] >> 16; buf[5] = b[1] >> 8; buf[4] = b[1]; buf[3] = b[0] >> 24; buf[2] = b[0] >> 16; buf[1] = b[0] >> 8; buf[0] = b[0]; } return; } static void bfencrypt(u32int *b, BFstate *s) { int i; u32int l, r; u32int *pb, *sb; l = b[0]; r = b[1]; pb = s->pbox; sb = s->sbox; l ^= pb[0]; for(i=1; i<16; i += 2) { r ^= pb[i]; r ^= ( (sb[ (uchar) (l>>24)] + sb[256 + ((uchar) (l>>16))]) ^ sb[512 + ((uchar) (l>>8))]) + sb[768 +((uchar) l)]; l ^= pb[i+1]; l ^= ( (sb[ (uchar) (r>>24)] + sb[256 + ((uchar) (r>>16))]) ^ sb[512 + ((uchar) (r>>8))]) + sb[768 +((uchar) r)]; } r ^= pb[BFrounds+1]; /* sic */ b[0] = r; b[1] = l; return; } static void bfdecrypt(u32int *b, BFstate *s) { int i; u32int l, r; u32int *pb, *sb; l = b[0]; r = b[1]; pb = s->pbox; sb = s->sbox; l ^= pb[BFrounds+1]; for(i=16; i > 0; i -= 2) { r ^= pb[i]; r ^= ( (sb[ (uchar) (l>>24)] + sb[256 + ((uchar) (l>>16))]) ^ sb[512 + ((uchar) (l>>8))]) + sb[768 +((uchar) l)]; l ^= pb[i-1]; l ^= ( (sb[ (uchar) (r>>24)] + sb[256 + ((uchar) (r>>16))]) ^ sb[512 + ((uchar) (r>>8))]) + sb[768 +((uchar) r)]; } r ^= pb[0]; /* sic */ b[0] = r; b[1] = l; return; } static u32int pbox[BFrounds+2] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b }; static u32int sbox[1024] = { 0xd1310ba6L, 0x98dfb5acL, 0x2ffd72dbL, 0xd01adfb7L, 0xb8e1afedL, 0x6a267e96L, 0xba7c9045L, 0xf12c7f99L, 0x24a19947L, 0xb3916cf7L, 0x0801f2e2L, 0x858efc16L, 0x636920d8L, 0x71574e69L, 0xa458fea3L, 0xf4933d7eL, 0x0d95748fL, 0x728eb658L, 0x718bcd58L, 0x82154aeeL, 0x7b54a41dL, 0xc25a59b5L, 0x9c30d539L, 0x2af26013L, 0xc5d1b023L, 0x286085f0L, 0xca417918L, 0xb8db38efL, 0x8e79dcb0L, 0x603a180eL, 0x6c9e0e8bL, 0xb01e8a3eL, 0xd71577c1L, 0xbd314b27L, 0x78af2fdaL, 0x55605c60L, 0xe65525f3L, 0xaa55ab94L, 0x57489862L, 0x63e81440L, 0x55ca396aL, 0x2aab10b6L, 0xb4cc5c34L, 0x1141e8ceL, 0xa15486afL, 0x7c72e993L, 0xb3ee1411L, 0x636fbc2aL, 0x2ba9c55dL, 0x741831f6L, 0xce5c3e16L, 0x9b87931eL, 0xafd6ba33L, 0x6c24cf5cL, 0x7a325381L, 0x28958677L, 0x3b8f4898L, 0x6b4bb9afL, 0xc4bfe81bL, 0x66282193L, 0x61d809ccL, 0xfb21a991L, 0x487cac60L, 0x5dec8032L, 0xef845d5dL, 0xe98575b1L, 0xdc262302L, 0xeb651b88L, 0x23893e81L, 0xd396acc5L, 0x0f6d6ff3L, 0x83f44239L, 0x2e0b4482L, 0xa4842004L, 0x69c8f04aL, 0x9e1f9b5eL, 0x21c66842L, 0xf6e96c9aL, 0x670c9c61L, 0xabd388f0L, 0x6a51a0d2L, 0xd8542f68L, 0x960fa728L, 0xab5133a3L, 0x6eef0b6cL, 0x137a3be4L, 0xba3bf050L, 0x7efb2a98L, 0xa1f1651dL, 0x39af0176L, 0x66ca593eL, 0x82430e88L, 0x8cee8619L, 0x456f9fb4L, 0x7d84a5c3L, 0x3b8b5ebeL, 0xe06f75d8L, 0x85c12073L, 0x401a449fL, 0x56c16aa6L, 0x4ed3aa62L, 0x363f7706L, 0x1bfedf72L, 0x429b023dL, 0x37d0d724L, 0xd00a1248L, 0xdb0fead3L, 0x49f1c09bL, 0x075372c9L, 0x80991b7bL, 0x25d479d8L, 0xf6e8def7L, 0xe3fe501aL, 0xb6794c3bL, 0x976ce0bdL, 0x04c006baL, 0xc1a94fb6L, 0x409f60c4L, 0x5e5c9ec2L, 0x196a2463L, 0x68fb6fafL, 0x3e6c53b5L, 0x1339b2ebL, 0x3b52ec6fL, 0x6dfc511fL, 0x9b30952cL, 0xcc814544L, 0xaf5ebd09L, 0xbee3d004L, 0xde334afdL, 0x660f2807L, 0x192e4bb3L, 0xc0cba857L, 0x45c8740fL, 0xd20b5f39L, 0xb9d3fbdbL, 0x5579c0bdL, 0x1a60320aL, 0xd6a100c6L, 0x402c7279L, 0x679f25feL, 0xfb1fa3ccL, 0x8ea5e9f8L, 0xdb3222f8L, 0x3c7516dfL, 0xfd616b15L, 0x2f501ec8L, 0xad0552abL, 0x323db5faL, 0xfd238760L, 0x53317b48L, 0x3e00df82L, 0x9e5c57bbL, 0xca6f8ca0L, 0x1a87562eL, 0xdf1769dbL, 0xd542a8f6L, 0x287effc3L, 0xac6732c6L, 0x8c4f5573L, 0x695b27b0L, 0xbbca58c8L, 0xe1ffa35dL, 0xb8f011a0L, 0x10fa3d98L, 0xfd2183b8L, 0x4afcb56cL, 0x2dd1d35bL, 0x9a53e479L, 0xb6f84565L, 0xd28e49bcL, 0x4bfb9790L, 0xe1ddf2daL, 0xa4cb7e33L, 0x62fb1341L, 0xcee4c6e8L, 0xef20cadaL, 0x36774c01L, 0xd07e9efeL, 0x2bf11fb4L, 0x95dbda4dL, 0xae909198L, 0xeaad8e71L, 0x6b93d5a0L, 0xd08ed1d0L, 0xafc725e0L, 0x8e3c5b2fL, 0x8e7594b7L, 0x8ff6e2fbL, 0xf2122b64L, 0x8888b812L, 0x900df01cL, 0x4fad5ea0L, 0x688fc31cL, 0xd1cff191L, 0xb3a8c1adL, 0x2f2f2218L, 0xbe0e1777L, 0xea752dfeL, 0x8b021fa1L, 0xe5a0cc0fL, 0xb56f74e8L, 0x18acf3d6L, 0xce89e299L, 0xb4a84fe0L, 0xfd13e0b7L, 0x7cc43b81L, 0xd2ada8d9L, 0x165fa266L, 0x80957705L, 0x93cc7314L, 0x211a1477L, 0xe6ad2065L, 0x77b5fa86L, 0xc75442f5L, 0xfb9d35cfL, 0xebcdaf0cL, 0x7b3e89a0L, 0xd6411bd3L, 0xae1e7e49L, 0x00250e2dL, 0x2071b35eL, 0x226800bbL, 0x57b8e0afL, 0x2464369bL, 0xf009b91eL, 0x5563911dL, 0x59dfa6aaL, 0x78c14389L, 0xd95a537fL, 0x207d5ba2L, 0x02e5b9c5L, 0x83260376L, 0x6295cfa9L, 0x11c81968L, 0x4e734a41L, 0xb3472dcaL, 0x7b14a94aL, 0x1b510052L, 0x9a532915L, 0xd60f573fL, 0xbc9bc6e4L, 0x2b60a476L, 0x81e67400L, 0x08ba6fb5L, 0x571be91fL, 0xf296ec6bL, 0x2a0dd915L, 0xb6636521L, 0xe7b9f9b6L, 0xff34052eL, 0xc5855664L, 0x53b02d5dL, 0xa99f8fa1L, 0x08ba4799L, 0x6e85076aL, 0x4b7a70e9L, 0xb5b32944L, 0xdb75092eL, 0xc4192623L, 0xad6ea6b0L, 0x49a7df7dL, 0x9cee60b8L, 0x8fedb266L, 0xecaa8c71L, 0x699a17ffL, 0x5664526cL, 0xc2b19ee1L, 0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL, 0x3f54989aL, 0x5b429d65L, 0x6b8fe4d6L, 0x99f73fd6L, 0xa1d29c07L, 0xefe830f5L, 0x4d2d38e6L, 0xf0255dc1L, 0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL, 0x09686b3fL, 0x3ebaefc9L, 0x3c971814L, 0x6b6a70a1L, 0x687f3584L, 0x52a0e286L, 0xb79c5305L, 0xaa500737L, 0x3e07841cL, 0x7fdeae5cL, 0x8e7d44ecL, 0x5716f2b8L, 0xb03ada37L, 0xf0500c0dL, 0xf01c1f04L, 0x0200b3ffL, 0xae0cf51aL, 0x3cb574b2L, 0x25837a58L, 0xdc0921bdL, 0xd19113f9L, 0x7ca92ff6L, 0x94324773L, 0x22f54701L, 0x3ae5e581L, 0x37c2dadcL, 0xc8b57634L, 0x9af3dda7L, 0xa9446146L, 0x0fd0030eL, 0xecc8c73eL, 0xa4751e41L, 0xe238cd99L, 0x3bea0e2fL, 0x3280bba1L, 0x183eb331L, 0x4e548b38L, 0x4f6db908L, 0x6f420d03L, 0xf60a04bfL, 0x2cb81290L, 0x24977c79L, 0x5679b072L, 0xbcaf89afL, 0xde9a771fL, 0xd9930810L, 0xb38bae12L, 0xdccf3f2eL, 0x5512721fL, 0x2e6b7124L, 0x501adde6L, 0x9f84cd87L, 0x7a584718L, 0x7408da17L, 0xbc9f9abcL, 0xe94b7d8cL, 0xec7aec3aL, 0xdb851dfaL, 0x63094366L, 0xc464c3d2L, 0xef1c1847L, 0x3215d908L, 0xdd433b37L, 0x24c2ba16L, 0x12a14d43L, 0x2a65c451L, 0x50940002L, 0x133ae4ddL, 0x71dff89eL, 0x10314e55L, 0x81ac77d6L, 0x5f11199bL, 0x043556f1L, 0xd7a3c76bL, 0x3c11183bL, 0x5924a509L, 0xf28fe6edL, 0x97f1fbfaL, 0x9ebabf2cL, 0x1e153c6eL, 0x86e34570L, 0xeae96fb1L, 0x860e5e0aL, 0x5a3e2ab3L, 0x771fe71cL, 0x4e3d06faL, 0x2965dcb9L, 0x99e71d0fL, 0x803e89d6L, 0x5266c825L, 0x2e4cc978L, 0x9c10b36aL, 0xc6150ebaL, 0x94e2ea78L, 0xa5fc3c53L, 0x1e0a2df4L, 0xf2f74ea7L, 0x361d2b3dL, 0x1939260fL, 0x19c27960L, 0x5223a708L, 0xf71312b6L, 0xebadfe6eL, 0xeac31f66L, 0xe3bc4595L, 0xa67bc883L, 0xb17f37d1L, 0x018cff28L, 0xc332ddefL, 0xbe6c5aa5L, 0x65582185L, 0x68ab9802L, 0xeecea50fL, 0xdb2f953bL, 0x2aef7dadL, 0x5b6e2f84L, 0x1521b628L, 0x29076170L, 0xecdd4775L, 0x619f1510L, 0x13cca830L, 0xeb61bd96L, 0x0334fe1eL, 0xaa0363cfL, 0xb5735c90L, 0x4c70a239L, 0xd59e9e0bL, 0xcbaade14L, 0xeecc86bcL, 0x60622ca7L, 0x9cab5cabL, 0xb2f3846eL, 0x648b1eafL, 0x19bdf0caL, 0xa02369b9L, 0x655abb50L, 0x40685a32L, 0x3c2ab4b3L, 0x319ee9d5L, 0xc021b8f7L, 0x9b540b19L, 0x875fa099L, 0x95f7997eL, 0x623d7da8L, 0xf837889aL, 0x97e32d77L, 0x11ed935fL, 0x16681281L, 0x0e358829L, 0xc7e61fd6L, 0x96dedfa1L, 0x7858ba99L, 0x57f584a5L, 0x1b227263L, 0x9b83c3ffL, 0x1ac24696L, 0xcdb30aebL, 0x532e3054L, 0x8fd948e4L, 0x6dbc3128L, 0x58ebf2efL, 0x34c6ffeaL, 0xfe28ed61L, 0xee7c3c73L, 0x5d4a14d9L, 0xe864b7e3L, 0x42105d14L, 0x203e13e0L, 0x45eee2b6L, 0xa3aaabeaL, 0xdb6c4f15L, 0xfacb4fd0L, 0xc742f442L, 0xef6abbb5L, 0x654f3b1dL, 0x41cd2105L, 0xd81e799eL, 0x86854dc7L, 0xe44b476aL, 0x3d816250L, 0xcf62a1f2L, 0x5b8d2646L, 0xfc8883a0L, 0xc1c7b6a3L, 0x7f1524c3L, 0x69cb7492L, 0x47848a0bL, 0x5692b285L, 0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L, 0x58428d2aL, 0x0c55f5eaL, 0x1dadf43eL, 0x233f7061L, 0x3372f092L, 0x8d937e41L, 0xd65fecf1L, 0x6c223bdbL, 0x7cde3759L, 0xcbee7460L, 0x4085f2a7L, 0xce77326eL, 0xa6078084L, 0x19f8509eL, 0xe8efd855L, 0x61d99735L, 0xa969a7aaL, 0xc50c06c2L, 0x5a04abfcL, 0x800bcadcL, 0x9e447a2eL, 0xc3453484L, 0xfdd56705L, 0x0e1e9ec9L, 0xdb73dbd3L, 0x105588cdL, 0x675fda79L, 0xe3674340L, 0xc5c43465L, 0x713e38d8L, 0x3d28f89eL, 0xf16dff20L, 0x153e21e7L, 0x8fb03d4aL, 0xe6e39f2bL, 0xdb83adf7L, 0xe93d5a68L, 0x948140f7L, 0xf64c261cL, 0x94692934L, 0x411520f7L, 0x7602d4f7L, 0xbcf46b2eL, 0xd4a20068L, 0xd4082471L, 0x3320f46aL, 0x43b7d4b7L, 0x500061afL, 0x1e39f62eL, 0x97244546L, 0x14214f74L, 0xbf8b8840L, 0x4d95fc1dL, 0x96b591afL, 0x70f4ddd3L, 0x66a02f45L, 0xbfbc09ecL, 0x03bd9785L, 0x7fac6dd0L, 0x31cb8504L, 0x96eb27b3L, 0x55fd3941L, 0xda2547e6L, 0xabca0a9aL, 0x28507825L, 0x530429f4L, 0x0a2c86daL, 0xe9b66dfbL, 0x68dc1462L, 0xd7486900L, 0x680ec0a4L, 0x27a18deeL, 0x4f3ffea2L, 0xe887ad8cL, 0xb58ce006L, 0x7af4d6b6L, 0xaace1e7cL, 0xd3375fecL, 0xce78a399L, 0x406b2a42L, 0x20fe9e35L, 0xd9f385b9L, 0xee39d7abL, 0x3b124e8bL, 0x1dc9faf7L, 0x4b6d1856L, 0x26a36631L, 0xeae397b2L, 0x3a6efa74L, 0xdd5b4332L, 0x6841e7f7L, 0xca7820fbL, 0xfb0af54eL, 0xd8feb397L, 0x454056acL, 0xba489527L, 0x55533a3aL, 0x20838d87L, 0xfe6ba9b7L, 0xd096954bL, 0x55a867bcL, 0xa1159a58L, 0xcca92963L, 0x99e1db33L, 0xa62a4a56L, 0x3f3125f9L, 0x5ef47e1cL, 0x9029317cL, 0xfdf8e802L, 0x04272f70L, 0x80bb155cL, 0x05282ce3L, 0x95c11548L, 0xe4c66d22L, 0x48c1133fL, 0xc70f86dcL, 0x07f9c9eeL, 0x41041f0fL, 0x404779a4L, 0x5d886e17L, 0x325f51ebL, 0xd59bc0d1L, 0xf2bcc18fL, 0x41113564L, 0x257b7834L, 0x602a9c60L, 0xdff8e8a3L, 0x1f636c1bL, 0x0e12b4c2L, 0x02e1329eL, 0xaf664fd1L, 0xcad18115L, 0x6b2395e0L, 0x333e92e1L, 0x3b240b62L, 0xeebeb922L, 0x85b2a20eL, 0xe6ba0d99L, 0xde720c8cL, 0x2da2f728L, 0xd0127845L, 0x95b794fdL, 0x647d0862L, 0xe7ccf5f0L, 0x5449a36fL, 0x877d48faL, 0xc39dfd27L, 0xf33e8d1eL, 0x0a476341L, 0x992eff74L, 0x3a6f6eabL, 0xf4f8fd37L, 0xa812dc60L, 0xa1ebddf8L, 0x991be14cL, 0xdb6e6b0dL, 0xc67b5510L, 0x6d672c37L, 0x2765d43bL, 0xdcd0e804L, 0xf1290dc7L, 0xcc00ffa3L, 0xb5390f92L, 0x690fed0bL, 0x667b9ffbL, 0xcedb7d9cL, 0xa091cf0bL, 0xd9155ea3L, 0xbb132f88L, 0x515bad24L, 0x7b9479bfL, 0x763bd6ebL, 0x37392eb3L, 0xcc115979L, 0x8026e297L, 0xf42e312dL, 0x6842ada7L, 0xc66a2b3bL, 0x12754cccL, 0x782ef11cL, 0x6a124237L, 0xb79251e7L, 0x06a1bbe6L, 0x4bfb6350L, 0x1a6b1018L, 0x11caedfaL, 0x3d25bdd8L, 0xe2e1c3c9L, 0x44421659L, 0x0a121386L, 0xd90cec6eL, 0xd5abea2aL, 0x64af674eL, 0xda86a85fL, 0xbebfe988L, 0x64e4c3feL, 0x9dbc8057L, 0xf0f7c086L, 0x60787bf8L, 0x6003604dL, 0xd1fd8346L, 0xf6381fb0L, 0x7745ae04L, 0xd736fcccL, 0x83426b33L, 0xf01eab71L, 0xb0804187L, 0x3c005e5fL, 0x77a057beL, 0xbde8ae24L, 0x55464299L, 0xbf582e61L, 0x4e58f48fL, 0xf2ddfda2L, 0xf474ef38L, 0x8789bdc2L, 0x5366f9c3L, 0xc8b38e74L, 0xb475f255L, 0x46fcd9b9L, 0x7aeb2661L, 0x8b1ddf84L, 0x846a0e79L, 0x915f95e2L, 0x466e598eL, 0x20b45770L, 0x8cd55591L, 0xc902de4cL, 0xb90bace1L, 0xbb8205d0L, 0x11a86248L, 0x7574a99eL, 0xb77f19b6L, 0xe0a9dc09L, 0x662d09a1L, 0xc4324633L, 0xe85a1f02L, 0x09f0be8cL, 0x4a99a025L, 0x1d6efe10L, 0x1ab93d1dL, 0x0ba5a4dfL, 0xa186f20fL, 0x2868f169L, 0xdcb7da83L, 0x573906feL, 0xa1e2ce9bL, 0x4fcd7f52L, 0x50115e01L, 0xa70683faL, 0xa002b5c4L, 0x0de6d027L, 0x9af88c27L, 0x773f8641L, 0xc3604c06L, 0x61a806b5L, 0xf0177a28L, 0xc0f586e0L, 0x006058aaL, 0x30dc7d62L, 0x11e69ed7L, 0x2338ea63L, 0x53c2dd94L, 0xc2c21634L, 0xbbcbee56L, 0x90bcb6deL, 0xebfc7da1L, 0xce591d76L, 0x6f05e409L, 0x4b7c0188L, 0x39720a3dL, 0x7c927c24L, 0x86e3725fL, 0x724d9db9L, 0x1ac15bb4L, 0xd39eb8fcL, 0xed545578L, 0x08fca5b5L, 0xd83d7cd3L, 0x4dad0fc4L, 0x1e50ef5eL, 0xb161e6f8L, 0xa28514d9L, 0x6c51133cL, 0x6fd5c7e7L, 0x56e14ec4L, 0x362abfceL, 0xddc6c837L, 0xd79a3234L, 0x92638212L, 0x670efa8eL, 0x406000e0L, 0x3a39ce37L, 0xd3faf5cfL, 0xabc27737L, 0x5ac52d1bL, 0x5cb0679eL, 0x4fa33742L, 0xd3822740L, 0x99bc9bbeL, 0xd5118e9dL, 0xbf0f7315L, 0xd62d1c7eL, 0xc700c47bL, 0xb78c1b6bL, 0x21a19045L, 0xb26eb1beL, 0x6a366eb4L, 0x5748ab2fL, 0xbc946e79L, 0xc6a376d2L, 0x6549c2c8L, 0x530ff8eeL, 0x468dde7dL, 0xd5730a1dL, 0x4cd04dc6L, 0x2939bbdbL, 0xa9ba4650L, 0xac9526e8L, 0xbe5ee304L, 0xa1fad5f0L, 0x6a2d519aL, 0x63ef8ce2L, 0x9a86ee22L, 0xc089c2b8L, 0x43242ef6L, 0xa51e03aaL, 0x9cf2d0a4L, 0x83c061baL, 0x9be96a4dL, 0x8fe51550L, 0xba645bd6L, 0x2826a2f9L, 0xa73a3ae1L, 0x4ba99586L, 0xef5562e9L, 0xc72fefd3L, 0xf752f7daL, 0x3f046f69L, 0x77fa0a59L, 0x80e4a915L, 0x87b08601L, 0x9b09e6adL, 0x3b3ee593L, 0xe990fd5aL, 0x9e34d797L, 0x2cf0b7d9L, 0x022b8b51L, 0x96d5ac3aL, 0x017da67dL, 0xd1cf3ed6L, 0x7c7d2d28L, 0x1f9f25cfL, 0xadf2b89bL, 0x5ad6b472L, 0x5a88f54cL, 0xe029ac71L, 0xe019a5e6L, 0x47b0acfdL, 0xed93fa9bL, 0xe8d3c48dL, 0x283b57ccL, 0xf8d56629L, 0x79132e28L, 0x785f0191L, 0xed756055L, 0xf7960e44L, 0xe3d35e8cL, 0x15056dd4L, 0x88f46dbaL, 0x03a16125L, 0x0564f0bdL, 0xc3eb9e15L, 0x3c9057a2L, 0x97271aecL, 0xa93a072aL, 0x1b3f6d9bL, 0x1e6321f5L, 0xf59c66fbL, 0x26dcf319L, 0x7533d928L, 0xb155fdf5L, 0x03563482L, 0x8aba3cbbL, 0x28517711L, 0xc20ad9f8L, 0xabcc5167L, 0xccad925fL, 0x4de81751L, 0x3830dc8eL, 0x379d5862L, 0x9320f991L, 0xea7a90c2L, 0xfb3e7bceL, 0x5121ce64L, 0x774fbe32L, 0xa8b6e37eL, 0xc3293d46L, 0x48de5369L, 0x6413e680L, 0xa2ae0810L, 0xdd6db224L, 0x69852dfdL, 0x09072166L, 0xb39a460aL, 0x6445c0ddL, 0x586cdecfL, 0x1c20c8aeL, 0x5bbef7ddL, 0x1b588d40L, 0xccd2017fL, 0x6bb4e3bbL, 0xdda26a7eL, 0x3a59ff45L, 0x3e350a44L, 0xbcb4cdd5L, 0x72eacea8L, 0xfa6484bbL, 0x8d6612aeL, 0xbf3c6f47L, 0xd29be463L, 0x542f5d9eL, 0xaec2771bL, 0xf64e6370L, 0x740e0d8dL, 0xe75b1357L, 0xf8721671L, 0xaf537d5dL, 0x4040cb08L, 0x4eb4e2ccL, 0x34d2466aL, 0x0115af84L, 0xe1b00428L, 0x95983a1dL, 0x06b89fb4L, 0xce6ea048L, 0x6f3f3b82L, 0x3520ab82L, 0x011a1d4bL, 0x277227f8L, 0x611560b1L, 0xe7933fdcL, 0xbb3a792bL, 0x344525bdL, 0xa08839e1L, 0x51ce794bL, 0x2f32c9b7L, 0xa01fbac9L, 0xe01cc87eL, 0xbcc7d1f6L, 0xcf0111c3L, 0xa1e8aac7L, 0x1a908749L, 0xd44fbd9aL, 0xd0dadecbL, 0xd50ada38L, 0x0339c32aL, 0xc6913667L, 0x8df9317cL, 0xe0b12b4fL, 0xf79e59b7L, 0x43f5bb3aL, 0xf2d519ffL, 0x27d9459cL, 0xbf97222cL, 0x15e6fc2aL, 0x0f91fc71L, 0x9b941525L, 0xfae59361L, 0xceb69cebL, 0xc2a86459L, 0x12baa8d1L, 0xb6c1075eL, 0xe3056a0cL, 0x10d25065L, 0xcb03a442L, 0xe0ec6e0eL, 0x1698db3bL, 0x4c98a0beL, 0x3278e964L, 0x9f1f9532L, 0xe0d392dfL, 0xd3a0342bL, 0x8971f21eL, 0x1b0a7441L, 0x4ba3348cL, 0xc5be7120L, 0xc37632d8L, 0xdf359f8dL, 0x9b992f2eL, 0xe60b6f47L, 0x0fe3f11dL, 0xe54cda54L, 0x1edad891L, 0xce6279cfL, 0xcd3e7e6fL, 0x1618b166L, 0xfd2c1d05L, 0x848fd2c5L, 0xf6fb2299L, 0xf523f357L, 0xa6327623L, 0x93a83531L, 0x56cccd02L, 0xacf08162L, 0x5a75ebb5L, 0x6e163697L, 0x88d273ccL, 0xde966292L, 0x81b949d0L, 0x4c50901bL, 0x71c65614L, 0xe6c6c7bdL, 0x327a140aL, 0x45e1d006L, 0xc3f27b9aL, 0xc9aa53fdL, 0x62a80f00L, 0xbb25bfe2L, 0x35bdd2f6L, 0x71126905L, 0xb2040222L, 0xb6cbcf7cL, 0xcd769c2bL, 0x53113ec0L, 0x1640e3d3L, 0x38abbd60L, 0x2547adf0L, 0xba38209cL, 0xf746ce76L, 0x77afa1c5L, 0x20756060L, 0x85cbfe4eL, 0x8ae88dd8L, 0x7aaaf9b0L, 0x4cf9aa7eL, 0x1948c25cL, 0x02fb8a8cL, 0x01c36ae4L, 0xd6ebe1f9L, 0x90d4f869L, 0xa65cdea0L, 0x3f09252dL, 0xc208e69fL, 0xb74e6132L, 0xce77e25bL, 0x578fdfe3L, 0x3ac372e6L, }; , 0x5664526cL, 0xc2b19ee1L, 0x193602a5L, 0x75094c29L, 0xa0591340L, 0xe4183a3eL, 0x3f54989aL, 0x5b429d65L, 0x6b8fe4d6L, 0x99f73fd6L, 0xa1d29c07L, 0xefe830f5L, 0x4d2d38e6L, 0xf0255dc1L, 0x4cdd2086L, 0x8470eb26L, 0x6382e9c6L, 0x021ecc5eL, 0x09686b3fL, 0x3ebaefc9L, 0x3c971814L, 0x6b6a7old_contrib//root/sys/src/cmd/limbo/libsec/port/decodepem.c����������������������������������������� 664 � 0 � 0 � 3447 10050262225 23046�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <u.h> #include <libc.h> #include <mp.h> #include <libsec.h> #define STRLEN(s) (sizeof(s)-1) uchar* decodePEM(char *s, char *type, int *len, char **new_s) { uchar *d; char *t, *e, *tt; int n; *len = 0; /* * find the correct section of the file, stripping garbage at the beginning and end. * the data is delimited by -----BEGIN <type>-----\n and -----END <type>-----\n */ n = strlen(type); e = strchr(s, '\0'); for(t = s; t != nil && t < e; ){ tt = t; t = strchr(tt, '\n'); if(t != nil) t++; if(strncmp(tt, "-----BEGIN ", STRLEN("-----BEGIN ")) == 0 && strncmp(&tt[STRLEN("-----BEGIN ")], type, n) == 0 && strncmp(&tt[STRLEN("-----BEGIN ")+n], "-----\n", STRLEN("-----\n")) == 0) break; } for(tt = t; tt != nil && tt < e; tt++){ if(strncmp(tt, "-----END ", STRLEN("-----END ")) == 0 && strncmp(&tt[STRLEN("-----END ")], type, n) == 0 && strncmp(&tt[STRLEN("-----END ")+n], "-----\n", STRLEN("-----\n")) == 0) break; tt = strchr(tt, '\n'); if(tt == nil) break; } if(tt == nil || tt == e){ werrstr("incorrect .pem file format: bad header or trailer"); return nil; } if(new_s) *new_s = tt+1; n = ((tt - t) * 6 + 7) / 8; d = malloc(n); if(d == nil){ werrstr("out of memory"); return nil; } n = dec64(d, n, t, tt - t); if(n < 0){ free(d); werrstr("incorrect .pem file format: bad base64 encoded data"); return nil; } *len = n; return d; } PEMChain* decodepemchain(char *s, char *type) { PEMChain *first = nil, *last = nil, *chp; uchar *d; char *e; int n; e = strchr(s, '\0'); while (s < e) { d = decodePEM(s, type, &n, &s); if(d == nil) break; chp = malloc(sizeof(PEMChain)); chp->next = nil; chp->pem = d; chp->pemlen = n; if (first == nil) first = chp; else last->next = chp; last = chp; } return first; } 0x86854dc7L, 0xe44b476aL, 0x3d816250L, 0xcf62a1f2L, 0x5b8d2646L, 0xfc8883a0L, 0xc1c7b6a3L, 0x7f1524c3L, 0x69cb7492L, 0x47848a0bL, 0x5692b285L, 0x095bbf00L, 0xad19489dL, 0x1462b174L, 0x23820e00L, 0x58428d2aL, 0old_contrib//root/sys/src/cmd/limbo/libsec/port/des.c����������������������������������������������� 664 � 0 � 0 � 42130 7437760313 21704�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> /* * integrated sbox & p perm */ static u32int spbox[] = { 0x00808200,0x00000000,0x00008000,0x00808202,0x00808002,0x00008202,0x00000002,0x00008000, 0x00000200,0x00808200,0x00808202,0x00000200,0x00800202,0x00808002,0x00800000,0x00000002, 0x00000202,0x00800200,0x00800200,0x00008200,0x00008200,0x00808000,0x00808000,0x00800202, 0x00008002,0x00800002,0x00800002,0x00008002,0x00000000,0x00000202,0x00008202,0x00800000, 0x00008000,0x00808202,0x00000002,0x00808000,0x00808200,0x00800000,0x00800000,0x00000200, 0x00808002,0x00008000,0x00008200,0x00800002,0x00000200,0x00000002,0x00800202,0x00008202, 0x00808202,0x00008002,0x00808000,0x00800202,0x00800002,0x00000202,0x00008202,0x00808200, 0x00000202,0x00800200,0x00800200,0x00000000,0x00008002,0x00008200,0x00000000,0x00808002, 0x40084010,0x40004000,0x00004000,0x00084010,0x00080000,0x00000010,0x40080010,0x40004010, 0x40000010,0x40084010,0x40084000,0x40000000,0x40004000,0x00080000,0x00000010,0x40080010, 0x00084000,0x00080010,0x40004010,0x00000000,0x40000000,0x00004000,0x00084010,0x40080000, 0x00080010,0x40000010,0x00000000,0x00084000,0x00004010,0x40084000,0x40080000,0x00004010, 0x00000000,0x00084010,0x40080010,0x00080000,0x40004010,0x40080000,0x40084000,0x00004000, 0x40080000,0x40004000,0x00000010,0x40084010,0x00084010,0x00000010,0x00004000,0x40000000, 0x00004010,0x40084000,0x00080000,0x40000010,0x00080010,0x40004010,0x40000010,0x00080010, 0x00084000,0x00000000,0x40004000,0x00004010,0x40000000,0x40080010,0x40084010,0x00084000, 0x00000104,0x04010100,0x00000000,0x04010004,0x04000100,0x00000000,0x00010104,0x04000100, 0x00010004,0x04000004,0x04000004,0x00010000,0x04010104,0x00010004,0x04010000,0x00000104, 0x04000000,0x00000004,0x04010100,0x00000100,0x00010100,0x04010000,0x04010004,0x00010104, 0x04000104,0x00010100,0x00010000,0x04000104,0x00000004,0x04010104,0x00000100,0x04000000, 0x04010100,0x04000000,0x00010004,0x00000104,0x00010000,0x04010100,0x04000100,0x00000000, 0x00000100,0x00010004,0x04010104,0x04000100,0x04000004,0x00000100,0x00000000,0x04010004, 0x04000104,0x00010000,0x04000000,0x04010104,0x00000004,0x00010104,0x00010100,0x04000004, 0x04010000,0x04000104,0x00000104,0x04010000,0x00010104,0x00000004,0x04010004,0x00010100, 0x80401000,0x80001040,0x80001040,0x00000040,0x00401040,0x80400040,0x80400000,0x80001000, 0x00000000,0x00401000,0x00401000,0x80401040,0x80000040,0x00000000,0x00400040,0x80400000, 0x80000000,0x00001000,0x00400000,0x80401000,0x00000040,0x00400000,0x80001000,0x00001040, 0x80400040,0x80000000,0x00001040,0x00400040,0x00001000,0x00401040,0x80401040,0x80000040, 0x00400040,0x80400000,0x00401000,0x80401040,0x80000040,0x00000000,0x00000000,0x00401000, 0x00001040,0x00400040,0x80400040,0x80000000,0x80401000,0x80001040,0x80001040,0x00000040, 0x80401040,0x80000040,0x80000000,0x00001000,0x80400000,0x80001000,0x00401040,0x80400040, 0x80001000,0x00001040,0x00400000,0x80401000,0x00000040,0x00400000,0x00001000,0x00401040, 0x00000080,0x01040080,0x01040000,0x21000080,0x00040000,0x00000080,0x20000000,0x01040000, 0x20040080,0x00040000,0x01000080,0x20040080,0x21000080,0x21040000,0x00040080,0x20000000, 0x01000000,0x20040000,0x20040000,0x00000000,0x20000080,0x21040080,0x21040080,0x01000080, 0x21040000,0x20000080,0x00000000,0x21000000,0x01040080,0x01000000,0x21000000,0x00040080, 0x00040000,0x21000080,0x00000080,0x01000000,0x20000000,0x01040000,0x21000080,0x20040080, 0x01000080,0x20000000,0x21040000,0x01040080,0x20040080,0x00000080,0x01000000,0x21040000, 0x21040080,0x00040080,0x21000000,0x21040080,0x01040000,0x00000000,0x20040000,0x21000000, 0x00040080,0x01000080,0x20000080,0x00040000,0x00000000,0x20040000,0x01040080,0x20000080, 0x10000008,0x10200000,0x00002000,0x10202008,0x10200000,0x00000008,0x10202008,0x00200000, 0x10002000,0x00202008,0x00200000,0x10000008,0x00200008,0x10002000,0x10000000,0x00002008, 0x00000000,0x00200008,0x10002008,0x00002000,0x00202000,0x10002008,0x00000008,0x10200008, 0x10200008,0x00000000,0x00202008,0x10202000,0x00002008,0x00202000,0x10202000,0x10000000, 0x10002000,0x00000008,0x10200008,0x00202000,0x10202008,0x00200000,0x00002008,0x10000008, 0x00200000,0x10002000,0x10000000,0x00002008,0x10000008,0x10202008,0x00202000,0x10200000, 0x00202008,0x10202000,0x00000000,0x10200008,0x00000008,0x00002000,0x10200000,0x00202008, 0x00002000,0x00200008,0x10002008,0x00000000,0x10202000,0x10000000,0x00200008,0x10002008, 0x00100000,0x02100001,0x02000401,0x00000000,0x00000400,0x02000401,0x00100401,0x02100400, 0x02100401,0x00100000,0x00000000,0x02000001,0x00000001,0x02000000,0x02100001,0x00000401, 0x02000400,0x00100401,0x00100001,0x02000400,0x02000001,0x02100000,0x02100400,0x00100001, 0x02100000,0x00000400,0x00000401,0x02100401,0x00100400,0x00000001,0x02000000,0x00100400, 0x02000000,0x00100400,0x00100000,0x02000401,0x02000401,0x02100001,0x02100001,0x00000001, 0x00100001,0x02000000,0x02000400,0x00100000,0x02100400,0x00000401,0x00100401,0x02100400, 0x00000401,0x02000001,0x02100401,0x02100000,0x00100400,0x00000000,0x00000001,0x02100401, 0x00000000,0x00100401,0x02100000,0x00000400,0x02000001,0x02000400,0x00000400,0x00100001, 0x08000820,0x00000800,0x00020000,0x08020820,0x08000000,0x08000820,0x00000020,0x08000000, 0x00020020,0x08020000,0x08020820,0x00020800,0x08020800,0x00020820,0x00000800,0x00000020, 0x08020000,0x08000020,0x08000800,0x00000820,0x00020800,0x00020020,0x08020020,0x08020800, 0x00000820,0x00000000,0x00000000,0x08020020,0x08000020,0x08000800,0x00020820,0x00020000, 0x00020820,0x00020000,0x08020800,0x00000800,0x00000020,0x08020020,0x00000800,0x00020820, 0x08000800,0x00000020,0x08000020,0x08020000,0x08020020,0x08000000,0x00020000,0x08000820, 0x00000000,0x08020820,0x00020020,0x08000020,0x08020000,0x08000800,0x08000820,0x00000000, 0x08020820,0x00020800,0x00020800,0x00000820,0x00000820,0x00020020,0x08000000,0x08020800, }; /* * for manual index calculation * #define fetch(box, i, sh) (*((u32int*)((uchar*)spbox + (box << 8) + ((i >> (sh)) & 0xfc)))) */ #define fetch(box, i, sh) ((spbox+(box << 6))[((i >> (sh + 2)) & 0x3f)]) /* * DES electronic codebook encryption of one block */ void block_cipher(ulong key[32], uchar text[8], int decrypting) { u32int right, left, v0, v1; int i, keystep; /* * initial permutation */ v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24); left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24); right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555); left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555); left = ((left << 6) & 0x33003300) | (left & 0xcc33cc33) | ((left >> 6) & 0x00cc00cc); left = ((left << 12) & 0x0f0f0000) | (left & 0xf0f00f0f) | ((left >> 12) & 0x0000f0f0); right = ((right << 6) & 0x33003300) | (right & 0xcc33cc33) | ((right >> 6) & 0x00cc00cc); right = ((right << 12) & 0x0f0f0000) | (right & 0xf0f00f0f) | ((right >> 12) & 0x0000f0f0); if (decrypting) { keystep = -2; key = key + 32 - 2; } else keystep = 2; for (i = 0; i < 8; i++) { v0 = key[0]; v0 ^= (right >> 1) | (right << 31); left ^= fetch(0, v0, 24) ^ fetch(2, v0, 16) ^ fetch(4, v0, 8) ^ fetch(6, v0, 0); v1 = key[1]; v1 ^= (right << 3) | (right >> 29); left ^= fetch(1, v1, 24) ^ fetch(3, v1, 16) ^ fetch(5, v1, 8) ^ fetch(7, v1, 0); key += keystep; v0 = key[0]; v0 ^= (left >> 1) | (left << 31); right ^= fetch(0, v0, 24) ^ fetch(2, v0, 16) ^ fetch(4, v0, 8) ^ fetch(6, v0, 0); v1 = key[1]; v1 ^= (left << 3) | (left >> 29); right ^= fetch(1, v1, 24) ^ fetch(3, v1, 16) ^ fetch(5, v1, 8) ^ fetch(7, v1, 0); key += keystep; } /* * final permutation, inverse initial permutation */ v0 = ((left << 1) & 0xaaaaaaaa) | (right & 0x55555555); v1 = (left & 0xaaaaaaaa) | ((right >> 1) & 0x55555555); v1 = ((v1 << 6) & 0x33003300) | (v1 & 0xcc33cc33) | ((v1 >> 6) & 0x00cc00cc); v1 = ((v1 << 12) & 0x0f0f0000) | (v1 & 0xf0f00f0f) | ((v1 >> 12) & 0x0000f0f0); v0 = ((v0 << 6) & 0x33003300) | (v0 & 0xcc33cc33) | ((v0 >> 6) & 0x00cc00cc); v0 = ((v0 << 12) & 0x0f0f0000) | (v0 & 0xf0f00f0f) | ((v0 >> 12) & 0x0000f0f0); text[0] = v0; text[2] = v0 >> 8; text[4] = v0 >> 16; text[6] = v0 >> 24; text[1] = v1; text[3] = v1 >> 8; text[5] = v1 >> 16; text[7] = v1 >> 24; } /* * triple DES electronic codebook encryption of one block */ void triple_block_cipher(ulong expanded_key[3][32], uchar text[8], int ende) { ulong *key; u32int right, left, v0, v1; int i, j, keystep; /* * initial permutation */ v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24); left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24); right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555); left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555); left = ((left << 6) & 0x33003300) | (left & 0xcc33cc33) | ((left >> 6) & 0x00cc00cc); left = ((left << 12) & 0x0f0f0000) | (left & 0xf0f00f0f) | ((left >> 12) & 0x0000f0f0); right = ((right << 6) & 0x33003300) | (right & 0xcc33cc33) | ((right >> 6) & 0x00cc00cc); right = ((right << 12) & 0x0f0f0000) | (right & 0xf0f00f0f) | ((right >> 12) & 0x0000f0f0); for(j = 0; j < 3; j++){ if((ende & 1) == DES3D) { key = &expanded_key[2-j][32-2]; keystep = -2; } else { key = &expanded_key[j][0]; keystep = 2; } ende >>= 1; for (i = 0; i < 8; i++) { v0 = key[0]; v0 ^= (right >> 1) | (right << 31); left ^= fetch(0, v0, 24) ^ fetch(2, v0, 16) ^ fetch(4, v0, 8) ^ fetch(6, v0, 0); v1 = key[1]; v1 ^= (right << 3) | (right >> 29); left ^= fetch(1, v1, 24) ^ fetch(3, v1, 16) ^ fetch(5, v1, 8) ^ fetch(7, v1, 0); key += keystep; v0 = key[0]; v0 ^= (left >> 1) | (left << 31); right ^= fetch(0, v0, 24) ^ fetch(2, v0, 16) ^ fetch(4, v0, 8) ^ fetch(6, v0, 0); v1 = key[1]; v1 ^= (left << 3) | (left >> 29); right ^= fetch(1, v1, 24) ^ fetch(3, v1, 16) ^ fetch(5, v1, 8) ^ fetch(7, v1, 0); key += keystep; } v0 = left; left = right; right = v0; } /* * final permutation, inverse initial permutation * left and right are swapped here */ v0 = ((right << 1) & 0xaaaaaaaa) | (left & 0x55555555); v1 = (right & 0xaaaaaaaa) | ((left >> 1) & 0x55555555); v1 = ((v1 << 6) & 0x33003300) | (v1 & 0xcc33cc33) | ((v1 >> 6) & 0x00cc00cc); v1 = ((v1 << 12) & 0x0f0f0000) | (v1 & 0xf0f00f0f) | ((v1 >> 12) & 0x0000f0f0); v0 = ((v0 << 6) & 0x33003300) | (v0 & 0xcc33cc33) | ((v0 >> 6) & 0x00cc00cc); v0 = ((v0 << 12) & 0x0f0f0000) | (v0 & 0xf0f00f0f) | ((v0 >> 12) & 0x0000f0f0); text[0] = v0; text[2] = v0 >> 8; text[4] = v0 >> 16; text[6] = v0 >> 24; text[1] = v1; text[3] = v1 >> 8; text[5] = v1 >> 16; text[7] = v1 >> 24; } /* * key compression permutation, 4 bits at a time */ static u32int comptab[] = { 0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088, 0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088, 0x000000,0x100000,0x000800,0x100800,0x000000,0x100000,0x000800,0x100800, 0x002000,0x102000,0x002800,0x102800,0x002000,0x102000,0x002800,0x102800, 0x000000,0x000004,0x000400,0x000404,0x000000,0x000004,0x000400,0x000404, 0x400000,0x400004,0x400400,0x400404,0x400000,0x400004,0x400400,0x400404, 0x000000,0x000020,0x008000,0x008020,0x800000,0x800020,0x808000,0x808020, 0x000002,0x000022,0x008002,0x008022,0x800002,0x800022,0x808002,0x808022, 0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200, 0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200, 0x000000,0x000040,0x000010,0x000050,0x004000,0x004040,0x004010,0x004050, 0x040000,0x040040,0x040010,0x040050,0x044000,0x044040,0x044010,0x044050, 0x000000,0x000100,0x020000,0x020100,0x000001,0x000101,0x020001,0x020101, 0x080000,0x080100,0x0a0000,0x0a0100,0x080001,0x080101,0x0a0001,0x0a0101, 0x000000,0x000100,0x040000,0x040100,0x000000,0x000100,0x040000,0x040100, 0x000040,0x000140,0x040040,0x040140,0x000040,0x000140,0x040040,0x040140, 0x000000,0x400000,0x008000,0x408000,0x000008,0x400008,0x008008,0x408008, 0x000400,0x400400,0x008400,0x408400,0x000408,0x400408,0x008408,0x408408, 0x000000,0x001000,0x080000,0x081000,0x000020,0x001020,0x080020,0x081020, 0x004000,0x005000,0x084000,0x085000,0x004020,0x005020,0x084020,0x085020, 0x000000,0x000800,0x000000,0x000800,0x000010,0x000810,0x000010,0x000810, 0x800000,0x800800,0x800000,0x800800,0x800010,0x800810,0x800010,0x800810, 0x000000,0x010000,0x000200,0x010200,0x000000,0x010000,0x000200,0x010200, 0x100000,0x110000,0x100200,0x110200,0x100000,0x110000,0x100200,0x110200, 0x000000,0x000004,0x000000,0x000004,0x000080,0x000084,0x000080,0x000084, 0x002000,0x002004,0x002000,0x002004,0x002080,0x002084,0x002080,0x002084, 0x000000,0x000001,0x200000,0x200001,0x020000,0x020001,0x220000,0x220001, 0x000002,0x000003,0x200002,0x200003,0x020002,0x020003,0x220002,0x220003, }; static int keysh[] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, }; static void keycompperm(u32int left, u32int right, ulong *ek) { u32int v0, v1; int i; for(i = 0; i < 16; i++){ left = (left << keysh[i]) | (left >> (28 - keysh[i])); left &= 0xfffffff0; right = (right << keysh[i]) | (right >> (28 - keysh[i])); right &= 0xfffffff0; v0 = comptab[6 * (1 << 4) + ((left >> (32-4)) & 0xf)] | comptab[5 * (1 << 4) + ((left >> (32-8)) & 0xf)] | comptab[4 * (1 << 4) + ((left >> (32-12)) & 0xf)] | comptab[3 * (1 << 4) + ((left >> (32-16)) & 0xf)] | comptab[2 * (1 << 4) + ((left >> (32-20)) & 0xf)] | comptab[1 * (1 << 4) + ((left >> (32-24)) & 0xf)] | comptab[0 * (1 << 4) + ((left >> (32-28)) & 0xf)]; v1 = comptab[13 * (1 << 4) + ((right >> (32-4)) & 0xf)] | comptab[12 * (1 << 4) + ((right >> (32-8)) & 0xf)] | comptab[11 * (1 << 4) + ((right >> (32-12)) & 0xf)] | comptab[10 * (1 << 4) + ((right >> (32-16)) & 0xf)] | comptab[9 * (1 << 4) + ((right >> (32-20)) & 0xf)] | comptab[8 * (1 << 4) + ((right >> (32-24)) & 0xf)] | comptab[7 * (1 << 4) + ((right >> (32-28)) & 0xf)]; ek[0] = (((v0 >> (24-6)) & 0x3f) << 26) | (((v0 >> (24-18)) & 0x3f) << 18) | (((v1 >> (24-6)) & 0x3f) << 10) | (((v1 >> (24-18)) & 0x3f) << 2); ek[1] = (((v0 >> (24-12)) & 0x3f) << 26) | (((v0 >> (24-24)) & 0x3f) << 18) | (((v1 >> (24-12)) & 0x3f) << 10) | (((v1 >> (24-24)) & 0x3f) << 2); ek += 2; } } void des_key_setup(uchar key[8], ulong *ek) { u32int left, right, v0, v1; v0 = key[0] | ((u32int)key[2] << 8) | ((u32int)key[4] << 16) | ((u32int)key[6] << 24); v1 = key[1] | ((u32int)key[3] << 8) | ((u32int)key[5] << 16) | ((u32int)key[7] << 24); left = ((v0 >> 1) & 0x40404040) | ((v0 >> 2) & 0x10101010) | ((v0 >> 3) & 0x04040404) | ((v0 >> 4) & 0x01010101) | ((v1 >> 0) & 0x80808080) | ((v1 >> 1) & 0x20202020) | ((v1 >> 2) & 0x08080808) | ((v1 >> 3) & 0x02020202); right = ((v0 >> 1) & 0x04040404) | ((v0 << 2) & 0x10101010) | ((v0 << 5) & 0x40404040) | ((v1 << 0) & 0x08080808) | ((v1 << 3) & 0x20202020) | ((v1 << 6) & 0x80808080); left = ((left << 6) & 0x33003300) | (left & 0xcc33cc33) | ((left >> 6) & 0x00cc00cc); v0 = ((left << 12) & 0x0f0f0000) | (left & 0xf0f00f0f) | ((left >> 12) & 0x0000f0f0); right = ((right << 6) & 0x33003300) | (right & 0xcc33cc33) | ((right >> 6) & 0x00cc00cc); v1 = ((right << 12) & 0x0f0f0000) | (right & 0xf0f00f0f) | ((right >> 12) & 0x0000f0f0); left = v0 & 0xfffffff0; right = (v1 & 0xffffff00) | ((v0 << 4) & 0xf0); keycompperm(left, right, ek); } static uchar parity[128] = { 0x01, 0x02, 0x04, 0x07, 0x08, 0x0b, 0x0d, 0x0e, 0x10, 0x13, 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1f, 0x20, 0x23, 0x25, 0x26, 0x29, 0x2a, 0x2c, 0x2f, 0x31, 0x32, 0x34, 0x37, 0x38, 0x3b, 0x3d, 0x3e, 0x40, 0x43, 0x45, 0x46, 0x49, 0x4a, 0x4c, 0x4f, 0x51, 0x52, 0x54, 0x57, 0x58, 0x5b, 0x5d, 0x5e, 0x61, 0x62, 0x64, 0x67, 0x68, 0x6b, 0x6d, 0x6e, 0x70, 0x73, 0x75, 0x76, 0x79, 0x7a, 0x7c, 0x7f, 0x80, 0x83, 0x85, 0x86, 0x89, 0x8a, 0x8c, 0x8f, 0x91, 0x92, 0x94, 0x97, 0x98, 0x9b, 0x9d, 0x9e, 0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xab, 0xad, 0xae, 0xb0, 0xb3, 0xb5, 0xb6, 0xb9, 0xba, 0xbc, 0xbf, 0xc1, 0xc2, 0xc4, 0xc7, 0xc8, 0xcb, 0xcd, 0xce, 0xd0, 0xd3, 0xd5, 0xd6, 0xd9, 0xda, 0xdc, 0xdf, 0xe0, 0xe3, 0xe5, 0xe6, 0xe9, 0xea, 0xec, 0xef, 0xf1, 0xf2, 0xf4, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe, }; /* * convert a 7 byte key to an 8 byte one */ void des56to64(uchar *k56, uchar *k64) { u32int hi, lo; hi = ((u32int)k56[0]<<24)|((u32int)k56[1]<<16)|((u32int)k56[2]<<8)|k56[3]; lo = ((u32int)k56[4]<<24)|((u32int)k56[5]<<16)|((u32int)k56[6]<<8); k64[0] = parity[(hi>>25)&0x7f]; k64[1] = parity[(hi>>18)&0x7f]; k64[2] = parity[(hi>>11)&0x7f]; k64[3] = parity[(hi>>4)&0x7f]; k64[4] = parity[((hi<<3)|(lo>>29))&0x7f]; k64[5] = parity[(lo>>22)&0x7f]; k64[6] = parity[(lo>>15)&0x7f]; k64[7] = parity[(lo>>8)&0x7f]; } /* * convert an 8 byte key to a 7 byte one */ void des64to56(uchar *k64, uchar *k56) { u32int hi, lo; hi = (((u32int)k64[0]&0xfe)<<24)|(((u32int)k64[1]&0xfe)<<17)|(((u32int)k64[2]&0xfe)<<10) |((k64[3]&0xfe)<<3)|(k64[4]>>4); lo = (((u32int)k64[4]&0xfe)<<28)|(((u32int)k64[5]&0xfe)<<21)|(((u32int)k64[6]&0xfe)<<14) |(((u32int)k64[7]&0xfe)<<7); k56[0] = hi>>24; k56[1] = hi>>16; k56[2] = hi>>8; k56[3] = hi>>0; k56[4] = lo>>24; k56[5] = lo>>16; k56[6] = lo>>8; } void key_setup(uchar key[7], ulong *ek) { uchar k64[8]; des56to64(key, k64); des_key_setup(k64, ek); } ^ fetch(7, v1, 0); key += keystep; v0 = key[0]; v0 ^= (left >> 1) | (left << 31); right ^= fetch(0, v0, 24) ^ fetch(2, v0, 16) ^ fetch(4, v0, 8) ^ fetch(6, v0, 0); v1 = key[1]; v1 ^= (left << 3) | (left >> 29); right ^= fetch(1, v1, 24) ^ fetch(3, v1, 16) ^ fetch(5, v1, 8) ^ fetch(7, v1, 0); key += keystep; } /* * final permutation, inverse initial permutation */ v0 = ((leold_contrib//root/sys/src/cmd/limbo/libsec/port/des3CBC.c������������������������������������������� 664 � 0 � 0 � 2157 7271617414 22263�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // Because of the way that non multiple of 8 // buffers are handled, the decryptor must // be fed buffers of the same size as the // encryptor // If the length is not a multiple of 8, I encrypt // the overflow to be compatible with lacy's cryptlib void des3CBCencrypt(uchar *p, int len, DES3state *s) { uchar *p2, *ip, *eip; for(; len >= 8; len -= 8){ p2 = p; ip = s->ivec; for(eip = ip+8; ip < eip; ) *p2++ ^= *ip++; triple_block_cipher(s->expanded, p, DES3EDE); memmove(s->ivec, p, 8); p += 8; } if(len > 0){ ip = s->ivec; triple_block_cipher(s->expanded, ip, DES3EDE); for(eip = ip+len; ip < eip; ) *p++ ^= *ip++; } } void des3CBCdecrypt(uchar *p, int len, DES3state *s) { uchar *ip, *eip, *tp; uchar tmp[8]; for(; len >= 8; len -= 8){ memmove(tmp, p, 8); triple_block_cipher(s->expanded, p, DES3DED); tp = tmp; ip = s->ivec; for(eip = ip+8; ip < eip; ){ *p++ ^= *ip; *ip++ = *tp++; } } if(len > 0){ ip = s->ivec; triple_block_cipher(s->expanded, ip, DES3EDE); for(eip = ip+len; ip < eip; ) *p++ ^= *ip++; } } keystep = 2; } ende >>= 1; for (i = 0; i < 8; i++) { v0 = key[0]; v0 ^= (right >> 1) | (right << 31); left ^= fetch(0, v0, 24) ^ fetch(2, v0, 16) ^ fetch(4, v0, 8) ^ fetch(6, v0, 0); v1 = key[1]; v1 ^= (right << 3) | (right >> 29); left ^= fetch(1, v1, 24) ^ fetch(3, v1, 16) ^ fetch(5, v1, 8) ^ fetch(7, v1, 0); key += keystep; v0 = key[0]old_contrib//root/sys/src/cmd/limbo/libsec/port/des3ECB.c������������������������������������������� 664 � 0 � 0 � 1625 7271617414 22264�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // I wasn't sure what to do when the buffer was not // a multiple of 8. I did what lacy's cryptolib did // to be compatible, but it looks dangerous to me // since its encrypting plain text with the key. -- presotto void des3ECBencrypt(uchar *p, int len, DES3state *s) { int i; uchar tmp[8]; for(; len >= 8; len -= 8){ triple_block_cipher(s->expanded, p, DES3EDE); p += 8; } if(len > 0){ for (i=0; i<8; i++) tmp[i] = i; triple_block_cipher(s->expanded, tmp, DES3EDE); for (i = 0; i < len; i++) p[i] ^= tmp[i]; } } void des3ECBdecrypt(uchar *p, int len, DES3state *s) { int i; uchar tmp[8]; for(; len >= 8; len -= 8){ triple_block_cipher(s->expanded, p, DES3DED); p += 8; } if(len > 0){ for (i=0; i<8; i++) tmp[i] = i; triple_block_cipher(s->expanded, tmp, DES3EDE); for (i = 0; i < len; i++) p[i] ^= tmp[i]; } } x102800, 0x000000,0x000004,0x000400,0x000404,0x000000,0x000004,0x000400,0x000404, 0x400000,0x400004,0x4004old_contrib//root/sys/src/cmd/limbo/libsec/port/desCBC.c�������������������������������������������� 664 � 0 � 0 � 2067 7254276567 22213�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // Because of the way that non multiple of 8 // buffers are handled, the decryptor must // be fed buffers of the same size as the // encryptor // If the length is not a multiple of 8, I encrypt // the overflow to be compatible with lacy's cryptlib void desCBCencrypt(uchar *p, int len, DESstate *s) { uchar *p2, *ip, *eip; for(; len >= 8; len -= 8){ p2 = p; ip = s->ivec; for(eip = ip+8; ip < eip; ) *p2++ ^= *ip++; block_cipher(s->expanded, p, 0); memmove(s->ivec, p, 8); p += 8; } if(len > 0){ ip = s->ivec; block_cipher(s->expanded, ip, 0); for(eip = ip+len; ip < eip; ) *p++ ^= *ip++; } } void desCBCdecrypt(uchar *p, int len, DESstate *s) { uchar *ip, *eip, *tp; uchar tmp[8]; for(; len >= 8; len -= 8){ memmove(tmp, p, 8); block_cipher(s->expanded, p, 1); tp = tmp; ip = s->ivec; for(eip = ip+8; ip < eip; ){ *p++ ^= *ip; *ip++ = *tp++; } } if(len > 0){ ip = s->ivec; block_cipher(s->expanded, ip, 0); for(eip = ip+len; ip < eip; ) *p++ ^= *ip++; } } , 0x000002,0x000003,0x200002,0x200003,0x020002,0x020003,0x220002,0x220003, }; static int keysh[] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, }; static void keycompperm(u32int left, u32int right, ulong *ek) { u32int v0, v1; int i; for(i = 0; i < 16; i++){ left = (left << keysh[i]) | (left >> (28 - keysh[i])); left &= 0xfffffff0; right = (right << keysh[i]) | (right >> (28 - keysh[i])); right &= 0xfffffff0; v0 = comptab[6 * (1 << old_contrib//root/sys/src/cmd/limbo/libsec/port/desECB.c�������������������������������������������� 664 � 0 � 0 � 1535 7254276567 22214�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // I wasn't sure what to do when the buffer was not // a multiple of 8. I did what lacy's cryptolib did // to be compatible, but it looks dangerous to me // since its encrypting plain text with the key. -- presotto void desECBencrypt(uchar *p, int len, DESstate *s) { int i; uchar tmp[8]; for(; len >= 8; len -= 8){ block_cipher(s->expanded, p, 0); p += 8; } if(len > 0){ for (i=0; i<8; i++) tmp[i] = i; block_cipher(s->expanded, tmp, 0); for (i = 0; i < len; i++) p[i] ^= tmp[i]; } } void desECBdecrypt(uchar *p, int len, DESstate *s) { int i; uchar tmp[8]; for(; len >= 8; len -= 8){ block_cipher(s->expanded, p, 1); p += 8; } if(len > 0){ for (i=0; i<8; i++) tmp[i] = i; block_cipher(s->expanded, tmp, 0); for (i = 0; i < len; i++) p[i] ^= tmp[i]; } } | ((v0 >> 2) & 0x10101010) | ((v0 >> 3) & 0x04040404) | ((v0 >> 4) & 0x01010101) | ((v1 >> 0) & 0x80808080) | ((v1 >> 1) & 0x20202020) | ((v1 >> 2) & 0xold_contrib//root/sys/src/cmd/limbo/libsec/port/desmodes.c������������������������������������������ 664 � 0 � 0 � 1207 7437760313 22714�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> /* * these routines use the 64bit format for * DES keys. */ void setupDESstate(DESstate *s, uchar key[8], uchar *ivec) { memset(s, 0, sizeof(*s)); memmove(s->key, key, sizeof(s->key)); des_key_setup(key, s->expanded); if(ivec) memmove(s->ivec, ivec, 8); s->setup = 0xdeadbeef; } void setupDES3state(DES3state *s, uchar key[3][8], uchar *ivec) { memset(s, 0, sizeof(*s)); memmove(s->key, key, sizeof(s->key)); des_key_setup(key[0], s->expanded[0]); des_key_setup(key[1], s->expanded[1]); des_key_setup(key[2], s->expanded[2]); if(ivec) memmove(s->ivec, ivec, 8); s->setup = 0xdeadbeef; } 0x8a, 0x8c, 0x8f, 0x91, 0x92, 0x94, 0x97, 0x98, 0x9b, 0x9d, 0x9e, 0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xab, 0xad, 0xae, 0xb0, 0xb3, 0xb5, 0xb6, 0xb9, 0xba, 0xbc, 0xbf, 0xc1, 0xc2, 0xc4, 0xc7, 0xc8, 0xcb, 0xcd, 0xce, 0xd0, 0xd3, 0xd5, 0xd6, 0xd9, 0xda, 0xdc, 0xdf, 0xe0, 0xe3, 0xe5, 0xe6, 0xe9, 0xea, 0xec, 0xef, 0xf1, 0xf2, 0xf4, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe, }; /* old_contrib//root/sys/src/cmd/limbo/libsec/port/dsaalloc.c������������������������������������������ 664 � 0 � 0 � 1604 7732217040 22664�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> DSApub* dsapuballoc(void) { DSApub *dsa; dsa = mallocz(sizeof(*dsa), 1); if(dsa == nil) sysfatal("dsapuballoc"); return dsa; } void dsapubfree(DSApub *dsa) { if(dsa == nil) return; mpfree(dsa->p); mpfree(dsa->q); mpfree(dsa->alpha); mpfree(dsa->key); free(dsa); } DSApriv* dsaprivalloc(void) { DSApriv *dsa; dsa = mallocz(sizeof(*dsa), 1); if(dsa == nil) sysfatal("dsaprivalloc"); return dsa; } void dsaprivfree(DSApriv *dsa) { if(dsa == nil) return; mpfree(dsa->pub.p); mpfree(dsa->pub.q); mpfree(dsa->pub.alpha); mpfree(dsa->pub.key); mpfree(dsa->secret); free(dsa); } DSAsig* dsasigalloc(void) { DSAsig *dsa; dsa = mallocz(sizeof(*dsa), 1); if(dsa == nil) sysfatal("dsasigalloc"); return dsa; } void dsasigfree(DSAsig *dsa) { if(dsa == nil) return; mpfree(dsa->r); mpfree(dsa->s); free(dsa); } 5, v1, 8) ^ fetch(7, v1, 0); key += keystep; } /* * final permutation, inverse initial permutation */ v0 = ((leold_contrib//root/sys/src/cmd/limbo/libsec/port/dsagen.c�������������������������������������������� 664 � 0 � 0 � 2163 7732217037 22352�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> DSApriv* dsagen(DSApub *opub) { DSApub *pub; DSApriv *priv; mpint *exp; mpint *g; mpint *r; int bits; priv = dsaprivalloc(); pub = &priv->pub; if(opub != nil){ pub->p = mpcopy(opub->p); pub->q = mpcopy(opub->q); } else { pub->p = mpnew(0); pub->q = mpnew(0); DSAprimes(pub->q, pub->p, nil); } bits = Dbits*pub->p->top; pub->alpha = mpnew(0); pub->key = mpnew(0); priv->secret = mpnew(0); // find a generator alpha of the multiplicative // group Z*p, i.e., of order n = p-1. We use the // fact that q divides p-1 to reduce the exponent. exp = mpnew(0); g = mpnew(0); r = mpnew(0); mpsub(pub->p, mpone, exp); mpdiv(exp, pub->q, exp, r); if(mpcmp(r, mpzero) != 0) sysfatal("dsagen foul up"); while(1){ mprand(bits, genrandom, g); mpmod(g, pub->p, g); mpexp(g, exp, pub->p, pub->alpha); if(mpcmp(pub->alpha, mpone) != 0) break; } mpfree(g); mpfree(exp); // create the secret key mprand(bits, genrandom, priv->secret); mpmod(priv->secret, pub->p, priv->secret); mpexp(pub->alpha, priv->secret, pub->p, pub->key); return priv; } eystep = 2; } ende >>= 1; for (i = 0; i < 8; i++) { v0 = key[0]; v0 ^= (right >> 1) | (right << 31); left ^= fetch(0, v0, 24) ^ fetch(2, v0, 16) ^ fetch(4, v0, 8) ^ fetch(6, v0, 0); v1 = key[1]; v1 ^= (right << 3) | (right >> 29); left ^= fetch(1, v1, 24) ^ fetch(3, v1, 16) ^ fetch(5, v1, 8) ^ fetch(7, v1, 0); key += keystep; v0 = key[0]old_contrib//root/sys/src/cmd/limbo/libsec/port/dsaprimes.c����������������������������������������� 664 � 0 � 0 � 3531 7254276570 23106�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // NIST algorithm for generating DSA primes // Menezes et al (1997) Handbook of Applied Cryptography, p.151 // q is a 160-bit prime; p is a 1024-bit prime; q divides p-1 // arithmetic on unsigned ints mod 2**160, represented // as 20-byte, little-endian uchar array static void Hrand(uchar *s) { ulong *u = (ulong*)s; *u++ = fastrand(); *u++ = fastrand(); *u++ = fastrand(); *u++ = fastrand(); *u = fastrand(); } static void Hincr(uchar *s) { int i; for(i=0; i<20; i++) if(++s[i]!=0) break; } // this can run for quite a while; be patient void DSAprimes(mpint *q, mpint *p, uchar seed[SHA1dlen]) { int i, j, k, n = 6, b = 63; uchar s[SHA1dlen], Hs[SHA1dlen], Hs1[SHA1dlen], sj[SHA1dlen], sjk[SHA1dlen]; mpint *two1023, *mb, *Vk, *W, *X, *q2; two1023 = mpnew(1024); mpleft(mpone, 1023, two1023); mb = mpnew(0); mpleft(mpone, b, mb); W = mpnew(1024); Vk = mpnew(1024); X = mpnew(0); q2 = mpnew(0); forever: do{ Hrand(s); memcpy(sj, s, 20); sha1(s, 20, Hs, 0); Hincr(sj); sha1(sj, 20, Hs1, 0); for(i=0; i<20; i++) Hs[i] ^= Hs1[i]; Hs[0] |= 1; Hs[19] |= 0x80; letomp(Hs, 20, q); }while(!probably_prime(q, 18)); if(seed != nil) // allow skeptics to confirm computation memmove(seed, s, SHA1dlen); i = 0; j = 2; Hincr(sj); mpleft(q, 1, q2); while(i<4096){ memcpy(sjk, sj, 20); for(k=0; k <= n; k++){ sha1(sjk, 20, Hs, 0); letomp(Hs, 20, Vk); if(k == n) mpmod(Vk, mb, Vk); mpleft(Vk, 160*k, Vk); mpadd(W, Vk, W); Hincr(sjk); } mpadd(W, two1023, X); mpmod(X, q2, W); mpsub(W, mpone, W); mpsub(X, W, p); if(mpcmp(p, two1023)>=0 && probably_prime(p, 5)) goto done; i += 1; j += n+1; for(k=0; k<n+1; k++) Hincr(sj); } goto forever; done: mpfree(q2); mpfree(X); mpfree(Vk); mpfree(W); mpfree(mb); mpfree(two1023); } tate *s) { uchar *p2, *ip, *eip; for(; len >= 8; len -= 8){ p2 = p; ip = s->ivec; for(eip = ip+8; ip < eip; ) *p2++ ^= *ip++; block_cipher(s->expanded, pold_contrib//root/sys/src/cmd/limbo/libsec/port/dsaprivtopub.c�������������������������������������� 664 � 0 � 0 � 427 7520060106 23600�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> DSApub* dsaprivtopub(DSApriv *priv) { DSApub *pub; pub = dsapuballoc(); pub->p = mpcopy(priv->pub.p); pub->q = mpcopy(priv->pub.q); pub->alpha = mpcopy(priv->pub.alpha); pub->key = mpcopy(priv->pub.key); return pub; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/dsasign.c������������������������������������������� 664 � 0 � 0 � 1711 7732217040 22531�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> DSAsig* dsasign(DSApriv *priv, mpint *m) { DSApub *pub = &priv->pub; DSAsig *sig; mpint *qm1, *k, *kinv, *r, *s; mpint *q = pub->q, *p = pub->p, *alpha = pub->alpha; int qlen = mpsignif(q); qm1 = mpnew(0); kinv = mpnew(0); r = mpnew(0); s = mpnew(0); k = mpnew(0); mpsub(pub->q, mpone, qm1); // find a k that has an inverse mod q while(1){ mprand(qlen, genrandom, k); if((mpcmp(mpone, k) > 0) || (mpcmp(k, pub->q) >= 0)) continue; mpextendedgcd(k, q, r, kinv, s); if(mpcmp(r, mpone) != 0) sysfatal("dsasign: pub->q not prime"); break; } // make kinv positive mpmod(kinv, pub->q, kinv); // r = ((alpha**k) mod p) mod q mpexp(alpha, k, p, r); mpmod(r, q, r); // s = (kinv*(m + ar)) mod q mpmul(r, priv->secret, s); mpadd(s, m, s); mpmul(s, kinv, s); mpmod(s, q, s); sig = dsasigalloc(); sig->r = r; sig->s = s; mpfree(qm1); mpfree(k); mpfree(kinv); return sig; } 08080) | ((v1 >> 1) & 0x20202020) | ((v1 >> 2) & 0xold_contrib//root/sys/src/cmd/limbo/libsec/port/dsaverify.c����������������������������������������� 664 � 0 � 0 � 1635 7732217041 23103�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> int dsaverify(DSApub *pub, DSAsig *sig, mpint *m) { int rv = -1; mpint *u1, *u2, *v, *sinv; if(mpcmp(sig->r, mpone) < 0 || mpcmp(sig->r, pub->q) >= 0) return rv; if(mpcmp(sig->s, mpone) < 0 || mpcmp(sig->s, pub->q) >= 0) return rv; u1 = mpnew(0); u2 = mpnew(0); v = mpnew(0); sinv = mpnew(0); // find (s**-1) mod q, make sure it exists mpextendedgcd(sig->s, pub->q, u1, sinv, v); if(mpcmp(u1, mpone) != 0) goto out; // u1 = (sinv * m) mod q, u2 = (r * sinv) mod q mpmul(sinv, m, u1); mpmod(u1, pub->q, u1); mpmul(sig->r, sinv, u2); mpmod(u2, pub->q, u2); // v = (((alpha**u1)*(key**u2)) mod p) mod q mpexp(pub->alpha, u1, pub->p, sinv); mpexp(pub->key, u2, pub->p, v); mpmul(sinv, v, v); mpmod(v, pub->p, v); mpmod(v, pub->q, v); if(mpcmp(v, sig->r) == 0) rv = 0; out: mpfree(v); mpfree(u1); mpfree(u2); mpfree(sinv); return rv; } xe3, 0xe5, 0xe6, 0xe9, 0xea, 0xec, 0xef, 0xf1, 0xf2, 0xf4, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe, }; /* old_contrib//root/sys/src/cmd/limbo/libsec/port/egalloc.c������������������������������������������� 664 � 0 � 0 � 1453 7732217036 22517�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> EGpub* egpuballoc(void) { EGpub *eg; eg = mallocz(sizeof(*eg), 1); if(eg == nil) sysfatal("egpuballoc"); return eg; } void egpubfree(EGpub *eg) { if(eg == nil) return; mpfree(eg->p); mpfree(eg->alpha); mpfree(eg->key); free(eg); } EGpriv* egprivalloc(void) { EGpriv *eg; eg = mallocz(sizeof(*eg), 1); if(eg == nil) sysfatal("egprivalloc"); return eg; } void egprivfree(EGpriv *eg) { if(eg == nil) return; mpfree(eg->pub.p); mpfree(eg->pub.alpha); mpfree(eg->pub.key); mpfree(eg->secret); free(eg); } EGsig* egsigalloc(void) { EGsig *eg; eg = mallocz(sizeof(*eg), 1); if(eg == nil) sysfatal("egsigalloc"); return eg; } void egsigfree(EGsig *eg) { if(eg == nil) return; mpfree(eg->r); mpfree(eg->s); free(eg); } DSAsig *dsa) { if(dsa == nil) return; mpfree(dsa->r); mpfree(dsa->s); free(dsa); } 5, v1, 8) ^ fetch(7, v1, 0); key += keystep; } /* * final permutation, inverse initial permutation */ v0 = ((leold_contrib//root/sys/src/cmd/limbo/libsec/port/egdecrypt.c����������������������������������������� 664 � 0 � 0 � 1064 7254276570 23104�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> mpint* egdecrypt(EGpriv *priv, mpint *in, mpint *out) { EGpub *pub = &priv->pub; mpint *gamma, *delta; mpint *p = pub->p; int plen = mpsignif(p)+1; int shift = ((plen+Dbits-1)/Dbits)*Dbits; if(out == nil) out = mpnew(0); gamma = mpnew(0); delta = mpnew(0); mpright(in, shift, gamma); mpleft(gamma, shift, delta); mpsub(in, delta, delta); mpexp(gamma, priv->secret, p, out); mpinvert(out, p, gamma); mpmul(gamma, delta, out); mpmod(out, p, out); mpfree(gamma); mpfree(delta); return out; } e the // fact that q divides p-1 to reduce the exponent. exp = mpnew(0); g = mpnew(0); r = mpnew(0); mpsub(pub->p, mpone, exp); mpdiv(exp, pub->q, exp, r); if(mpcmp(r, mpzero) != 0) sysfatal("dsagen foul up"); while(1){ mprand(bits, genrandom, g); mpmod(g, pub->p, g); mpexp(g, exp, pub->p, pub->alpha); if(mpcmp(pub->alpha, mpone) != 0) break; } mpfree(g); mpfree(exp); // create the secret key mprand(bits, genrandom, priv->secret)old_contrib//root/sys/src/cmd/limbo/libsec/port/egencrypt.c����������������������������������������� 664 � 0 � 0 � 1446 7437760313 23116�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> mpint* egencrypt(EGpub *pub, mpint *in, mpint *out) { mpint *m, *k, *gamma, *delta, *pm1; mpint *p = pub->p, *alpha = pub->alpha; int plen = mpsignif(p); int shift = ((plen+Dbits)/Dbits)*Dbits; // in libcrypt version, (int)(LENGTH(pub->p)*sizeof(NumType)*CHARBITS); if(out == nil) out = mpnew(0); pm1 = mpnew(0); m = mpnew(0); gamma = mpnew(0); delta = mpnew(0); mpmod(in, p, m); while(1){ k = mprand(plen, genrandom, nil); if((mpcmp(mpone, k) <= 0) && (mpcmp(k, pm1) < 0)) break; } mpexp(alpha, k, p, gamma); mpexp(pub->key, k, p, delta); mpmul(m, delta, delta); mpmod(delta, p, delta); mpleft(gamma, shift, out); mpadd(delta, out, out); mpfree(pm1); mpfree(m); mpfree(k); mpfree(gamma); mpfree(delta); return out; } yte, little-endian uchar array static void Hrand(uchar *s) { ulong *u = (ulong*)s; *u++ = fastrand(); *u++ = fastrand(); *u++ = fastrand(); *u++ = fastrand(); *u = fastrand(); } static void Hincr(uchar *s) { iold_contrib//root/sys/src/cmd/limbo/libsec/port/eggen.c��������������������������������������������� 664 � 0 � 0 � 635 7520060105 22143�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> EGpriv* eggen(int nlen, int rounds) { EGpub *pub; EGpriv *priv; priv = egprivalloc(); pub = &priv->pub; pub->p = mpnew(0); pub->alpha = mpnew(0); pub->key = mpnew(0); priv->secret = mpnew(0); gensafeprime(pub->p, pub->alpha, nlen, rounds); mprand(nlen-1, genrandom, priv->secret); mpexp(pub->alpha, priv->secret, pub->p, pub->key); return priv; } ���������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/egprivtopub.c��������������������������������������� 664 � 0 � 0 � 421 7254276570 23440�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> EGpub* egprivtopub(EGpriv *priv) { EGpub *pub; pub = egpuballoc(); if(pub == nil) return nil; pub->p = mpcopy(priv->pub.p); pub->alpha = mpcopy(priv->pub.alpha); pub->key = mpcopy(priv->pub.key); return pub; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/egsign.c�������������������������������������������� 664 � 0 � 0 � 1447 7520060105 22354�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> EGsig* egsign(EGpriv *priv, mpint *m) { EGpub *pub = &priv->pub; EGsig *sig; mpint *pm1, *k, *kinv, *r, *s; mpint *p = pub->p, *alpha = pub->alpha; int plen = mpsignif(p); pm1 = mpnew(0); kinv = mpnew(0); r = mpnew(0); s = mpnew(0); k = mpnew(0); mpsub(p, mpone, pm1); while(1){ mprand(plen, genrandom, k); if((mpcmp(mpone, k) > 0) || (mpcmp(k, pm1) >= 0)) continue; mpextendedgcd(k, pm1, r, kinv, s); if(mpcmp(r, mpone) != 0) continue; break; } mpmod(kinv, pm1, kinv); // make kinv positive mpexp(alpha, k, p, r); mpmul(priv->secret, r, s); mpmod(s, pm1, s); mpsub(m, s, s); mpmul(kinv, s, s); mpmod(s, pm1, s); sig = egsigalloc(); sig->r = r; sig->s = s; mpfree(pm1); mpfree(k); mpfree(kinv); return sig; } 0); s = mpnew(0); k = mpnew(0); mpsub(pub->q, mpone, qm1); // find a k that has an inverse mod q while(1){ mprand(qlen, genrandom, k); if((mpcmp(mpone, k) > 0) || (mpcmp(k, pub->q) >= 0)) continue; mpexold_contrib//root/sys/src/cmd/limbo/libsec/port/egtest.c�������������������������������������������� 664 � 0 � 0 � 1217 7254276571 22412�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> void main(void) { EGpriv *sk; mpint *m, *gamma, *delta, *in, *out; int plen, shift; fmtinstall('B', mpconv); sk = egprivalloc(); sk->pub.p = uitomp(2357, nil); sk->pub.alpha = uitomp(2, nil); sk->pub.key = uitomp(1185, nil); sk->secret = uitomp(1751, nil); m = uitomp(2035, nil); plen = mpsignif(sk->pub.p)+1; shift = ((plen+Dbits-1)/Dbits)*Dbits; gamma = uitomp(1430, nil); delta = uitomp(697, nil); out = mpnew(0); in = mpnew(0); mpleft(gamma, shift, in); mpadd(delta, in, in); egdecrypt(sk, in, out); if(mpcmp(m, out) != 0) print("decrypt failed to recover message\n"); } nv; if(mpcmp(sig->r, mpone) < 0 || mpcmp(sig->r, pub->q) >= 0) return rv; if(mpcmp(sig->s, mpone) < 0 || mpcmp(sig->s, pub->q) >= 0) return rv; u1 = mpnew(0); u2 = mpnew(0); v = mpnew(0); sinv = mpnew(0); // find (s**-1) mod q, make sure it exists mpextendedgcd(sig->s, pub->q, u1, sinv, v); if(mpcmp(u1, mpone) != 0) goto out; // u1 = (sinv * m) modold_contrib//root/sys/src/cmd/limbo/libsec/port/egverify.c������������������������������������������ 664 � 0 � 0 � 1007 7254276571 22734�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> int egverify(EGpub *pub, EGsig *sig, mpint *m) { mpint *p = pub->p, *alpha = pub->alpha; mpint *r = sig->r, *s = sig->s; mpint *v1, *v2, *rs; int rv = -1; if(mpcmp(r, mpone) < 0 || mpcmp(r, p) >= 0) return rv; v1 = mpnew(0); rs = mpnew(0); v2 = mpnew(0); mpexp(pub->key, r, p, v1); mpexp(r, s, p, rs); mpmul(v1, rs, v1); mpmod(v1, p, v1); mpexp(alpha, m, p, v2); if(mpcmp(v1, v2) == 0) rv = 0; mpfree(v1); mpfree(rs); mpfree(v2); return rv; } e "os.h" #include <mp.h> #include <libsec.h> EGpub* egpuballoc(void) { EGpub *eg; eg = mallocz(sizeof(*eg), 1); if(eg == nil) sysfatal("egpuballoc"); return eg; } void egpubfree(EGpub *eg) { if(eg == nil) return; mpfree(eg->p); mpfree(eg->alpha); mpfree(eg->key); free(eg); } EGpriv* egprivalloc(void) { EGpriv *eg; eg = mallocz(sizeof(*eg), 1); if(eg == nil) sysfatal("egprivalloc"); return eg; } void egprivfree(EGpriv *eg) { if(eg == nil) return; mpfree(eg->pub.p); mpfreold_contrib//root/sys/src/cmd/limbo/libsec/port/fastrand.c������������������������������������������ 664 � 0 � 0 � 361 10231466557 22712�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> /* * use the X917 random number generator to create random * numbers (faster than truerand() but not as random). */ ulong fastrand(void) { ulong x; genrandom((uchar*)&x, sizeof x); return x; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/genprime.c������������������������������������������ 664 � 0 � 0 � 1027 7254276571 22724�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // generate a probable prime. accuracy is the miller-rabin interations void genprime(mpint *p, int n, int accuracy) { mpdigit x; // generate n random bits with high and low bits set mpbits(p, n); genrandom((uchar*)p->p, (n+7)/8); p->top = (n+Dbits-1)/Dbits; x = 1; x <<= ((n-1)%Dbits); p->p[p->top-1] &= (x-1); p->p[p->top-1] |= x; p->p[0] |= 1; // keep icrementing till it looks prime for(;;){ if(probably_prime(p, accuracy)) break; mpadd(p, mptwo, p); } } rc/cmd/limbo/libsec/port/egencrypt.c����������������������������������������� 664 � 0 � 0 � 1446 7437760313 23116�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/genrandom.c����������������������������������������� 664 � 0 � 0 � 2217 10321670774 23102�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include "kernel.h" #include <mp.h> #include <libsec.h> typedef struct State{ int seeded; uvlong seed; DES3state des3; } State; static State x917state; static void X917(uchar *rand, int nrand) { int i, m, n8; uvlong I, x; /* 1. Compute intermediate value I = Ek(time). */ I = nsec(); triple_block_cipher(x917state.des3.expanded, (uchar*)&I, 0); /* two-key EDE */ /* 2. x[i] = Ek(I^seed); seed = Ek(x[i]^I); */ m = (nrand+7)/8; for(i=0; i<m; i++){ x = I ^ x917state.seed; triple_block_cipher(x917state.des3.expanded, (uchar*)&x, 0); n8 = (nrand>8) ? 8 : nrand; memcpy(rand, (uchar*)&x, n8); rand += 8; nrand -= 8; x ^= I; triple_block_cipher(x917state.des3.expanded, (uchar*)&x, 0); x917state.seed = x; } } static void X917init(void) { int n; uchar mix[128]; uchar key3[3][8]; ulong *ulp; ulp = (ulong*)key3; for(n = 0; n < sizeof(key3)/sizeof(ulong); n++) ulp[n] = truerand(); setupDES3state(&x917state.des3, key3, nil); X917(mix, sizeof mix); x917state.seeded = 1; } void genrandom(uchar *p, int n) { _genrandomqlock(); if(x917state.seeded == 0) X917init(); X917(p, n); _genrandomqunlock(); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/gensafeprime.c�������������������������������������� 664 � 0 � 0 � 1345 7520060104 23541�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // find a prime p of length n and a generator alpha of Z^*_p // Alg 4.86 Menezes et al () Handbook, p.164 void gensafeprime(mpint *p, mpint *alpha, int n, int accuracy) { mpint *q, *b; q = mpnew(n-1); while(1){ genprime(q, n-1, accuracy); mpleft(q, 1, p); mpadd(p, mpone, p); // p = 2*q+1 if(probably_prime(p, accuracy)) break; } // now find a generator alpha of the multiplicative // group Z*_p of order p-1=2q b = mpnew(0); while(1){ mprand(n, genrandom, alpha); mpmod(alpha, p, alpha); mpmul(alpha, alpha, b); mpmod(b, p, b); if(mpcmp(b, mpone) == 0) continue; mpexp(alpha, q, p, b); if(mpcmp(b, mpone) != 0) break; } mpfree(b); mpfree(q); } ����������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/genstrongprime.c������������������������������������ 664 � 0 � 0 � 2017 7254276572 24162�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // Gordon's algorithm for generating a strong prime // Menezes et al () Handbook, p.150 void genstrongprime(mpint *p, int n, int accuracy) { mpint *s, *t, *r, *i; if(n < 64) n = 64; s = mpnew(n/2); genprime(s, (n/2)-16, accuracy); t = mpnew(n/2); genprime(t, n-mpsignif(s)-32, accuracy); // first r = 2it + 1 that's prime i = mpnew(16); r = mpnew(0); itomp(0x8000, i); mpleft(t, 1, t); // 2t mpmul(i, t, r); // 2it mpadd(r, mpone, r); // 2it + 1 for(;;){ if(probably_prime(r, 18)) break; mpadd(r, t, r); // r += 2t } // p0 = 2(s**(r-2) mod r)s - 1 itomp(2, p); mpsub(r, p, p); mpexp(s, p, r, p); mpmul(s, p, p); mpleft(p, 1, p); mpsub(p, mpone, p); // first p = p0 + 2irs that's prime itomp(0x8000, i); mpleft(r, 1, r); // 2r mpmul(r, s, r); // 2rs mpmul(r, i, i); // 2irs mpadd(p, i, p); // p0 + 2irs for(;;){ if(probably_prime(p, accuracy)) break; mpadd(p, r, p); // p += 2rs } mpfree(i); mpfree(s); mpfree(r); mpfree(t); } #include <mp.h> #include <libsec.h> void main(void) { EGpriv *sk; mpint *m, *gamma, *delta, *in, *out; int plen, shift; fmtinstall('B', mpconv); sk = egprivalloc(); sk->pub.p = uitomp(2357, nil); sk->pub.alpha = uitomp(2, nil); sk->pub.key = uitomp(1185, nil); sk->secret = uitomp(1751, nil); m = uitomp(2035, nil); plen = mpsignif(sk->pub.p)+1; shift = ((plen+Dbits-1)/Dbits)*Dbits; gamma = uitomp(1430, nil); delta = uitomp(697, nil); out = mpnew(0); in = mpnew(0); mpleftold_contrib//root/sys/src/cmd/limbo/libsec/port/hmac.c���������������������������������������������� 664 � 0 � 0 � 2237 10376620715 22042�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> /* rfc2104 */ static DigestState* hmac_x(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s, DigestState*(*x)(uchar*, ulong, uchar*, DigestState*), int xlen) { int i; uchar pad[65], innerdigest[256]; if(xlen > sizeof(innerdigest)) return nil; if(klen>64) return nil; /* first time through */ if(s == nil || s->seeded == 0){ for(i=0; i<64; i++) pad[i] = 0x36; pad[64] = 0; for(i=0; i<klen; i++) pad[i] ^= key[i]; s = (*x)(pad, 64, nil, s); if(s == nil) return nil; } s = (*x)(p, len, nil, s); if(digest == nil) return s; /* last time through */ for(i=0; i<64; i++) pad[i] = 0x5c; pad[64] = 0; for(i=0; i<klen; i++) pad[i] ^= key[i]; (*x)(nil, 0, innerdigest, s); s = (*x)(pad, 64, nil, nil); (*x)(innerdigest, xlen, digest, s); return nil; } DigestState* hmac_sha1(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s) { return hmac_x(p, len, key, klen, digest, s, sha1, SHA1dlen); } DigestState* hmac_md5(uchar *p, ulong len, uchar *key, ulong klen, uchar *digest, DigestState *s) { return hmac_x(p, len, key, klen, digest, s, md5, MD5dlen); } c"); return eg; } void egpubfree(EGpub *eg) { if(eg == nil) return; mpfree(eg->p); mpfree(eg->alpha); mpfree(eg->key); free(eg); } EGpriv* egprivalloc(void) { EGpriv *eg; eg = mallocz(sizeof(*eg), 1); if(eg == nil) sysfatal("egprivalloc"); return eg; } void egprivfree(EGpriv *eg) { if(eg == nil) return; mpfree(eg->pub.p); mpfreold_contrib//root/sys/src/cmd/limbo/libsec/port/hmactest.c������������������������������������������ 664 � 0 � 0 � 530 7254276572 22705�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> uchar key[] = "Jefe"; uchar data[] = "what do ya want for nothing?"; void main(void) { int i; uchar hash[MD5dlen]; hmac_md5(data, strlen((char*)data), key, 4, hash, nil); for(i=0; i<MD5dlen; i++) print("%2.2x", hash[i]); print("\n"); print("750c783e6ab0b503eaa86e310a5db738\n"); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/idea.c���������������������������������������������� 664 � 0 � 0 � 6005 10334361366 22027�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include "mp.h" #include "libsec.h" #define KEYLEN 52 #define MODA 0x10000 #define MODM 0x10001 #define MASKA (MODA-1) #define OP1(x, y) ((x) ^ (y)) #define OP2(x, y) (((x) + (y)) & MASKA) #define OP3(x, y) mod(x, y) #define OP2INV(x) (-(x)) #define OP3INV(x) inv(x) #define BIGEND(k, i) ((k[i]<<8)|k[i+1]) #define MSB(x) ((x)>>8) #define LSB(x) ((x)&0xff) static ushort mod(ushort x, ushort y) { ushort q, r; uint z; if (x == 0) return 1-y; if (y == 0) return 1-x; z = (uint)x*(uint)y; q = z >> 16; r = z & MASKA; return r-q+(r<q); } static ushort inv(ushort x) { int q, r0, r1, r2, v0, v1, v2; if (x <= 1) return x; r0 = MODM; r1 = x; v0 = 0; v1 = 1; while (r1 != 0) { q = r0/r1; r2 = r0-q*r1; v2 = v0-q*v1; r0 = r1; r1 = r2; v0 = v1; v1 = v2; } if (v0 < 0) v0 += MODM; return v0 & MASKA; } static void idea_key_setup_decrypt(ushort ek[KEYLEN], ushort dk[KEYLEN]) { int i; for (i = 0; i < 54; i += 6) { dk[i] = OP3INV(ek[48-i]); dk[i+1] = OP2INV(ek[50-i]); dk[i+2] = OP2INV(ek[49-i]); dk[i+3] = OP3INV(ek[51-i]); if (i < 48) { dk[i+4] = ek[46-i]; dk[i+5] = ek[47-i]; } } } void idea_key_setup(uchar key[16], ushort ek[2*KEYLEN]) { int i, j; ushort tmp, *e = ek; for (i = 0; i < 8; i++) ek[i] = BIGEND(key, 2*i); for (i = 8, j = 1; i < KEYLEN; i++, j++) { ek[i] = (e[j&7]<<9)|(e[(j+1)&7]>>7); if (((i+1) & 7) == 0) e += 8; } tmp = ek[49]; ek[49] = ek[50]; ek[50] = tmp; idea_key_setup_decrypt(ek, &ek[KEYLEN]); } void idea_cipher(ushort key[2*KEYLEN], uchar text[8], int decrypting) { int i; ushort *k; ushort x[4]; ushort tmp, yout, zout; k = decrypting ? &key[KEYLEN] : key; for (i = 0; i < 4; i++) x[i] = BIGEND(text, 2*i); for (i = 0; i < 17; i++) { if (!(i&1)) { /* odd round */ x[0] = OP3(x[0], k[3*i]); tmp = OP2(x[2], k[3*i+2]); x[2] = OP2(x[1], k[3*i+1]); x[3] = OP3(x[3], k[3*i+3]); x[1] = tmp; } else { tmp = OP3(k[3*i+1], OP1(x[0], x[1])); yout = OP3(OP2(tmp, OP1(x[2], x[3])), k[3*i+2]); zout = OP2(tmp, yout); x[0] = OP1(x[0], yout); x[1] = OP1(x[1], yout); x[2] = OP1(x[2], zout); x[3] = OP1(x[3], zout); } } for (i = 0; i < 4; i++) { text[2*i] = MSB(x[i]); text[2*i+1] = LSB(x[i]); } } void setupIDEAstate(IDEAstate *s, uchar key[16], uchar *ivec) { memset(s, 0, sizeof(*s)); memmove(s->key, key, sizeof(s->key)); idea_key_setup(key, s->edkey); if(ivec) memmove(s->ivec, ivec, 8); } /* void main() { uchar key[] = { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }; uchar plain[] = { 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03 }; uchar cipher[] = { 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5 }; ushort edkey[2*KEYLEN]; uchar tmp[8]; memcpy(tmp, plain, 8); idea_key_setup(key, edkey); idea_cipher(edkey, tmp, 0); if (memcmp(tmp, cipher, 8)) { print("encrypt wrong\n"); exits(""); } idea_cipher(edkey, tmp, 1); if (memcmp(tmp, plain, 8)) { print("decrypt wrong\n"); exits(""); } } */ ontrib//root/sys/src/cmd/limbo/libsec/port/gensafeprime.c�������������������������������������� 664 � 0 � 0 � 1345 7520060104 23541�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/libsec.a�������������������������������������������� 664 � 0 � 0 � 104 10745511272 22335�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!<arch> __.SYMDEF 1201050298 0 0 644 0 ` ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/md4.c����������������������������������������������� 664 � 0 � 0 � 10244 7437760313 21616�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> /* * This MD4 is implemented from the description in Stinson's Cryptography, * theory and practice. -- presotto */ /* * Rotate ammounts used in the algorithm */ enum { S11= 3, S12= 7, S13= 11, S14= 19, S21= 3, S22= 5, S23= 9, S24= 13, S31= 3, S32= 9, S33= 11, S34= 15, }; typedef struct MD4Table MD4Table; struct MD4Table { uchar x; /* index into data block */ uchar rot; /* amount to rotate left by */ }; static MD4Table tab[] = { /* round 1 */ /*[0]*/ { 0, S11}, { 1, S12}, { 2, S13}, { 3, S14}, { 4, S11}, { 5, S12}, { 6, S13}, { 7, S14}, { 8, S11}, { 9, S12}, { 10, S13}, { 11, S14}, { 12, S11}, { 13, S12}, { 14, S13}, { 15, S14}, /* round 2 */ /*[16]*/{ 0, S21}, { 4, S22}, { 8, S23}, { 12, S24}, { 1, S21}, { 5, S22}, { 9, S23}, { 13, S24}, { 2, S21}, { 6, S22}, { 10, S23}, { 14, S24}, { 3, S21}, { 7, S22}, { 11, S23}, { 15, S24}, /* round 3 */ /*[32]*/{ 0, S31}, { 8, S32}, { 4, S33}, { 12, S34}, { 2, S31}, { 10, S32}, { 6, S33}, { 14, S34}, { 1, S31}, { 9, S32}, { 5, S33}, { 13, S34}, { 3, S31}, { 11, S32}, { 7, S33}, { 15, S34}, }; static void encode(uchar*, u32int*, ulong); static void decode(u32int*, uchar*, ulong); static void md4block(uchar *p, ulong len, MD4state *s) { int i; u32int a, b, c, d, tmp; MD4Table *t; uchar *end; u32int x[16]; for(end = p+len; p < end; p += 64){ a = s->state[0]; b = s->state[1]; c = s->state[2]; d = s->state[3]; decode(x, p, 64); for(i = 0; i < 48; i++){ t = tab + i; switch(i>>4){ case 0: a += (b & c) | (~b & d); break; case 1: a += ((b & c) | (b & d) | (c & d)) + 0x5A827999; break; case 2: a += (b ^ c ^ d) + 0x6ED9EBA1; break; } a += x[t->x]; a = (a << t->rot) | (a >> (32 - t->rot)); /* rotate variables */ tmp = d; d = c; c = b; b = a; a = tmp; } s->state[0] += a; s->state[1] += b; s->state[2] += c; s->state[3] += d; s->len += 64; } } MD4state* md4(uchar *p, ulong len, uchar *digest, MD4state *s) { u32int x[16]; uchar buf[128]; int i; uchar *e; if(s == nil){ s = malloc(sizeof(*s)); if(s == nil) return nil; memset(s, 0, sizeof(*s)); s->malloced = 1; } if(s->seeded == 0){ /* seed the state, these constants would look nicer big-endian */ s->state[0] = 0x67452301; s->state[1] = 0xefcdab89; s->state[2] = 0x98badcfe; s->state[3] = 0x10325476; s->seeded = 1; } /* fill out the partial 64 byte block from previous calls */ if(s->blen){ i = 64 - s->blen; if(len < i) i = len; memmove(s->buf + s->blen, p, i); len -= i; s->blen += i; p += i; if(s->blen == 64){ md4block(s->buf, s->blen, s); s->blen = 0; } } /* do 64 byte blocks */ i = len & ~0x3f; if(i){ md4block(p, i, s); len -= i; p += i; } /* save the left overs if not last call */ if(digest == 0){ if(len){ memmove(s->buf, p, len); s->blen += len; } return s; } /* * this is the last time through, pad what's left with 0x80, * 0's, and the input count to create a multiple of 64 bytes */ if(s->blen){ p = s->buf; len = s->blen; } else { memmove(buf, p, len); p = buf; } s->len += len; e = p + len; if(len < 56) i = 56 - len; else i = 120 - len; memset(e, 0, i); *e = 0x80; len += i; /* append the count */ x[0] = s->len<<3; x[1] = s->len>>29; encode(p+len, x, 8); /* digest the last part */ md4block(p, len+8, s); /* return result and free state */ encode(digest, s->state, MD4dlen); if(s->malloced == 1) free(s); return nil; } /* * encodes input (u32int) into output (uchar). Assumes len is * a multiple of 4. */ static void encode(uchar *output, u32int *input, ulong len) { u32int x; uchar *e; for(e = output + len; output < e;) { x = *input++; *output++ = x; *output++ = x >> 8; *output++ = x >> 16; *output++ = x >> 24; } } /* * decodes input (uchar) into output (u32int). Assumes len is * a multiple of 4. */ static void decode(u32int *output, uchar *input, ulong len) { uchar *e; for(e = input+len; input < e; input += 4) *output++ = input[0] | (input[1] << 8) | (input[2] << 16) | (input[3] << 24); } dlen]; hmac_md5(data, strlen((char*)data), key, 4, hash, nil); for(i=0; i<MD5dlen; i++) print("%2.2x", hash[i]); print("\n"); print("750c783e6ab0b503eaa86e310a5db738\n"); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/md4test.c������������������������������������������� 664 � 0 � 0 � 1031 7254276572 22476�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> char *tests[] = { "", "a", "abc", "message digest", "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "12345678901234567890123456789012345678901234567890123456789012345678901234567890", 0 }; void main(void) { char **pp; uchar *p; int i; uchar digest[MD5dlen]; for(pp = tests; *pp; pp++){ p = (uchar*)*pp; md4(p, strlen(*pp), digest, 0); for(i = 0; i < MD5dlen; i++) print("%2.2ux", digest[i]); print("\n"); } } 6; r = z & MASKA; return r-q+(r<q); } static ushort inv(ushort x) { int q, r0, r1, r2, v0, v1, v2; if (x <= 1) return x; r0 = MODM; r1 = x; v0 = 0; v1 = 1; while (r1 != 0) { q = r0/r1; r2 = r0-q*r1; v2 = v0-q*v1; r0 = r1; r1 = r2; v0 = v1; v1 = v2; } if (v0 < 0) v0 += MODM; return v0 & MASKA; } static void idea_key_setup_decrypt(ushort ek[KEYLEN], ushort dk[KEYLEN]) { int i; for (i = 0; i < 54; i += 6) { dk[i] = OP3INV(ek[48-i]); dk[i+1] = OPold_contrib//root/sys/src/cmd/limbo/libsec/port/md5.c����������������������������������������������� 664 � 0 � 0 � 6266 10050262224 21607�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> /* * rfc1321 requires that I include this. The code is new. The constants * all come from the rfc (hence the copyright). We trade a table for the * macros in rfc. The total size is a lot less. -- presotto * * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All * rights reserved. * * License to copy and use this software is granted provided that it * is identified as the "RSA Data Security, Inc. MD5 Message-Digest * Algorithm" in all material mentioning or referencing this software * or this function. * * License is also granted to make and use derivative works provided * that such works are identified as "derived from the RSA Data * Security, Inc. MD5 Message-Digest Algorithm" in all material * mentioning or referencing the derived work. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software forany particular purpose. It is provided "as is" * without express or implied warranty of any kind. * These notices must be retained in any copies of any part of this * documentation and/or software. */ static void encode(uchar*, u32int*, ulong); extern void _md5block(uchar*, ulong, u32int*); MD5state* md5(uchar *p, ulong len, uchar *digest, MD5state *s) { u32int x[16]; uchar buf[128]; int i; uchar *e; if(s == nil){ s = malloc(sizeof(*s)); if(s == nil) return nil; memset(s, 0, sizeof(*s)); s->malloced = 1; } if(s->seeded == 0){ /* seed the state, these constants would look nicer big-endian */ s->state[0] = 0x67452301; s->state[1] = 0xefcdab89; s->state[2] = 0x98badcfe; s->state[3] = 0x10325476; s->seeded = 1; } /* fill out the partial 64 byte block from previous calls */ if(s->blen){ i = 64 - s->blen; if(len < i) i = len; memmove(s->buf + s->blen, p, i); len -= i; s->blen += i; p += i; if(s->blen == 64){ _md5block(s->buf, s->blen, s->state); s->len += s->blen; s->blen = 0; } } /* do 64 byte blocks */ i = len & ~0x3f; if(i){ _md5block(p, i, s->state); s->len += i; len -= i; p += i; } /* save the left overs if not last call */ if(digest == 0){ if(len){ memmove(s->buf, p, len); s->blen += len; } return s; } /* * this is the last time through, pad what's left with 0x80, * 0's, and the input count to create a multiple of 64 bytes */ if(s->blen){ p = s->buf; len = s->blen; } else { memmove(buf, p, len); p = buf; } s->len += len; e = p + len; if(len < 56) i = 56 - len; else i = 120 - len; memset(e, 0, i); *e = 0x80; len += i; /* append the count */ x[0] = s->len<<3; x[1] = s->len>>29; encode(p+len, x, 8); /* digest the last part */ _md5block(p, len+8, s->state); s->len += len; /* return result and free state */ encode(digest, s->state, MD5dlen); if(s->malloced == 1) free(s); return nil; } /* * encodes input (u32int) into output (uchar). Assumes len is * a multiple of 4. */ static void encode(uchar *output, u32int *input, ulong len) { u32int x; uchar *e; for(e = output + len; output < e;) { x = *input++; *output++ = x; *output++ = x >> 8; *output++ = x >> 16; *output++ = x >> 24; } } ���������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/md5block.c������������������������������������������ 664 � 0 � 0 � 11626 10225443636 22652�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> /* * rfc1321 requires that I include this. The code is new. The constants * all come from the rfc (hence the copyright). We trade a table for the * macros in rfc. The total size is a lot less. -- presotto * * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All * rights reserved. * * License to copy and use this software is granted provided that it * is identified as the "RSA Data Security, Inc. MD5 Message-Digest * Algorithm" in all material mentioning or referencing this software * or this function. * * License is also granted to make and use derivative works provided * that such works are identified as "derived from the RSA Data * Security, Inc. MD5 Message-Digest Algorithm" in all material * mentioning or referencing the derived work. * * RSA Data Security, Inc. makes no representations concerning either * the merchantability of this software or the suitability of this * software forany particular purpose. It is provided "as is" * without express or implied warranty of any kind. * These notices must be retained in any copies of any part of this * documentation and/or software. */ /* * Rotate ammounts used in the algorithm */ enum { S11= 7, S12= 12, S13= 17, S14= 22, S21= 5, S22= 9, S23= 14, S24= 20, S31= 4, S32= 11, S33= 16, S34= 23, S41= 6, S42= 10, S43= 15, S44= 21 }; static u32int md5tab[] = { /* round 1 */ /*[0]*/ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, /* round 2 */ /*[16]*/0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, /* round 3 */ /*[32]*/0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, /* round 4 */ /*[48]*/0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, }; static void decode(u32int*, uchar*, ulong); extern void _md5block(uchar *p, ulong len, u32int *s); void _md5block(uchar *p, ulong len, u32int *s) { u32int a, b, c, d, sh; u32int *t; uchar *end; u32int x[16]; for(end = p+len; p < end; p += 64){ a = s[0]; b = s[1]; c = s[2]; d = s[3]; decode(x, p, 64); t = md5tab; sh = 0; for(; sh != 16; t += 4){ a += ((c ^ d) & b) ^ d; a += x[sh] + t[0]; a = (a << S11) | (a >> (32 - S11)); a += b; d += ((b ^ c) & a) ^ c; d += x[sh + 1] + t[1]; d = (d << S12) | (d >> (32 - S12)); d += a; c += ((a ^ b) & d) ^ b; c += x[sh + 2] + t[2]; c = (c << S13) | (c >> (32 - S13)); c += d; b += ((d ^ a) & c) ^ a; b += x[sh + 3] + t[3]; b = (b << S14) | (b >> (32 - S14)); b += c; sh += 4; } sh = 1; for(; sh != 1+20*4; t += 4){ a += ((b ^ c) & d) ^ c; a += x[sh & 0xf] + t[0]; a = (a << S21) | (a >> (32 - S21)); a += b; d += ((a ^ b) & c) ^ b; d += x[(sh + 5) & 0xf] + t[1]; d = (d << S22) | (d >> (32 - S22)); d += a; c += ((d ^ a) & b) ^ a; c += x[(sh + 10) & 0xf] + t[2]; c = (c << S23) | (c >> (32 - S23)); c += d; b += ((c ^ d) & a) ^ d; b += x[(sh + 15) & 0xf] + t[3]; b = (b << S24) | (b >> (32 - S24)); b += c; sh += 20; } sh = 5; for(; sh != 5+12*4; t += 4){ a += b ^ c ^ d; a += x[sh & 0xf] + t[0]; a = (a << S31) | (a >> (32 - S31)); a += b; d += a ^ b ^ c; d += x[(sh + 3) & 0xf] + t[1]; d = (d << S32) | (d >> (32 - S32)); d += a; c += d ^ a ^ b; c += x[(sh + 6) & 0xf] + t[2]; c = (c << S33) | (c >> (32 - S33)); c += d; b += c ^ d ^ a; b += x[(sh + 9) & 0xf] + t[3]; b = (b << S34) | (b >> (32 - S34)); b += c; sh += 12; } sh = 0; for(; sh != 28*4; t += 4){ a += c ^ (b | ~d); a += x[sh & 0xf] + t[0]; a = (a << S41) | (a >> (32 - S41)); a += b; d += b ^ (a | ~c); d += x[(sh + 7) & 0xf] + t[1]; d = (d << S42) | (d >> (32 - S42)); d += a; c += a ^ (d | ~b); c += x[(sh + 14) & 0xf] + t[2]; c = (c << S43) | (c >> (32 - S43)); c += d; b += d ^ (c | ~a); b += x[(sh + 21) & 0xf] + t[3]; b = (b << S44) | (b >> (32 - S44)); b += c; sh += 28; } s[0] += a; s[1] += b; s[2] += c; s[3] += d; } } /* * decodes input (uchar) into output (u32int). Assumes len is * a multiple of 4. */ static void decode(u32int *output, uchar *input, ulong len) { uchar *e; for(e = input+len; input < e; input += 4) *output++ = input[0] | (input[1] << 8) | (input[2] << 16) | (input[3] << 24); } = (uchar*)*pp; md4(p, strlen(*pp), digest, 0); for(i = 0; i < MD5dlen; i++) print("%2.2ux", digest[old_contrib//root/sys/src/cmd/limbo/libsec/port/md5pickle.c����������������������������������������� 664 � 0 � 0 � 1314 10163647153 23001�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> char* md5pickle(MD5state *s) { char *p; int m, n; m = 17+4*9+4*((s->blen+3)/3 + 1); p = malloc(m); if(p == nil) return p; n = sprint(p, "%16.16llux %8.8ux %8.8ux %8.8ux %8.8ux ", s->len, s->state[0], s->state[1], s->state[2], s->state[3]); enc64(p+n, m-n, s->buf, s->blen); return p; } MD5state* md5unpickle(char *p) { MD5state *s; s = malloc(sizeof(*s)); if(s == nil) return nil; s->len = strtoull(p, &p, 16); s->state[0] = strtoul(p, &p, 16); s->state[1] = strtoul(p, &p, 16); s->state[2] = strtoul(p, &p, 16); s->state[3] = strtoul(p, &p, 16); s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p)); s->malloced = 1; s->seeded = 1; return s; } rfc. The total size is a lot less. -- presotto * * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All * rights reserved. * * License to copy and use this software is granted provided that it * is identified as the "RSA Data Security, Inc. MD5 Message-Digest * Algorithm" in all material old_contrib//root/sys/src/cmd/limbo/libsec/port/mkfile���������������������������������������������� 664 � 0 � 0 � 1555 10745514365 22165�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������</$objtype/mkfile LIB=../libsec.a CFILES = des.c desmodes.c desECB.c desCBC.c des3ECB.c des3CBC.c\ aes.c blowfish.c \ idea.c \ hmac.c md5.c md5block.c md4.c sha1.c sha1block.c\ sha1pickle.c md5pickle.c\ rc4.c\ genrandom.c prng.c fastrand.c nfastrand.c\ probably_prime.c smallprimetest.c genprime.c dsaprimes.c gensafeprime.c genstrongprime.c\ rsagen.c rsafill.c rsaencrypt.c rsadecrypt.c rsaalloc.c rsaprivtopub.c \ eggen.c egencrypt.c egdecrypt.c egalloc.c egprivtopub.c egsign.c egverify.c \ dsagen.c dsaalloc.c dsaprivtopub.c dsasign.c dsaverify.c \ ALLOFILES=${CFILES:%.c=%.$O} # cull things in the per-machine directories from this list OFILES= `{rc ./reduce-rc $O Plan9-$objtype $ALLOFILES } HFILES=\ ../include/libsec.h\ ../libmp/port/os.h\ CFLAGS=$CFLAGS -I../../libmp/port -I../../include UPDATE=mkfile\ $HFILES\ $CFILES\ </sys/src/cmd/mksyslib i; s->blen += i; p += i; if(s->blen == 64){ _md5block(s->buf, s->blen, s->state); s->len += s->blen; s->blen = 0; } } /* do 64 old_contrib//root/sys/src/cmd/limbo/libsec/port/nfastrand.c����������������������������������������� 664 � 0 � 0 � 521 10231466523 23057�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> #define Maxrand ((1UL<<31)-1) ulong nfastrand(ulong n) { ulong m, r; /* * set m to the maximum multiple of n <= 2^31-1 * so we want a random number < m. */ if(n > Maxrand) sysfatal("nfastrand: n too large"); m = Maxrand - Maxrand % n; while((r = fastrand()) >= m) ; return r%n; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/primetest.c����������������������������������������� 664 � 0 � 0 � 4666 7254276573 23150�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> void main(void) { mpint *z = mpnew(0); mpint *p = mpnew(0); mpint *q = mpnew(0); mpint *nine = mpnew(0); fmtinstall('B', mpconv); strtomp("2492491", nil, 16, z); // 38347921 = x*y = (2**28-9)/7, // an example of 3**(n-1)=1 mod n strtomp("15662C00E811", nil, 16, p);// 23528569104401, a prime uitomp(9, nine); if(probably_prime(z, 5) == 1) fprint(2, "tricked primality test\n"); if(probably_prime(nine, 5) == 1) fprint(2, "9 passed primality test!\n"); if(probably_prime(p, 25) == 1) fprint(2, "ok\n"); DSAprimes(q, p, nil); print("q=%B\np=%B\n", q, p); exits(0); } // example output, checked with Maple: // seed EB7B6E35F7CD37B511D96C67D6688CC4DD440E1E // q=E0F0EF284E10796C5A2A511E94748BA03C795C13 // = 1284186945063585093695748280224501481698995297299 // p=C41CFBE4D4846F67A3DF7DE9921A49D3B42DC33728427AB159CEC8CBBDB12B5F0C244F1A734AEB9840804EA3C25036AD1B61AFF3ABBC247CD4B384224567A863A6F020E7EE9795554BCD08ABAD7321AF27E1E92E3DB1C6E7E94FAAE590AE9C48F96D93D178E809401ABE8A534A1EC44359733475A36A70C7B425125062B1142D // = 137715385439333164327584575331308277462546592976152006175830654712456008630139443747529133857837818585400418619916530061955288983751958831927807888408309879880101870216437711393638413509484569804814373511469405934988856674935304074081350525593807908358867354528898618574659752879015380013845760006721861915693 // r=DF310F4E54A5FEC5D86D3E14863921E834113E060F90052AD332B3241CEF2497EFA0303D6344F7C819691A0F9C4A773815AF8EAECFB7EC1D98F039F17A32A7E887D97251A927D093F44A55577F4D70444AEBD06B9B45695EC23962B175F266895C67D21C4656848614D888A4 // = 107239359478548771267308764204625458348785444483302647285245969203446101233421655396874997253111222983406676955642093641709149748793954493558324738441197139556917622937892491175016280660608595599724194374948056515856812347094848443460715881455884639869144172708 // g=2F1C308DC46B9A44B52DF7DACCE1208CCEF72F69C743ADD4D2327173444ED6E65E074694246E07F9FD4AE26E0FDDD9F54F813C40CB9BCD4338EA6F242AB94CD410E676C290368A16B1A3594877437E516C53A6EEE5493A038A017E955E218E7819734E3E2A6E0BAE08B14258F8C03CC1B30E0DDADFCF7CEDF0727684D3D255F1 // = 33081848392740465806285326014906437543653045153885419334085917570615301913274531387168723847139029827598735376746057461417880810924280288611116213062512408829164220104555543445909528701551198146080221790002337033997295756585193926863581671466708482411159477816144226847280417522524922667065714073338662508017 122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,old_contrib//root/sys/src/cmd/limbo/libsec/port/prng.c���������������������������������������������� 664 � 0 � 0 � 273 7254276573 22050�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // // just use the libc prng to fill a buffer // void prng(uchar *p, int n) { uchar *e; for(e = p+n; p < e; p++) *p = rand(); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/probably_prime.c������������������������������������ 664 � 0 � 0 � 3037 7254276573 24131�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // Miller-Rabin probabilistic primality testing // Knuth (1981) Seminumerical Algorithms, p.379 // Menezes et al () Handbook, p.39 // 0 if composite; 1 if almost surely prime, Pr(err)<1/4**nrep int probably_prime(mpint *n, int nrep) { int j, k, rep, nbits, isprime = 1; mpint *nm1, *q, *x, *y, *r; if(n->sign < 0) sysfatal("negative prime candidate"); if(nrep <= 0) nrep = 18; k = mptoi(n); if(k == 2) // 2 is prime return 1; if(k < 2) // 1 is not prime return 0; if((n->p[0] & 1) == 0) // even is not prime return 0; // test against small prime numbers if(smallprimetest(n) < 0) return 0; // fermat test, 2^n mod n == 2 if p is prime x = uitomp(2, nil); y = mpnew(0); mpexp(x, n, n, y); k = mptoi(y); if(k != 2){ mpfree(x); mpfree(y); return 0; } nbits = mpsignif(n); nm1 = mpnew(nbits); mpsub(n, mpone, nm1); // nm1 = n - 1 */ k = mplowbits0(nm1); q = mpnew(0); mpright(nm1, k, q); // q = (n-1)/2**k for(rep = 0; rep < nrep; rep++){ // x = random in [2, n-2] r = mprand(nbits, prng, nil); mpmod(r, nm1, x); mpfree(r); if(mpcmp(x, mpone) <= 0) continue; // y = x**q mod n mpexp(x, q, n, y); if(mpcmp(y, mpone) == 0 || mpcmp(y, nm1) == 0) goto done; for(j = 1; j < k; j++){ mpmul(y, y, x); mpmod(x, n, y); // y = y*y mod n if(mpcmp(y, nm1) == 0) goto done; if(mpcmp(y, mpone) == 0){ isprime = 0; goto done; } } isprime = 0; } done: mpfree(y); mpfree(x); mpfree(q); mpfree(nm1); return isprime; } imbo/libsec/port/md5pickle.c����������������������������������������� 664 � 0 � 0 � 1314 10163647153 23001�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/rc4.c����������������������������������������������� 664 � 0 � 0 � 2607 7437760314 21607�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> void setupRC4state(RC4state *key, uchar *start, int n) { int t; int index2; uchar *state; uchar *p, *e, *sp, *se; state = key->state; se = &state[256]; for(sp = state; sp < se; sp++) *sp = sp - state; key->x = 0; key->y = 0; index2 = 0; e = start + n; p = start; for(sp = state; sp < se; sp++) { t = *sp; index2 = (*p + t + index2) & 255; *sp = state[index2]; state[index2] = t; if(++p >= e) p = start; } } void rc4(RC4state *key, uchar *p, int len) { int tx, ty; int x, y; uchar *state; uchar *e; x = key->x; y = key->y; state = &key->state[0]; for(e = p + len; p < e; p++) { x = (x+1)&255; tx = state[x]; y = (y+tx)&255; ty = state[y]; state[x] = ty; state[y] = tx; *p ^= state[(tx+ty)&255]; } key->x = x; key->y = y; } void rc4skip(RC4state *key, int len) { int tx, ty; int x, y; uchar *state; int i; x = key->x; y = key->y; state = &key->state[0]; for(i=0; i<len; i++) { x = (x+1)&255; tx = state[x]; y = (y+tx)&255; ty = state[y]; state[x] = ty; state[y] = tx; } key->x = x; key->y = y; } void rc4back(RC4state *key, int len) { int tx, ty; int x, y; uchar *state; int i; x = key->x; y = key->y; state = &key->state[0]; for(i=0; i<len; i++) { ty = state[x]; tx = state[y]; state[y] = ty; state[x] = tx; y = (y-tx)&255; x = (x-1)&255; } key->x = x; key->y = y; } �������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/reduce-nt������������������������������������������� 664 � 0 � 0 � 127 10242675723 22554�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# for now, just return the input files shift # $O shift # $SYSTARG-$OBJTYPE echo -n $* �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/reduce-rc������������������������������������������� 664 � 0 � 0 � 462 10225340664 22533�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O=$1 shift nonport=$1 shift ls -p ../$nonport/*.[cs] >[2]/dev/null | sed 's/..$//' > /tmp/reduce.$pid # # if empty directory, just return the input files # if (! ~ $status '|') { echo $* rm /tmp/reduce.$pid exit 0 } echo $* | tr ' ' \012 | grep -v -f /tmp/reduce.$pid | tr \012 ' ' rm /tmp/reduce.$pid ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/reduce-sh������������������������������������������� 664 � 0 � 0 � 270 10400412110 22513�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O=$1 shift nonport=$1 shift for i in $* do j=`echo $i | sed 's/\.'$O'//'` if test ! -f ../$nonport/$j.c -a ! -f ../$nonport/$j.s -a ! -f ../$nonport/$j.spp then echo $i fi done ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/rsaalloc.c������������������������������������������ 664 � 0 � 0 � 1221 7254276574 22715�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> RSApub* rsapuballoc(void) { RSApub *rsa; rsa = mallocz(sizeof(*rsa), 1); if(rsa == nil) sysfatal("rsapuballoc"); return rsa; } void rsapubfree(RSApub *rsa) { if(rsa == nil) return; mpfree(rsa->ek); mpfree(rsa->n); free(rsa); } RSApriv* rsaprivalloc(void) { RSApriv *rsa; rsa = mallocz(sizeof(*rsa), 1); if(rsa == nil) sysfatal("rsaprivalloc"); return rsa; } void rsaprivfree(RSApriv *rsa) { if(rsa == nil) return; mpfree(rsa->pub.ek); mpfree(rsa->pub.n); mpfree(rsa->dk); mpfree(rsa->p); mpfree(rsa->q); mpfree(rsa->kp); mpfree(rsa->kq); mpfree(rsa->c2); free(rsa); } 5806285326014906437543653045153885419334085917570615301913274531387168723847139029827598735376746057461417880810924280288611116213062512408829164220104555543445909528701551198146080221790002337033997295756585193926863581671466708482411159477816144226847280417522524922667065714073338662508017 122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,old_contrib//root/sys/src/cmd/limbo/libsec/port/rsadecrypt.c���������������������������������������� 664 � 0 � 0 � 1355 7254276574 23305�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> // decrypt rsa using garner's algorithm for the chinese remainder theorem // seminumerical algorithms, knuth, pp 253-254 // applied cryptography, menezes et al, pg 612 mpint* rsadecrypt(RSApriv *rsa, mpint *in, mpint *out) { mpint *v1, *v2; if(out == nil) out = mpnew(0); // convert in to modular representation v1 = mpnew(0); mpmod(in, rsa->p, v1); v2 = mpnew(0); mpmod(in, rsa->q, v2); // exponentiate the modular rep mpexp(v1, rsa->kp, rsa->p, v1); mpexp(v2, rsa->kq, rsa->q, v2); // out = v1 + p*((v2-v1)*c2 mod q) mpsub(v2, v1, v2); mpmul(v2, rsa->c2, v2); mpmod(v2, rsa->q, v2); mpmul(v2, rsa->p, out); mpadd(v1, out, out); mpfree(v1); mpfree(v2); return out; } ��������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/rsaencrypt.c���������������������������������������� 664 � 0 � 0 � 300 7254276574 23264�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> mpint* rsaencrypt(RSApub *rsa, mpint *in, mpint *out) { if(out == nil) out = mpnew(0); mpexp(in, rsa->ek, rsa->n, out); return out; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/rsafill.c������������������������������������������� 664 � 0 � 0 � 2120 7624214333 22532�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> RSApriv* rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q) { mpint *c2, *kq, *kp, *x; RSApriv *rsa; // make sure we're not being hoodwinked if(!probably_prime(p, 10) || !probably_prime(q, 10)){ werrstr("rsafill: p or q not prime"); return nil; } x = mpnew(0); mpmul(p, q, x); if(mpcmp(n, x) != 0){ werrstr("rsafill: n != p*q"); mpfree(x); return nil; } c2 = mpnew(0); mpsub(p, mpone, c2); mpsub(q, mpone, x); mpmul(c2, x, x); mpmul(e, d, c2); mpmod(c2, x, x); if(mpcmp(x, mpone) != 0){ werrstr("rsafill: e*d != 1 mod (p-1)*(q-1)"); mpfree(x); mpfree(c2); return nil; } // compute chinese remainder coefficient mpinvert(p, q, c2); // for crt a**k mod p == (a**(k mod p-1)) mod p kq = mpnew(0); kp = mpnew(0); mpsub(p, mpone, x); mpmod(d, x, kp); mpsub(q, mpone, x); mpmod(d, x, kq); rsa = rsaprivalloc(); rsa->pub.ek = mpcopy(e); rsa->pub.n = mpcopy(n); rsa->dk = mpcopy(d); rsa->kp = kp; rsa->kq = kq; rsa->p = mpcopy(p); rsa->q = mpcopy(q); rsa->c2 = c2; mpfree(x); return rsa; } art, int n) { int t; int index2; uchar *state; uchar *p, *e, *sp, *se; state = key->state; se = &state[256]; for(sp = state; sp < se; sp++) *sp = sp - state; key->x = 0; key->y = 0; index2 = 0; e = start + n; p = start; for(sp = state; sp < se; sp++) { t = *sp; index2 = (*p + t + index2) & 255; *sp = state[index2]; state[index2] = t; if(++p >= e) p = start; } } void rc4(RC4state *key, uchar *p, iold_contrib//root/sys/src/cmd/limbo/libsec/port/rsagen.c�������������������������������������������� 664 � 0 � 0 � 2666 10050262225 22402�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> RSApriv* rsagen(int nlen, int elen, int rounds) { mpint *p, *q, *e, *d, *phi, *n, *t1, *t2, *kp, *kq, *c2; RSApriv *rsa; p = mpnew(nlen/2); q = mpnew(nlen/2); n = mpnew(nlen); e = mpnew(elen); d = mpnew(0); phi = mpnew(nlen); // create the prime factors and euclid's function genprime(p, nlen/2, rounds); genprime(q, nlen - mpsignif(p) + 1, rounds); mpmul(p, q, n); mpsub(p, mpone, e); mpsub(q, mpone, d); mpmul(e, d, phi); // find an e relatively prime to phi t1 = mpnew(0); t2 = mpnew(0); mprand(elen, genrandom, e); if(mpcmp(e,mptwo) <= 0) itomp(3, e); // See Menezes et al. p.291 "8.8 Note (selecting primes)" for discussion // of the merits of various choices of primes and exponents. e=3 is a // common and recommended exponent, but doesn't necessarily work here // because we chose strong rather than safe primes. for(;;){ mpextendedgcd(e, phi, t1, d, t2); if(mpcmp(t1, mpone) == 0) break; mpadd(mpone, e, e); } mpfree(t1); mpfree(t2); // compute chinese remainder coefficient c2 = mpnew(0); mpinvert(p, q, c2); // for crt a**k mod p == (a**(k mod p-1)) mod p kq = mpnew(0); kp = mpnew(0); mpsub(p, mpone, phi); mpmod(d, phi, kp); mpsub(q, mpone, phi); mpmod(d, phi, kq); rsa = rsaprivalloc(); rsa->pub.ek = e; rsa->pub.n = n; rsa->dk = d; rsa->kp = kp; rsa->kq = kq; rsa->p = p; rsa->q = q; rsa->c2 = c2; mpfree(phi); return rsa; } ��������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/rsaprivtopub.c�������������������������������������� 664 � 0 � 0 � 355 7254276575 23645�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> RSApub* rsaprivtopub(RSApriv *priv) { RSApub *pub; pub = rsapuballoc(); if(pub == nil) return nil; pub->n = mpcopy(priv->pub.n); pub->ek = mpcopy(priv->pub.ek); return pub; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/rsatest.c������������������������������������������� 664 � 0 � 0 � 2106 10232133406 22575�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> #include <bio.h> void main(void) { RSApriv *rsa; Biobuf b; char *p; int n; mpint *clr, *enc, *clr2; uchar buf[4096]; uchar *e; vlong start; fmtinstall('B', mpfmt); rsa = rsagen(1024, 16, 0); if(rsa == nil) sysfatal("rsagen"); Binit(&b, 0, OREAD); clr = mpnew(0); clr2 = mpnew(0); enc = mpnew(0); strtomp("123456789abcdef123456789abcdef123456789abcdef123456789abcdef", nil, 16, clr); rsaencrypt(&rsa->pub, clr, enc); start = nsec(); for(n = 0; n < 10; n++) rsadecrypt(rsa, enc, clr); print("%lld\n", nsec()-start); start = nsec(); for(n = 0; n < 10; n++) mpexp(enc, rsa->dk, rsa->pub.n, clr2); print("%lld\n", nsec()-start); if(mpcmp(clr, clr2) != 0) print("%B != %B\n", clr, clr2); print("> "); while(p = Brdline(&b, '\n')){ n = Blinelen(&b); letomp((uchar*)p, n, clr); print("clr %B\n", clr); rsaencrypt(&rsa->pub, clr, enc); print("enc %B\n", enc); rsadecrypt(rsa, enc, clr); print("clr %B\n", clr); n = mptole(clr, buf, sizeof(buf), nil); write(1, buf, n); print("> "); } } oc(void) { RSApub *rsa; rsa = mallocz(sizeof(*rsa), 1); if(rsa == nil) sysfatal("rsapuballoc"); return rsa; } void rsapubfree(RSApub *rsa) { if(rsa == nil) return; mpfree(rsa->ek); mpfree(rsa->n); free(rsa); } RSApriv* rsaprivalloc(void) { RSApriv *rsa; rsa = mallocz(sizeof(*rsa), 1); if(rsa == nil) sysfatal("rsaprivalloc"); return rsa; } void rsaprivfree(RSApriv *rsa) { if(rsa == nil) return; mpfree(rsa->pub.eold_contrib//root/sys/src/cmd/limbo/libsec/port/sha1.c���������������������������������������������� 664 � 0 � 0 � 4347 7255750025 21752�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> static void encode(uchar*, u32int*, ulong); extern void _sha1block(uchar*, ulong, u32int*); /* * we require len to be a multiple of 64 for all but * the last call. There must be room in the input buffer * to pad. */ SHA1state* sha1(uchar *p, ulong len, uchar *digest, SHA1state *s) { uchar buf[128]; u32int x[16]; int i; uchar *e; if(s == nil){ s = malloc(sizeof(*s)); if(s == nil) return nil; memset(s, 0, sizeof(*s)); s->malloced = 1; } if(s->seeded == 0){ /* seed the state, these constants would look nicer big-endian */ s->state[0] = 0x67452301; s->state[1] = 0xefcdab89; s->state[2] = 0x98badcfe; s->state[3] = 0x10325476; s->state[4] = 0xc3d2e1f0; s->seeded = 1; } /* fill out the partial 64 byte block from previous calls */ if(s->blen){ i = 64 - s->blen; if(len < i) i = len; memmove(s->buf + s->blen, p, i); len -= i; s->blen += i; p += i; if(s->blen == 64){ _sha1block(s->buf, s->blen, s->state); s->len += s->blen; s->blen = 0; } } /* do 64 byte blocks */ i = len & ~0x3f; if(i){ _sha1block(p, i, s->state); s->len += i; len -= i; p += i; } /* save the left overs if not last call */ if(digest == 0){ if(len){ memmove(s->buf, p, len); s->blen += len; } return s; } /* * this is the last time through, pad what's left with 0x80, * 0's, and the input count to create a multiple of 64 bytes */ if(s->blen){ p = s->buf; len = s->blen; } else { memmove(buf, p, len); p = buf; } s->len += len; e = p + len; if(len < 56) i = 56 - len; else i = 120 - len; memset(e, 0, i); *e = 0x80; len += i; /* append the count */ x[0] = s->len>>29; x[1] = s->len<<3; encode(p+len, x, 8); /* digest the last part */ _sha1block(p, len+8, s->state); s->len += len+8; /* return result and free state */ encode(digest, s->state, SHA1dlen); if(s->malloced == 1) free(s); return nil; } /* * encodes input (ulong) into output (uchar). Assumes len is * a multiple of 4. */ static void encode(uchar *output, u32int *input, ulong len) { u32int x; uchar *e; for(e = output + len; output < e;) { x = *input++; *output++ = x >> 24; *output++ = x >> 16; *output++ = x >> 8; *output++ = x; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/sha1block.c����������������������������������������� 664 � 0 � 0 � 11101 7437760314 22773�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" void _sha1block(uchar *p, ulong len, u32int *s) { u32int a, b, c, d, e, x; uchar *end; u32int *wp, *wend; u32int w[80]; /* at this point, we have a multiple of 64 bytes */ for(end = p+len; p < end;){ a = s[0]; b = s[1]; c = s[2]; d = s[3]; e = s[4]; wend = w + 15; for(wp = w; wp < wend; wp += 5){ wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; e += ((a<<5) | (a>>27)) + wp[0]; e += 0x5a827999 + (((c^d)&b)^d); b = (b<<30)|(b>>2); wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; d += ((e<<5) | (e>>27)) + wp[1]; d += 0x5a827999 + (((b^c)&a)^c); a = (a<<30)|(a>>2); wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11]; c += ((d<<5) | (d>>27)) + wp[2]; c += 0x5a827999 + (((a^b)&e)^b); e = (e<<30)|(e>>2); wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15]; b += ((c<<5) | (c>>27)) + wp[3]; b += 0x5a827999 + (((e^a)&d)^a); d = (d<<30)|(d>>2); wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19]; a += ((b<<5) | (b>>27)) + wp[4]; a += 0x5a827999 + (((d^e)&c)^e); c = (c<<30)|(c>>2); p += 20; } wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; e += ((a<<5) | (a>>27)) + wp[0]; e += 0x5a827999 + (((c^d)&b)^d); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0x5a827999 + (((b^c)&a)^c); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0x5a827999 + (((a^b)&e)^b); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0x5a827999 + (((e^a)&d)^a); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0x5a827999 + (((d^e)&c)^e); c = (c<<30)|(c>>2); wp += 5; p += 4; wend = w + 40; for(; wp < wend; wp += 5){ x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; wp[0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[0]; e += 0x6ed9eba1 + (b^c^d); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0x6ed9eba1 + (a^b^c); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0x6ed9eba1 + (e^a^b); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0x6ed9eba1 + (d^e^a); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0x6ed9eba1 + (c^d^e); c = (c<<30)|(c>>2); } wend = w + 60; for(; wp < wend; wp += 5){ x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; wp[0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[0]; e += 0x8f1bbcdc + ((b&c)|((b|c)&d)); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0x8f1bbcdc + ((a&b)|((a|b)&c)); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0x8f1bbcdc + ((e&a)|((e|a)&b)); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0x8f1bbcdc + ((d&e)|((d|e)&a)); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0x8f1bbcdc + ((c&d)|((c|d)&e)); c = (c<<30)|(c>>2); } wend = w + 80; for(; wp < wend; wp += 5){ x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16]; wp[0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[0]; e += 0xca62c1d6 + (b^c^d); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0xca62c1d6 + (a^b^c); a = (a<<30)|(a>>2); x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14]; wp[2] = (x<<1) | (x>>31); c += ((d<<5) | (d>>27)) + wp[2]; c += 0xca62c1d6 + (e^a^b); e = (e<<30)|(e>>2); x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13]; wp[3] = (x<<1) | (x>>31); b += ((c<<5) | (c>>27)) + wp[3]; b += 0xca62c1d6 + (d^e^a); d = (d<<30)|(d>>2); x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12]; wp[4] = (x<<1) | (x>>31); a += ((b<<5) | (b>>27)) + wp[4]; a += 0xca62c1d6 + (c^d^e); c = (c<<30)|(c>>2); } /* save state */ s[0] += a; s[1] += b; s[2] += c; s[3] += d; s[4] += e; } } ����������������������������������� 664 � 0 � 0 � 2106 10232133406 22575�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/libsec/port/sha1pickle.c���������������������������������������� 664 � 0 � 0 � 1315 7271617414 23134�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <libsec.h> char* sha1pickle(SHA1state *s) { char *p; int m, n; m = 5*9+4*((s->blen+3)/3); p = malloc(m); if(p == nil) return p; n = sprint(p, "%8.8ux %8.8ux %8.8ux %8.8ux %8.8ux ", s->state[0], s->state[1], s->state[2], s->state[3], s->state[4]); enc64(p+n, m-n, s->buf, s->blen); return p; } SHA1state* sha1unpickle(char *p) { SHA1state *s; s = malloc(sizeof(*s)); if(s == nil) return nil; s->state[0] = strtoul(p, &p, 16); s->state[1] = strtoul(p, &p, 16); s->state[2] = strtoul(p, &p, 16); s->state[3] = strtoul(p, &p, 16); s->state[4] = strtoul(p, &p, 16); s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p)); s->malloced = 1; s->seeded = 1; return s; } SApub *rsa) { if(rsa == nil) return; mpfree(rsa->ek); mpfree(rsa->n); free(rsa); } RSApriv* rsaprivalloc(void) { RSApriv *rsa; rsa = mallocz(sizeof(*rsa), 1); if(rsa == nil) sysfatal("rsaprivalloc"); return rsa; } void rsaprivfree(RSApriv *rsa) { if(rsa == nil) return; mpfree(rsa->pub.eold_contrib//root/sys/src/cmd/limbo/libsec/port/smallprimes.c��������������������������������������� 664 � 0 � 0 � 15303 7254276575 23474�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" ulong smallprimes[1000] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, }; ] ^ wp[-8] ^ wp[-14] ^ wp[-16]; wp[0] = (x<<1) | (x>>31); e += ((a<<5) | (a>>27)) + wp[0]; e += 0xca62c1d6 + (b^c^d); b = (b<<30)|(b>>2); x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15]; wp[1] = (x<<1) | (x>>31); d += ((e<<5) | (e>>27)) + wp[1]; d += 0xca62c1d6 + (a^b^c); a = (a<<30)|(a>>2); old_contrib//root/sys/src/cmd/limbo/libsec/port/smallprimetest.c������������������������������������ 664 � 0 � 0 � 211760 7254276575 24236�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "os.h" #include <mp.h> #include <libsec.h> static ulong smallprimes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, 100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, 100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, 100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, 100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, 100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, 100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, 100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, 100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, 101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, 101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, 101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, 101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, 101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, 101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, 101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, 101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, 101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, 102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, 102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, 102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, 102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, 102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, 102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, 102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, 102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, 102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, 103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, 103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, 103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, 103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, 103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, 103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, 103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, 103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, 104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, 104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, 104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, 104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729, }; // return 1 if p is divisable by sp, 0 otherwise static int divides(mpint *dividend, ulong divisor) { mpdigit d[2], q; int i; d[1] = 0; for(i = dividend->top-1; i >= 0; i--){ d[0] = dividend->p[i]; mpdigdiv(d, divisor, &q); d[1] = d[0] - divisor*q; } return d[1] == 0; } // return -1 if p is divisable by one of the small primes, 0 otherwise int smallprimetest(mpint *p) { int i; ulong sp; for(i = 0; i < nelem(smallprimes); i++){ sp = smallprimes[i]; if(p->top == 1 && p->p[0] <= sp) break; if(divides(p, sp)) return -1; } return 0; } 89821, 89833, 89old_contrib//root/sys/src/cmd/limbo/limbo/���������������������������������������������������������� 775 � 0 � 0 � 0 11411740032 17621��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/limbo/NOTICE���������������������������������������������������� 664 � 0 � 0 � 2374 10560641716 20550�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This copyright NOTICE applies to all files in this directory and subdirectories, unless another copyright notice appears in a given file or subdirectory. If you take substantial code from this software to use in other programs, you must somehow include with it an appropriate copyright notice that includes the copyright notice and the other notices below. It is fine (and often tidier) to do that in a separate file such as NOTICE, LICENCE or COPYING. Copyright © 1995-1999 Lucent Technologies Inc. Portions Copyright © 1997-2000 Vita Nuova Limited Portions Copyright © 2000-2007 Vita Nuova Holdings Limited This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 3427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901,old_contrib//root/sys/src/cmd/limbo/limbo/asm.c����������������������������������������������������� 664 � 0 � 0 � 14622 10213604714 20577�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" void asmentry(Decl *e) { if(e == nil) return; Bprint(bout, "\tentry\t%ld, %d\n", e->pc->pc, e->desc->id); } void asmmod(Decl *m) { Bprint(bout, "\tmodule\t"); Bprint(bout, "%s\n", m->sym->name); for(m = m->ty->tof->ids; m != nil; m = m->next){ switch(m->store){ case Dglobal: Bprint(bout, "\tlink\t-1,-1,0x%lux,\".mp\"\n", sign(m)); break; case Dfn: Bprint(bout, "\tlink\t%d,%ld,0x%lux,\"", m->desc->id, m->pc->pc, sign(m)); if(m->dot->ty->kind == Tadt) Bprint(bout, "%s.", m->dot->sym->name); Bprint(bout, "%s\"\n", m->sym->name); break; } } } #define NAMELEN 64 void asmpath(void) { char name[8*NAMELEN], *sp; sp = srcpath(name, 8*NAMELEN); Bprint(bout, "\tsource\t\"%s\"\n", sp); } void asmdesc(Desc *d) { uchar *m, *e; for(; d != nil; d = d->next){ Bprint(bout, "\tdesc\t$%d,%lud,\"", d->id, d->size); e = d->map + d->nmap; for(m = d->map; m < e; m++) Bprint(bout, "%.2x", *m); Bprint(bout, "\"\n"); } } void asmvar(long size, Decl *d) { Bprint(bout, "\tvar\t@mp,%ld\n", size); for(; d != nil; d = d->next) if(d->store == Dglobal && d->init != nil) asminitializer(d->offset, d->init); } void asmldt(long size, Decl *d) { Bprint(bout, "\tldts\t@ldt,%ld\n", size); for(; d != nil; d = d->next) if(d->store == Dglobal && d->init != nil) asminitializer(d->offset, d->init); } void asminitializer(long offset, Node *n) { Node *elem, *wild; Case *c; Label *lab; Decl *id; ulong dv[2]; long e, last, esz, dotlen, idlen; int i; switch(n->ty->kind){ case Tbyte: Bprint(bout, "\tbyte\t@mp+%ld,%ld\n", offset, (long)n->val & 0xff); break; case Tint: case Tfix: Bprint(bout, "\tword\t@mp+%ld,%ld\n", offset, (long)n->val); break; case Tbig: Bprint(bout, "\tlong\t@mp+%ld,%lld # %.16llux\n", offset, n->val, n->val); break; case Tstring: asmstring(offset, n->decl->sym); break; case Treal: dtocanon(n->rval, dv); Bprint(bout, "\treal\t@mp+%ld,%g # %.8lux%.8lux\n", offset, n->rval, dv[0], dv[1]); break; case Tadt: case Tadtpick: case Ttuple: id = n->ty->ids; for(n = n->left; n != nil; n = n->right){ asminitializer(offset + id->offset, n->left); id = id->next; } break; case Tcase: c = n->ty->cse; Bprint(bout, "\tword\t@mp+%ld,%d", offset, c->nlab); for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; Bprint(bout, ",%ld,%ld,%ld", (long)lab->start->val, (long)lab->stop->val+1, lab->inst->pc); } Bprint(bout, ",%ld\n", c->iwild ? c->iwild->pc : -1); break; case Tcasel: c = n->ty->cse; Bprint(bout, "\tword\t@mp+%ld,%d", offset, c->nlab); for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; Bprint(bout, ",%lld,%lld,%ld", lab->start->val, lab->stop->val+1, lab->inst->pc); } Bprint(bout, ",%ld\n", c->iwild ? c->iwild->pc : -1); break; case Tcasec: c = n->ty->cse; Bprint(bout, "\tword\t@mp+%ld,%d\n", offset, c->nlab); offset += IBY2WD; for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; asmstring(offset, lab->start->decl->sym); offset += IBY2WD; if(lab->stop != lab->start) asmstring(offset, lab->stop->decl->sym); offset += IBY2WD; Bprint(bout, "\tword\t@mp+%ld,%ld\n", offset, lab->inst->pc); offset += IBY2WD; } Bprint(bout, "\tword\t@mp+%ld,%d\n", offset, c->iwild ? c->iwild->pc : -1); break; case Tgoto: c = n->ty->cse; Bprint(bout, "\tword\t@mp+%ld", offset); Bprint(bout, ",%ld", n->ty->size/IBY2WD-1); for(i = 0; i < c->nlab; i++) Bprint(bout, ",%ld", c->labs[i].inst->pc); if(c->iwild != nil) Bprint(bout, ",%ld", c->iwild->pc); Bprint(bout, "\n"); break; case Tany: break; case Tarray: Bprint(bout, "\tarray\t@mp+%ld,$%d,%ld\n", offset, n->ty->tof->decl->desc->id, (long)n->left->val); if(n->right == nil) break; Bprint(bout, "\tindir\t@mp+%ld,0\n", offset); c = n->right->ty->cse; wild = nil; if(c->wild != nil) wild = c->wild->right; last = 0; esz = n->ty->tof->size; for(i = 0; i < c->nlab; i++){ e = c->labs[i].start->val; if(wild != nil){ for(; last < e; last++) asminitializer(esz * last, wild); } last = e; e = c->labs[i].stop->val; elem = c->labs[i].node->right; for(; last <= e; last++) asminitializer(esz * last, elem); } if(wild != nil) for(e = n->left->val; last < e; last++) asminitializer(esz * last, wild); Bprint(bout, "\tapop\n"); break; case Tiface: if(LDT) Bprint(bout, "\tword\t@ldt+%d,%d\n", offset, (long)n->val); else Bprint(bout, "\tword\t@mp+%d,%d\n", offset, (long)n->val); offset += IBY2WD; for(id = n->decl->ty->ids; id != nil; id = id->next){ offset = align(offset, IBY2WD); if(LDT) Bprint(bout, "\text\t@ldt+%d,0x%lux,\"", offset, sign(id)); else Bprint(bout, "\text\t@mp+%d,0x%lux,\"", offset, sign(id)); dotlen = 0; idlen = id->sym->len + 1; if(id->dot->ty->kind == Tadt){ dotlen = id->dot->sym->len + 1; Bprint(bout, "%s.", id->dot->sym->name); } Bprint(bout, "%s\"\n", id->sym->name); offset += idlen + dotlen + IBY2WD; } break; default: nerror(n, "can't asm global %n", n); break; } } void asmexc(Except *es) { int i, o, n, id; Decl *d; Except *e; Case *c; Label *lab; n = 0; for(e = es; e != nil; e = e->next) n++; Bprint(bout, "\texceptions\t%d\n", n); for(e = es; e != nil; e = e->next){ if(!e->p1->reach && !e->p2->reach) continue; c = e->c; o = e->d->offset; if(e->desc != nil) id = e->desc->id; else id = -1; Bprint(bout, "\texception\t%d, %d, %d, %d, %d, %d\n", getpc(e->p1), getpc(e->p2), o, id, c->nlab, e->ne); for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; d = lab->start->decl; if(lab->start->ty->kind == Texception) d = d->init->decl; Bprint(bout, "\texctab\t\"%s\", %d\n", d->sym->name, lab->inst->pc); } if(c->iwild == nil) Bprint(bout, "\texctab\t*, %d\n", -1); else Bprint(bout, "\texctab\t*, %d\n", c->iwild->pc); } } void asmstring(long offset, Sym *sym) { char *s, *se; int c; Bprint(bout, "\tstring\t@mp+%ld,\"", offset); s = sym->name; se = s + sym->len; for(; s < se; s++){ c = *s; if(c == '\n') Bwrite(bout, "\\n", 2); else if(c == '\0') Bwrite(bout, "\\z", 2); else if(c == '"') Bwrite(bout, "\\\"", 2); else if(c == '\\') Bwrite(bout, "\\\\", 2); else Bputc(bout, c); } Bprint(bout, "\"\n"); } void asminst(Inst *in) { for(; in != nil; in = in->next){ if(in->op == INOOP) continue; if(in->pc % 10 == 0) Bprint(bout, "#%d\n", in->pc); Bprint(bout, "%I\n", in); } } 104711, 104717, 104723, 104729, }; // return 1 if p is divisable by sp, 0 otherwise static int divides(mpintold_contrib//root/sys/src/cmd/limbo/limbo/com.c����������������������������������������������������� 664 � 0 � 0 � 67524 10413230151 20576�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" static Inst **breaks; static Inst **conts; static Decl **labels; static Node **bcscps; static int labdep; static Inst nocont; static int scp; static Node *scps[MaxScope]; static int trcom(Node*, Node*, int); static void pushscp(Node *n) { if (scp >= MaxScope) fatal("scope too deep"); scps[scp++] = n; } static void popscp(void) { scp--; } static Node * curscp(void) { if (scp == 0) return nil; return scps[scp-1]; } static void zeroscopes(Node *stop) { int i; Node *cs; for (i = scp-1; i >= 0; i--) { cs = scps[i]; if (cs == stop) break; zcom(cs->left, nil); } } static void zeroallscopes(Node *n, Node **nn) { if(n == nil) return; for(; n != nil; n = n->right){ switch(n->op){ case Oscope: zeroallscopes(n->right, nn); zcom(n->left, nn); return; case Olabel: case Odo: zeroallscopes(n->right, nn); return; case Oif: case Ofor: zeroallscopes(n->right->left, nn); zeroallscopes(n->right->right, nn); return; case Oalt: case Ocase: case Opick: case Oexcept: for(n = n->right; n != nil; n = n->right) zeroallscopes(n->left->right, nn); return; case Oseq: zeroallscopes(n->left, nn); break; case Oexstmt: zeroallscopes(n->left, nn); zeroallscopes(n->right, nn); return; default: return; } } } static Except *excs; static void installexc(Node *en, Inst *p1, Inst *p2, Node *zn) { int i, ne; Except *e; Case *c; Label *lab; e = allocmem(sizeof(Except)); e->p1 = p1; e->p2 = p2; e->c = en->ty->cse; e->d = en->left->decl; e->zn = zn; e->desc = nil; e->next = excs; excs = e; ne = 0; c = e->c; for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; if(lab->start->ty->kind == Texception) ne++; } e->ne = ne; } static int inlist(Decl *d, Decl *dd) { for( ; dd != nil; dd = dd->next) if(d == dd) return 1; return 0; } static void excdesc(void) { ulong o, maxo; Except *e; Node *n; Decl *d, *dd, *nd; for(e = excs; e != nil; e = e->next){ if(e->zn != nil){ /* set up a decl list for gendesc */ dd = nil; maxo = 0; for(n = e->zn ; n != nil; n = n->right){ d = n->decl; d->locals = d->next; if(!inlist(d, dd)){ d->next = dd; dd = d; o = d->offset+d->ty->size; if(o > maxo) maxo = o; } } e->desc = gendesc(e->d, align(maxo, MaxAlign), dd); for(d = dd; d != nil; d = nd){ nd = d->next; d->next = d->locals; d->locals = nil; } e->zn = nil; } } } static Except* reve(Except *e) { Except *l, *n; l = nil; for( ; e != nil; e = n){ n = e->next; e->next = l; l = e; } return l; } static int ckinline0(Node *n, Decl *d) { Decl *dd; if(n == nil) return 1; if(n->op == Oname){ dd = n->decl; if(d == dd) return 0; if(dd->caninline == 1) return ckinline0(dd->init->right, d); return 1; } return ckinline0(n->left, d) && ckinline0(n->right, d); } static void ckinline(Decl *d) { d->caninline = ckinline0(d->init->right, d); } void modcom(Decl *entry) { Decl *globals, *m, *nils, *d, *ldts; long ninst, ndata, ndesc, nlink, offset, ldtoff; int ok, i, hints; Dlist *dl; if(errors) return; if(emitcode || emitstub || emittab != nil){ emit(curscope()); popscope(); return; } /* * scom introduces global variables for case statements * and unaddressable constants, so it must be done before * popping the global scope */ nlabel = 0; maxstack = MaxTemp; genstart(); for(i = 0; i < nfns; i++) if(fns[i]->caninline == 1) ckinline(fns[i]); ok = 0; for(i = 0; i < nfns; i++){ d = fns[i]; if(debug['v']) print("fncom: %s %d %p\n", d->sym->name, d->refs, d); if(d->refs > 1 && !(d->caninline == 1 && local(d) && d->iface == nil)){ fns[ok++] = d; fncom(d); } } nfns = ok; if(blocks != -1) fatal("blocks not nested correctly"); firstinst = firstinst->next; if(errors) return; globals = popscope(); checkrefs(globals); if(errors) return; globals = vars(globals); moddataref(); nils = popscope(); m = nil; for(d = nils; d != nil; d = d->next){ if(debug['n']) print("nil '%s' ref %d\n", d->sym->name, d->refs); if(d->refs && m == nil) m = dupdecl(d); d->offset = 0; } globals = appdecls(m, globals); globals = namesort(globals); globals = modglobals(impdecls->d, globals); vcom(globals); narrowmods(); ldts = nil; if(LDT) globals = resolveldts(globals, &ldts); offset = idoffsets(globals, 0, IBY2WD); if(LDT) ldtoff = idindices(ldts); /* ldtoff = idoffsets(ldts, 0, IBY2WD); */ for(d = nils; d != nil; d = d->next){ if(debug['n']) print("nil '%s' ref %d\n", d->sym->name, d->refs); if(d->refs) d->offset = m->offset; } if(debug['g']){ print("globals:\n"); printdecls(globals); } ndata = 0; for(d = globals; d != nil; d = d->next) ndata++; ndesc = resolvedesc(impdecls->d, offset, globals); ninst = resolvepcs(firstinst); modresolve(); if(impdecls->next != nil) for(dl = impdecls; dl != nil; dl = dl->next) resolvemod(dl->d); nlink = resolvemod(impdecl); maxstack *= 10; if(fixss != 0) maxstack = fixss; if(debug['s']) print("%ld instructions\n%ld data elements\n%ld type descriptors\n%ld functions exported\n%ld stack size\n", ninst, ndata, ndesc, nlink, maxstack); excs = reve(excs); if(gendis){ discon(XMAGIC); hints = 0; if(mustcompile) hints |= MUSTCOMPILE; if(dontcompile) hints |= DONTCOMPILE; if(LDT) hints |= HASLDT; if(excs != nil) hints |= HASEXCEPT; discon(hints); /* runtime hints */ discon(maxstack); /* minimum stack extent size */ discon(ninst); discon(offset); discon(ndesc); discon(nlink); disentry(entry); disinst(firstinst); disdesc(descriptors); disvar(offset, globals); dismod(impdecl); if(LDT) disldt(ldtoff, ldts); if(excs != nil) disexc(excs); dispath(); }else{ asminst(firstinst); asmentry(entry); asmdesc(descriptors); asmvar(offset, globals); asmmod(impdecl); if(LDT) asmldt(ldtoff, ldts); if(excs != nil) asmexc(excs); asmpath(); } if(bsym != nil){ sblmod(impdecl); sblfiles(); sblinst(firstinst, ninst); sblty(adts, nadts); sblfn(fns, nfns); sblvar(globals); } firstinst = nil; lastinst = nil; excs = nil; } void fncom(Decl *decl) { Src src; Node *n; Decl *loc, *last; Inst *in; curfn = decl; if(ispoly(decl)) addfnptrs(decl, 1); /* * pick up the function body and compile it * this code tries to clean up the parse nodes as fast as possible * function is Ofunc(name, body) */ decl->pc = nextinst(); tinit(); labdep = 0; scp = 0; breaks = allocmem(maxlabdep * sizeof breaks[0]); conts = allocmem(maxlabdep * sizeof conts[0]); labels = allocmem(maxlabdep * sizeof labels[0]); bcscps = allocmem(maxlabdep * sizeof bcscps[0]); n = decl->init; if(decl->caninline == 1) decl->init = dupn(0, nil, n); else decl->init = n->left; src = n->right->src; src.start.line = src.stop.line; src.start.pos = src.stop.pos - 1; for(n = n->right; n != nil; n = n->right){ if(n->op != Oseq){ if(n->op == Ocall && trcom(n, nil, 1)) break; scom(n); break; } if(n->left->op == Ocall && trcom(n->left, n->right, 1)){ n = n->right; if(n == nil || n->op != Oseq) break; } else scom(n->left); } pushblock(); in = genrawop(&src, IRET, nil, nil, nil); popblock(); reach(decl->pc); if(in->reach && decl->ty->tof != tnone) error(src.start, "no return at end of function %D", decl); /* decl->endpc = lastinst; */ if(labdep != 0) fatal("unbalanced label stack"); free(breaks); free(conts); free(labels); free(bcscps); loc = declsort(appdecls(vars(decl->locals), tdecls())); decl->offset = idoffsets(loc, decl->offset, MaxAlign); for(last = decl->ty->ids; last != nil && last->next != nil; last = last->next) ; if(last != nil) last->next = loc; else decl->ty->ids = loc; if(debug['f']){ print("fn: %s\n", decl->sym->name); printdecls(decl->ty->ids); } decl->desc = gendesc(decl, decl->offset, decl->ty->ids); decl->locals = loc; excdesc(); if(decl->offset > maxstack) maxstack = decl->offset; if(optims) optim(decl->pc, decl); if(last != nil) last->next = nil; else decl->ty->ids = nil; } /* * statement compiler */ void scom(Node *n) { Inst *p, *pp, *p1, *p2, *p3; Node tret, *left, *zn; for(; n != nil; n = n->right){ switch(n->op){ case Ocondecl: case Otypedecl: case Ovardecl: case Oimport: case Oexdecl: return; case Ovardecli: break; case Oscope: pushscp(n); scom(n->right); popscp(); zcom(n->left, nil); return; case Olabel: scom(n->right); return; case Oif: pushblock(); left = simplify(n->left); if(left->op == Oconst && left->ty == tint){ if(left->val != 0) scom(n->right->left); else scom(n->right->right); popblock(); return; } sumark(left); pushblock(); p = bcom(left, 1, nil); tfreenow(); popblock(); scom(n->right->left); if(n->right->right != nil){ pp = p; p = genrawop(&lastinst->src, IJMP, nil, nil, nil); patch(pp, nextinst()); scom(n->right->right); } patch(p, nextinst()); popblock(); return; case Ofor: n->left = left = simplify(n->left); if(left->op == Oconst && left->ty == tint){ if(left->val == 0) return; left->op = Onothing; left->ty = tnone; left->decl = nil; } pp = nextinst(); pushblock(); /* b = pushblock(); */ sumark(left); p = bcom(left, 1, nil); tfreenow(); popblock(); if(labdep >= maxlabdep) fatal("label stack overflow"); breaks[labdep] = nil; conts[labdep] = nil; labels[labdep] = n->decl; bcscps[labdep] = curscp(); labdep++; scom(n->right->left); labdep--; patch(conts[labdep], nextinst()); if(n->right->right != nil){ pushblock(); scom(n->right->right); popblock(); } repushblock(lastinst->block); /* was b */ patch(genrawop(&lastinst->src, IJMP, nil, nil, nil), pp); /* for cprof: was &left->src */ popblock(); patch(p, nextinst()); patch(breaks[labdep], nextinst()); return; case Odo: pp = nextinst(); if(labdep >= maxlabdep) fatal("label stack overflow"); breaks[labdep] = nil; conts[labdep] = nil; labels[labdep] = n->decl; bcscps[labdep] = curscp(); labdep++; scom(n->right); labdep--; patch(conts[labdep], nextinst()); left = simplify(n->left); if(left->op == Onothing || left->op == Oconst && left->ty == tint){ if(left->op == Onothing || left->val != 0){ pushblock(); p = genrawop(&left->src, IJMP, nil, nil, nil); popblock(); }else p = nil; }else{ pushblock(); p = bcom(sumark(left), 0, nil); tfreenow(); popblock(); } patch(p, pp); patch(breaks[labdep], nextinst()); return; case Oalt: case Ocase: case Opick: case Oexcept: /* need push/pop blocks for alt guards */ pushblock(); if(labdep >= maxlabdep) fatal("label stack overflow"); breaks[labdep] = nil; conts[labdep] = &nocont; labels[labdep] = n->decl; bcscps[labdep] = curscp(); labdep++; switch(n->op){ case Oalt: altcom(n); break; case Ocase: case Opick: casecom(n); break; case Oexcept: excom(n); break; } labdep--; patch(breaks[labdep], nextinst()); popblock(); return; case Obreak: pushblock(); bccom(n, breaks); popblock(); break; case Ocont: pushblock(); bccom(n, conts); popblock(); break; case Oseq: if(n->left->op == Ocall && trcom(n->left, n->right, 0)){ n = n->right; if(n == nil || n->op != Oseq) return; } else scom(n->left); break; case Oret: if(n->left != nil && n->left->op == Ocall && trcom(n->left, nil, 1)) return; pushblock(); if(n->left != nil){ n->left = simplify(n->left); sumark(n->left); ecom(&n->left->src, retalloc(&tret, n->left), n->left); tfreenow(); } genrawop(&n->src, IRET, nil, nil, nil); popblock(); return; case Oexit: pushblock(); genrawop(&n->src, IEXIT, nil, nil, nil); popblock(); return; case Onothing: return; case Ofunc: fatal("Ofunc"); return; case Oexstmt: pushblock(); pp = genrawop(&n->right->src, IEXC0, nil, nil, nil); /* marker */ p1 = nextinst(); scom(n->left); p2 = nextinst(); p3 = genrawop(&n->right->src, IJMP, nil, nil, nil); p = genrawop(&n->right->src, IEXC, nil, nil, nil); /* marker */ p->d.decl = mkdecl(&n->src, 0, n->right->ty); zn = nil; zeroallscopes(n->left, &zn); scom(n->right); patch(p3, nextinst()); installexc(n->right, p1, p2, zn); patch(pp, p); popblock(); return; default: pushblock(); n = simplify(n); sumark(n); ecom(&n->src, nil, n); tfreenow(); popblock(); return; } } } /* * compile a break, continue */ void bccom(Node *n, Inst **bs) { Sym *s; Inst *p; int i, ok; s = nil; if(n->decl != nil) s = n->decl->sym; ok = -1; for(i = 0; i < labdep; i++){ if(bs[i] == &nocont) continue; if(s == nil || labels[i] != nil && labels[i]->sym == s) ok = i; } if(ok < 0){ nerror(n, "no appropriate target for %V", n); return; } zeroscopes(bcscps[ok]); p = genrawop(&n->src, IJMP, nil, nil, nil); p->branch = bs[ok]; bs[ok] = p; } static int dogoto(Case *c) { int i, j, k, n, r, q, v; Label *l, *nl; Src *src; l = c->labs; n = c->nlab; if(n == 0) return 0; r = l[n-1].stop->val - l[0].start->val+1; if(r >= 3 && r <= 3*n){ if(r != n){ /* remove ranges, fill in gaps */ c->nlab = r; nl = c->labs = allocmem(r*sizeof(*nl)); k = 0; v = l[0].start->val-1; for(i = 0; i < n; i++){ /* p = l[i].start->val; */ q = l[i].stop->val; src = &l[i].start->src; for(j = v+1; j <= q; j++){ nl[k] = l[i]; nl[k].start = nl[k].stop = mkconst(src, j); k++; } v = q; } if(k != r) fatal("bad case expansion"); } l = c->labs; for(i = 0; i < r; i++) l[i].inst = nil; return 1; } return 0; } static void fillrange(Case *c, Node *nn, Inst *in) { int i, j, n, p, q; Label *l; l = c->labs; n = c->nlab; p = nn->left->val; q = nn->right->val; for(i = 0; i < n; i++) if(l[i].start->val == p) break; if(i == n) fatal("fillrange fails"); for(j = p; j <= q; j++) l[i++].inst = in; } void casecom(Node *cn) { Src *src; Case *c; Decl *d; Type *ctype; Inst *j, *jmps, *wild, *k, *j1, *j2; Node *n, *p, *left, tmp, nto, tmpc; Label *labs; char buf[32]; int i, nlab, op, needwild, igoto; c = cn->ty->cse; needwild = cn->op != Opick || c->nlab != cn->left->right->ty->tof->decl->tag; igoto = cn->left->ty == tint && dogoto(c); j1 = j2 = nil; /* * generate global which has case labels */ if(igoto){ seprint(buf, buf+sizeof(buf), ".g%d", nlabel++); cn->ty->kind = Tgoto; } else seprint(buf, buf+sizeof(buf), ".c%d", nlabel++); d = mkids(&cn->src, enter(buf, 0), cn->ty, nil); d->init = mkdeclname(&cn->src, d); nto.addable = Rmreg; nto.left = nil; nto.right = nil; nto.op = Oname; nto.ty = d->ty; nto.decl = d; tmp.decl = tmpc.decl = nil; left = cn->left; left = simplify(left); cn->left = left; sumark(left); if(debug['c']) print("case %n\n", left); ctype = cn->left->ty; if(left->addable >= Rcant){ if(cn->op == Opick){ ecom(&left->src, nil, left); tfreenow(); left = mkunary(Oind, dupn(1, &left->src, left->left)); left->ty = tint; sumark(left); ctype = tint; }else{ left = eacom(left, &tmp, nil); tfreenow(); } } labs = c->labs; nlab = c->nlab; if(igoto){ if(labs[0].start->val != 0){ talloc(&tmpc, left->ty, nil); if(left->addable == Radr || left->addable == Rmadr){ genrawop(&left->src, IMOVW, left, nil, &tmpc); left = &tmpc; } genrawop(&left->src, ISUBW, sumark(labs[0].start), left, &tmpc); left = &tmpc; } if(needwild){ j1 = genrawop(&left->src, IBLTW, left, sumark(mkconst(&left->src, 0)), nil); j2 = genrawop(&left->src, IBGTW, left, sumark(mkconst(&left->src, labs[nlab-1].start->val-labs[0].start->val)), nil); } j = nextinst(); genrawop(&left->src, IGOTO, left, nil, &nto); j->d.reg = IBY2WD; } else{ op = ICASE; if(ctype == tbig) op = ICASEL; else if(ctype == tstring) op = ICASEC; genrawop(&left->src, op, left, nil, &nto); } tfree(&tmp); tfree(&tmpc); jmps = nil; wild = nil; for(n = cn->right; n != nil; n = n->right){ j = nextinst(); for(p = n->left->left; p != nil; p = p->right){ if(debug['c']) print("case qualifier %n\n", p->left); switch(p->left->op){ case Oconst: labs[findlab(ctype, p->left, labs, nlab)].inst = j; break; case Orange: labs[findlab(ctype, p->left->left, labs, nlab)].inst = j; if(igoto) fillrange(c, p->left, j); break; case Owild: if(needwild) wild = j; /* else nwarn(p->left, "default case redundant"); */ break; } } if(debug['c']) print("case body for %V: %n\n", n->left->left, n->left->right); k = nextinst(); scom(n->left->right); src = &lastinst->src; // if(n->left->right == nil || n->left->right->op == Onothing) if(k == nextinst()) src = &n->left->left->src; j = genrawop(src, IJMP, nil, nil, nil); j->branch = jmps; jmps = j; } patch(jmps, nextinst()); if(wild == nil && needwild) wild = nextinst(); if(igoto){ if(needwild){ patch(j1, wild); patch(j2, wild); } for(i = 0; i < nlab; i++) if(labs[i].inst == nil) labs[i].inst = wild; } c->iwild = wild; d->ty->cse = c; usetype(d->ty); installids(Dglobal, d); } void altcom(Node *nalt) { Src altsrc; Case *c; Decl *d; Type *talt; Node *n, *p, *left, tab, slot, off, add, which, nto, adr; Node **comm, *op, *tmps; Inst *j, *tj, *jmps, *me, *wild; Label *labs; char buf[32]; int i, is, ir, nlab, nsnd, altop, isptr; Inst *pp; talt = nalt->ty; c = talt->cse; nlab = c->nlab; nsnd = c->nsnd; comm = allocmem(nlab * sizeof *comm); labs = allocmem(nlab * sizeof *labs); tmps = allocmem(nlab * sizeof *tmps); c->labs = labs; /* * built the type of the alt channel table * note that we lie to the garbage collector * if we know that another reference exists for the channel */ is = 0; ir = nsnd; i = 0; for(n = nalt->left; n != nil; n = n->right){ for(p = n->left->right->left; p != nil; p = p->right){ left = simplify(p->left); p->left = left; if(left->op == Owild) continue; comm[i] = hascomm(left); left = comm[i]->left; sumark(left); isptr = left->addable >= Rcant; if(comm[i]->op == Osnd) labs[is++].isptr = isptr; else labs[ir++].isptr = isptr; i++; } } talloc(&which, tint, nil); talloc(&tab, talt, nil); /* * build the node for the address of each channel, * the values to send, and the storage fro values received */ off = znode; off.op = Oconst; off.ty = tint; off.addable = Rconst; adr = znode; adr.op = Oadr; adr.left = &tab; adr.ty = tint; add = znode; add.op = Oadd; add.left = &adr; add.right = &off; add.ty = tint; slot = znode; slot.op = Oind; slot.left = &add; sumark(&slot); /* * compile the sending and receiving channels and values */ is = 2*IBY2WD; ir = is + nsnd*2*IBY2WD; i = 0; for(n = nalt->left; n != nil; n = n->right){ for(p = n->left->right->left; p != nil; p = p->right){ if(p->left->op == Owild) continue; /* * gen channel */ op = comm[i]; if(op->op == Osnd){ off.val = is; is += 2*IBY2WD; }else{ off.val = ir; ir += 2*IBY2WD; } left = op->left; /* * this sleaze is lying to the garbage collector */ if(left->addable < Rcant) genmove(&left->src, Mas, tint, left, &slot); else{ slot.ty = left->ty; ecom(&left->src, &slot, left); tfreenow(); slot.ty = nil; } /* * gen value */ off.val += IBY2WD; tmps[i].decl = nil; p->left = rewritecomm(p->left, comm[i], &tmps[i], &slot); i++; } } /* * stuff the number of send & receive channels into the table */ altsrc = nalt->src; altsrc.stop.pos += 3; off.val = 0; genmove(&altsrc, Mas, tint, sumark(mkconst(&altsrc, nsnd)), &slot); off.val += IBY2WD; genmove(&altsrc, Mas, tint, sumark(mkconst(&altsrc, nlab-nsnd)), &slot); off.val += IBY2WD; altop = IALT; if(c->wild != nil) altop = INBALT; pp = genrawop(&altsrc, altop, &tab, nil, &which); pp->m.offset = talt->size; /* for optimizer */ seprint(buf, buf+sizeof(buf), ".g%d", nlabel++); d = mkids(&nalt->src, enter(buf, 0), mktype(&nalt->src.start, &nalt->src.stop, Tgoto, nil, nil), nil); d->ty->cse = c; d->init = mkdeclname(&nalt->src, d); nto.addable = Rmreg; nto.left = nil; nto.right = nil; nto.op = Oname; nto.decl = d; nto.ty = d->ty; me = nextinst(); genrawop(&altsrc, IGOTO, &which, nil, &nto); me->d.reg = IBY2WD; /* skip the number of cases field */ tfree(&tab); tfree(&which); /* * compile the guard expressions and bodies */ i = 0; is = 0; ir = nsnd; jmps = nil; wild = nil; for(n = nalt->left; n != nil; n = n->right){ j = nil; for(p = n->left->right->left; p != nil; p = p->right){ tj = nextinst(); if(p->left->op == Owild){ wild = nextinst(); }else{ if(comm[i]->op == Osnd) labs[is++].inst = tj; else{ labs[ir++].inst = tj; tacquire(&tmps[i]); } sumark(p->left); if(debug['a']) print("alt guard %n\n", p->left); ecom(&p->left->src, nil, p->left); tfree(&tmps[i]); tfreenow(); i++; } if(p->right != nil){ tj = genrawop(&lastinst->src, IJMP, nil, nil, nil); tj->branch = j; j = tj; } } patch(j, nextinst()); if(debug['a']) print("alt body %n\n", n->left->right); scom(n->left); j = genrawop(&lastinst->src, IJMP, nil, nil, nil); j->branch = jmps; jmps = j; } patch(jmps, nextinst()); free(comm); c->iwild = wild; usetype(d->ty); installids(Dglobal, d); } void excom(Node *en) { Src *src; Decl *ed; Type *qt; Case *c; Inst *j, *jmps, *wild, *k; Node *n, *p; Label *labs; int nlab; ed = en->left->decl; ed->ty = rtexception; c = en->ty->cse; labs = c->labs; nlab = c->nlab; jmps = nil; wild = nil; for(n = en->right; n != nil; n = n->right){ qt = nil; j = nextinst(); for(p = n->left->left; p != nil; p = p->right){ switch(p->left->op){ case Oconst: labs[findlab(texception, p->left, labs, nlab)].inst = j; break; case Owild: wild = j; break; } if(qt == nil) qt = p->left->ty; else if(!tequal(qt, p->left->ty)) qt = texception; } if(qt != nil) ed->ty = qt; k = nextinst(); scom(n->left->right); src = &lastinst->src; if(k == nextinst()) src = &n->left->left->src; j = genrawop(src, IJMP, nil, nil, nil); j->branch = jmps; jmps = j; } ed->ty = rtexception; patch(jmps, nextinst()); c->iwild = wild; } /* * rewrite the communication operand * allocate any temps needed for holding value to send or receive */ Node* rewritecomm(Node *n, Node *comm, Node *tmp, Node *slot) { Node *adr; Inst *p; if(n == nil) return nil; adr = nil; if(n == comm){ if(comm->op == Osnd && sumark(n->right)->addable < Rcant) adr = n->right; else{ adr = talloc(tmp, n->ty, nil); tmp->src = n->src; if(comm->op == Osnd){ ecom(&n->right->src, tmp, n->right); tfreenow(); } else trelease(tmp); } } if(n->right == comm && n->op == Oas && comm->op == Orcv && sumark(n->left)->addable < Rcant && (n->left->op != Oname || n->left->decl != nildecl)) adr = n->left; if(adr != nil){ p = genrawop(&comm->left->src, ILEA, adr, nil, slot); p->m.offset = adr->ty->size; /* for optimizer */ if(comm->op == Osnd) p->m.reg = 1; /* for optimizer */ return adr; } n->left = rewritecomm(n->left, comm, tmp, slot); n->right = rewritecomm(n->right, comm, tmp, slot); return n; } /* * merge together two sorted lists, yielding a sorted list */ static Decl* declmerge(Decl *e, Decl *f) { Decl rock, *d; int es, fs, v; d = &rock; while(e != nil && f != nil){ fs = f->ty->size; es = e->ty->size; /* v = 0; */ v = (e->link == nil) - (f->link == nil); if(v == 0 && (es <= IBY2WD || fs <= IBY2WD)) v = fs - es; if(v == 0) v = e->refs - f->refs; if(v == 0) v = fs - es; if(v == 0) v = -strcmp(e->sym->name, f->sym->name); if(v >= 0){ d->next = e; d = e; e = e->next; while(e != nil && e->nid == 0){ d = e; e = e->next; } }else{ d->next = f; d = f; f = f->next; while(f != nil && f->nid == 0){ d = f; f = f->next; } } /* d = d->next; */ } if(e != nil) d->next = e; else d->next = f; return rock.next; } /* * recursively split lists and remerge them after they are sorted */ static Decl* recdeclsort(Decl *d, int n) { Decl *r, *dd; int i, m; if(n <= 1) return d; m = n / 2 - 1; dd = d; for(i = 0; i < m; i++){ dd = dd->next; while(dd->nid == 0) dd = dd->next; } r = dd->next; while(r->nid == 0){ dd = r; r = r->next; } dd->next = nil; return declmerge(recdeclsort(d, n / 2), recdeclsort(r, (n + 1) / 2)); } /* * sort the ids by size and number of references */ Decl* declsort(Decl *d) { Decl *dd; int n; n = 0; for(dd = d; dd != nil; dd = dd->next) if(dd->nid > 0) n++; return recdeclsort(d, n); } Src nilsrc; /* Do we finally * (a) pick off pointers as in the code below * (b) generate a block move from zeroed memory as in tfree() in gen.b in limbo version * (c) add a new block zero instruction to dis * (d) reorganize the locals/temps in a frame */ void zcom1(Node *n, Node **nn) { Type *ty; Decl *d; Node *e, *dn; Src src; ty = n->ty; if (!tmustzero(ty)) return; if (n->op == Oname && n->decl->refs == 0) return; if (nn) { if(n->op != Oname) nerror(n, "fatal: bad op in zcom1 map"); n->right = *nn; *nn = n; return; } if (debug['Z']) print("zcom1 : %n\n", n); if (ty->kind == Tadtpick) ty = ty->tof; if (ty->kind == Ttuple || ty->kind == Tadt) { for (d = ty->ids; d != nil; d = d->next) { if (tmustzero(d->ty)) { if (d->next != nil) dn = dupn(0, nil, n); else dn = n; e = mkbin(Odot, dn, mkname(&nilsrc, d->sym)); e->right->decl = d; e->ty = e->right->ty = d->ty; zcom1(e, nn); } } } else { src = n->src; n->src = nilsrc; e = mkbin(Oas, n, mknil(&nilsrc)); e->ty = e->right->ty = ty; /* if (debug['Z']) print("ecom %n\n", e); */ pushblock(); e = simplify(e); sumark(e); ecom(&e->src, nil, e); popblock(); n->src = src; } } void zcom0(Decl *id, Node **nn) { Node *e; e = mkname(&nilsrc, id->sym); e->decl = id; e->ty = id->ty; zcom1(e, nn); } /* end of scope */ void zcom(Node *n, Node **nn) { Decl *ids, *last; Node *r, *nt; for ( ; n != nil; n = r) { r = n->right; n->right = nil; switch (n->op) { case Ovardecl : last = n->left->decl; for (ids = n->decl; ids != last->next; ids = ids->next) zcom0(ids, nn); break; case Oname : if (n->decl != nildecl) zcom1(dupn(0, nil, n), nn); break; case Otuple : for (nt = n->left; nt != nil; nt = nt->right) zcom(nt->left, nn); break; default : fatal("bad node in zcom()"); break; } n->right = r; } } static int ret(Node *n, int nilret) { if(n == nil) return nilret; if(n->op == Oseq) n = n->left; return n->op == Oret && n->left == nil; } static int trcom(Node *e, Node *ne, int nilret) { Decl *d, *id; Node *as, *a, *f, *n; Inst *p; return 0; // TBS if(e->op != Ocall || e->left->op != Oname) return 0; d = e->left->decl; if(d != curfn || d->handler || ispoly(d)) return 0; if(!ret(ne, nilret)) return 0; pushblock(); id = d->ty->ids; /* evaluate args in same order as normal calls */ for(as = e->right; as != nil; as = as->right){ a = as->left; if(!(a->op == Oname && id == a->decl)){ if(occurs(id, as->right)){ f = talloc(mkn(0, nil, nil), id->ty, nil); f->flags |= TEMP; } else f = mkdeclname(&as->src, id); n = mkbin(Oas, f, a); n->ty = id->ty; scom(n); if(f->flags&TEMP) as->left = f; } id = id->next; } id = d->ty->ids; for(as = e->right; as != nil; as = as->right){ a = as->left; if(a->flags&TEMP){ f = mkdeclname(&as->src, id); n = mkbin(Oas, f, a); n->ty = id->ty; scom(n); tfree(a); } id = id->next; } p = genrawop(&e->src, IJMP, nil, nil, nil); patch(p, d->pc); popblock(); return 1; } is = 0; ir = nsnd; i = 0; for(n = nalt->left; n != nil; n = n->right){ for(p = n->left->right->left; p != nil; p = p->right){ left = simplify(p->left); p->leftold_contrib//root/sys/src/cmd/limbo/limbo/decls.c��������������������������������������������������� 664 � 0 � 0 � 60342 10540574325 21120�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" char *storename[Dend]= { /* Dtype */ "type", /* Dfn */ "function", /* Dglobal */ "global", /* Darg */ "argument", /* Dlocal */ "local", /* Dconst */ "con", /* Dfield */ "field", /* Dtag */ "pick tag", /* Dimport */ "import", /* Dunbound */ "unbound", /* Dundef */ "undefined", /* Dwundef */ "undefined", }; char *storeart[Dend] = { /* Dtype */ "a ", /* Dfn */ "a ", /* Dglobal */ "a ", /* Darg */ "an ", /* Dlocal */ "a ", /* Dconst */ "a ", /* Dfield */ "a ", /* Dtag */ "a", /* Dimport */ "an ", /* Dunbound */ "", /* Dundef */ "", /* Dwundef */ "", }; int storespace[Dend] = { /* Dtype */ 0, /* Dfn */ 0, /* Dglobal */ 1, /* Darg */ 1, /* Dlocal */ 1, /* Dconst */ 0, /* Dfield */ 1, /* Dtag */ 0, /* Dimport */ 0, /* Dunbound */ 0, /* Dundef */ 0, /* Dwundef */ 0, }; static Decl *scopes[MaxScope]; static Decl *tails[MaxScope]; static Node *scopenode[MaxScope]; static uchar scopekind[MaxScope]; static Decl zdecl; static void freeloc(Decl*); void popscopes(void) { Decl *d; Dlist *id; /* * clear out any decls left in syms */ while(scope >= ScopeBuiltin){ for(d = scopes[scope--]; d != nil; d = d->next){ if(d->sym != nil){ d->sym->decl = d->old; d->old = nil; } } } for(id = impdecls; id != nil; id = id->next){ for(d = id->d->ty->ids; d != nil; d = d->next){ d->sym->decl = nil; d->old = nil; } } impdecls = nil; scope = ScopeBuiltin; scopes[ScopeBuiltin] = nil; tails[ScopeBuiltin] = nil; } void declstart(void) { Decl *d; iota = mkids(&nosrc, enter("iota", 0), tint, nil); iota->init = mkconst(&nosrc, 0); scope = ScopeNils; scopes[ScopeNils] = nil; tails[ScopeNils] = nil; nildecl = mkdecl(&nosrc, Dglobal, tany); nildecl->sym = enter("nil", 0); installids(Dglobal, nildecl); d = mkdecl(&nosrc, Dglobal, tstring); d->sym = enter("", 0); installids(Dglobal, d); scope = ScopeGlobal; scopes[ScopeGlobal] = nil; tails[ScopeGlobal] = nil; } void redecl(Decl *d) { Decl *old; old = d->sym->decl; if(old->store == Dwundef) return; error(d->src.start, "redeclaration of %K, previously declared as %k on line %L", d, old, old->src.start); } void checkrefs(Decl *d) { Decl *id, *m; long refs; for(; d != nil; d = d->next){ if(d->das) d->refs--; switch(d->store){ case Dtype: refs = d->refs; if(d->ty->kind == Tadt){ for(id = d->ty->ids; id != nil; id = id->next){ d->refs += id->refs; if(id->store != Dfn) continue; if(id->init == nil && id->link == nil && d->importid == nil) error(d->src.start, "function %s.%s not defined", d->sym->name, id->sym->name); if(superwarn && !id->refs && d->importid == nil) warn(d->src.start, "function %s.%s not referenced", d->sym->name, id->sym->name); } } if(d->ty->kind == Tmodule){ for(id = d->ty->ids; id != nil; id = id->next){ refs += id->refs; if(id->iface != nil) id->iface->refs += id->refs; if(id->store == Dtype){ for(m = id->ty->ids; m != nil; m = m->next){ refs += m->refs; if(m->iface != nil) m->iface->refs += m->refs; } } } d->refs = refs; } if(superwarn && !refs && d->importid == nil) warn(d->src.start, "%K not referenced", d); break; case Dglobal: if(!superwarn) break; case Dlocal: case Darg: if(!d->refs && d->sym != nil && d->sym->name != nil && d->sym->name[0] != '.') warn(d->src.start, "%K not referenced", d); break; case Dconst: if(superwarn && !d->refs && d->sym != nil) warn(d->src.start, "%K not referenced", d); if(d->ty == tstring && d->init != nil) d->init->decl->refs += d->refs; break; case Dfn: if(d->init == nil && d->importid == nil) error(d->src.start, "%K not defined", d); if(superwarn && !d->refs) warn(d->src.start, "%K not referenced", d); break; case Dimport: if(superwarn && !d->refs) warn(d->src.start, "%K not referenced", d); break; } if(d->das) d->refs++; } } Node* vardecl(Decl *ids, Type *t) { Node *n; n = mkn(Ovardecl, mkn(Oseq, nil, nil), nil); n->decl = ids; n->ty = t; return n; } void vardecled(Node *n) { Decl *ids, *last; Type *t; int store; store = Dlocal; if(scope == ScopeGlobal) store = Dglobal; if(n->ty->kind == Texception && n->ty->cons){ store = Dconst; fatal("Texception in vardecled"); } ids = n->decl; installids(store, ids); t = n->ty; for(last = ids; ids != nil; ids = ids->next){ ids->ty = t; last = ids; } n->left->decl = last; } Node* condecl(Decl *ids, Node *init) { Node *n; n = mkn(Ocondecl, mkn(Oseq, nil, nil), init); n->decl = ids; return n; } void condecled(Node *n) { Decl *ids, *last; ids = n->decl; installids(Dconst, ids); for(last = ids; ids != nil; ids = ids->next){ ids->ty = tunknown; last = ids; } n->left->decl = last; } Node* exdecl(Decl *ids, Decl *tids) { Node *n; Type *t; t = mktype(&ids->src.start, &ids->src.stop, Texception, nil, tids); t->cons = 1; n = mkn(Oexdecl, mkn(Oseq, nil, nil), nil); n->decl = ids; n->ty = t; return n; } void exdecled(Node *n) { Decl *ids, *last; Type *t; ids = n->decl; installids(Dconst, ids); t = n->ty; for(last = ids; ids != nil; ids = ids->next){ ids->ty = t; last = ids; } n->left->decl = last; } Node* importdecl(Node *m, Decl *ids) { Node *n; n = mkn(Oimport, mkn(Oseq, nil, nil), m); n->decl = ids; return n; } void importdecled(Node *n) { Decl *ids, *last; ids = n->decl; installids(Dimport, ids); for(last = ids; ids != nil; ids = ids->next){ ids->ty = tunknown; last = ids; } n->left->decl = last; } Node* mkscope(Node *body) { Node *n; n = mkn(Oscope, nil, body); if(body != nil) n->src = body->src; return n; } Node* fndecl(Node *n, Type *t, Node *body) { n = mkbin(Ofunc, n, body); n->ty = t; return n; } void fndecled(Node *n) { Decl *d; Node *left; left = n->left; if(left->op == Oname){ d = left->decl->sym->decl; if(d == nil || d->store == Dimport){ d = mkids(&left->src, left->decl->sym, n->ty, nil); installids(Dfn, d); } left->decl = d; d->refs++; } if(left->op == Odot) pushscope(nil, Sother); if(n->ty->polys != nil){ pushscope(nil, Sother); installids(Dtype, n->ty->polys); } pushscope(nil, Sother); installids(Darg, n->ty->ids); n->ty->ids = popscope(); if(n->ty->val != nil) mergepolydecs(n->ty); if(n->ty->polys != nil) n->ty->polys = popscope(); if(left->op == Odot) popscope(); } /* * check the function declaration only * the body will be type checked later by fncheck */ Decl * fnchk(Node *n) { int bad; Decl *d, *inadt, *adtp; Type *t; bad = 0; d = n->left->decl; if(n->left->op == Odot) d = n->left->right->decl; if(d == nil) fatal("decl() fnchk nil"); n->left->decl = d; if(d->store == Dglobal || d->store == Dfield) d->store = Dfn; if(d->store != Dfn || d->init != nil){ nerror(n, "redeclaration of function %D, previously declared as %k on line %L", d, d, d->src.start); if(d->store == Dfn && d->init != nil) bad = 1; } d->init = n; t = n->ty; inadt = d->dot; if(inadt != nil && (inadt->store != Dtype || inadt->ty->kind != Tadt)) inadt = nil; if(n->left->op == Odot){ pushscope(nil, Sother); adtp = outerpolys(n->left); if(adtp != nil) installids(Dtype, adtp); if(!polyequal(adtp, n->decl)) nerror(n, "adt polymorphic type mismatch"); n->decl = nil; } t = validtype(t, inadt); if(n->left->op == Odot) popscope(); if(debug['d']) print("declare function %D ty %T newty %T\n", d, d->ty, t); t = usetype(t); if(!polyequal(d->ty->polys, t->polys)) nerror(n, "function polymorphic type mismatch"); if(!tcompat(d->ty, t, 0)) nerror(n, "type mismatch: %D defined as %T declared as %T on line %L", d, t, d->ty, d->src.start); else if(!raisescompat(d->ty->u.eraises, t->u.eraises)) nerror(n, "raises mismatch: %D", d); if(t->varargs != 0) nerror(n, "cannot define functions with a '*' argument, such as %D", d); t->u.eraises = d->ty->u.eraises; d->ty = t; d->offset = idoffsets(t->ids, MaxTemp, IBY2WD); d->src = n->src; d->locals = nil; n->ty = t; return bad ? nil: d; } Node* globalas(Node *dst, Node *v, int valok) { Node *tv; if(v == nil) return nil; if(v->op == Oas || v->op == Odas){ v = globalas(v->left, v->right, valok); if(v == nil) return nil; }else if(valok && !initable(dst, v, 0)) return nil; switch(dst->op){ case Oname: if(dst->decl->init != nil) nerror(dst, "duplicate assignment to %V, previously assigned on line %L", dst, dst->decl->init->src.start); if(valok) dst->decl->init = v; return v; case Otuple: if(valok && v->op != Otuple) fatal("can't deal with %n in tuple case of globalas", v); tv = v->left; for(dst = dst->left; dst != nil; dst = dst->right){ globalas(dst->left, tv->left, valok); if(valok) tv = tv->right; } return v; } fatal("can't deal with %n in globalas", dst); return nil; } int needsstore(Decl *d) { if(!d->refs) return 0; if(d->importid != nil) return 0; if(storespace[d->store]) return 1; return 0; } /* * return the list of all referenced storage variables */ Decl* vars(Decl *d) { Decl *v, *n; while(d != nil && !needsstore(d)) d = d->next; for(v = d; v != nil; v = v->next){ while(v->next != nil){ n = v->next; if(needsstore(n)) break; v->next = n->next; } } return d; } /* * declare variables from the left side of a := statement */ static int recdasdecl(Node *n, int store, int *nid) { Decl *d, *old; int ok; switch(n->op){ case Otuple: ok = 1; for(n = n->left; n != nil; n = n->right) ok &= recdasdecl(n->left, store, nid); return ok; case Oname: if(n->decl == nildecl){ *nid = -1; return 1; } d = mkids(&n->src, n->decl->sym, nil, nil); installids(store, d); old = d->old; if(old != nil && old->store != Dfn && old->store != Dwundef && old->store != Dundef) warn(d->src.start, "redeclaration of %K, previously declared as %k on line %L", d, old, old->src.start); n->decl = d; d->refs++; d->das = 1; if(*nid >= 0) (*nid)++; return 1; } return 0; } static int recmark(Node *n, int nid) { switch(n->op){ case Otuple: for(n = n->left; n != nil; n = n->right) nid = recmark(n->left, nid); break; case Oname: n->decl->nid = nid; nid = 0; break; } return nid; } int dasdecl(Node *n) { int store, ok, nid; nid = 0; if(scope == ScopeGlobal) store = Dglobal; else store = Dlocal; ok = recdasdecl(n, store, &nid); if(!ok) nerror(n, "illegal declaration expression %V", n); if(ok && store == Dlocal && nid > 1) recmark(n, nid); return ok; } /* * declare global variables in nested := expressions */ void gdasdecl(Node *n) { if(n == nil) return; if(n->op == Odas){ gdasdecl(n->right); dasdecl(n->left); }else{ gdasdecl(n->left); gdasdecl(n->right); } } Decl* undefed(Src *src, Sym *s) { Decl *d; d = mkids(src, s, tnone, nil); error(src->start, "%s is not declared", s->name); installids(Dwundef, d); return d; } /* int inloop() { int i; for (i = scope; i > 0; i--) if (scopekind[i] == Sloop) return 1; return 0; } */ int nested() { int i; for (i = scope; i > 0; i--) if (scopekind[i] == Sscope || scopekind[i] == Sloop) return 1; return 0; } void decltozero(Node *n) { Node *scp; if ((scp = scopenode[scope]) != nil) { /* can happen if we do * x[i] := ...... * which is an error */ if (n->right != nil && errors == 0) fatal("Ovardecl/Oname/Otuple has right field\n"); n->right = scp->left; scp->left = n; } } void pushscope(Node *scp, int kind) { if(scope >= MaxScope) fatal("scope too deep"); scope++; scopes[scope] = nil; tails[scope] = nil; scopenode[scope] = scp; scopekind[scope] = kind; } Decl* curscope(void) { return scopes[scope]; } /* * revert to old declarations for each symbol in the currect scope. * remove the effects of any imported adt types * whenever the adt is imported from a module, * we record in the type's decl the module to use * when calling members. the process is reversed here. */ Decl* popscope(void) { Decl *id; Type *t; if (debug['X']) print("popscope\n"); for(id = scopes[scope]; id != nil; id = id->next){ if(id->sym != nil){ if (debug['X']) print("%s : %s %d\n", id->sym->name, kindname[id->ty->kind], id->init != nil ? id->init->op : 0); id->sym->decl = id->old; id->old = nil; } if(id->importid != nil) id->importid->refs += id->refs; t = id->ty; if(id->store == Dtype && t->decl != nil && t->decl->timport == id) t->decl->timport = id->timport; if(id->store == Dlocal) freeloc(id); } return scopes[scope--]; } /* * make a new scope, * preinstalled with some previously installed identifiers * don't add the identifiers to the scope chain, * so they remain separate from any newly installed ids * * these routines assume no ids are imports */ void repushids(Decl *ids) { Sym *s; if(scope >= MaxScope) fatal("scope too deep"); scope++; scopes[scope] = nil; tails[scope] = nil; scopenode[scope] = nil; scopekind[scope] = Sother; for(; ids != nil; ids = ids->next){ if(ids->scope != scope && (ids->dot == nil || !isimpmod(ids->dot->sym) || ids->scope != ScopeGlobal || scope != ScopeGlobal + 1)) fatal("repushids scope mismatch"); s = ids->sym; if(s != nil && ids->store != Dtag){ if(s->decl != nil && s->decl->scope >= scope) ids->old = s->decl->old; else ids->old = s->decl; s->decl = ids; } } } /* * pop a scope which was started with repushids * return any newly installed ids */ Decl* popids(Decl *ids) { for(; ids != nil; ids = ids->next){ if(ids->sym != nil && ids->store != Dtag){ ids->sym->decl = ids->old; ids->old = nil; } } return popscope(); } void installids(int store, Decl *ids) { Decl *d, *last; Sym *s; last = nil; for(d = ids; d != nil; d = d->next){ d->scope = scope; if(d->store == Dundef) d->store = store; s = d->sym; if(s != nil){ if(s->decl != nil && s->decl->scope >= scope){ redecl(d); d->old = s->decl->old; }else d->old = s->decl; s->decl = d; } last = d; } if(ids != nil){ d = tails[scope]; if(d == nil) scopes[scope] = ids; else d->next = ids; tails[scope] = last; } } Decl* lookup(Sym *sym) { int s; Decl *d; for(s = scope; s >= ScopeBuiltin; s--){ for(d = scopes[s]; d != nil; d = d->next){ if(d->sym == sym) return d; } } return nil; } Decl* mkids(Src *src, Sym *s, Type *t, Decl *next) { Decl *d; d = mkdecl(src, Dundef, t); d->next = next; d->sym = s; return d; } Decl* mkdecl(Src *src, int store, Type *t) { Decl *d; static Decl z; d = allocmem(sizeof *d); *d = z; d->src = *src; d->store = store; d->ty = t; d->nid = 1; return d; } Decl* dupdecl(Decl *old) { Decl *d; d = allocmem(sizeof *d); *d = *old; d->next = nil; return d; } Decl* dupdecls(Decl *old) { Decl *d, *nd, *first, *last; first = last = nil; for(d = old; d != nil; d = d->next){ nd = dupdecl(d); if(first == nil) first = nd; else last->next = nd; last = nd; } return first; } Decl* appdecls(Decl *d, Decl *dd) { Decl *t; if(d == nil) return dd; for(t = d; t->next != nil; t = t->next) ; t->next = dd; return d; } Decl* revids(Decl *id) { Decl *d, *next; d = nil; for(; id != nil; id = next){ next = id->next; id->next = d; d = id; } return d; } long idoffsets(Decl *id, long offset, int al) { int a, algn; Decl *d; algn = 1; for(; id != nil; id = id->next){ if(storespace[id->store]){ usedty(id->ty); if(id->store == Dlocal && id->link != nil){ /* id->nid always 1 */ id->offset = id->link->offset; continue; } a = id->ty->align; if(id->nid > 1){ for(d = id->next; d != nil && d->nid == 0; d = d->next) if(d->ty->align > a) a = d->ty->align; algn = a; } offset = align(offset, a); id->offset = offset; offset += id->ty->size; if(id->nid == 0 && (id->next == nil || id->next->nid != 0)) offset = align(offset, algn); } } return align(offset, al); } long idindices(Decl *id) { int i; i = 0; for(; id != nil; id = id->next){ if(storespace[id->store]){ usedty(id->ty); id->offset = i++; } } return i; } int declconv(Fmt *f) { Decl *d; char buf[4096], *s; d = va_arg(f->args, Decl*); if(d->sym == nil) s = "<nil>"; else s = d->sym->name; seprint(buf, buf+sizeof(buf), "%s %s", storename[d->store], s); return fmtstrcpy(f, buf); } int storeconv(Fmt *f) { Decl *d; char buf[4096]; d = va_arg(f->args, Decl*); seprint(buf, buf+sizeof(buf), "%s%s", storeart[d->store], storename[d->store]); return fmtstrcpy(f, buf); } int dotconv(Fmt *f) { Decl *d; char buf[4096], *p, *s; d = va_arg(f->args, Decl*); buf[0] = 0; p = buf; if(d->dot != nil && !isimpmod(d->dot->sym)){ s = "."; if(d->dot->ty != nil && d->dot->ty->kind == Tmodule) s = "->"; p = seprint(buf, buf+sizeof(buf), "%D%s", d->dot, s); } seprint(p, buf+sizeof(buf), "%s", d->sym->name); return fmtstrcpy(f, buf); } /* * merge together two sorted lists, yielding a sorted list */ static Decl* namemerge(Decl *e, Decl *f) { Decl rock, *d; d = &rock; while(e != nil && f != nil){ if(strcmp(e->sym->name, f->sym->name) <= 0){ d->next = e; e = e->next; }else{ d->next = f; f = f->next; } d = d->next; } if(e != nil) d->next = e; else d->next = f; return rock.next; } /* * recursively split lists and remerge them after they are sorted */ static Decl* recnamesort(Decl *d, int n) { Decl *r, *dd; int i, m; if(n <= 1) return d; m = n / 2 - 1; dd = d; for(i = 0; i < m; i++) dd = dd->next; r = dd->next; dd->next = nil; return namemerge(recnamesort(d, n / 2), recnamesort(r, (n + 1) / 2)); } /* * sort the ids by name */ Decl* namesort(Decl *d) { Decl *dd; int n; n = 0; for(dd = d; dd != nil; dd = dd->next) n++; return recnamesort(d, n); } void printdecls(Decl *d) { for(; d != nil; d = d->next) print("%ld: %K %T ref %d\n", d->offset, d, d->ty, d->refs); } void mergepolydecs(Type *t) { Node *n, *nn; Decl *id, *ids, *ids1; for(n = t->val; n != nil; n = n->right){ nn = n->left; for(ids = nn->decl; ids != nil; ids = ids->next){ id = ids->sym->decl; if(id == nil){ undefed(&ids->src, ids->sym); break; } if(id->store != Dtype){ error(ids->src.start, "%K is not a type", id); break; } if(id->ty->kind != Tpoly){ error(ids->src.start, "%K is not a polymorphic type", id); break; } if(id->ty->ids != nil) error(ids->src.start, "%K redefined", id); pushscope(nil, Sother); fielddecled(nn->left); id->ty->ids = popscope(); for(ids1 = id->ty->ids; ids1 != nil; ids1 = ids1->next){ ids1->dot = id; bindtypes(ids1->ty); if(ids1->ty->kind != Tfn){ error(ids1->src.start, "only function types expected"); id->ty->ids = nil; } } } } t->val = nil; } static void adjfnptrs(Decl *d, Decl *polys1, Decl *polys2) { int n; Decl *id, *idt, *idf, *arg; if(debug['U']) print("adjnptrs %s\n", d->sym->name); n = 0; for(id = d->ty->ids; id != nil; id = id->next) n++; for(idt = polys1; idt != nil; idt = idt->next) for(idf = idt->ty->ids; idf != nil; idf = idf->next) n -= 2; for(idt = polys2; idt != nil; idt = idt->next) for(idf = idt->ty->ids; idf != nil; idf = idf->next) n -= 2; for(arg = d->ty->ids; --n >= 0; arg = arg->next) ; for(idt = polys1; idt != nil; idt = idt->next){ for(idf = idt->ty->ids; idf != nil; idf = idf->next){ idf->link = arg; arg = arg->next->next; } } for(idt = polys2; idt != nil; idt = idt->next){ for(idf = idt->ty->ids; idf != nil; idf = idf->next){ idf->link = arg; arg = arg->next->next; } } } static void addptrs(Decl *polys, Decl** fps, Decl **last, int link, Src *src) { Decl *idt, *idf, *fp; if(debug['U']) print("addptrs\n"); for(idt = polys; idt != nil; idt = idt->next){ for(idf = idt->ty->ids; idf != nil; idf = idf->next){ fp = mkdecl(src, Darg, tany); fp->sym = idf->sym; if(link) idf->link = fp; if(*fps == nil) *fps = fp; else (*last)->next = fp; *last = fp; fp = mkdecl(src, Darg, tint); fp->sym = idf->sym; (*last)->next = fp; *last = fp; } } } void addfnptrs(Decl *d, int link) { Decl *fps, *last, *polys; if(debug['U']) print("addfnptrs %s %d\n", d->sym->name, link); polys = encpolys(d); if(d->ty->flags&FULLARGS){ if(link) adjfnptrs(d, d->ty->polys, polys); if(0 && debug['U']){ for(d = d->ty->ids; d != nil; d = d->next) print("%s=%ld(%d) ", d->sym->name, d->offset, tattr[d->ty->kind].isptr); print("\n"); } return; } d->ty->flags |= FULLARGS; fps = last = nil; addptrs(d->ty->polys, &fps, &last, link, &d->src); addptrs(polys, &fps, &last, link, &d->src); for(last = d->ty->ids; last != nil && last->next != nil; last = last->next) ; if(last != nil) last->next = fps; else d->ty->ids = fps; d->offset = idoffsets(d->ty->ids, MaxTemp, IBY2WD); if(0 && debug['U']){ for(d = d->ty->ids; d != nil; d = d->next) print("%s=%ld(%d) ", d->sym->name, d->offset, tattr[d->ty->kind].isptr); print("\n"); } } void rmfnptrs(Decl *d) { int n; Decl *id, *idt, *idf; if(debug['U']) print("rmfnptrs %s\n", d->sym->name); if(!(d->ty->flags&FULLARGS)) return; d->ty->flags &= ~FULLARGS; n = 0; for(id = d->ty->ids; id != nil; id = id->next) n++; for(idt = d->ty->polys; idt != nil; idt = idt->next) for(idf = idt->ty->ids; idf != nil; idf = idf->next) n -= 2; for(idt = encpolys(d); idt != nil; idt = idt->next) for(idf = idt->ty->ids; idf != nil; idf = idf->next) n -= 2; if(n == 0){ d->ty->ids = nil; return; } for(id = d->ty->ids; --n > 0; id = id->next) ; id->next = nil; d->offset = idoffsets(d->ty->ids, MaxTemp, IBY2WD); } int local(Decl *d) { for(d = d->dot; d != nil; d = d->dot) if(d->store == Dtype && d->ty->kind == Tmodule) return 0; return 1; } Decl* module(Decl *d) { for(d = d->dot; d != nil; d = d->dot) if(d->store == Dtype && d->ty->kind == Tmodule) return d; return nil; } Decl* outerpolys(Node *n) { Decl *d; if(n->op == Odot){ d = n->right->decl; if(d == nil) fatal("decl() outeradt nil"); d = d->dot; if(d != nil && d->store == Dtype && d->ty->kind == Tadt) return d->ty->polys; } return nil; } Decl* encpolys(Decl *d) { if((d = d->dot) == nil) return nil; return d->ty->polys; } Decl* fnlookup(Sym *s, Type *t, Node **m) { Decl *id; Node *mod; id = nil; mod = nil; if(t->kind == Tpoly || t->kind == Tmodule) id = namedot(t->ids, s); else if(t->kind == Tref){ t = t->tof; if(t->kind == Tadt){ id = namedot(t->ids, s); if(t->decl != nil && t->decl->timport != nil) mod = t->decl->timport->eimport; } else if(t->kind == Tadtpick){ id = namedot(t->ids, s); if(t->decl != nil && t->decl->timport != nil) mod = t->decl->timport->eimport; t = t->decl->dot->ty; if(id == nil) id = namedot(t->ids, s); if(t->decl != nil && t->decl->timport != nil) mod = t->decl->timport->eimport; } } if(id == nil){ id = lookup(s); if(id != nil) mod = id->eimport; } if(m != nil) *m = mod; return id; } int isimpmod(Sym *s) { Decl *d; for(d = impmods; d != nil; d = d->next) if(d->sym == s) return 1; return 0; } int dequal(Decl *d1, Decl *d2, int full) { return d1->sym == d2->sym && d1->store == d2->store && d1->implicit == d2->implicit && d1->cyc == d2->cyc && (!full || tequal(d1->ty, d2->ty)) && (!full || d1->store == Dfn || sametree(d1->init, d2->init)); } static int tzero(Type *t) { return t->kind == Texception || tmustzero(t); } static int isptr(Type *t) { return t->kind == Texception || tattr[t->kind].isptr; } /* can d share the same stack location as another local ? */ void shareloc(Decl *d) { int z; Type *t, *tt; Decl *dd, *res; if(d->store != Dlocal || d->nid != 1) return; t = d->ty; res = nil; for(dd = fndecls; dd != nil; dd = dd->next){ if(d == dd) fatal("d==dd in shareloc"); if(dd->store != Dlocal || dd->nid != 1 || dd->link != nil || dd->tref != 0) continue; tt = dd->ty; if(t->size != tt->size || t->align != tt->align) continue; z = tzero(t)+tzero(tt); if(z > 0) continue; /* for now */ if(t == tt || tequal(t, tt)) res = dd; else{ if(z == 1) continue; if(z == 0 || isptr(t) || isptr(tt) || mktdesc(t) == mktdesc(tt)) res = dd; } if(res != nil){ /* print("%L %K share %L %K\n", d->src.start, d, res->src.start, res); */ d->link = res; res->tref = 1; return; } } return; } static void freeloc(Decl *d) { if(d->link != nil) d->link->tref = 0; } Sym *s, Type *t, Decl *next) { Decl *d; d = mkdecl(src, Dundef, t); d->next = next; d->sym = s; return d; } Decl* mkdecl(Src *src, int store, Type *t) { Decl *d; static Decl z; d = allocmem(sizeof *d); *d = z; d->src = *src; d->store = store; d->ty = t; d->nid = 1; retold_contrib//root/sys/src/cmd/limbo/limbo/dis.c����������������������������������������������������� 664 � 0 � 0 � 26757 10205415041 20604�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" static void disbig(long, Long); static void disbyte(long, int); static void disbytes(long, void*, int); static void disdatum(long, Node*); static void disflush(int, long, long); static void disint(long, long); static void disreal(long, Real); static void disstring(long, Sym*); static uchar *cache; static int ncached; static int ndatum; static int startoff; static int lastoff; static int lastkind; static int lencache; void discon(long val) { if(val >= -64 && val <= 63) { Bputc(bout, val & ~0x80); return; } if(val >= -8192 && val <= 8191) { Bputc(bout, ((val>>8) & ~0xC0) | 0x80); Bputc(bout, val); return; } if(val < 0 && ((val >> 29) & 0x7) != 7 || val > 0 && (val >> 29) != 0) fatal("overflow in constant 0x%lux\n", val); Bputc(bout, (val>>24) | 0xC0); Bputc(bout, val>>16); Bputc(bout, val>>8); Bputc(bout, val); } void disword(long w) { Bputc(bout, w >> 24); Bputc(bout, w >> 16); Bputc(bout, w >> 8); Bputc(bout, w); } void disdata(int kind, long n) { if(n < DMAX && n != 0) Bputc(bout, DBYTE(kind, n)); else{ Bputc(bout, DBYTE(kind, 0)); discon(n); } } #define NAMELEN 64 void dismod(Decl *m) { char name[8*NAMELEN]; ulong fileoff; fileoff = Boffset(bout); strncpy(name, m->sym->name, NAMELEN); name[NAMELEN-1] = '\0'; Bwrite(bout, name, strlen(name)+1); for(m = m->ty->tof->ids; m != nil; m = m->next){ switch(m->store){ case Dglobal: discon(-1); discon(-1); disword(sign(m)); Bprint(bout, ".mp"); Bputc(bout, '\0'); break; case Dfn: if(debug['v']) print("Dfn: %s %d %p\n", m->sym->name, m->refs, m); discon(m->pc->pc); discon(m->desc->id); disword(sign(m)); if(m->dot->ty->kind == Tadt) Bprint(bout, "%s.", m->dot->sym->name); Bprint(bout, "%s", m->sym->name); Bputc(bout, '\0'); break; default: fatal("unknown kind %K in dismod", m); break; } } if(debug['s']) print("%ld linkage bytes start %ld\n", Boffset(bout) - fileoff, fileoff); } void dispath(void) { char name[8*NAMELEN], *sp; sp = srcpath(name, 8*NAMELEN); Bwrite(bout, sp, strlen(sp)+1); } void disentry(Decl *e) { if(e == nil){ discon(-1); discon(-1); return; } discon(e->pc->pc); discon(e->desc->id); } void disdesc(Desc *d) { ulong fileoff; fileoff = Boffset(bout); for(; d != nil; d = d->next){ discon(d->id); discon(d->size); discon(d->nmap); Bwrite(bout, d->map, d->nmap); } if(debug['s']) print("%ld type descriptor bytes start %ld\n", Boffset(bout) - fileoff, fileoff); } void disvar(long size, Decl *d) { ulong fileoff; fileoff = Boffset(bout); USED(size); lastkind = -1; ncached = 0; ndatum = 0; for(; d != nil; d = d->next) if(d->store == Dglobal && d->init != nil) disdatum(d->offset, d->init); disflush(-1, -1, 0); Bputc(bout, 0); if(debug['s']) print("%ld data bytes start %ld\n", Boffset(bout) - fileoff, fileoff); } void disldt(long size, Decl *ds) { int m; Decl *d, *id; Sym *s; Node *n; if(0){ discon(size); disvar(size, ds); return; } m = 0; for(d = ds; d != nil; d = d->next) if(d->store == Dglobal && d->init != nil) m++; discon(m); for(d = ds; d != nil; d = d->next){ if(d->store == Dglobal && d->init != nil){ n = d->init; if(n->ty->kind != Tiface) nerror(n, "disldt: not Tiface"); discon(n->val); for(id = n->decl->ty->ids; id != nil; id = id->next){ disword(sign(id)); if(id->dot->ty->kind == Tadt){ s = id->dot->sym; Bprint(bout, "%s", s->name); Bputc(bout, '.'); } s = id->sym; Bprint(bout, "%s", s->name); Bputc(bout, 0); } } } discon(0); } static void disdatum(long offset, Node *n) { Node *elem, *wild; Case *c; Label *lab; Decl *id; Sym *s; long e, last, esz; int i; switch(n->ty->kind){ case Tbyte: disbyte(offset, n->val); break; case Tint: case Tfix: disint(offset, n->val); break; case Tbig: disbig(offset, n->val); break; case Tstring: disstring(offset, n->decl->sym); break; case Treal: disreal(offset, n->rval); break; case Tadt: case Tadtpick: case Ttuple: id = n->ty->ids; for(n = n->left; n != nil; n = n->right){ disdatum(offset + id->offset, n->left); id = id->next; } break; case Tany: break; case Tcase: c = n->ty->cse; disint(offset, c->nlab); offset += IBY2WD; for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; disint(offset, lab->start->val); offset += IBY2WD; disint(offset, lab->stop->val+1); offset += IBY2WD; disint(offset, lab->inst->pc); offset += IBY2WD; } disint(offset, c->iwild ? c->iwild->pc : -1); break; case Tcasel: c = n->ty->cse; disint(offset, c->nlab); offset += 2*IBY2WD; for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; disbig(offset, lab->start->val); offset += IBY2LG; disbig(offset, lab->stop->val+1); offset += IBY2LG; disint(offset, lab->inst->pc); offset += 2*IBY2WD; } disint(offset, c->iwild ? c->iwild->pc : -1); break; case Tcasec: c = n->ty->cse; disint(offset, c->nlab); offset += IBY2WD; for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; disstring(offset, lab->start->decl->sym); offset += IBY2WD; if(lab->stop != lab->start) disstring(offset, lab->stop->decl->sym); offset += IBY2WD; disint(offset, lab->inst->pc); offset += IBY2WD; } disint(offset, c->iwild ? c->iwild->pc : -1); break; case Tgoto: c = n->ty->cse; disint(offset, n->ty->size/IBY2WD-1); offset += IBY2WD; for(i = 0; i < c->nlab; i++){ disint(offset, c->labs[i].inst->pc); offset += IBY2WD; } if(c->iwild != nil) disint(offset, c->iwild->pc); break; case Tarray: disflush(-1, -1, 0); disdata(DEFA, 1); /* 1 is ignored */ discon(offset); disword(n->ty->tof->decl->desc->id); disword(n->left->val); if(n->right == nil) break; disdata(DIND, 1); /* 1 is ignored */ discon(offset); disword(0); c = n->right->ty->cse; wild = nil; if(c->wild != nil) wild = c->wild->right; last = 0; esz = n->ty->tof->size; for(i = 0; i < c->nlab; i++){ e = c->labs[i].start->val; if(wild != nil){ for(; last < e; last++) disdatum(esz * last, wild); } last = e; e = c->labs[i].stop->val; elem = c->labs[i].node->right; for(; last <= e; last++) disdatum(esz * last, elem); } if(wild != nil) for(e = n->left->val; last < e; last++) disdatum(esz * last, wild); disflush(-1, -1, 0); disdata(DAPOP, 1); /* 1 is ignored */ discon(0); break; case Tiface: disint(offset, n->val); offset += IBY2WD; for(id = n->decl->ty->ids; id != nil; id = id->next){ offset = align(offset, IBY2WD); disint(offset, sign(id)); offset += IBY2WD; if(id->dot->ty->kind == Tadt){ s = id->dot->sym; disbytes(offset, s->name, s->len); offset += s->len; disbyte(offset, '.'); offset++; } s = id->sym; disbytes(offset, s->name, s->len); offset += s->len; disbyte(offset, 0); offset++; } break; default: nerror(n, "can't dis global %n", n); break; } } void disexc(Except *es) { int i, n; Decl *d; Except *e; Case *c; Label *lab; n = 0; for(e = es; e != nil; e = e->next) if(e->p1->reach || e->p2->reach) n++; discon(n); for(e = es; e != nil; e = e->next){ if(!e->p1->reach && !e->p2->reach) continue; c = e->c; discon(e->d->offset); discon(getpc(e->p1)); discon(getpc(e->p2)); if(e->desc) discon(e->desc->id); else discon(-1); discon(c->nlab|(e->ne<<16)); for(i = 0; i < c->nlab; i++){ lab = &c->labs[i]; d = lab->start->decl; if(lab->start->ty->kind == Texception) d = d->init->decl; Bprint(bout, "%s", d->sym->name); Bputc(bout, '\0'); discon(lab->inst->pc); } if(c->iwild == nil) discon(-1); else discon(c->iwild->pc); } discon(0); } static void disbyte(long off, int v) { disflush(DEFB, off, 1); cache[ncached++] = v; ndatum++; } static void disbytes(long off, void *v, int n) { disflush(DEFB, off, n); memmove(&cache[ncached], v, n); ncached += n; ndatum += n; } static void disint(long off, long v) { disflush(DEFW, off, IBY2WD); cache[ncached++] = v >> 24; cache[ncached++] = v >> 16; cache[ncached++] = v >> 8; cache[ncached++] = v; ndatum++; } static void disbig(long off, Long v) { ulong iv; disflush(DEFL, off, IBY2LG); iv = v >> 32; cache[ncached++] = iv >> 24; cache[ncached++] = iv >> 16; cache[ncached++] = iv >> 8; cache[ncached++] = iv; iv = v; cache[ncached++] = iv >> 24; cache[ncached++] = iv >> 16; cache[ncached++] = iv >> 8; cache[ncached++] = iv; ndatum++; } static void disreal(long off, Real v) { ulong bv[2]; ulong iv; disflush(DEFF, off, IBY2LG); dtocanon(v, bv); iv = bv[0]; cache[ncached++] = iv >> 24; cache[ncached++] = iv >> 16; cache[ncached++] = iv >> 8; cache[ncached++] = iv; iv = bv[1]; cache[ncached++] = iv >> 24; cache[ncached++] = iv >> 16; cache[ncached++] = iv >> 8; cache[ncached++] = iv; ndatum++; } static void disstring(long offset, Sym *sym) { disflush(-1, -1, 0); disdata(DEFS, sym->len); discon(offset); Bwrite(bout, sym->name, sym->len); } static void disflush(int kind, long off, long size) { if(kind != lastkind || off != lastoff){ if(lastkind != -1 && ncached){ disdata(lastkind, ndatum); discon(startoff); Bwrite(bout, cache, ncached); } startoff = off; lastkind = kind; ncached = 0; ndatum = 0; } lastoff = off + size; while(kind >= 0 && ncached + size >= lencache){ lencache = ncached+1024; cache = reallocmem(cache, lencache); } } static int dismode[Aend] = { /* Aimm */ AIMM, /* Amp */ AMP, /* Ampind */ AMP|AIND, /* Afp */ AFP, /* Afpind */ AFP|AIND, /* Apc */ AIMM, /* Adesc */ AIMM, /* Aoff */ AIMM, /* Anoff */ AIMM, /* Aerr */ AXXX, /* Anone */ AXXX, /* Aldt */ AIMM, }; static int disregmode[Aend] = { /* Aimm */ AXIMM, /* Amp */ AXINM, /* Ampind */ AXNON, /* Afp */ AXINF, /* Afpind */ AXNON, /* Apc */ AXIMM, /* Adesc */ AXIMM, /* Aoff */ AXIMM, /* Anoff */ AXIMM, /* Aerr */ AXNON, /* Anone */ AXNON, /* Aldt */ AXIMM, }; enum { MAXCON = 4, MAXADDR = 2*MAXCON, MAXINST = 3*MAXADDR+2, NIBUF = 1024 }; static uchar *ibuf; static int nibuf; void disinst(Inst *in) { ulong fileoff; fileoff = Boffset(bout); ibuf = allocmem(NIBUF); nibuf = 0; for(; in != nil; in = in->next){ if(in->op == INOOP) continue; if(nibuf >= NIBUF-MAXINST){ Bwrite(bout, ibuf, nibuf); nibuf = 0; } ibuf[nibuf++] = in->op; ibuf[nibuf++] = SRC(dismode[in->sm]) | DST(dismode[in->dm]) | disregmode[in->mm]; if(in->mm != Anone) disaddr(in->mm, &in->m); if(in->sm != Anone) disaddr(in->sm, &in->s); if(in->dm != Anone) disaddr(in->dm, &in->d); } if(nibuf > 0) Bwrite(bout, ibuf, nibuf); free(ibuf); ibuf = nil; if(debug['s']) print("%ld instruction bytes start %ld\n", Boffset(bout) - fileoff, fileoff); } void disaddr(int m, Addr *a) { long val; val = 0; switch(m){ case Anone: case Aerr: default: break; case Aimm: case Apc: case Adesc: val = a->offset; break; case Aoff: val = a->decl->iface->offset; break; case Anoff: val = -(a->decl->iface->offset+1); break; case Afp: case Amp: case Aldt: val = a->reg; break; case Afpind: case Ampind: disbcon(a->reg); val = a->offset; break; } disbcon(val); } void disbcon(long val) { if(val >= -64 && val <= 63){ ibuf[nibuf++] = val & ~0x80; return; } if(val >= -8192 && val <= 8191){ ibuf[nibuf++] = val>>8 & ~0xC0 | 0x80; ibuf[nibuf++] = val; return; } if(val < 0 && ((val >> 29) & 7) != 7 || val > 0 && (val >> 29) != 0) fatal("overflow in constant 16r%lux", val); ibuf[nibuf++] = val>>24 | 0xC0; ibuf[nibuf++] = val>>16; ibuf[nibuf++] = val>>8; ibuf[nibuf++] = val; } break; case Dfold_contrib//root/sys/src/cmd/limbo/limbo/dtocanon.c������������������������������������������������ 664 � 0 � 0 � 657 10176463737 21607�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" void dtocanon(double f, ulong v[]) { union { double d; ulong ul[2]; } a; a.d = 1.; if(a.ul[0]){ a.d = f; v[0] = a.ul[0]; v[1] = a.ul[1]; }else{ a.d = f; v[0] = a.ul[1]; v[1] = a.ul[0]; } } double canontod(ulong v[2]) { union { double d; unsigned long ul[2]; } a; a.d = 1.; if(a.ul[0]) { a.ul[0] = v[0]; a.ul[1] = v[1]; } else { a.ul[1] = v[0]; a.ul[0] = v[1]; } return a.d; } ���������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/limbo/ecom.c���������������������������������������������������� 664 � 0 � 0 � 147032 10413230544 20762�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" static Node* putinline(Node*); static void fpcall(Src*, int, Node*, Node*); void optabinit(void) { int i; for(i = 0; setisbyteinst[i] >= 0; i++) isbyteinst[setisbyteinst[i]] = 1; for(i = 0; setisused[i] >= 0; i++) isused[setisused[i]] = 1; for(i = 0; setsideeffect[i] >= 0; i++) sideeffect[setsideeffect[i]] = 1; opind[Tbyte] = 1; opind[Tint] = 2; opind[Tbig] = 3; opind[Treal] = 4; opind[Tstring] = 5; opind[Tfix] = 6; opcommute[Oeq] = Oeq; opcommute[Oneq] = Oneq; opcommute[Olt] = Ogt; opcommute[Ogt] = Olt; opcommute[Ogeq] = Oleq; opcommute[Oleq] = Ogeq; opcommute[Oadd] = Oadd; opcommute[Omul] = Omul; opcommute[Oxor] = Oxor; opcommute[Oor] = Oor; opcommute[Oand] = Oand; oprelinvert[Oeq] = Oneq; oprelinvert[Oneq] = Oeq; oprelinvert[Olt] = Ogeq; oprelinvert[Ogt] = Oleq; oprelinvert[Ogeq] = Olt; oprelinvert[Oleq] = Ogt; isrelop[Oeq] = 1; isrelop[Oneq] = 1; isrelop[Olt] = 1; isrelop[Oleq] = 1; isrelop[Ogt] = 1; isrelop[Ogeq] = 1; isrelop[Oandand] = 1; isrelop[Ooror] = 1; isrelop[Onot] = 1; precasttab[Tstring][Tbyte] = tint; precasttab[Tbyte][Tstring] = tint; precasttab[Treal][Tbyte] = tint; precasttab[Tbyte][Treal] = tint; precasttab[Tbig][Tbyte] = tint; precasttab[Tbyte][Tbig] = tint; precasttab[Tfix][Tbyte] = tint; precasttab[Tbyte][Tfix] = tint; precasttab[Tbig][Tfix] = treal; precasttab[Tfix][Tbig] = treal; precasttab[Tstring][Tfix] = treal; precasttab[Tfix][Tstring] = treal; casttab[Tint][Tint] = IMOVW; casttab[Tbig][Tbig] = IMOVL; casttab[Treal][Treal] = IMOVF; casttab[Tbyte][Tbyte] = IMOVB; casttab[Tstring][Tstring] = IMOVP; casttab[Tfix][Tfix] = ICVTXX; /* never same type */ casttab[Tint][Tbyte] = ICVTWB; casttab[Tint][Treal] = ICVTWF; casttab[Tint][Tstring] = ICVTWC; casttab[Tint][Tfix] = ICVTXX; casttab[Tbyte][Tint] = ICVTBW; casttab[Treal][Tint] = ICVTFW; casttab[Tstring][Tint] = ICVTCW; casttab[Tfix][Tint] = ICVTXX; casttab[Tint][Tbig] = ICVTWL; casttab[Treal][Tbig] = ICVTFL; casttab[Tstring][Tbig] = ICVTCL; casttab[Tbig][Tint] = ICVTLW; casttab[Tbig][Treal] = ICVTLF; casttab[Tbig][Tstring] = ICVTLC; casttab[Treal][Tstring] = ICVTFC; casttab[Tstring][Treal] = ICVTCF; casttab[Treal][Tfix] = ICVTFX; casttab[Tfix][Treal] = ICVTXF; casttab[Tstring][Tarray] = ICVTCA; casttab[Tarray][Tstring] = ICVTAC; /* * placeholders; fixed in precasttab */ casttab[Tbyte][Tstring] = 0xff; casttab[Tstring][Tbyte] = 0xff; casttab[Tbyte][Treal] = 0xff; casttab[Treal][Tbyte] = 0xff; casttab[Tbyte][Tbig] = 0xff; casttab[Tbig][Tbyte] = 0xff; casttab[Tfix][Tbyte] = 0xff; casttab[Tbyte][Tfix] = 0xff; casttab[Tfix][Tbig] = 0xff; casttab[Tbig][Tfix] = 0xff; casttab[Tfix][Tstring] = 0xff; casttab[Tstring][Tfix] = 0xff; } /* * global variable and constant initialization checking */ int vcom(Decl *ids) { Decl *v; int ok; ok = 1; for(v = ids; v != nil; v = v->next) ok &= varcom(v); for(v = ids; v != nil; v = v->next) v->init = simplify(v->init); return ok; } Node* simplify(Node *n) { if(n == nil) return nil; if(debug['F']) print("simplify %n\n", n); n = efold(rewrite(n)); if(debug['F']) print("simplified %n\n", n); return n; } static int isfix(Node *n) { if(n->ty->kind == Tint || n->ty->kind == Tfix){ if(n->op == Ocast) return n->left->ty->kind == Tint || n->left->ty->kind == Tfix; return 1; } return 0; } /* * rewrite an expression to make it easiser to compile, * or give the correct results */ Node* rewrite(Node *n) { Long v; Type *t; Decl *d; Node *nn, *left, *right; if(n == nil) return nil; left = n->left; right = n->right; /* * rewrites */ switch(n->op){ case Oname: d = n->decl; if(d->importid != nil){ left = mkbin(Omdot, dupn(1, &n->src, d->eimport), mkdeclname(&n->src, d->importid)); left->ty = n->ty; return rewrite(left); } if((t = n->ty)->kind == Texception){ if(t->cons) fatal("cons in rewrite Oname"); n = mkbin(Oadd, n, mkconst(&n->src, 2*IBY2WD)); n = mkunary(Oind, n); n->ty = t; n->left->ty = n->left->left->ty = tint; return rewrite(n); } break; case Odas: n->op = Oas; return rewrite(n); case Oneg: n->left = rewrite(left); if(n->ty == treal) break; left = n->left; n->right = left; n->left = mkconst(&n->src, 0); n->left->ty = n->ty; n->op = Osub; break; case Ocomp: v = 0; v = ~v; n->right = mkconst(&n->src, v); n->right->ty = n->ty; n->left = rewrite(left); n->op = Oxor; break; case Oinc: case Odec: case Opreinc: case Opredec: n->left = rewrite(left); switch(n->ty->kind){ case Treal: n->right = mkrconst(&n->src, 1.0); break; case Tint: case Tbig: case Tbyte: case Tfix: n->right = mkconst(&n->src, 1); n->right->ty = n->ty; break; default: fatal("can't rewrite inc/dec %n", n); break; } if(n->op == Opreinc) n->op = Oaddas; else if(n->op == Opredec) n->op = Osubas; break; case Oslice: if(right->left->op == Onothing) right->left = mkconst(&right->left->src, 0); n->left = rewrite(left); n->right = rewrite(right); break; case Oindex: n->op = Oindx; n->left = rewrite(left); n->right = rewrite(right); n = mkunary(Oind, n); n->ty = n->left->ty; n->left->ty = tint; break; case Oload: n->right = mkn(Oname, nil, nil); n->right->src = n->left->src; n->right->decl = n->ty->tof->decl; n->right->ty = n->ty; n->left = rewrite(left); break; case Ocast: if(left->ty->kind == Texception){ n = rewrite(left); break; } n->op = Ocast; t = precasttab[left->ty->kind][n->ty->kind]; if(t != nil){ n->left = mkunary(Ocast, left); n->left->ty = t; return rewrite(n); } n->left = rewrite(left); break; case Oraise: if(left->ty == tstring) {} else if(!left->ty->cons) break; else if(left->op != Ocall || left->left->ty->kind == Tfn){ left = mkunary(Ocall, left); left->ty = left->left->ty; } n->left = rewrite(left); break; case Ocall: t = left->ty; if(t->kind == Tref) t = t->tof; if(t->kind == Tfn){ if(debug['U']) print("call %n\n", left); if(left->ty->kind == Tref){ /* call by function reference */ n->left = mkunary(Oind, left); n->left->ty = t; return rewrite(n); } d = nil; if(left->op == Oname) d = left->decl; else if(left->op == Omdot && left->right->op == Odot) d = left->right->right->decl; else if(left->op == Omdot || left->op == Odot) d = left->right->decl; else if(left->op != Oind) fatal("cannot deal with call %n in rewrite", n); if(ispoly(d)) addfnptrs(d, 0); n->left = rewrite(left); if(right != nil) n->right = rewrite(right); if(d != nil && d->caninline == 1) n = simplify(putinline(n)); break; } switch(n->ty->kind){ case Tref: n = mkunary(Oref, n); n->ty = n->left->ty; n->left->ty = n->left->ty->tof; n->left->left->ty = n->left->ty; return rewrite(n); case Tadt: n->op = Otuple; n->right = nil; if(n->ty->tags != nil){ n->left = nn = mkunary(Oseq, mkconst(&n->src, left->right->decl->tag)); if(right != nil){ nn->right = right; nn->src.stop = right->src.stop; } n->ty = left->right->decl->ty->tof; }else n->left = right; return rewrite(n); case Tadtpick: n->op = Otuple; n->right = nil; n->left = nn = mkunary(Oseq, mkconst(&n->src, left->right->decl->tag)); if(right != nil){ nn->right = right; nn->src.stop = right->src.stop; } n->ty = left->right->decl->ty->tof; return rewrite(n); case Texception: if(!n->ty->cons) return n->left; if(left->op == Omdot){ left->right->ty = left->ty; left = left->right; } n->op = Otuple; n->right = nil; n->left = nn = mkunary(Oseq, left->decl->init); nn->right = mkunary(Oseq, mkconst(&n->src, 0)); nn->right->right = right; n->ty = mkexbasetype(n->ty); n = mkunary(Oref, n); n->ty = internaltype(mktype(&n->src.start, &n->src.stop, Tref, t, nil)); return rewrite(n); default: fatal("can't deal with %n in rewrite/Ocall", n); break; } break; case Omdot: /* * what about side effects from left? */ d = right->decl; switch(d->store){ case Dfn: n->left = rewrite(left); if(right->op == Odot){ n->right = dupn(1, &left->src, right->right); n->right->ty = d->ty; } break; case Dconst: case Dtag: case Dtype: /* handled by fold */ return n; case Dglobal: right->op = Oconst; right->val = d->offset; right->ty = tint; n->left = left = mkunary(Oind, left); left->ty = tint; n->op = Oadd; n = mkunary(Oind, n); n->ty = n->left->ty; n->left->ty = tint; n->left = rewrite(n->left); return n; case Darg: return n; default: fatal("can't deal with %n in rewrite/Omdot", n); break; } break; case Odot: /* * what about side effects from left? */ d = right->decl; switch(d->store){ case Dfn: if(right->left != nil){ n = mkbin(Omdot, dupn(1, &left->src, right->left), right); right->left = nil; n->ty = d->ty; return rewrite(n); } if(left->ty->kind == Tpoly){ n = mkbin(Omdot, mkdeclname(&left->src, d->link), mkdeclname(&left->src, d->link->next)); n->ty = d->ty; return rewrite(n); } n->op = Oname; n->decl = d; n->right = nil; n->left = nil; return n; case Dconst: case Dtag: case Dtype: /* handled by fold */ return n; } if(istuple(left)) return n; /* handled by fold */ right->op = Oconst; right->val = d->offset; right->ty = tint; if(left->ty->kind != Tref){ n->left = mkunary(Oadr, left); n->left->ty = tint; } n->op = Oadd; n = mkunary(Oind, n); n->ty = n->left->ty; n->left->ty = tint; n->left = rewrite(n->left); return n; case Oadr: left = rewrite(left); n->left = left; if(left->op == Oind) return left->left; break; case Otagof: if(n->decl == nil){ n->op = Oind; return rewrite(n); } return n; case Omul: case Odiv: left = n->left = rewrite(left); right = n->right = rewrite(right); if(n->ty->kind == Tfix && isfix(left) && isfix(right)){ if(left->op == Ocast && tequal(left->ty, n->ty)) n->left = left->left; if(right->op == Ocast && tequal(right->ty, n->ty)) n->right = right->left; } break; case Oself: if(newfnptr) return n; if(selfdecl == nil){ d = selfdecl = mkids(&n->src, enter(strdup(".self"), 5), tany, nil); installids(Dglobal, d); d->refs++; } nn = mkn(Oload, nil, nil); nn->src = n->src; nn->left = mksconst(&n->src, enterstring(strdup("$self"), 5)); nn->ty = impdecl->ty; usetype(nn->ty); usetype(nn->ty->tof); nn = rewrite(nn); nn->op = Oself; return nn; case Ofnptr: if(n->flags == 0){ /* module */ if(left == nil) left = mkn(Oself, nil, nil); return rewrite(left); } right->flags = n->flags; n = right; d = n->decl; if(n->flags == FNPTR2){ if(left != nil && left->op != Oname) fatal("not Oname for addiface"); if(left == nil){ addiface(nil, d); if(newfnptr) n->flags |= FNPTRN; } else addiface(left->decl, d); /* is this necessary ? */ n->ty = tint; return n; } if(n->flags == FNPTRA){ n = mkdeclname(&n->src, d->link); n->ty = tany; return n; } if(n->flags == (FNPTRA|FNPTR2)){ n = mkdeclname(&n->src, d->link->next); n->ty = tint; return n; } break; case Ochan: if(left == nil) left = n->left = mkconst(&n->src, 0); n->left = rewrite(left); break; default: n->left = rewrite(left); n->right = rewrite(right); break; } return n; } /* * label a node with sethi-ullman numbers and addressablity * genaddr interprets addable to generate operands, * so a change here mandates a change there. * * addressable: * const Rconst $value may also be Roff or Rdesc or Rnoff * Asmall(local) Rreg value(FP) * Asmall(global) Rmreg value(MP) * ind(Rareg) Rreg value(FP) * ind(Ramreg) Rmreg value(MP) * ind(Rreg) Radr *value(FP) * ind(Rmreg) Rmadr *value(MP) * ind(Raadr) Radr value(value(FP)) * ind(Ramadr) Rmadr value(value(MP)) * * almost addressable: * adr(Rreg) Rareg * adr(Rmreg) Ramreg * add(const, Rareg) Rareg * add(const, Ramreg) Ramreg * add(const, Rreg) Raadr * add(const, Rmreg) Ramadr * add(const, Raadr) Raadr * add(const, Ramadr) Ramadr * adr(Radr) Raadr * adr(Rmadr) Ramadr * * strangely addressable: * fn Rpc * mdot(module,exp) Rmpc */ Node* sumark(Node *n) { Node *left, *right; long v; if(n == nil) return nil; n->temps = 0; n->addable = Rcant; left = n->left; right = n->right; if(left != nil){ sumark(left); n->temps = left->temps; } if(right != nil){ sumark(right); if(right->temps == n->temps) n->temps++; else if(right->temps > n->temps) n->temps = right->temps; } switch(n->op){ case Oadr: switch(left->addable){ case Rreg: n->addable = Rareg; break; case Rmreg: n->addable = Ramreg; break; case Radr: n->addable = Raadr; break; case Rmadr: n->addable = Ramadr; break; } break; case Oind: switch(left->addable){ case Rreg: n->addable = Radr; break; case Rmreg: n->addable = Rmadr; break; case Rareg: n->addable = Rreg; break; case Ramreg: n->addable = Rmreg; break; case Raadr: n->addable = Radr; break; case Ramadr: n->addable = Rmadr; break; } break; case Oname: switch(n->decl->store){ case Darg: case Dlocal: n->addable = Rreg; break; case Dglobal: n->addable = Rmreg; if(LDT && n->decl->ty->kind == Tiface) n->addable = Rldt; break; case Dtype: /* * check for inferface to load */ if(n->decl->ty->kind == Tmodule) n->addable = Rmreg; break; case Dfn: if(n->flags & FNPTR){ if(n->flags == FNPTR2) n->addable = Roff; else if(n->flags == (FNPTR2|FNPTRN)) n->addable = Rnoff; } else n->addable = Rpc; break; default: fatal("cannot deal with %K in Oname in %n", n->decl, n); break; } break; case Omdot: n->addable = Rmpc; break; case Oconst: switch(n->ty->kind){ case Tint: case Tfix: v = n->val; if(v < 0 && ((v >> 29) & 0x7) != 7 || v > 0 && (v >> 29) != 0){ n->decl = globalconst(n); n->addable = Rmreg; }else n->addable = Rconst; break; case Tbig: n->decl = globalBconst(n); n->addable = Rmreg; break; case Tbyte: n->decl = globalbconst(n); n->addable = Rmreg; break; case Treal: n->decl = globalfconst(n); n->addable = Rmreg; break; case Tstring: n->decl = globalsconst(n); n->addable = Rmreg; break; default: fatal("cannot %T const in sumark", n->ty); break; } break; case Oadd: if(right->addable == Rconst){ switch(left->addable){ case Rareg: n->addable = Rareg; break; case Ramreg: n->addable = Ramreg; break; case Rreg: case Raadr: n->addable = Raadr; break; case Rmreg: case Ramadr: n->addable = Ramadr; break; } } break; } if(n->addable < Rcant) n->temps = 0; else if(n->temps == 0) n->temps = 1; return n; } Node* mktn(Type *t) { Node *n; n = mkn(Oname, nil, nil); usedesc(mktdesc(t)); n->ty = t; n->decl = t->decl; if(n->decl == nil) fatal("mktn t %T nil decl", t); n->addable = Rdesc; return n; } /* does a tuple of the form (a, b, ...) form a contiguous block * of memory on the stack when offsets are assigned later * - only when (a, b, ...) := rhs and none of the names nil * can we guarantee this */ static int tupblk0(Node *n, Decl **dd) { Decl *d; int nid; switch(n->op){ case Otuple: for(n = n->left; n != nil; n = n->right) if(!tupblk0(n->left, dd)) return 0; return 1; case Oname: if(n->decl == nildecl) return 0; d = *dd; if(d != nil && d->next != n->decl) return 0; nid = n->decl->nid; if(d == nil && nid == 1) return 0; if(d != nil && nid != 0) return 0; *dd = n->decl; return 1; } return 0; } /* could force locals to be next to each other * - need to shuffle locals list * - later */ static Node* tupblk(Node *n) { Decl *d; if(n->op != Otuple) return nil; d = nil; if(!tupblk0(n, &d)) return nil; while(n->op == Otuple) n = n->left->left; if(n->op != Oname || n->decl->nid == 1) fatal("bad tupblk"); return n; } /* for cprof */ #define esrc(src, osrc, nto) (src != nil && nto != nil ? src : osrc) /* * compile an expression with an implicit assignment * note: you are not allowed to use to->src * * need to think carefully about the types used in moves * it particular, it would be nice to gen movp rather than movc sometimes. */ Node* ecom(Src *src, Node *nto, Node *n) { Node *left, *right, *tn; Node tl, tr, tto, ttn; Type *t, *tt; Inst *p, *pp; int op; if(debug['e']){ print("ecom: %n\n", n); if(nto != nil) print("ecom to: %n\n", nto); } if(n->addable < Rcant){ /* * think carefully about the type used here */ if(nto != nil) genmove(src, Mas, n->ty, n, nto); return nto; } tl.decl = nil; tr.decl = nil; tto.decl = nil; ttn.decl = nil; left = n->left; right = n->right; op = n->op; switch(op){ default: case Oadr: fatal("can't %n in ecom", n); return nto; case Oif: p = bcom(left, 1, nil); ecom(&right->left->src, nto, right->left); if(right->right != nil){ pp = p; p = genrawop(&right->left->src, IJMP, nil, nil, nil); patch(pp, nextinst()); ecom(&right->right->src, nto, right->right); } patch(p, nextinst()); break; case Ocomma: tn = left->left; ecom(&left->src, nil, left); ecom(&right->src, nto, right); tfree(tn); break; case Oname: if(n->addable == Rpc){ if(nto != nil) genmove(src, Mas, n->ty, n, nto); return nto; } fatal("can't %n in ecom", n); break; case Onothing: break; case Oused: if(nto != nil) fatal("superfluous used %n to %n", left, nto); talloc(&tto, left->ty, nil); ecom(&left->src, &tto, left); tfree(&tto); break; case Oas: if(right->ty == tany) right->ty = n->ty; if(left->op == Oname && left->decl->ty == tany){ if(nto == nil) nto = talloc(&tto, right->ty, nil); left = nto; nto = nil; } if(left->op == Oinds){ indsascom(src, nto, n); tfree(&tto); break; } if(left->op == Oslice){ slicelcom(src, nto, n); tfree(&tto); break; } if(left->op == Otuple){ if(!tupsaliased(right, left)){ if((tn = tupblk(left)) != nil){ tn->ty = n->ty; ecom(&n->right->src, tn, right); if(nto != nil) genmove(src, Mas, n->ty, tn, nto); tfree(&tto); break; } if((tn = tupblk(right)) != nil){ tn->ty = n->ty; tuplcom(tn, left); if(nto != nil) genmove(src, Mas, n->ty, tn, nto); tfree(&tto); break; } if(nto == nil && right->op == Otuple && left->ty->kind != Tadtpick){ tuplrcom(right, left); tfree(&tto); break; } } if(right->addable >= Ralways || right->op != Oname || tupaliased(right, left)){ talloc(&tr, n->ty, nil); ecom(&n->right->src, &tr, right); right = &tr; } tuplcom(right, n->left); if(nto != nil) genmove(src, Mas, n->ty, right, nto); tfree(&tr); tfree(&tto); break; } /* * check for left/right aliasing and build right into temporary */ if(right->op == Otuple){ if(!tupsaliased(left, right) && (tn = tupblk(right)) != nil){ tn->ty = n->ty; right = tn; } else if(left->op != Oname || tupaliased(left, right)) right = ecom(&right->src, talloc(&tr, right->ty, nil), right); } /* * think carefully about types here */ if(left->addable >= Rcant) left = eacom(left, &tl, nto); ecom(&n->src, left, right); if(nto != nil) genmove(src, Mas, nto->ty, left, nto); tfree(&tl); tfree(&tr); tfree(&tto); break; case Ochan: if(left && left->addable >= Rcant) left = eacom(left, &tl, nto); genchan(src, left, n->ty->tof, nto); tfree(&tl); break; case Oinds: if(right->addable < Ralways){ if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else if(left->temps <= right->temps){ right = ecom(&right->src, talloc(&tr, right->ty, nil), right); if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else{ left = eacom(left, &tl, nil); right = ecom(&right->src, talloc(&tr, right->ty, nil), right); } genop(&n->src, op, left, right, nto); tfree(&tl); tfree(&tr); break; case Osnd: if(right->addable < Rcant){ if(left->addable >= Rcant) left = eacom(left, &tl, nto); }else if(left->temps < right->temps){ right = eacom(right, &tr, nto); if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else{ left = eacom(left, &tl, nto); right = eacom(right, &tr, nil); } p = genrawop(&n->src, ISEND, right, nil, left); p->m.offset = n->ty->size; /* for optimizer */ if(nto != nil) genmove(src, Mas, right->ty, right, nto); tfree(&tl); tfree(&tr); break; case Orcv: if(nto == nil){ ecom(&n->src, talloc(&tto, n->ty, nil), n); tfree(&tto); return nil; } if(left->addable >= Rcant) left = eacom(left, &tl, nto); if(left->ty->kind == Tchan){ p = genrawop(src, IRECV, left, nil, nto); p->m.offset = n->ty->size; /* for optimizer */ }else{ recvacom(src, nto, n); } tfree(&tl); break; case Ocons: /* * another temp which can go with analysis */ if(left->addable >= Rcant) left = eacom(left, &tl, nil); if(!sameaddr(right, nto)){ ecom(&right->src, talloc(&tto, n->ty, nto), right); genmove(src, Mcons, left->ty, left, &tto); if(!sameaddr(&tto, nto)) genmove(src, Mas, nto->ty, &tto, nto); }else genmove(src, Mcons, left->ty, left, nto); tfree(&tl); tfree(&tto); break; case Ohd: if(left->addable >= Rcant) left = eacom(left, &tl, nto); genmove(src, Mhd, nto->ty, left, nto); tfree(&tl); break; case Otl: if(left->addable >= Rcant) left = eacom(left, &tl, nto); genmove(src, Mtl, left->ty, left, nto); tfree(&tl); break; case Otuple: if((tn = tupblk(n)) != nil){ tn->ty = n->ty; genmove(src, Mas, n->ty, tn, nto); break; } tupcom(nto, n); break; case Oadd: case Osub: case Omul: case Odiv: case Omod: case Oand: case Oor: case Oxor: case Olsh: case Orsh: case Oexp: /* * check for 2 operand forms */ if(sameaddr(nto, left)){ if(right->addable >= Rcant) right = eacom(right, &tr, nto); genop(src, op, right, nil, nto); tfree(&tr); break; } if(opcommute[op] && sameaddr(nto, right) && n->ty != tstring){ if(left->addable >= Rcant) left = eacom(left, &tl, nto); genop(src, opcommute[op], left, nil, nto); tfree(&tl); break; } if(right->addable < left->addable && opcommute[op] && n->ty != tstring){ op = opcommute[op]; left = right; right = n->left; } if(left->addable < Ralways){ if(right->addable >= Rcant) right = eacom(right, &tr, nto); }else if(right->temps <= left->temps){ left = ecom(&left->src, talloc(&tl, left->ty, nto), left); if(right->addable >= Rcant) right = eacom(right, &tr, nil); }else{ right = eacom(right, &tr, nto); left = ecom(&left->src, talloc(&tl, left->ty, nil), left); } /* * check for 2 operand forms */ if(sameaddr(nto, left)) genop(src, op, right, nil, nto); else if(opcommute[op] && sameaddr(nto, right) && n->ty != tstring) genop(src, opcommute[op], left, nil, nto); else genop(src, op, right, left, nto); tfree(&tl); tfree(&tr); break; case Oaddas: case Osubas: case Omulas: case Odivas: case Omodas: case Oexpas: case Oandas: case Ooras: case Oxoras: case Olshas: case Orshas: if(left->op == Oinds){ indsascom(src, nto, n); break; } if(right->addable < Rcant){ if(left->addable >= Rcant) left = eacom(left, &tl, nto); }else if(left->temps < right->temps){ right = eacom(right, &tr, nto); if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else{ left = eacom(left, &tl, nto); right = eacom(right, &tr, nil); } genop(&n->src, op, right, nil, left); if(nto != nil) genmove(src, Mas, left->ty, left, nto); tfree(&tl); tfree(&tr); break; case Olen: if(left->addable >= Rcant) left = eacom(left, &tl, nto); op = -1; t = left->ty; if(t == tstring) op = ILENC; else if(t->kind == Tarray) op = ILENA; else if(t->kind == Tlist) op = ILENL; else fatal("can't len %n", n); genrawop(src, op, left, nil, nto); tfree(&tl); break; case Oneg: if(left->addable >= Rcant) left = eacom(left, &tl, nto); genop(&n->src, op, left, nil, nto); tfree(&tl); break; case Oinc: case Odec: if(left->op == Oinds){ indsascom(src, nto, n); break; } if(left->addable >= Rcant) left = eacom(left, &tl, nil); if(nto != nil) genmove(src, Mas, left->ty, left, nto); if(right->addable >= Rcant) fatal("inc/dec amount not addressable: %n", n); genop(&n->src, op, right, nil, left); tfree(&tl); break; case Ospawn: if(left->left->op == Oind) fpcall(&n->src, op, left, nto); else callcom(&n->src, op, left, nto); break; case Oraise: if(left->addable >= Rcant) left = eacom(left, &tl, nil); genrawop(&n->src, IRAISE, left, nil, nil); tfree(&tl); break; case Ocall: if(left->op == Oind) fpcall(esrc(src, &n->src, nto), op, n, nto); else callcom(esrc(src, &n->src, nto), op, n, nto); break; case Oref: t = left->ty; if(left->op == Oname && left->decl->store == Dfn || left->op == Omdot && left->right->op == Oname && left->right->decl->store == Dfn){ /* create a function reference */ Decl *d; Node *mod, *ind; d = left->decl; if(left->op == Omdot){ d = left->right->decl; mod = left->left; } else if(d->eimport != nil) mod = d->eimport; else{ mod = rewrite(mkn(Oself, nil, nil)); addiface(nil, d); } sumark(mod); talloc(&tto, n->ty, nto); genrawop(src, INEW, mktn(usetype(tfnptr)), nil, &tto); tr.src = *src; tr.op = Oind; tr.left = &tto; tr.right = nil; tr.ty = tany; sumark(&tr); ecom(src, &tr, mod); ind = mkunary(Oind, mkbin(Oadd, dupn(0, src, &tto), mkconst(src, IBY2WD))); ind->ty = ind->left->ty = ind->left->right->ty = tint; tr.op = Oas; tr.left = ind; tr.right = mkdeclname(src, d); tr.ty = tr.right->ty = tint; sumark(&tr); tr.right->addable = mod->op == Oself && newfnptr ? Rnoff : Roff; ecom(src, nil, &tr); if(!sameaddr(&tto, nto)) genmove(src, Mas, n->ty, &tto, nto); tfree(&tto); break; } if(left->op == Oname && left->decl->store == Dtype){ genrawop(src, INEW, mktn(t), nil, nto); break; } if(t->kind == Tadt && t->tags != nil){ pickdupcom(src, nto, left); break; } tt = t; if(left->op == Oconst && left->decl->store == Dtag) t = left->decl->ty->tof; /* * could eliminate temp if to does not occur * in tuple initializer */ talloc(&tto, n->ty, nto); genrawop(src, INEW, mktn(t), nil, &tto); tr.op = Oind; tr.left = &tto; tr.right = nil; tr.ty = tt; sumark(&tr); ecom(src, &tr, left); if(!sameaddr(&tto, nto)) genmove(src, Mas, n->ty, &tto, nto); tfree(&tto); break; case Oload: if(left->addable >= Rcant) left = eacom(left, &tl, nto); talloc(&tr, tint, nil); if(LDT) genrawop(src, ILOAD, left, right, nto); else{ genrawop(src, ILEA, right, nil, &tr); genrawop(src, ILOAD, left, &tr, nto); } tfree(&tl); tfree(&tr); break; case Ocast: if(left->addable >= Rcant) left = eacom(left, &tl, nto); t = left->ty; if(t->kind == Tfix || n->ty->kind == Tfix){ op = casttab[t->kind][n->ty->kind]; if(op == ICVTXX) genfixcastop(src, op, left, nto); else{ tn = sumark(mkrconst(src, scale2(t, n->ty))); genrawop(src, op, left, tn, nto); } } else genrawop(src, casttab[t->kind][n->ty->kind], left, nil, nto); tfree(&tl); break; case Oarray: if(left->addable >= Rcant) left = eacom(left, &tl, nto); genrawop(esrc(src, &left->src, nto), arrayz ? INEWAZ : INEWA, left, mktn(n->ty->tof), nto); if(right != nil) arraycom(nto, right); tfree(&tl); break; case Oslice: tn = right->right; right = right->left; /* * make the left node of the slice directly addressable * therefore, if it's len is taken (via tn), * left's tree won't be rewritten */ if(left->addable >= Rcant) left = eacom(left, &tl, nil); if(tn->op == Onothing){ tn = mkn(Olen, left, nil); tn->src = *src; tn->ty = tint; sumark(tn); } if(tn->addable < Ralways){ if(right->addable >= Rcant) right = eacom(right, &tr, nil); }else if(right->temps <= tn->temps){ tn = ecom(&tn->src, talloc(&ttn, tn->ty, nil), tn); if(right->addable >= Rcant) right = eacom(right, &tr, nil); }else{ right = eacom(right, &tr, nil); tn = ecom(&tn->src, talloc(&ttn, tn->ty, nil), tn); } op = ISLICEA; if(nto->ty == tstring) op = ISLICEC; /* * overwrite the destination last, * since it might be used in computing the slice bounds */ if(!sameaddr(left, nto)) ecom(&left->src, nto, left); genrawop(src, op, right, tn, nto); tfree(&tl); tfree(&tr); tfree(&ttn); break; case Oindx: if(right->addable < Rcant){ if(left->addable >= Rcant) left = eacom(left, &tl, nto); }else if(left->temps < right->temps){ right = eacom(right, &tr, nto); if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else{ left = eacom(left, &tl, nto); right = eacom(right, &tr, nil); } if(nto->addable >= Ralways) nto = ecom(src, talloc(&tto, nto->ty, nil), nto); op = IINDX; switch(left->ty->tof->size){ case IBY2LG: op = IINDL; if(left->ty->tof == treal) op = IINDF; break; case IBY2WD: op = IINDW; break; case 1: op = IINDB; break; } genrawop(src, op, left, nto, right); // array[] of {....} [index] frees array too early (before index value used) // function(...) [index] frees array too early (before index value used) if(tl.decl != nil) tfreelater(&tl); else tfree(&tl); tfree(&tr); tfree(&tto); break; case Oind: n = eacom(n, &tl, nto); genmove(src, Mas, n->ty, n, nto); tfree(&tl); break; case Onot: case Oandand: case Ooror: case Oeq: case Oneq: case Olt: case Oleq: case Ogt: case Ogeq: p = bcom(n, 1, nil); genmove(src, Mas, tint, sumark(mkconst(src, 1)), nto); pp = genrawop(src, IJMP, nil, nil, nil); patch(p, nextinst()); genmove(src, Mas, tint, sumark(mkconst(src, 0)), nto); patch(pp, nextinst()); break; case Oself: if(newfnptr){ if(nto != nil) genrawop(src, ISELF, nil, nil, nto); break; } tn = sumark(mkdeclname(src, selfdecl)); p = genbra(src, Oneq, tn, sumark(mkdeclname(src, nildecl))); n->op = Oload; ecom(src, tn, n); patch(p, nextinst()); genmove(src, Mas, n->ty, tn, nto); break; } return nto; } /* * compile exp n to yield an addressable expression * use reg to build a temporary; if t is a temp, it is usable * if dangle leaves the address dangling, generate into a temporary * this should only happen with arrays * * note that 0adr's are strange as they are only used * for calculating the addresses of fields within adt's. * therefore an Oind is the parent or grandparent of the Oadr, * and we pick off all of the cases where Oadr's argument is not * addressable by looking from the Oind. */ Node* eacom(Node *n, Node *reg, Node *t) { Node *left, *tn; if(n->op == Ocomma){ tn = n->left->left; ecom(&n->left->src, nil, n->left); n = eacom(n->right, reg, t); tfree(tn); return n; } if(debug['e'] || debug['E']) print("eacom: %n\n", n); left = n->left; if(n->op != Oind){ ecom(&n->src, talloc(reg, n->ty, t), n); reg->src = n->src; return reg; } if(left->op == Oadd && left->right->op == Oconst){ if(left->left->op == Oadr){ left->left->left = eacom(left->left->left, reg, t); sumark(n); if(n->addable >= Rcant) fatal("eacom can't make node addressable: %n", n); return n; } talloc(reg, left->left->ty, t); ecom(&left->left->src, reg, left->left); left->left->decl = reg->decl; left->left->addable = Rreg; left->left = reg; left->addable = Raadr; n->addable = Radr; }else if(left->op == Oadr){ talloc(reg, left->left->ty, t); ecom(&left->left->src, reg, left->left); /* * sleaze: treat the temp as the type of the field, not the enclosing structure */ reg->ty = n->ty; reg->src = n->src; return reg; }else{ talloc(reg, left->ty, t); ecom(&left->src, reg, left); n->left = reg; n->addable = Radr; } return n; } /* * compile an assignment to an array slice */ Node* slicelcom(Src *src, Node *nto, Node *n) { Node *left, *right, *v; Node tl, tr, tv, tu; tl.decl = nil; tr.decl = nil; tv.decl = nil; tu.decl = nil; left = n->left->left; right = n->left->right->left; v = n->right; if(right->addable < Ralways){ if(left->addable >= Rcant) left = eacom(left, &tl, nto); }else if(left->temps <= right->temps){ right = ecom(&right->src, talloc(&tr, right->ty, nto), right); if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else{ left = eacom(left, &tl, nil); /* dangle on right and v */ right = ecom(&right->src, talloc(&tr, right->ty, nil), right); } switch(n->op){ case Oas: if(v->addable >= Rcant) v = eacom(v, &tv, nil); break; } genrawop(&n->src, ISLICELA, v, right, left); if(nto != nil) genmove(src, Mas, n->ty, left, nto); tfree(&tl); tfree(&tv); tfree(&tr); tfree(&tu); return nto; } /* * compile an assignment to a string location */ Node* indsascom(Src *src, Node *nto, Node *n) { Node *left, *right, *u, *v; Node tl, tr, tv, tu; tl.decl = nil; tr.decl = nil; tv.decl = nil; tu.decl = nil; left = n->left->left; right = n->left->right; v = n->right; if(right->addable < Ralways){ if(left->addable >= Rcant) left = eacom(left, &tl, nto); }else if(left->temps <= right->temps){ right = ecom(&right->src, talloc(&tr, right->ty, nto), right); if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else{ left = eacom(left, &tl, nil); /* dangle on right and v */ right = ecom(&right->src, talloc(&tr, right->ty, nil), right); } switch(n->op){ case Oas: if(v->addable >= Rcant) v = eacom(v, &tv, nil); break; case Oinc: case Odec: if(v->addable >= Rcant) fatal("inc/dec amount not addable"); u = talloc(&tu, tint, nil); genop(&n->left->src, Oinds, left, right, u); if(nto != nil) genmove(src, Mas, n->ty, u, nto); nto = nil; genop(&n->src, n->op, v, nil, u); v = u; break; case Oaddas: case Osubas: case Omulas: case Odivas: case Omodas: case Oexpas: case Oandas: case Ooras: case Oxoras: case Olshas: case Orshas: if(v->addable >= Rcant) v = eacom(v, &tv, nil); u = talloc(&tu, tint, nil); genop(&n->left->src, Oinds, left, right, u); genop(&n->src, n->op, v, nil, u); v = u; break; } genrawop(&n->src, IINSC, v, right, left); tfree(&tl); tfree(&tv); tfree(&tr); tfree(&tu); if(nto != nil) genmove(src, Mas, n->ty, v, nto); return nto; } void callcom(Src *src, int op, Node *n, Node *ret) { Node frame, tadd, toff, pass, *a, *mod, *ind, *nfn, *args, tmod, tind, *tn; Inst *in,*p; Decl *d, *callee; long off; int iop; args = n->right; nfn = n->left; switch(nfn->op){ case Odot: callee = nfn->right->decl; nfn->addable = Rpc; break; case Omdot: callee = nfn->right->decl; break; case Oname: callee = nfn->decl; break; default: callee = nil; fatal("bad call op in callcom"); } if(nfn->addable != Rpc && nfn->addable != Rmpc) fatal("can't gen call addresses"); if(nfn->ty->tof != tnone && ret == nil){ ecom(src, talloc(&tmod, nfn->ty->tof, nil), n); tfree(&tmod); return; } if(ispoly(callee)) addfnptrs(callee, 0); if(nfn->ty->varargs){ nfn->decl = dupdecl(nfn->right->decl); nfn->decl->desc = gendesc(nfn->right->decl, idoffsets(nfn->ty->ids, MaxTemp, MaxAlign), nfn->ty->ids); } talloc(&frame, tint, nil); mod = nfn->left; ind = nfn->right; tmod.decl = tind.decl = nil; if(nfn->addable == Rmpc){ if(mod->addable >= Rcant) mod = eacom(mod, &tmod, nil); /* dangle always */ if(ind->op != Oname && ind->addable >= Ralways){ talloc(&tind, ind->ty, nil); ecom(&ind->src, &tind, ind); ind = &tind; } else if(ind->decl != nil && ind->decl->store != Darg) ind->addable = Roff; } /* * stop nested uncalled frames * otherwise exception handling very complicated */ for(a = args; a != nil; a = a->right){ if(hascall(a->left)){ tn = mkn(0, nil, nil); talloc(tn, a->left->ty, nil); ecom(&a->left->src, tn, a->left); a->left = tn; tn->flags |= TEMP; } } /* * allocate the frame */ if(nfn->addable == Rmpc && !nfn->ty->varargs){ genrawop(src, IMFRAME, mod, ind, &frame); }else if(nfn->op == Odot){ genrawop(src, IFRAME, nfn->left, nil, &frame); }else{ in = genrawop(src, IFRAME, nil, nil, &frame); in->sm = Adesc; in->s.decl = nfn->decl; } /* * build a fake node for the argument area */ toff = znode; tadd = znode; pass = znode; toff.op = Oconst; toff.addable = Rconst; toff.ty = tint; tadd.op = Oadd; tadd.addable = Raadr; tadd.left = &frame; tadd.right = &toff; tadd.ty = tint; pass.op = Oind; pass.addable = Radr; pass.left = &tadd; /* * compile all the args */ d = nfn->ty->ids; off = 0; for(a = args; a != nil; a = a->right){ off = d->offset; toff.val = off; if(d->ty->kind == Tpoly) pass.ty = a->left->ty; else pass.ty = d->ty; ecom(&a->left->src, &pass, a->left); d = d->next; if(a->left->flags & TEMP) tfree(a->left); } if(off > maxstack) maxstack = off; /* * pass return value */ if(ret != nil){ toff.val = REGRET*IBY2WD; pass.ty = nfn->ty->tof; p = genrawop(src, ILEA, ret, nil, &pass); p->m.offset = ret->ty->size; /* for optimizer */ } /* * call it */ if(nfn->addable == Rmpc){ iop = IMCALL; if(op == Ospawn) iop = IMSPAWN; genrawop(src, iop, &frame, ind, mod); tfree(&tmod); tfree(&tind); }else if(nfn->op == Odot){ iop = ICALL; if(op == Ospawn) iop = ISPAWN; genrawop(src, iop, &frame, nil, nfn->right); }else{ iop = ICALL; if(op == Ospawn) iop = ISPAWN; in = genrawop(src, iop, &frame, nil, nil); in->d.decl = nfn->decl; in->dm = Apc; } tfree(&frame); } /* * initialization code for arrays * a must be addressable (< Rcant) */ void arraycom(Node *a, Node *elems) { Node tindex, fake, tmp, ri, *e, *n, *q, *body, *wild; Inst *top, *out; /* Case *c; */ if(debug['A']) print("arraycom: %n %n\n", a, elems); /* c = elems->ty->cse; */ /* don't use c->wild in case we've been inlined */ wild = nil; for(e = elems; e != nil; e = e->right) for(q = e->left->left; q != nil; q = q->right) if(q->left->op == Owild) wild = e->left; if(wild != nil) arraydefault(a, wild->right); tindex = znode; fake = znode; talloc(&tmp, tint, nil); tindex.op = Oindx; tindex.addable = Rcant; tindex.left = a; tindex.right = nil; tindex.ty = tint; fake.op = Oind; fake.addable = Radr; fake.left = &tmp; fake.ty = a->ty->tof; for(e = elems; e != nil; e = e->right){ /* * just duplicate the initializer for Oor */ for(q = e->left->left; q != nil; q = q->right){ if(q->left->op == Owild) continue; body = e->left->right; if(q->right != nil) body = dupn(0, &nosrc, body); top = nil; out = nil; ri.decl = nil; if(q->left->op == Orange){ /* * for(i := q.left.left; i <= q.left.right; i++) */ talloc(&ri, tint, nil); ri.src = q->left->src; ecom(&q->left->src, &ri, q->left->left); /* i <= q.left.right; */ n = mkn(Oleq, &ri, q->left->right); n->src = q->left->src; n->ty = tint; top = nextinst(); out = bcom(n, 1, nil); tindex.right = &ri; }else{ tindex.right = q->left; } tindex.addable = Rcant; tindex.src = q->left->src; ecom(&tindex.src, &tmp, &tindex); ecom(&body->src, &fake, body); if(q->left->op == Orange){ /* i++ */ n = mkbin(Oinc, &ri, sumark(mkconst(&ri.src, 1))); n->ty = tint; n->addable = Rcant; ecom(&n->src, nil, n); /* jump to test */ patch(genrawop(&q->left->src, IJMP, nil, nil, nil), top); patch(out, nextinst()); tfree(&ri); } } } tfree(&tmp); } /* * default initialization code for arrays. * compiles to * n = len a; * while(n){ * n--; * a[n] = elem; * } */ void arraydefault(Node *a, Node *elem) { Inst *out, *top; Node n, e, *t; if(debug['A']) print("arraydefault: %n %n\n", a, elem); t = mkn(Olen, a, nil); t->src = elem->src; t->ty = tint; t->addable = Rcant; talloc(&n, tint, nil); n.src = elem->src; ecom(&t->src, &n, t); top = nextinst(); out = bcom(&n, 1, nil); t = mkbin(Odec, &n, sumark(mkconst(&elem->src, 1))); t->ty = tint; t->addable = Rcant; ecom(&t->src, nil, t); e.decl = nil; if(elem->addable >= Rcant) elem = eacom(elem, &e, nil); t = mkn(Oindx, a, &n); t->src = elem->src; t = mkbin(Oas, mkunary(Oind, t), elem); t->ty = elem->ty; t->left->ty = elem->ty; t->left->left->ty = tint; sumark(t); ecom(&t->src, nil, t); patch(genrawop(&t->src, IJMP, nil, nil, nil), top); tfree(&n); tfree(&e); patch(out, nextinst()); } void tupcom(Node *nto, Node *n) { Node tadr, tadd, toff, fake, *e; Decl *d; if(debug['Y']) print("tupcom %n\nto %n\n", n, nto); /* * build a fake node for the tuple */ toff = znode; tadd = znode; fake = znode; tadr = znode; toff.op = Oconst; toff.ty = tint; tadr.op = Oadr; tadr.left = nto; tadr.ty = tint; tadd.op = Oadd; tadd.left = &tadr; tadd.right = &toff; tadd.ty = tint; fake.op = Oind; fake.left = &tadd; sumark(&fake); if(fake.addable >= Rcant) fatal("tupcom: bad value exp %n", &fake); /* * compile all the exps */ d = n->ty->ids; for(e = n->left; e != nil; e = e->right){ toff.val = d->offset; fake.ty = d->ty; ecom(&e->left->src, &fake, e->left); d = d->next; } } void tuplcom(Node *n, Node *nto) { Node tadr, tadd, toff, fake, tas, *e, *as; Decl *d; if(debug['Y']) print("tuplcom %n\nto %n\n", n, nto); /* * build a fake node for the tuple */ toff = znode; tadd = znode; fake = znode; tadr = znode; toff.op = Oconst; toff.ty = tint; tadr.op = Oadr; tadr.left = n; tadr.ty = tint; tadd.op = Oadd; tadd.left = &tadr; tadd.right = &toff; tadd.ty = tint; fake.op = Oind; fake.left = &tadd; sumark(&fake); if(fake.addable >= Rcant) fatal("tuplcom: bad value exp for %n", &fake); /* * compile all the exps */ d = nto->ty->ids; if(nto->ty->kind == Tadtpick) d = nto->ty->tof->ids->next; for(e = nto->left; e != nil; e = e->right){ as = e->left; if(as->op != Oname || as->decl != nildecl){ toff.val = d->offset; fake.ty = d->ty; fake.src = as->src; if(as->addable < Rcant) genmove(&as->src, Mas, d->ty, &fake, as); else{ tas.op = Oas; tas.ty = d->ty; tas.src = as->src; tas.left = as; tas.right = &fake; tas.addable = Rcant; ecom(&tas.src, nil, &tas); } } d = d->next; } } void tuplrcom(Node *n, Node *nto) { Node *s, *d, tas; Decl *de; de = nto->ty->ids; for(s = n->left, d = nto->left; s != nil && d != nil; s = s->right, d = d->right){ if(d->left->op != Oname || d->left->decl != nildecl){ tas.op = Oas; tas.ty = de->ty; tas.src = s->left->src; tas.left = d->left; tas.right = s->left; sumark(&tas); ecom(&tas.src, nil, &tas); } de = de->next; } if(s != nil || d != nil) fatal("tuplrcom"); } /* * boolean compiler * fall through when condition == true */ Inst* bcom(Node *n, int true, Inst *b) { Inst *bb; Node tl, tr, *t, *left, *right, *tn; int op; if(n->op == Ocomma){ tn = n->left->left; ecom(&n->left->src, nil, n->left); bb = bcom(n->right, true, b); tfree(tn); return bb; } if(debug['b']) print("bcom %n %d\n", n, true); left = n->left; right = n->right; op = n->op; switch(op){ case Onothing: return b; case Onot: return bcom(n->left, !true, b); case Oandand: if(!true) return oror(n, true, b); return andand(n, true, b); case Ooror: if(!true) return andand(n, true, b); return oror(n, true, b); case Ogt: case Ogeq: case Oneq: case Oeq: case Olt: case Oleq: break; default: if(n->ty->kind == Tint){ right = mkconst(&n->src, 0); right->addable = Rconst; left = n; op = Oneq; break; } fatal("can't bcom %n", n); return b; } if(true) op = oprelinvert[op]; if(left->addable < right->addable){ t = left; left = right; right = t; op = opcommute[op]; } tl.decl = nil; tr.decl = nil; if(right->addable < Ralways){ if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else if(left->temps <= right->temps){ right = ecom(&right->src, talloc(&tr, right->ty, nil), right); if(left->addable >= Rcant) left = eacom(left, &tl, nil); }else{ left = eacom(left, &tl, nil); right = ecom(&right->src, talloc(&tr, right->ty, nil), right); } bb = genbra(&n->src, op, left, right); bb->branch = b; tfree(&tl); tfree(&tr); return bb; } Inst* andand(Node *n, int true, Inst *b) { if(debug['b']) print("andand %n\n", n); b = bcom(n->left, true, b); b = bcom(n->right, true, b); return b; } Inst* oror(Node *n, int true, Inst *b) { Inst *bb; if(debug['b']) print("oror %n\n", n); bb = bcom(n->left, !true, nil); b = bcom(n->right, true, b); patch(bb, nextinst()); return b; } /* * generate code for a recva expression * this is just a hacked up small alt */ void recvacom(Src *src, Node *nto, Node *n) { Label *labs; Case *c; Node which, tab, off, add, adr, slot, *left; Type *talt; Inst *p; left = n->left; labs = allocmem(1 * sizeof *labs); labs[0].isptr = left->addable >= Rcant; c = allocmem(sizeof *c); c->nlab = 1; c->labs = labs; talt = mktalt(c); talloc(&which, tint, nil); talloc(&tab, talt, nil); /* * build the node for the address of each channel, * the values to send, and the storage fro values received */ off = znode; off.op = Oconst; off.ty = tint; off.addable = Rconst; adr = znode; adr.op = Oadr; adr.left = &tab; adr.ty = tint; add = znode; add.op = Oadd; add.left = &adr; add.right = &off; add.ty = tint; slot = znode; slot.op = Oind; slot.left = &add; sumark(&slot); /* * gen the channel * this sleaze is lying to the garbage collector */ off.val = 2*IBY2WD; if(left->addable < Rcant) genmove(src, Mas, tint, left, &slot); else{ slot.ty = left->ty; ecom(src, &slot, left); slot.ty = nil; } /* * gen the value */ off.val += IBY2WD; p = genrawop(&left->src, ILEA, nto, nil, &slot); p->m.offset = nto->ty->size; /* for optimizer */ /* * number of senders and receivers */ off.val = 0; genmove(src, Mas, tint, sumark(mkconst(src, 0)), &slot); off.val += IBY2WD; genmove(src, Mas, tint, sumark(mkconst(src, 1)), &slot); off.val += IBY2WD; p = genrawop(src, IALT, &tab, nil, &which); p->m.offset = talt->size; /* for optimizer */ tfree(&which); tfree(&tab); } /* * generate code to duplicate an adt with pick fields * this is just a hacked up small pick * n is Oind(exp) */ void pickdupcom(Src *src, Node *nto, Node *n) { Node *start, *stop, *node, *orig, *dest, tmp, clab; Case *c; Inst *j, *jmps, *wild; Label *labs; Decl *d, *tg, *stg; Type *t; int i, nlab; char buf[32]; if(n->op != Oind) fatal("pickdupcom not Oind: %n" ,n); t = n->ty; nlab = t->decl->tag; /* * generate global which has case labels */ seprint(buf, buf+sizeof(buf), ".c%d", nlabel++); d = mkids(src, enter(buf, 0), mktype(&src->start, &src->stop, Tcase, nil, nil), nil); d->init = mkdeclname(src, d); clab.addable = Rmreg; clab.left = nil; clab.right = nil; clab.op = Oname; clab.ty = d->ty; clab.decl = d; /* * generate a temp to hold the real value * then generate a case on the tag */ orig = n->left; talloc(&tmp, orig->ty, nil); ecom(src, &tmp, orig); orig = mkunary(Oind, &tmp); orig->ty = tint; sumark(orig); dest = mkunary(Oind, nto); dest->ty = nto->ty->tof; sumark(dest); genrawop(src, ICASE, orig, nil, &clab); labs = allocmem(nlab * sizeof *labs); i = 0; jmps = nil; for(tg = t->tags; tg != nil; tg = tg->next){ stg = tg; for(; tg->next != nil; tg = tg->next) if(stg->ty != tg->next->ty) break; start = sumark(simplify(mkdeclname(src, stg))); stop = start; node = start; if(stg != tg){ stop = sumark(simplify(mkdeclname(src, tg))); node = mkbin(Orange, start, stop); } labs[i].start = start; labs[i].stop = stop; labs[i].node = node; labs[i++].inst = nextinst(); genrawop(src, INEW, mktn(tg->ty->tof), nil, nto); genmove(src, Mas, tg->ty->tof, orig, dest); j = genrawop(src, IJMP, nil, nil, nil); j->branch = jmps; jmps = j; } /* * this should really be a runtime error */ wild = genrawop(src, IJMP, nil, nil, nil); patch(wild, wild); patch(jmps, nextinst()); tfree(&tmp); if(i > nlab) fatal("overflowed label tab for pickdupcom"); c = allocmem(sizeof *c); c->nlab = i; c->nsnd = 0; c->labs = labs; c->iwild = wild; d->ty->cse = c; usetype(d->ty); installids(Dglobal, d); } /* * see if name n occurs anywhere in e */ int tupaliased(Node *n, Node *e) { for(;;){ if(e == nil) return 0; if(e->op == Oname && e->decl == n->decl) return 1; if(tupaliased(n, e->left)) return 1; e = e->right; } return 0; } /* * see if any name in n occurs anywere in e */ int tupsaliased(Node *n, Node *e) { for(;;){ if(n == nil) return 0; if(n->op == Oname && tupaliased(n, e)) return 1; if(tupsaliased(n->left, e)) return 1; n = n->right; } return 0; } /* * put unaddressable constants in the global data area */ Decl* globalconst(Node *n) { Decl *d; Sym *s; char buf[32]; seprint(buf, buf+sizeof(buf), ".i.%.8lux", (long)n->val); s = enter(buf, 0); d = s->decl; if(d == nil){ d = mkids(&n->src, s, tint, nil); installids(Dglobal, d); d->init = n; d->refs++; } return d; } Decl* globalBconst(Node *n) { Decl *d; Sym *s; char buf[32]; seprint(buf, buf+sizeof(buf), ".B.%.8lux.%8lux", (long)(n->val>>32), (long)n->val); s = enter(buf, 0); d = s->decl; if(d == nil){ d = mkids(&n->src, s, tbig, nil); installids(Dglobal, d); d->init = n; d->refs++; } return d; } Decl* globalbconst(Node *n) { Decl *d; Sym *s; char buf[32]; seprint(buf, buf+sizeof(buf), ".b.%.2lux", (long)n->val & 0xff); s = enter(buf, 0); d = s->decl; if(d == nil){ d = mkids(&n->src, s, tbyte, nil); installids(Dglobal, d); d->init = n; d->refs++; } return d; } Decl* globalfconst(Node *n) { Decl *d; Sym *s; char buf[32]; ulong dv[2]; dtocanon(n->rval, dv); seprint(buf, buf+sizeof(buf), ".f.%.8lux.%8lux", dv[0], dv[1]); s = enter(buf, 0); d = s->decl; if(d == nil){ d = mkids(&n->src, s, treal, nil); installids(Dglobal, d); d->init = n; d->refs++; } return d; } Decl* globalsconst(Node *n) { Decl *d; Sym *s; s = n->decl->sym; d = s->decl; if(d == nil){ d = mkids(&n->src, s, tstring, nil); installids(Dglobal, d); d->init = n; } d->refs++; return d; } static Node* subst(Decl *d, Node *e, Node *n) { if(n == nil) return nil; if(n->op == Oname){ if(d == n->decl){ n = dupn(0, nil, e); n->ty = d->ty; } return n; } n->left = subst(d, e, n->left); n->right = subst(d, e, n->right); return n; } static Node* putinline(Node *n) { Node *e, *tn; Type *t; Decl *d; if(debug['z']) print("inline1: %n\n", n); if(n->left->op == Oname) d = n->left->decl; else d = n->left->right->decl; e = d->init; t = e->ty; e = dupn(1, &n->src, e->right->left->left); for(d = t->ids, n = n->right; d != nil && n != nil; d = d->next, n = n->right){ if(hasside(n->left, 0) && occurs(d, e) != 1){ tn = talloc(mkn(0, nil, nil), d->ty, nil); e = mkbin(Ocomma, mkbin(Oas, tn, n->left), subst(d, tn, e)); e->ty = e->right->ty; e->left->ty = d->ty; } else e = subst(d, n->left, e); } if(d != nil || n != nil) fatal("bad arg match in putinline()"); if(debug['z']) print("inline2: %n\n", e); return e; } static void fpcall(Src *src, int op, Node *n, Node *ret) { Node tp, *e, *mod, *ind; tp.decl = nil; e = n->left->left; if(e->addable >= Rcant) e = eacom(e, &tp, nil); mod = mkunary(Oind, e); ind = mkunary(Oind, mkbin(Oadd, dupn(0, src, e), mkconst(src, IBY2WD))); n->left = mkbin(Omdot, mod, ind); n->left->ty = e->ty->tof; mod->ty = ind->ty = ind->left->ty = ind->left->right->ty = tint; sumark(n); callcom(src, op, n, ret); tfree(&tp); } &tadr; tadd.right = &toff; tadd.ty = tint; fake.op = Oind; fake.left = &tadd; sumark(&fake); if(fake.addable >= Rcant) fatal("tuplcom: bad value exp for %n", &fake); /* * compile all the exps */ d = nto->ty->ids; if(nto->ty->kind == Tadtpick) d = nto->ty->tof->ids->next; for(e = nto->left; e != nil; e = e->right){ as = e->left; if(as->op != Oname || as->decl != nildecl){ toff.val = d->offset; fake.ty = d->ty; fake.src = as->src; if(as->addable < Rold_contrib//root/sys/src/cmd/limbo/limbo/fns.h����������������������������������������������������� 664 � 0 � 0 � 25052 10214306322 20604�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������int addfile(File*); void addfnptrs(Decl*, int); void addiface(Decl*, Decl*); void addinclude(char*); char *addrprint(char*, char*, int, Addr*); Typelist *addtype(Type*, Typelist*); Node *adtdecl(Decl *ids, Node *fields); void adtdecled(Node *n); void adtdefd(Type*); Decl *adtmeths(Type*); void adtstub(Decl*); long align(long, int); void *allocmem(ulong); void altcheck(Node *an, Type *ret); void altcom(Node*); Inst *andand(Node*, int, Inst*); Decl *appdecls(Decl*, Decl*); int argcompat(Node*, Decl*, Node*); void arraycom(Node*, Node*); void arraydefault(Node*, Node*); Type *arrowtype(Type*, Decl*); void asmdesc(Desc*); void asmentry(Decl*); void asmexc(Except*); void asminitializer(long, Node*); void asminst(Inst*); void asmldt(long, Decl*); void asmmod(Decl*); void asmpath(void); void asmstring(long, Sym*); void asmvar(long, Decl*); int assignindices(Node*); void bccom(Node*, Inst**); Inst *bcom(Node*, int, Inst*); void bindnames(Node*); void bindtypes(Type *t); Ok callcast(Node*, int, int); void callcom(Src*, int, Node*, Node*); Type* calltype(Type*, Node*, Type*); double canontod(ulong v[2]); void casecheck(Node *cn, Type *ret); int casecmp(Type*, Node*, Node*); void casecom(Node*); Node *caselist(Node*, Node*); void casesort(Type*, Label*, Label*, int, int); Case *checklabels(Node *inits, Type *ctype, int nlab, char *title); void checkrefs(Decl*); Node *checkused(Node*); int circlval(Node*, Node*); void concheck(Node *n, int isglobal); Node *condecl(Decl*, Node*); void condecled(Node *n); void constub(Decl*); Type *copytypeids(Type*); char *ctprint(char*, char*, Type*); int ctypeconv(Fmt*); Line curline(void); Decl *curscope(void); int cycarc(Type*, Type*); void cycfield(Type*, Decl*); void cycsizetype(Type*); void cyctype(Type*); int dasdecl(Node *n); void declaserr(Node*); int declasinfer(Node*, Type*); int declconv(Fmt*); Decl *declsort(Decl*); void declstart(void); void decltozero(Node *n); void deldecl(Decl*); int dequal(Decl*, Decl*, int); long descmap(Decl*, uchar*, long); void disaddr(int, Addr*); void disbcon(long); void discon(long); void disdata(int, long); void disdesc(Desc*); void disentry(Decl*); void disexc(Except*); void disinst(Inst*); void disldt(long, Decl*); void dismod(Decl*); void dispath(void); void disvar(long, Decl*); void disword(long); int dotconv(Fmt*); char *dotprint(char*, char*, Decl*, int); Type *dottype(Type*, Decl*); void dtocanon(double, ulong[2]); Decl *dupdecl(Decl*); Decl *dupdecls(Decl*); Node *dupn(int, Src*, Node*); Node *eacom(Node*, Node*, Node*); Ok echeck(Node *n, int typeok, int isglobal, Node* par); Node *ecom(Src*, Node*, Node*); Node *efold(Node *n); Node *elemsort(Node*); void emit(Decl*); Decl *encpolys(Decl*); Sym *enter(char*, int); Desc *enterdesc(uchar*, long, long); Sym *enterstring(char*, int); char *eprint(char*, char*, Node*); char *eprintlist(char*, char*, Node*, char*); void error(Line, char*, ...); #pragma varargck argpos error 2 int etconv(Fmt*); Node *etolist(Node*); void excheck(Node *n, int isglobal); void exccheck(Node *cn, Type *ret); void excom(Node*); Node *exdecl(Decl*, Decl*); void exdecled(Node *n); Type *expandtype(Type*, Type*, Decl*, Tpair**); Type *expandtypes(Type*, Decl*); int expconv(Fmt*); Type *exptotype(Node*); void fatal(char*, ...); #pragma varargck argpos fatal 1 void fielddecled(Node *n); Node *fielddecl(int store, Decl *ids); int findlab(Type *ty, Node *v, Label *labs, int nlab); int fixop(int, Type*, Type*, Type*, int*, int*); Fline fline(int); void fmtcheck(Node*, Node*, Node*); void fncheck(Decl *d); Decl *fnchk(Node *n); void fncom(Decl*); Node *fndecl(Node *n, Type *t, Node *body); void fndecled(Node *n); Decl* fnlookup(Sym*, Type*, Node**); Node *fold(Node*); void foldbranch(Inst*); Node *foldc(Node*); Node *foldcast(Node*, Node*); Node *foldcasti(Node*, Node*); Node *foldr(Node*); Node *foldvc(Node*); void gbind(Node *n); int gcheck(Node*, Decl**, int); void gdasdecl(Node *n); void gdecl(Node *n); Addr genaddr(Node*); Inst *genbra(Src*, int, Node*, Node*); Inst *genchan(Src*, Node*, Type*, Node*); Desc *gendesc(Decl*, long, Decl*); Inst *genfixcastop(Src*, int, Node*, Node*); Inst *genmove(Src*, int, Type*, Node*, Node*); Inst *genop(Src*, int, Node*, Node*, Node*); Inst *genrawop(Src*, int, Node*, Node*, Node*); void genstart(void); long getpc(Inst*); int gfltconv(Fmt*); Decl *globalBconst(Node*); Node *globalas(Node*, Node*, int); Decl *globalbconst(Node*); Decl *globalconst(Node*); Decl *globalfconst(Node*); Decl *globalsconst(Node*); void gsort(Node*); int hasasgns(Node*); int hascall(Node*); Node *hascomm(Node*); int hasside(Node*, int); long idindices(Decl*); long idoffsets(Decl*, long, int); Type *idtype(Type*); void importcheck(Node *n, int isglobal); void importchk(Node*); Node *importdecl(Node *m, Decl *ids); void importdecled(Node *n); void includef(Sym*); Node *indsascom(Src*, Node*, Node*); int initable(Node*, Node*, int); int inloop(void); void installids(int store, Decl *ids); int instconv(Fmt*); Type *insttype(Type*, Decl*, Tpair**); Type *internaltype(Type*); int isimpmod(Sym*); int islval(Node*); int ispoly(Decl*); int ispolyadt(Type*); int istuple(Node*); void joiniface(Type*, Type*); void lexinit(void); void lexstart(char*); int lineconv(Fmt*); int local(Decl*); Decl *lookdot(Decl*, Sym*); Decl *lookup(Sym*); int mapconv(Fmt*); int marklval(Node*); int mathchk(Node*, int); void mergepolydecs(Type*); Type *mkadtcon(Type*); Type *mkadtpickcon(Type*, Type*); Type *mkarrowtype(Line*, Line*, Type*, Sym*); Node *mkbin(int, Node*, Node*); Node *mkconst(Src*, Long); Decl *mkdecl(Src*, int, Type*); Node *mkdeclname(Src*, Decl*); Desc *mkdesc(long, Decl*); Type *mkdottype(Line*, Line*, Type*, Sym*); Type *mkexbasetype(Type*); Type *mkextuptype(Type*); Type *mkextype(Type*); File *mkfile(char*, int, int, int, char*, int, int); Decl *mkids(Src*, Sym*, Type*, Decl*); Type *mkidtype(Src*, Sym*); Type *mkiface(Decl*); Inst *mkinst(void); Type *mkinsttype(Src*, Type*, Typelist*); Node *mkname(Src*, Sym*); Node *mknil(Src*); Node *mkn(int, Node*, Node*); Node *mkrconst(Src*, Real); Node *mksconst(Src*, Sym*); Node *mkscope(Node *body); Type *mktalt(Case*); Desc *mktdesc(Type*); Node *mktn(Type*); Type *mktype(Line*, Line*, int, Type*, Decl*); Node *mkunary(int, Node*); Type *mkvarargs(Node*, Node*); Teq *modclass(void); void modcode(Decl*); void modcom(Decl*); void moddataref(void); Node *moddecl(Decl *ids, Node *fields); void moddecled(Node *n); Decl *modglobals(Decl*, Decl*); Decl *modimp(Dlist*, Decl*); void modrefable(Type*); void modresolve(void); void modstub(Decl*); void modtab(Decl*); Decl *module(Decl*); int mustzero(Decl *); int mpatof(char*, double*); Decl *namedot(Decl*, Sym*); Decl *namesort(Decl*); void narrowmods(void); void nerror(Node*, char*, ...); #pragma varargck argpos nerror 2 int nested(void); Inst *nextinst(void); int nodeconv(Fmt*); int nodes(Node*); char *nprint(char*, char*, Node*, int); void nwarn(Node*, char*, ...); #pragma varargck argpos nwarn 2 int occurs(Decl*, Node*); int opconv(Fmt*); void optabinit(void); void optim(Inst*, Decl*); Inst *oror(Node*, int, Inst*); Decl *outerpolys(Node*); Node *passfns(Src*, Decl*, Node*, Node*, Type*, Tpair*); Node *passimplicit(Node*, Node*); void patch(Inst*, Inst*); void pickcheck(Node*, Type*); int pickdecled(Node *n); Decl *pickdefd(Type*, Decl*); void pickdupcom(Src*, Node*, Node*); Decl* polydecl(Decl*); int polyequal(Decl*, Decl*); void popblock(void); Decl *popids(Decl*); void popscopes(void); Decl *popscope(void); void printdecls(Decl*); int pushblock(void); void pushlabel(Node*); void pushscope(Node *, int); void raisescheck(Type*); int raisescompat(Node*, Node*); void reach(Inst*); void *reallocmem(void*, ulong); void recvacom(Src*, Node*, Node*); void redecl(Decl *d); void reftype(Type*); void repushblock(int); void repushids(Decl*); void resizetype(Type*); long resolvedesc(Decl*, long, Decl*); Decl* resolveldts(Decl*, Decl**); int resolvemod(Decl*); long resolvepcs(Inst*); Node *retalloc(Node*, Node*); Decl *revids(Decl*); Node *rewrite(Node *n); Node *rewritecomm(Node*, Node*, Node*, Node*); Inst *rewritedestreg(Inst*, int, int); Inst *rewritesrcreg(Inst*, int, int, int); void rmfnptrs(Decl*); Node *rotater(Node*); double rpow(double, int); int sameaddr(Node*, Node*); int sametree(Node*, Node*); void sblfiles(void); void sblfn(Decl**, int); void sblinst(Inst*, long); void sblmod(Decl*); void sblty(Decl**, int); void sblvar(Decl*); double scale(Type*); double scale2(Type*, Type*); Node* scheck(Node*, Type*, int); void scom(Node*); char *secpy(char*, char*, char*); char *seprint(char*, char*, char*, ...); #pragma varargck argpos seprint 3 void shareloc(Decl*); int shiftchk(Node*); ulong sign(Decl*); Node *simplify(Node*); Szal sizeids(Decl*, long); void sizetype(Type*); Node *slicelcom(Src*, Node*, Node*); int specific(Type*); int srcconv(Fmt*); char* srcpath(char*, int); int storeconv(Fmt*); char *stprint(char*, char*, Type*); Sym *stringcat(Sym*, Sym*); char *stringpr(char*, char*, Sym*); Long strtoi(char*, int); int stypeconv(Fmt*); Node *sumark(Node*); int symcmp(Sym*, Sym*); Node *tacquire(Node*); Ok tagcast(Node*, Node*, Node*, Decl*, int, int); Node *talloc(Node*, Type*, Node*); int tcompat(Type*, Type*, int); void tcycle(Type*); Decl *tdecls(void); long tdescmap(Type*, uchar*, long); void teqclass(Type*); int tequal(Type*, Type*); void tfree(Node*); void tfreelater(Node*); void tfreenow(void); void tinit(void); int tmustzero(Type *); Type *toptype(Src*, Type*); Type *topvartype(Type *t, Decl *id, int tyok, int polyok); Type* tparent(Type*, Type*); char *tprint(char*, char*, Type*); void translate(char*, char*, char*); void trelease(Node*); int tunify(Type*, Type*, Tpair**); int tupaliased(Node*, Node*); int tupsaliased(Node*, Node*); void tupcom(Node*, Node*); void tuplcom(Node*, Node*); void tuplrcom(Node*, Node*); Decl *tuplefields(Node*); void typebuiltin(Decl*, Type*); Decl *typecheck(int); int typeconv(Fmt*); Node *typedecl(Decl *ids, Type *t); void typedecled(Node *n); Decl *typeids(Decl*, Type*); void typeinit(void); void typestart(void); Decl *undefed(Src *src, Sym *s); Desc *usedesc(Desc*); void usedty(Type*); Type *usetype(Type*); Type *validtype(Type*, Decl*); int valistype(Node*); Type *valtmap(Type*, Tpair*); void varcheck(Node *n, int isglobal); int varcom(Decl*); Node *vardecl(Decl*, Type*); void vardecled(Node *n); Node *varinit(Decl*, Node*); Decl *varlistdecl(Decl*, Node*); Decl *vars(Decl*); int vcom(Decl*); Type *verifytypes(Type*, Decl*, Decl*); void warn(Line, char*, ...); #pragma varargck argpos warn 2 void yyerror(char*, ...); #pragma varargck argpos yyerror 1 int yylex(void); int yyparse(void); void zcom(Node *, Node**); void zcom0(Decl *, Node**); void zcom1(Node *, Node**); ault(Node*, Node*); Type *arrowtype(Type*, Decl*); void asmdesc(Desc*); void asmentry(Decl*); void asmexc(Except*); void asminitializer(long, Node*); void asminst(Inst*); void asmldt(long, Decl*); void asmmod(Decl*); void asmpath(void); void asmstring(long, Sym*); void asmvar(long, Decl*); int assignindices(Node*); void bccom(Node*, Inst**); Inst *bcom(Node*, int, Inst*); void bindnames(Node*); void bindtypes(Type *t); Ok callcast(Node*, int, int); void callcom(Src*old_contrib//root/sys/src/cmd/limbo/limbo/gen.c����������������������������������������������������� 664 � 0 � 0 � 46252 10214046533 20574�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" static int addrmode[Rend] = { /* Rreg */ Afp, /* Rmreg */ Amp, /* Roff */ Aoff, /* Rnoff */ Anoff, /* Rdesc */ Adesc, /* Rdescp */ Adesc, /* Rconst */ Aimm, /* Ralways */ Aerr, /* Radr */ Afpind, /* Rmadr */ Ampind, /* Rcant */ Aerr, /* Rpc */ Apc, /* Rmpc */ Aerr, /* Rareg */ Aerr, /* Ramreg */ Aerr, /* Raadr */ Aerr, /* Ramadr */ Aerr, /* Rldt */ Aldt, }; static Decl *wtemp; static Decl *bigtemp; static int ntemp; static Node retnode; static Inst zinst; int *blockstack; int blockdep; int nblocks; static int lenblockstack; static Node *ntoz; static Inst* genfixop(Src *src, int op, Node *s, Node *m, Node *d); void genstart(void) { Decl *d; d = mkdecl(&nosrc, Dlocal, tint); d->sym = enter(".ret", 0); d->offset = IBY2WD * REGRET; retnode = znode; retnode.op = Oname; retnode.addable = Rreg; retnode.decl = d; retnode.ty = tint; zinst.op = INOP; zinst.sm = Anone; zinst.dm = Anone; zinst.mm = Anone; firstinst = allocmem(sizeof *firstinst); *firstinst = zinst; lastinst = firstinst; blocks = -1; blockdep = 0; nblocks = 0; } /* * manage nested control flow blocks */ int pushblock(void) { if(blockdep >= lenblockstack){ lenblockstack = blockdep + 32; blockstack = reallocmem(blockstack, lenblockstack * sizeof *blockstack); } blockstack[blockdep++] = blocks; return blocks = nblocks++; } void repushblock(int b) { blockstack[blockdep++] = blocks; blocks = b; } void popblock(void) { blocks = blockstack[blockdep -= 1]; } void tinit(void) { wtemp = nil; bigtemp = nil; } Decl* tdecls(void) { Decl *d; for(d = wtemp; d != nil; d = d->next){ if(d->tref != 1) fatal("temporary %s has %d references", d->sym->name, d->tref-1); } for(d = bigtemp; d != nil; d = d->next){ if(d->tref != 1) fatal("temporary %s has %d references", d->sym->name, d->tref-1); } return appdecls(wtemp, bigtemp); } Node* talloc(Node *n, Type *t, Node *nok) { Decl *d, *ok; Desc *desc; char buf[StrSize]; ok = nil; if(nok != nil) ok = nok->decl; if(ok == nil || ok->tref == 0 || tattr[ok->ty->kind].big != tattr[t->kind].big || ok->ty->align != t->align) ok = nil; *n = znode; n->op = Oname; n->addable = Rreg; n->ty = t; if(tattr[t->kind].big){ desc = mktdesc(t); if(ok != nil && ok->desc == desc){ ok->tref++; ok->refs++; n->decl = ok; return n; } for(d = bigtemp; d != nil; d = d->next){ if(d->tref == 1 && d->desc == desc && d->ty->align == t->align){ d->tref++; d->refs++; n->decl = d; return n; } } d = mkdecl(&nosrc, Dlocal, t); d->desc = desc; d->tref = 2; d->refs = 1; n->decl = d; seprint(buf, buf+sizeof(buf), ".b%d", ntemp++); d->sym = enter(buf, 0); d->next = bigtemp; bigtemp = d; return n; } if(ok != nil && tattr[ok->ty->kind].isptr == tattr[t->kind].isptr && ok->ty->size == t->size){ ok->tref++; n->decl = ok; return n; } for(d = wtemp; d != nil; d = d->next){ if(d->tref == 1 && tattr[d->ty->kind].isptr == tattr[t->kind].isptr && d->ty->size == t->size && d->ty->align == t->align){ d->tref++; n->decl = d; return n; } } d = mkdecl(&nosrc, Dlocal, t); d->tref = 2; d->refs = 1; n->decl = d; seprint(buf, buf+sizeof(buf), ".t%d", ntemp++); d->sym = enter(buf, 0); d->next = wtemp; wtemp = d; return n; } void tfree(Node *n) { if(n == nil || n->decl == nil || n->decl->tref == 0) return; if(n->decl->tref == 1) fatal("double free of temporary %s", n->decl->sym->name); if (--n->decl->tref == 1) zcom1(n, nil); } void tfreelater(Node *n) { if(n == nil || n->decl == nil || n->decl->tref == 0) return; if(n->decl->tref == 1) fatal("double free of temporary %s", n->decl->sym->name); if(--n->decl->tref == 1){ Node *nn = mkn(Oname, nil, nil); *nn = *n; nn->left = ntoz; ntoz = nn; n->decl->tref++; } } void tfreenow() { Node *n, *nn; for(n = ntoz; n != nil; n = nn){ nn = n->left; n->left = nil; if(n->decl->tref != 2) fatal("bad free of temporary %s", n->decl->sym->name); --n->decl->tref; zcom1(n, nil); } ntoz = nil; } /* * realloc a temporary after it's been freed */ Node* tacquire(Node *n) { if(n == nil || n->decl == nil || n->decl->tref == 0) return n; /* if(n->decl->tref != 1) fatal("tacquire ref != 1: %d", n->decl->tref); */ n->decl->tref++; return n; } void trelease(Node *n) { if(n == nil || n->decl == nil || n->decl->tref == 0) return; if(n->decl->tref == 1) fatal("double release of temporary %s", n->decl->sym->name); n->decl->tref--; } Inst* mkinst(void) { Inst *in; in = lastinst->next; if(in == nil){ in = allocmem(sizeof *in); *in = zinst; lastinst->next = in; } lastinst = in; in->block = blocks; if(blocks < 0) fatal("mkinst no block"); return in; } Inst* nextinst(void) { Inst *in; in = lastinst->next; if(in != nil) return in; in = allocmem(sizeof(*in)); *in = zinst; lastinst->next = in; return in; } /* * allocate a node for returning */ Node* retalloc(Node *n, Node *nn) { if(nn->ty == tnone) return nil; *n = znode; n->op = Oind; n->addable = Radr; n->left = dupn(1, &n->src, &retnode); n->ty = nn->ty; return n; } Inst* genrawop(Src *src, int op, Node *s, Node *m, Node *d) { Inst *in; in = mkinst(); in->op = op; in->src = *src; if(in->sm != Anone || in->mm != Anone || in->dm != Anone) fatal("bogus mkinst in genrawop: %I\n", in); if(s != nil){ in->s = genaddr(s); in->sm = addrmode[s->addable]; } if(m != nil){ in->m = genaddr(m); in->mm = addrmode[m->addable]; if(in->mm == Ampind || in->mm == Afpind) fatal("illegal addressing mode in register %n", m); } if(d != nil){ in->d = genaddr(d); in->dm = addrmode[d->addable]; } return in; } Inst* genop(Src *src, int op, Node *s, Node *m, Node *d) { Inst *in; int iop; iop = disoptab[op][opind[d->ty->kind]]; if(iop == 0) fatal("can't deal with op %s on %n %n %n in genop", opname[op], s, m, d); if(iop == IMULX || iop == IDIVX) return genfixop(src, iop, s, m, d); in = mkinst(); in->op = iop; in->src = *src; if(s != nil){ in->s = genaddr(s); in->sm = addrmode[s->addable]; } if(m != nil){ in->m = genaddr(m); in->mm = addrmode[m->addable]; if(in->mm == Ampind || in->mm == Afpind) fatal("illegal addressing mode in register %n", m); } if(d != nil){ in->d = genaddr(d); in->dm = addrmode[d->addable]; } return in; } Inst* genbra(Src *src, int op, Node *s, Node *m) { Type *t; Inst *in; int iop; t = s->ty; if(t == tany) t = m->ty; iop = disoptab[op][opind[t->kind]]; if(iop == 0) fatal("can't deal with op %s on %n %n in genbra", opname[op], s, m); in = mkinst(); in->op = iop; in->src = *src; if(s != nil){ in->s = genaddr(s); in->sm = addrmode[s->addable]; } if(m != nil){ in->m = genaddr(m); in->mm = addrmode[m->addable]; if(in->mm == Ampind || in->mm == Afpind) fatal("illegal addressing mode in register %n", m); } return in; } Inst* genchan(Src *src, Node *sz, Type *mt, Node *d) { Inst *in; Desc *td; Addr reg; int op, regm; regm = Anone; reg.decl = nil; reg.reg = 0; reg.offset = 0; op = chantab[mt->kind]; if(op == 0) fatal("can't deal with op %d in genchan", mt->kind); switch(mt->kind){ case Tadt: case Tadtpick: case Ttuple: td = mktdesc(mt); if(td->nmap != 0){ op++; /* sleazy */ usedesc(td); regm = Adesc; reg.decl = mt->decl; }else{ regm = Aimm; reg.offset = mt->size; } break; } in = mkinst(); in->op = op; in->src = *src; in->s = reg; in->sm = regm; if(sz != nil){ in->m = genaddr(sz); in->mm = addrmode[sz->addable]; } if(d != nil){ in->d = genaddr(d); in->dm = addrmode[d->addable]; } return in; } Inst* genmove(Src *src, int how, Type *mt, Node *s, Node *d) { Inst *in; Desc *td; Addr reg; int op, regm; regm = Anone; reg.decl = nil; reg.reg = 0; reg.offset = 0; op = movetab[how][mt->kind]; if(op == 0) fatal("can't deal with op %d on %n %n in genmove", how, s, d); switch(mt->kind){ case Tadt: case Tadtpick: case Ttuple: case Texception: if(mt->size == 0 && how == Mas) return nil; td = mktdesc(mt); if(td->nmap != 0){ op++; /* sleazy */ usedesc(td); regm = Adesc; reg.decl = mt->decl; }else{ regm = Aimm; reg.offset = mt->size; } break; } in = mkinst(); in->op = op; in->src = *src; if(s != nil){ in->s = genaddr(s); in->sm = addrmode[s->addable]; } in->m = reg; in->mm = regm; if(d != nil){ in->d = genaddr(d); in->dm = addrmode[d->addable]; } if(s->addable == Rpc) in->op = IMOVPC; return in; } void patch(Inst *b, Inst *dst) { Inst *n; for(; b != nil; b = n){ n = b->branch; b->branch = dst; } } long getpc(Inst *i) { if(i->pc == 0 && i != firstinst && (firstinst->op != INOOP || i != firstinst->next)){ do i = i->next; while(i != nil && i->pc == 0); if(i == nil || i->pc == 0) fatal("bad instruction in getpc"); } return i->pc; } /* * follow all possible paths from n, * marking reached code, compressing branches, and reclaiming unreached insts */ void reach(Inst *in) { Inst *last; foldbranch(in); last = in; for(in = in->next; in != nil; in = in->next){ if(!in->reach) last->next = in->next; else last = in; } lastinst = last; } /* * follow all possible paths from n, * marking reached code, compressing branches, and eliminating tail recursion */ void foldbranch(Inst *in) { Inst *b, *next; Label *lab; int i, n; while(in != nil && !in->reach){ in->reach = 1; if(in->branch != nil) while(in->branch->op == IJMP){ if(in == in->branch || in->branch == in->branch->branch) break; in->branch = in->branch->branch; } switch(in->op){ case IGOTO: case ICASE: case ICASEL: case ICASEC: case IEXC: foldbranch(in->d.decl->ty->cse->iwild); lab = in->d.decl->ty->cse->labs; n = in->d.decl->ty->cse->nlab; for(i = 0; i < n; i++) foldbranch(lab[i].inst); if(in->op == IEXC) in->op = INOOP; return; case IEXC0: foldbranch(in->branch); in->op = INOOP; break; case IRET: case IEXIT: case IRAISE: return; case IJMP: b = in->branch; switch(b->op){ case ICASE: case ICASEL: case ICASEC: case IRET: case IEXIT: next = in->next; *in = *b; in->next = next; /* b->reach = 1; */ /* why ? */ continue; } foldbranch(in->branch); return; default: if(in->branch != nil) foldbranch(in->branch); break; } in = in->next; } } /* * convert the addressable node into an operand * see the comment for sumark */ Addr genaddr(Node *n) { Addr a; a.reg = 0; a.offset = 0; a.decl = nil; if(n == nil) return a; switch(n->addable){ case Rreg: if(n->decl != nil) a.decl = n->decl; else a = genaddr(n->left); break; case Rmreg: if(n->decl != nil) a.decl = n->decl; else a = genaddr(n->left); break; case Rdesc: a.decl = n->ty->decl; break; case Roff: case Rnoff: a.decl = n->decl; break; case Rconst: a.offset = n->val; break; case Radr: a = genaddr(n->left); break; case Rmadr: a = genaddr(n->left); break; case Rareg: case Ramreg: a = genaddr(n->left); if(n->op == Oadd) a.reg += n->right->val; break; case Raadr: case Ramadr: a = genaddr(n->left); if(n->op == Oadd) a.offset += n->right->val; break; case Rldt: a.decl = n->decl; break; case Rdescp: case Rpc: a.decl = n->decl; break; default: fatal("can't deal with %n in genaddr", n); break; } return a; } int sameaddr(Node *n, Node *m) { Addr a, b; if(n->addable != m->addable) return 0; a = genaddr(n); b = genaddr(m); return a.offset == b.offset && a.reg == b.reg && a.decl == b.decl; } long resolvedesc(Decl *mod, long length, Decl *decls) { Desc *g, *d, *last; int descid; g = gendesc(mod, length, decls); g->used = 0; last = nil; for(d = descriptors; d != nil; d = d->next){ if(!d->used){ if(last != nil) last->next = d->next; else descriptors = d->next; continue; } last = d; } g->next = descriptors; descriptors = g; descid = 0; for(d = descriptors; d != nil; d = d->next) d->id = descid++; if(g->id != 0) fatal("bad global descriptor id"); return descid; } int resolvemod(Decl *m) { Decl *id, *d; for(id = m->ty->ids; id != nil; id = id->next){ switch(id->store){ case Dfn: id->iface->pc = id->pc; id->iface->desc = id->desc; if(debug['v']) print("R1: %s %p %p %p\n", id->sym->name, id, id->iface, id->pc); break; case Dtype: if(id->ty->kind != Tadt) break; for(d = id->ty->ids; d != nil; d = d->next){ if(d->store == Dfn){ d->iface->pc = d->pc; d->iface->desc = d->desc; if(debug['v']) print("R2: %s %p %p %p\n", d->sym->name, d, d->iface, d->pc); } } break; } } /* for addiface */ for(id = m->ty->tof->ids; id != nil; id = id->next){ if(id->store == Dfn){ if(id->pc == nil) id->pc = id->iface->pc; if(id->desc == nil) id->desc = id->iface->desc; if(debug['v']) print("R3: %s %p %p %p\n", id->sym->name, id, id->iface, id->pc); } } return m->ty->tof->decl->init->val; } /* * place the Tiface decs in another list */ Decl* resolveldts(Decl *d, Decl **dd) { Decl *d1, *ld1, *d2, *ld2, *n; d1 = d2 = nil; ld1 = ld2 = nil; for( ; d != nil; d = n){ n = d->next; d->next = nil; if(d->ty->kind == Tiface){ if(d2 == nil) d2 = d; else ld2->next = d; ld2 = d; } else{ if(d1 == nil) d1 = d; else ld1->next = d; ld1 = d; } } *dd = d2; return d1; } /* * fix up all pc's * finalize all data offsets * fix up instructions with offsets too large */ long resolvepcs(Inst *inst) { Decl *d; Inst *in; int op; ulong r, off; long v, pc; pc = 0; for(in = inst; in != nil; in = in->next){ if(!in->reach || in->op == INOP) fatal("unreachable pc: %I %ld", in, pc); if(in->op == INOOP){ in->pc = pc; continue; } d = in->s.decl; if(d != nil){ if(in->sm == Adesc){ if(d->desc != nil) in->s.offset = d->desc->id; }else in->s.reg += d->offset; } r = in->s.reg; off = in->s.offset; if((in->sm == Afpind || in->sm == Ampind) && (r >= MaxReg || off >= MaxReg)) fatal("big offset in %I\n", in); d = in->m.decl; if(d != nil){ if(in->mm == Adesc){ if(d->desc != nil) in->m.offset = d->desc->id; }else in->m.reg += d->offset; } v = 0; switch(in->mm){ case Anone: break; case Aimm: case Apc: case Adesc: v = in->m.offset; break; case Aoff: case Anoff: v = in->m.decl->iface->offset; break; case Afp: case Amp: case Aldt: v = in->m.reg; if(v < 0) v = 0x8000; break; default: fatal("can't deal with %I's m mode\n", in); break; } if(v > 0x7fff || v < -0x8000){ switch(in->op){ case IALT: case IINDX: warn(in->src.start, "possible bug: temp m too big in %I: %ld %ld %d\n", in, in->m.reg, in->m.reg, MaxReg); rewritedestreg(in, IMOVW, RTemp); break; default: op = IMOVW; if(isbyteinst[in->op]) op = IMOVB; in = rewritesrcreg(in, op, RTemp, pc++); break; } } d = in->d.decl; if(d != nil){ if(in->dm == Apc) in->d.offset = d->pc->pc; else in->d.reg += d->offset; } r = in->d.reg; off = in->d.offset; if((in->dm == Afpind || in->dm == Ampind) && (r >= MaxReg || off >= MaxReg)) fatal("big offset in %I\n", in); in->pc = pc; pc++; } for(in = inst; in != nil; in = in->next){ d = in->s.decl; if(d != nil && in->sm == Apc) in->s.offset = d->pc->pc; d = in->d.decl; if(d != nil && in->dm == Apc) in->d.offset = d->pc->pc; if(in->branch != nil){ in->dm = Apc; in->d.offset = in->branch->pc; } } return pc; } /* * fixp up a big register constant uses as a source * ugly: smashes the instruction */ Inst* rewritesrcreg(Inst *in, int op, int treg, int pc) { Inst *new; Addr a; int am; a = in->m; am = in->mm; in->mm = Afp; in->m.reg = treg; in->m.decl = nil; new = allocmem(sizeof(*in)); *new = *in; *in = zinst; in->src = new->src; in->next = new; in->op = op; in->s = a; in->sm = am; in->dm = Afp; in->d.reg = treg; in->pc = pc; in->reach = 1; in->block = new->block; return new; } /* * fix up a big register constant by moving to the destination * after the instruction completes */ Inst* rewritedestreg(Inst *in, int op, int treg) { Inst *n; n = allocmem(sizeof(*n)); *n = zinst; n->next = in->next; in->next = n; n->src = in->src; n->op = op; n->sm = Afp; n->s.reg = treg; n->d = in->m; n->dm = in->mm; n->reach = 1; n->block = in->block; in->mm = Afp; in->m.reg = treg; in->m.decl = nil; return n; } int instconv(Fmt *f) { Inst *in; char buf[512], *p; char *op, *comma; in = va_arg(f->args, Inst*); op = nil; if(in->op >= 0 && in->op < MAXDIS) op = instname[in->op]; if(op == nil) op = "??"; buf[0] = '\0'; if(in->op == INOP) return fmtstrcpy(f, "\tnop"); p = seprint(buf, buf + sizeof(buf), "\t%s\t", op); comma = ""; if(in->sm != Anone){ p = addrprint(p, buf + sizeof(buf), in->sm, &in->s); comma = ","; } if(in->mm != Anone){ p = seprint(p, buf + sizeof(buf), "%s", comma); p = addrprint(p, buf + sizeof(buf), in->mm, &in->m); comma = ","; } if(in->dm != Anone){ p = seprint(p, buf + sizeof(buf), "%s", comma); p = addrprint(p, buf + sizeof(buf), in->dm, &in->d); } if(asmsym && in->s.decl != nil && in->sm == Adesc) p = seprint(p, buf+sizeof(buf), " #%D", in->s.decl); if(0 && asmsym && in->m.decl != nil) p = seprint(p, buf+sizeof(buf), " #%D", in->m.decl); if(asmsym && in->d.decl != nil && in->dm == Apc) p = seprint(p, buf+sizeof(buf), " #%D", in->d.decl); if(asmsym) p = seprint(p, buf+sizeof(buf), " #%U", in->src); USED(p); return fmtstrcpy(f, buf); } char* addrprint(char *buf, char *end, int am, Addr *a) { switch(am){ case Anone: return buf; case Aimm: case Apc: case Adesc: return seprint(buf, end, "$%ld", a->offset); case Aoff: return seprint(buf, end, "$%ld", a->decl->iface->offset); case Anoff: return seprint(buf, end, "-$%ld", a->decl->iface->offset); case Afp: return seprint(buf, end, "%ld(fp)", a->reg); case Afpind: return seprint(buf, end, "%ld(%ld(fp))", a->offset, a->reg); case Amp: return seprint(buf, end, "%ld(mp)", a->reg); case Ampind: return seprint(buf, end, "%ld(%ld(mp))", a->offset, a->reg); case Aldt: return seprint(buf, end, "$%ld", a->reg); case Aerr: default: return seprint(buf, end, "%ld(%ld(?%d?))", a->offset, a->reg, am); } } static void genstore(Src *src, Node *n, int offset) { Decl *de; Node d; de = mkdecl(&nosrc, Dlocal, tint); de->sym = nil; de->offset = offset; d = znode; d.op = Oname; d.addable = Rreg; d.decl = de; d.ty = tint; genrawop(src, IMOVW, n, nil, &d); } static Inst* genfixop(Src *src, int op, Node *s, Node *m, Node *d) { int p, a; Node *mm; Inst *i; mm = m ? m: d; op = fixop(op, mm->ty, s->ty, d->ty, &p, &a); if(op == IMOVW){ /* just zero d */ s = sumark(mkconst(src, 0)); return genrawop(src, op, s, nil, d); } if(op != IMULX && op != IDIVX) genstore(src, sumark(mkconst(src, a)), STemp); genstore(src, sumark(mkconst(src, p)), DTemp); i = genrawop(src, op, s, m, d); return i; } Inst* genfixcastop(Src *src, int op, Node *s, Node *d) { int p, a; Node *m; op = fixop(op, s->ty, tint, d->ty, &p, &a); if(op == IMOVW){ /* just zero d */ s = sumark(mkconst(src, 0)); return genrawop(src, op, s, nil, d); } m = sumark(mkconst(src, p)); if(op != ICVTXX) genstore(src, sumark(mkconst(src, a)), STemp); return genrawop(src, op, s, m, d); } void foldbranch(Inst *in) { Inst *b, *next; Label *lab; int i, n; while(in != nil && !in->reach){ in->reach = 1; if(in->branch != nil) while(in->branch->op == IJMP){ if(in == in->branch || in->branch == in->branch->branch) break; in->branch = in->branch->branch; } switch(in->op){ case IGOTO: case ICASE: cold_contrib//root/sys/src/cmd/limbo/limbo/lex.c����������������������������������������������������� 664 � 0 � 0 � 53237 10542012331 20605�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define Extern #include "limbo.h" #include "y.tab.h" enum { Leof = -1, Linestart = 0, Mlower = 1, Mupper = 2, Munder = 4, Malpha = Mupper|Mlower|Munder, Mdigit = 8, Msign = 16, Mexp = 32, Mhex = 64, Mradix = 128, HashSize = 1024, MaxPath = 4096 }; typedef struct Keywd Keywd; struct Keywd { char *name; int token; }; File **files; /* files making up the module, sorted by absolute line */ int nfiles; static int lenfiles; static int lastfile; /* index of last file looked up */ static char *incpath[MaxIncPath]; static Sym *symbols[HashSize]; static Sym *strings[HashSize]; static char map[256]; static Biobuf *bin; static Line linestack[MaxInclude]; static int lineno; static int linepos; static int bstack; static int ineof; static int lasttok; static YYSTYPE lastyylval; static char srcdir[MaxPath]; static Keywd keywords[] = { "adt", Ladt, "alt", Lalt, "array", Larray, "big", Ltid, "break", Lbreak, "byte", Ltid, "case", Lcase, "chan", Lchan, "con", Lcon, "continue", Lcont, "cyclic", Lcyclic, "do", Ldo, "dynamic", Ldynamic, "else", Lelse, "exception", Lexcept, "exit", Lexit, "fixed", Lfix, "fn", Lfn, "for", Lfor, "hd", Lhd, "if", Lif, "implement", Limplement, "import", Limport, "include", Linclude, "int", Ltid, "len", Llen, "list", Llist, "load", Lload, "module", Lmodule, "nil", Lnil, "of", Lof, "or", Lor, "pick", Lpick, "raise", Lraise, "raises", Lraises, "real", Ltid, "ref", Lref, "return", Lreturn, "self", Lself, "spawn", Lspawn, "string", Ltid, "tagof", Ltagof, "tl", Ltl, "to", Lto, "type", Ltype, "while", Lwhile, 0, }; static Keywd tokwords[] = { "&=", Landeq, "|=", Loreq, "^=", Lxoreq, "<<=", Llsheq, ">>=", Lrsheq, "+=", Laddeq, "-=", Lsubeq, "*=", Lmuleq, "/=", Ldiveq, "%=", Lmodeq, "**=", Lexpeq, ":=", Ldeclas, "||", Loror, "&&", Landand, "::", Lcons, "==", Leq, "!=", Lneq, "<=", Lleq, ">=", Lgeq, "<<", Llsh, ">>", Lrsh, "<-", Lcomm, "++", Linc, "--", Ldec, "->", Lmdot, "=>", Llabs, "**", Lexp, "EOF", Leof, "eof", Beof, 0, }; void lexinit(void) { Keywd *k; int i; for(i = 0; i < 256; i++){ if(i == '_' || i > 0xa0) map[i] |= Munder; if(i >= 'A' && i <= 'Z') map[i] |= Mupper; if(i >= 'a' && i <= 'z') map[i] |= Mlower; if(i >= 'A' && i <= 'F' || i >= 'a' && i <= 'f') map[i] |= Mhex; if(i == 'e' || i == 'E') map[i] |= Mexp; if(i == 'r' || i == 'R') map[i] |= Mradix; if(i == '-' || i == '+') map[i] |= Msign; if(i >= '0' && i <= '9') map[i] |= Mdigit; } memset(escmap, -1, sizeof(escmap)); escmap['\''] = '\''; unescmap['\''] = '\''; escmap['"'] = '"'; unescmap['"'] = '"'; escmap['\\'] = '\\'; unescmap['\\'] = '\\'; escmap['a'] = '\a'; unescmap['\a'] = 'a'; escmap['b'] = '\b'; unescmap['\b'] = 'b'; escmap['f'] = '\f'; unescmap['\f'] = 'f'; escmap['n'] = '\n'; unescmap['\n'] = 'n'; escmap['r'] = '\r'; unescmap['\r'] = 'r'; escmap['t'] = '\t'; unescmap['\t'] = 't'; escmap['v'] = '\v'; unescmap['\v'] = 'v'; escmap['0'] = '\0'; unescmap['\0'] = '0'; for(k = keywords; k->name != nil; k++) enter(k->name, k->token); } int cmap(int c) { if(c<0) return 0; if(c<256) return map[c]; return Mlower; } void lexstart(char *in) { char *p; ineof = 0; bstack = 0; nfiles = 0; lastfile = 0; addfile(mkfile(strdup(in), 1, 0, -1, nil, 0, -1)); bin = bins[bstack]; lineno = 1; linepos = Linestart; secpy(srcdir, srcdir+MaxPath, in); p = strrchr(srcdir, '/'); if(p == nil) srcdir[0] = '\0'; else p[1] = '\0'; } static int Getc(void) { int c; if(ineof) return Beof; c = BGETC(bin); if(c == Beof) ineof = 1; linepos++; return c; } static void unGetc(void) { if(ineof) return; Bungetc(bin); linepos--; } static int getrune(void) { int c; if(ineof) return Beof; c = Bgetrune(bin); if(c == Beof) ineof = 1; linepos++; return c; } static void ungetrune(void) { if(ineof) return; Bungetrune(bin); linepos--; } void addinclude(char *s) { int i; for(i = 0; i < MaxIncPath; i++){ if(incpath[i] == 0){ incpath[i] = s; return; } } fatal("out of include path space"); } File* mkfile(char *name, int abs, int off, int in, char *act, int actoff, int sbl) { File *f; f = allocmem(sizeof *f); f->name = name; f->abs = abs; f->off = off; f->in = in; f->act = act; f->actoff = actoff; f->sbl = sbl; return f; } int addfile(File *f) { if(nfiles >= lenfiles){ lenfiles = nfiles+32; files = reallocmem(files, lenfiles*sizeof(File*)); } files[nfiles] = f; return nfiles++; } void includef(Sym *file) { Biobuf *b; char *p, buf[MaxPath]; int i; linestack[bstack].line = lineno; linestack[bstack].pos = linepos; bstack++; if(bstack >= MaxInclude) fatal("%L: include file depth too great", curline()); p = ""; if(file->name[0] != '/') p = srcdir; seprint(buf, buf+sizeof(buf), "%s%s", p, file->name); b = Bopen(buf, OREAD); for(i = 0; b == nil && i < MaxIncPath && incpath[i] != nil && file->name[0] != '/'; i++){ seprint(buf, buf+sizeof(buf), "%s/%s", incpath[i], file->name); b = Bopen(buf, OREAD); } bins[bstack] = b; if(bins[bstack] == nil){ yyerror("can't include %s: %r", file->name); bstack--; }else{ addfile(mkfile(strdup(buf), lineno+1, -lineno, lineno, nil, 0, -1)); lineno++; linepos = Linestart; } bin = bins[bstack]; } /* * we hit eof in the current file * revert to the file which included it. */ static void popinclude(void) { Fline fl; File *f; int oline, opos, ln; ineof = 0; bstack--; bin = bins[bstack]; oline = linestack[bstack].line; opos = linestack[bstack].pos; fl = fline(oline); f = fl.file; ln = fl.line; lineno++; linepos = opos; addfile(mkfile(f->name, lineno, ln-lineno, f->in, f->act, f->actoff, -1)); } /* * convert an absolute Line into a file and line within the file */ Fline fline(int absline) { Fline fl; int l, r, m, s; if(absline < files[lastfile]->abs || lastfile+1 < nfiles && absline >= files[lastfile+1]->abs){ lastfile = 0; l = 0; r = nfiles - 1; while(l <= r){ m = (r + l) / 2; s = files[m]->abs; if(s <= absline){ l = m + 1; lastfile = m; }else r = m - 1; } } fl.file = files[lastfile]; fl.line = absline + files[lastfile]->off; return fl; } /* * read a comment */ static int lexcom(void) { File *f; char buf[StrSize], *s, *t, *act; int i, n, c, actline; i = 0; while((c = Getc()) != '\n'){ if(c == Beof) return -1; if(i < sizeof(buf)-1) buf[i++] = c; } buf[i] = 0; lineno++; linepos = Linestart; if(strncmp(buf, "line ", 5) != 0 && strncmp(buf, "line\t", 5) != 0) return 0; for(s = buf+5; *s == ' ' || *s == '\t'; s++) ; if(!(cmap(*s) & Mdigit)) return 0; n = 0; for(; cmap(c = *s) & Mdigit; s++) n = n * 10 + c - '0'; for(; *s == ' ' || *s == '\t'; s++) ; if(*s != '"') return 0; s++; t = strchr(s, '"'); if(t == nil || t[1] != '\0') return 0; *t = '\0'; f = files[nfiles - 1]; if(n == f->off+lineno && strcmp(s, f->name) == 0) return 1; act = f->name; actline = lineno + f->off; if(f->act != nil){ actline += f->actoff; act = f->act; } addfile(mkfile(strdup(s), lineno, n-lineno, f->in, act, actline - n, -1)); return 1; } Line curline(void) { Line line; line.line = lineno; line.pos = linepos; return line; } int lineconv(Fmt *f) { Fline fl; File *file; Line inl, line; char buf[StrSize], *s; line = va_arg(f->args, Line); if(line.line < 0) return fmtstrcpy(f, "<noline>"); fl = fline(line.line); file = fl.file; s = seprint(buf, buf+sizeof(buf), "%s:%d", file->name, fl.line); if(file->act != nil) s = seprint(s, buf+sizeof(buf), " [ %s:%d ]", file->act, file->actoff+fl.line); if(file->in >= 0){ inl.line = file->in; inl.pos = 0; seprint(s, buf+sizeof(buf), ": %L", inl); } return fmtstrcpy(f, buf); } static char* posconv(char *s, char *e, Line line) { Fline fl; if(line.line < 0) return secpy(s, e, "nopos"); fl = fline(line.line); return seprint(s, e, "%s:%d.%d", fl.file->name, fl.line, line.pos); } int srcconv(Fmt *f) { Src src; char buf[StrSize], *s; src = va_arg(f->args, Src); s = posconv(buf, buf+sizeof(buf), src.start); s = secpy(s, buf+sizeof(buf), ","); posconv(s, buf+sizeof(buf), src.stop); return fmtstrcpy(f, buf); } int lexid(int c) { Sym *sym; char id[StrSize*UTFmax+1], *p; Rune r; int i, t; p = id; i = 0; for(;;){ if(i < StrSize){ if(c < Runeself) *p++ = c; else{ r = c; p += runetochar(p, &r); } i++; } c = getrune(); if(c == Beof || !(cmap(c) & (Malpha|Mdigit))){ ungetrune(); break; } } *p = '\0'; sym = enter(id, Lid); t = sym->token; if(t == Lid || t == Ltid) yylval.tok.v.idval = sym; return t; } Long strtoi(char *t, int base) { char *s; Long v; int c, neg, ck; neg = 0; if(t[0] == '-'){ neg = 1; t++; }else if(t[0] == '+') t++; v = 0; for(s = t; c = *s; s++){ ck = cmap(c); if(ck & Mdigit) c -= '0'; else if(ck & Mlower) c = c - 'a' + 10; else if(ck & Mupper) c = c - 'A' + 10; if(c >= base){ yyerror("digit '%c' not radix %d", *s, base); return -1; } v = v * base + c; } if(neg) return -v; return v; } static int digit(int c, int base) { int cc, ck; cc = c; ck = cmap(c); if(ck & Mdigit) c -= '0'; else if(ck & Mlower) c = c - 'a' + 10; else if(ck & Mupper) c = c - 'A' + 10; else if(ck & Munder) {} else return -1; if(c >= base) yyerror("digit '%c' not radix %d", cc, base); return c; } double strtodb(char *t, int base) { double num, dem; int neg, eneg, dig, exp, c, d; num = 0; neg = 0; dig = 0; exp = 0; eneg = 0; c = *t++; if(c == '-' || c == '+'){ if(c == '-') neg = 1; c = *t++; } while((d = digit(c, base)) >= 0){ num = num*base + d; c = *t++; } if(c == '.') c = *t++; while((d = digit(c, base)) >= 0){ num = num*base + d; dig++; c = *t++; } if(c == 'e' || c == 'E'){ c = *t++; if(c == '-' || c == '+'){ if(c == '-'){ dig = -dig; eneg = 1; } c = *t++; } while((d = digit(c, base)) >= 0){ exp = exp*base + d; c = *t++; } } exp -= dig; if(exp < 0){ exp = -exp; eneg = !eneg; } dem = rpow(base, exp); if(eneg) num /= dem; else num *= dem; if(neg) return -num; return num; } /* * parse a numeric identifier * format [0-9]+(r[0-9A-Za-z]+)? * or ([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)? */ int lexnum(int c) { char buf[StrSize], *base; enum { Int, Radix, RadixSeen, Frac, ExpSeen, ExpSignSeen, Exp, FracB } state; double d; Long v; int i, ck; i = 0; buf[i++] = c; state = Int; if(c == '.') state = Frac; base = nil; for(;;){ c = Getc(); if(c == Beof){ yyerror("end of file in numeric constant"); return Leof; } ck = cmap(c); switch(state){ case Int: if(ck & Mdigit) break; if(ck & Mexp){ state = ExpSeen; break; } if(ck & Mradix){ base = &buf[i]; state = RadixSeen; break; } if(c == '.'){ state = Frac; break; } goto done; case RadixSeen: case Radix: if(ck & (Mdigit|Malpha)){ state = Radix; break; } if(c == '.'){ state = FracB; break; } goto done; case Frac: if(ck & Mdigit) break; if(ck & Mexp) state = ExpSeen; else goto done; break; case FracB: if(ck & (Mdigit|Malpha)) break; goto done; case ExpSeen: if(ck & Msign){ state = ExpSignSeen; break; } /* fall through */ case ExpSignSeen: case Exp: if(ck & Mdigit){ state = Exp; break; } goto done; } if(i < StrSize-1) buf[i++] = c; } done: buf[i] = 0; unGetc(); switch(state){ default: yyerror("malformed numerical constant '%s'", buf); yylval.tok.v.ival = 0; return Lconst; case Radix: *base++ = '\0'; v = strtoi(buf, 10); if(v < 0) break; if(v < 2 || v > 36){ yyerror("radix '%s' must be between 2 and 36", buf); break; } v = strtoi(base, v); break; case Int: v = strtoi(buf, 10); break; case Frac: case Exp: d = strtod(buf, nil); yylval.tok.v.rval = d; return Lrconst; case FracB: *base++ = '\0'; v = strtoi(buf, 10); if(v < 0) break; if(v < 2 || v > 36){ yyerror("radix '%s' must be between 2 and 36", buf); break; } d = strtodb(base, v); yylval.tok.v.rval = d; return Lrconst; } yylval.tok.v.ival = v; return Lconst; } int escchar(void) { char buf[4+1]; int c, i; c = getrune(); if(c == Beof) return Beof; if(c == 'u'){ for(i = 0; i < 4; i++){ c = getrune(); if(c == Beof || !(cmap(c) & (Mdigit|Mhex))){ yyerror("malformed \\u escape sequence"); ungetrune(); break; } buf[i] = c; } buf[i] = 0; return strtoul(buf, 0, 16); } if(c < 256 && (i = escmap[c]) >= 0) return i; yyerror("unrecognized escape \\%C", c); return c; } void lexstring(void) { char *str; int c; Rune r; int len, alloc; alloc = 32; len = 0; str = allocmem(alloc * sizeof(str)); for(;;){ c = getrune(); switch(c){ case '\\': c = escchar(); if(c != Beof) break; /* fall through */ case Beof: yyerror("end of file in string constant"); yylval.tok.v.idval = enterstring(str, len); return; case '\n': yyerror("newline in string constant"); lineno++; linepos = Linestart; yylval.tok.v.idval = enterstring(str, len); return; case '"': yylval.tok.v.idval = enterstring(str, len); return; } while(len+UTFmax+1 >= alloc){ alloc += 32; str = reallocmem(str, alloc * sizeof(str)); } r = c; len += runetochar(&str[len], &r); str[len] = '\0'; } } static int lex(void) { int c; loop: yylval.tok.src.start.line = lineno; yylval.tok.src.start.pos = linepos; c = getrune(); /* ehg: outside switch() to avoid bug in VisualC++5.0 */ switch(c){ case Beof: Bterm(bin); if(bstack == 0) return Leof; popinclude(); break; case '#': if(lexcom() < 0){ Bterm(bin); if(bstack == 0) return Leof; popinclude(); } break; case '\n': lineno++; linepos = Linestart; goto loop; case ' ': case '\t': case '\r': case '\v': case '\f': goto loop; case '"': lexstring(); return Lsconst; case '\'': c = getrune(); if(c == '\\') c = escchar(); if(c == Beof){ yyerror("end of file in character constant"); return Beof; }else yylval.tok.v.ival = c; c = Getc(); if(c != '\'') { yyerror("missing closing '"); unGetc(); } return Lconst; case '(': case ')': case '[': case ']': case '{': case '}': case ',': case ';': case '~': return c; case ':': c = Getc(); if(c == ':') return Lcons; if(c == '=') return Ldeclas; unGetc(); return ':'; case '.': c = Getc(); unGetc(); if(c != Beof && (cmap(c) & Mdigit)) return lexnum('.'); return '.'; case '|': c = Getc(); if(c == '=') return Loreq; if(c == '|') return Loror; unGetc(); return '|'; case '&': c = Getc(); if(c == '=') return Landeq; if(c == '&') return Landand; unGetc(); return '&'; case '^': c = Getc(); if(c == '=') return Lxoreq; unGetc(); return '^'; case '*': c = Getc(); if(c == '=') return Lmuleq; if(c == '*'){ c = Getc(); if(c == '=') return Lexpeq; unGetc(); return Lexp; } unGetc(); return '*'; case '/': c = Getc(); if(c == '=') return Ldiveq; unGetc(); return '/'; case '%': c = Getc(); if(c == '=') return Lmodeq; unGetc(); return '%'; case '=': c = Getc(); if(c == '=') return Leq; if(c == '>') return Llabs; unGetc(); return '='; case '!': c = Getc(); if(c == '=') return Lneq; unGetc(); return '!'; case '>': c = Getc(); if(c == '=') return Lgeq; if(c == '>'){ c = Getc(); if(c == '=') return Lrsheq; unGetc(); return Lrsh; } unGetc(); return '>'; case '<': c = Getc(); if(c == '=') return Lleq; if(c == '-') return Lcomm; if(c == '<'){ c = Getc(); if(c == '=') return Llsheq; unGetc(); return Llsh; } unGetc(); return '<'; case '+': c = Getc(); if(c == '=') return Laddeq; if(c == '+') return Linc; unGetc(); return '+'; case '-': c = Getc(); if(c == '=') return Lsubeq; if(c == '-') return Ldec; if(c == '>') return Lmdot; unGetc(); return '-'; case '1': case '2': case '3': case '4': case '5': case '0': case '6': case '7': case '8': case '9': return lexnum(c); default: if(cmap(c) & Malpha) return lexid(c); yyerror("unknown character %c", c); break; } goto loop; } int yylex(void) { int t; t = lex(); yylval.tok.src.stop.line = lineno; yylval.tok.src.stop.pos = linepos; lasttok = t; lastyylval = yylval; return t; } static char* toksp(int t) { Keywd *k; static char buf[256]; switch(t){ case Lconst: snprint(buf, sizeof(buf), "%lld", lastyylval.tok.v.ival); return buf; case Lrconst: snprint(buf, sizeof(buf), "%f", lastyylval.tok.v.rval); return buf; case Lsconst: snprint(buf, sizeof(buf), "\"%s\"", lastyylval.tok.v.idval->name); return buf; case Ltid: case Lid: return lastyylval.tok.v.idval->name; } for(k = keywords; k->name != nil; k++) if(t == k->token) return k->name; for(k = tokwords; k->name != nil; k++) if(t == k->token) return k->name; if(t < 0 || t > 255) fatal("bad token %d in toksp()", t); buf[0] = t; buf[1] = '\0'; return buf; } Sym* enterstring(char *str, int n) { Sym *s; char *p, *e; ulong h; int c, c0; e = str + n; h = 0; for(p = str; p < e; p++){ c = *p; c ^= c << 6; h += (c << 11) ^ (c >> 1); c = *p; h ^= (c << 14) + (c << 7) + (c << 4) + c; } c0 = str[0]; h %= HashSize; for(s = strings[h]; s != nil; s = s->next){ if(s->name[0] == c0 && s->len == n && memcmp(s->name, str, n) == 0){ free(str); return s; } } if(n == 0) return enter("", 0); s = allocmem(sizeof(Sym)); memset(s, 0, sizeof(Sym)); s->name = str; s->len = n; s->next = strings[h]; strings[h] = s; return s; } int symcmp(Sym *s, Sym *t) { int n, c; n = s->len; if(n > t->len) n = t->len; c = memcmp(s->name, t->name, n); if(c == 0) return s->len - t->len; return c; } Sym* stringcat(Sym *s, Sym *t) { char *str; int n; n = s->len + t->len; str = allocmem(n+1); memmove(str, s->name, s->len); memmove(str+s->len, t->name, t->len); str[n] = '\0'; return enterstring(str, n); } Sym* enter(char *name, int token) { Sym *s; char *p; ulong h; int c0, c, n; c0 = name[0]; h = 0; for(p = name; c = *p; p++){ c ^= c << 6; h += (c << 11) ^ (c >> 1); c = *p; h ^= (c << 14) + (c << 7) + (c << 4) + c; } n = p - name; h %= HashSize; for(s = symbols[h]; s != nil; s = s->next) if(s->name[0] == c0 && strcmp(s->name, name) == 0) return s; s = allocmem(sizeof(Sym)); memset(s, 0, sizeof(Sym)); s->hash = h; s->name = allocmem(n+1); memmove(s->name, name, n+1); if(token == 0) token = Lid; s->token = token; s->next = symbols[h]; s->len = n; symbols[h] = s; return s; } char* stringpr(char *buf, char *end, Sym *sym) { char sb[30], *s, *p; int i, c, n; s = sym->name; n = sym->len; if(n > 10) n = 10; p = sb; *p++ = '"'; for(i = 0; i < n; i++){ c = s[i]; switch(c){ case '\\': case '"': case '\n': case '\r': case '\t': case '\b': case '\a': case '\v': case '\0': *p++ = '\\'; *p++ = unescmap[c]; break; default: *p++ = c; break; } } if(n != sym->len){ *p++ = '.'; *p++ = '.'; *p++ = '.'; } *p++ = '"'; *p = 0; return secpy(buf, end, sb); } void warn(Line line, char *fmt, ...) { char buf[4096]; va_list arg; if(errors || !dowarn) return; va_start(arg, fmt); vseprint(buf, buf+sizeof(buf), fmt, arg); va_end(arg); fprint(2, "%L: warning: %s\n", line, buf); } void nwarn(Node *n, char *fmt, ...) { char buf[4096]; va_list arg; if(errors || !dowarn) return; va_start(arg, fmt); vseprint(buf, buf+sizeof(buf), fmt, arg); va_end(arg); fprint(2, "%L: warning: %s\n", n->src.start, buf); } void error(Line line, char *fmt, ...) { char buf[4096]; va_list arg; errors++; if(errors >= maxerr){ if(errors == maxerr) fprint(2, "too many errors, stopping\n"); return; } va_start(arg, fmt); vseprint(buf, buf+sizeof(buf), fmt, arg); va_end(arg); fprint(2, "%L: %s\n", line, buf); } void nerror(Node *n, char *fmt, ...) { char buf[4096]; va_list arg; errors++; if(errors >= maxerr){ if(errors == maxerr) fprint(2, "too many errors, stopping\n"); return; } va_start(arg, fmt); vseprint(buf, buf+sizeof(buf), fmt, arg); va_end(arg); fprint(2, "%L: %s\n", n->src.start, buf); } void yyerror(char *fmt, ...) { char buf[4096]; va_list arg; errors++; if(errors >= maxerr){ if(errors == maxerr) fprint(2, "too many errors, stopping\n"); return; } va_start(arg, fmt); vseprint(buf, buf+sizeof(buf), fmt, arg); va_end(arg); if(lasttok != 0) fprint(2, "%L: near ` %s ` : %s\n", curline(), toksp(lasttok), buf); else fprint(2, "%L: %s\n", curline(), buf); } void fatal(char *fmt, ...) { char buf[4096]; va_list arg; if(errors == 0 || isfatal){ va_start(arg, fmt); vseprint(buf, buf+sizeof(buf), fmt, arg); va_end(arg); fprint(2, "fatal limbo compiler error: %s\n", buf); } if(bout != nil) remove(outfile); if(bsym != nil) remove(symfile); if(isfatal) abort(); exits(buf); } int gfltconv(Fmt *f) { double d; char buf[32]; d = va_arg(f->args, double); g_fmt(buf, d, 'e'); return fmtstrcpy(f, buf); } char* secpy(char *p, char *e, char *s) { int c; if(p == e){ p[-1] = '\0'; return p; } for(; c = *s; s++){ *p++ = c; if(p == e){ p[-1] = '\0'; return p; } } *p = '\0'; return p; } char* seprint(char *buf, char *end, char *fmt, ...) { va_list arg; if(buf == end) return buf; va_start(arg, fmt); buf = vseprint(buf, end, fmt, arg); va_end(arg); return buf; } void* allocmem(ulong n) { void *p; p = malloc(n); if(p == nil) fatal("out of memory"); return p; } void* reallocmem(void *p, ulong n) { if(p == nil) p = malloc(n); else p = realloc(p, n); if(p == nil) fatal("out of memory"); return p; } between 2 and 36", buf); break; } v = strtoi(base, v); break; case Int: v = strtoi(buf, 10); break; case Frac: case Exp: d = strtod(buf, nil); yylval.tok.v.rval = d; return Lrconst; case FracB: *base++ = '\0'; v = strtoi(buf, 10); if(v < 0) break; if(v < 2 || v > 36){ yyerror("radix '%s' must be between 2 and 36", old_contrib//root/sys/src/cmd/limbo/limbo/limbo.h��������������������������������������������������� 664 � 0 � 0 � 33433 10745510177 21140�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <u.h> #include <libc.h> #include <bio.h> #include "isa.h" #include "mathi.h" /* internal dis ops */ #define IEXC MAXDIS #define IEXC0 (MAXDIS+1) #define INOOP (MAXDIS+2) /* temporary */ #define LDT 1 #ifndef Extern #define Extern extern #endif #define YYMAXDEPTH 200 typedef struct Addr Addr; typedef struct Case Case; typedef struct Decl Decl; typedef struct Desc Desc; typedef struct Dlist Dlist; typedef struct Except Except; typedef struct File File; typedef struct Fline Fline; typedef struct Inst Inst; typedef struct Label Label; typedef struct Line Line; typedef struct Node Node; typedef struct Ok Ok; typedef struct Src Src; typedef struct Sym Sym; typedef struct Szal Szal; typedef struct Tattr Tattr; typedef struct Teq Teq; typedef struct Tpair Tpair; typedef struct Type Type; typedef struct Typelist Typelist; typedef double Real; typedef vlong Long; enum { STemp = NREG * IBY2WD, RTemp = STemp+IBY2WD, DTemp = RTemp+IBY2WD, MaxTemp = DTemp+IBY2WD, MaxReg = 1<<16, MaxAlign = IBY2LG, StrSize = 256, NumSize = 32, /* max length of printed */ MaxIncPath = 32, /* max directories in include path */ MaxScope = 64, /* max nested {} */ MaxInclude = 32, /* max nested include "" */ ScopeBuiltin = 0, ScopeNils = 1, ScopeGlobal = 2 }; /* * return tuple from expression type checking */ struct Ok { int ok; int allok; }; /* * return tuple from type sizing */ struct Szal { int size; int align; }; /* * return tuple for file/line numbering */ struct Fline { File *file; int line; }; struct File { char *name; int abs; /* absolute line of start of the part of file */ int off; /* offset to line in the file */ int in; /* absolute line where included */ char *act; /* name of real file with #line fake file */ int actoff; /* offset from fake line to real line */ int sbl; /* symbol file number */ }; struct Line { int line; int pos; /* character within the line */ }; struct Src { Line start; Line stop; }; enum { Aimm, /* immediate */ Amp, /* global */ Ampind, /* global indirect */ Afp, /* activation frame */ Afpind, /* frame indirect */ Apc, /* branch */ Adesc, /* type descriptor immediate */ Aoff, /* offset in module description table */ Anoff, /* above encoded as -ve */ Aerr, /* error */ Anone, /* no operand */ Aldt, /* linkage descriptor table immediate */ Aend }; struct Addr { long reg; long offset; Decl *decl; }; struct Inst { Src src; ushort op; long pc; uchar reach; /* could a control path reach this instruction? */ uchar sm; /* operand addressing modes */ uchar mm; uchar dm; Addr s; /* operands */ Addr m; Addr d; Inst *branch; /* branch destination */ Inst *next; int block; /* blocks nested inside */ }; struct Case { int nlab; int nsnd; long offset; /* offset in mp */ Label *labs; Node *wild; /* if nothing matches */ Inst *iwild; }; struct Label { Node *node; char isptr; /* true if the labelled alt channel is a pointer */ Node *start; /* value in range [start, stop) => code */ Node *stop; Inst *inst; }; enum { Dtype, Dfn, Dglobal, Darg, Dlocal, Dconst, Dfield, Dtag, /* pick tags */ Dimport, /* imported identifier */ Dunbound, /* unbound identified */ Dundef, Dwundef, /* undefined, but don't whine */ Dend }; struct Decl { Src src; /* where declaration */ Sym *sym; uchar store; /* storage class */ uchar nid; /* block grouping for locals */ uchar caninline; /* inline function */ uchar das; /* declared with := */ Decl *dot; /* parent adt or module */ Type *ty; int refs; /* number of references */ long offset; int tag; /* union tag */ uchar scope; /* in which it was declared */ uchar handler; /* fn has exception handler in body */ Decl *next; /* list in same scope, field or argument list, etc. */ Decl *old; /* declaration of the symbol in enclosing scope */ Node *eimport; /* expr from which imported */ Decl *importid; /* identifier imported */ Decl *timport; /* stack of identifiers importing a type */ Node *init; /* data initialization */ int tref; /* 1 => is a tmp; >=2 => tmp in use */ char cycle; /* can create a cycle */ char cyc; /* so labelled in source */ char cycerr; /* delivered an error message for cycle? */ char implicit; /* implicit first argument in an adt? */ Decl *iface; /* used external declarations in a module */ Decl *locals; /* locals for a function */ Decl *link; /* pointer to parent function or function argument or local share or parent type dec */ Inst *pc; /* start of function */ /* Inst *endpc; */ /* limit of function - unused */ Desc *desc; /* heap descriptor */ }; struct Desc { int id; /* dis type identifier */ uchar used; /* actually used in output? */ uchar *map; /* byte map of pointers */ long size; /* length of the object */ long nmap; /* length of good bytes in map */ Desc *next; }; struct Dlist { Decl *d; Dlist *next; }; struct Except { Inst *p1; /* first pc covered */ Inst *p2; /* last pc not covered */ Case *c; /* exception case instructions */ Decl *d; /* exception definition if any */ Node *zn; /* list of nodes to zero in handler */ Desc *desc; /* descriptor map for above */ int ne; /* number of exceptions (ie not strings) in case */ Except *next; }; struct Sym { ushort token; char *name; int len; int hash; Sym *next; Decl *decl; Decl *unbound; /* place holder for unbound symbols */ }; /* * ops for nodes */ enum { Oadd = 1, Oaddas, Oadr, Oadtdecl, Oalt, Oand, Oandand, Oandas, Oarray, Oas, Obreak, Ocall, Ocase, Ocast, Ochan, Ocomma, Ocomp, Ocondecl, Ocons, Oconst, Ocont, Odas, Odec, Odiv, Odivas, Odo, Odot, Oelem, Oeq, Oexcept, Oexdecl, Oexit, Oexp, Oexpas, Oexstmt, Ofielddecl, Ofnptr, Ofor, Ofunc, Ogeq, Ogt, Ohd, Oif, Oimport, Oinc, Oind, Oindex, Oinds, Oindx, Oinv, Ojmp, Olabel, Olen, Oleq, Oload, Olsh, Olshas, Olt, Omdot, Omod, Omodas, Omoddecl, Omul, Omulas, Oname, Oneg, Oneq, Onot, Onothing, Oor, Ooras, Ooror, Opick, Opickdecl, Opredec, Opreinc, Oraise, Orange, Orcv, Oref, Oret, Orsh, Orshas, Oscope, Oself, Oseq, Oslice, Osnd, Ospawn, Osub, Osubas, Otagof, Otl, Otuple, Otype, Otypedecl, Oused, Ovardecl, Ovardecli, Owild, Oxor, Oxoras, Oend }; /* * moves */ enum { Mas, Mcons, Mhd, Mtl, Mend }; /* * addressability */ enum { Rreg, /* v(fp) */ Rmreg, /* v(mp) */ Roff, /* $v */ Rnoff, /* $v encoded as -ve */ Rdesc, /* $v */ Rdescp, /* $v */ Rconst, /* $v */ Ralways, /* preceeding are always addressable */ Radr, /* v(v(fp)) */ Rmadr, /* v(v(mp)) */ Rcant, /* following are not quite addressable */ Rpc, /* branch address */ Rmpc, /* cross module branch address */ Rareg, /* $v(fp) */ Ramreg, /* $v(mp) */ Raadr, /* $v(v(fp)) */ Ramadr, /* $v(v(mp)) */ Rldt, /* $v */ Rend }; #define PARENS 1 #define TEMP 2 #define FNPTRA 4 /* argument */ #define FNPTR2 8 /* 2nd parameter */ #define FNPTRN 16 /* use -ve offset */ #define FNPTR (FNPTRA|FNPTR2|FNPTRN) struct Node { Src src; uchar op; uchar addable; uchar flags; uchar temps; Node *left; Node *right; Type *ty; Decl *decl; Long val; /* for Oconst */ Real rval; /* for Oconst */ }; enum { /* * types visible to limbo */ Tnone = 0, Tadt, Tadtpick, /* pick case of an adt */ Tarray, Tbig, /* 64 bit int */ Tbyte, /* 8 bit unsigned int */ Tchan, Treal, Tfn, Tint, /* 32 bit int */ Tlist, Tmodule, Tref, Tstring, Ttuple, Texception, Tfix, Tpoly, /* * internal use types */ Tainit, /* array initializers */ Talt, /* alt channels */ Tany, /* type of nil */ Tarrow, /* unresolved ty->id types */ Tcase, /* case labels */ Tcasel, /* case big labels */ Tcasec, /* case string labels */ Tdot, /* unresolved ty.id types */ Terror, Tgoto, /* goto labels */ Tid, /* id with unknown type */ Tiface, /* module interface */ Texcept, /* exception handler tables */ Tinst, /* instantiated adt */ Tend }; enum { OKbind = 1 << 0, /* type decls are bound */ OKverify = 1 << 1, /* type looks ok */ OKsized = 1 << 2, /* started figuring size */ OKref = 1 << 3, /* recorded use of type */ OKclass = 1 << 4, /* equivalence class found */ OKcyc = 1 << 5, /* checked for cycles */ OKcycsize = 1 << 6, /* checked for cycles and size */ OKmodref = 1 << 7, /* started checking for a module handle */ OKmask = 0xff, /* * recursive marks */ TReq = 1 << 0, TRcom = 1 << 1, TRcyc = 1 << 2, TRvis = 1 << 3, }; /* type flags */ #define FULLARGS 1 /* all hidden args added */ #define INST 2 /* instantiated adt */ #define CYCLIC 4 /* cyclic type */ #define POLY 8 /* polymorphic types inside */ #define NOPOLY 16 /* no polymorphic types inside */ struct Type { Src src; uchar kind; uchar varargs; /* if a function, ends with vargs? */ uchar ok; /* set when type is verified */ uchar linkall; /* put all iface fns in external linkage? */ uchar rec; /* in the middle of recursive type */ uchar cons; /* exception constant */ uchar align; /* alignment in bytes */ uchar flags; int sbl; /* slot in .sbl adt table */ long sig; /* signature for dynamic type check */ long size; /* storage required, in bytes */ Decl *decl; Type *tof; Decl *ids; Decl *tags; /* tagged fields in an adt */ Decl *polys; /* polymorphic fields in fn or adt */ Case *cse; /* case or goto labels */ Type *teq; /* temporary equiv class for equiv checking */ Type *tcom; /* temporary equiv class for compat checking */ Teq *eq; /* real equiv class */ Node *val; /* for Tfix, Tfn, Tadt only */ union { Node *eraises; /* for Tfn only */ Typelist *tlist; /* for Tinst only */ Tpair *tmap; /* for Tadt only */ } u; }; /* * type equivalence classes */ struct Teq { int id; /* for signing */ Type *ty; /* an instance of the class */ Teq *eq; /* used to link eq sets */ }; struct Tattr { char isptr; char refable; char conable; char big; char vis; /* type visible to users */ }; enum { Sother, Sloop, Sscope }; struct Tpair { Type *t1; Type *t2; Tpair *nxt; }; struct Typelist { Type *t; Typelist *nxt; }; Extern Decl **adts; Extern Sym *anontupsym; /* name assigned to all anonymouse tuples */ Extern int arrayz; Extern int asmsym; /* generate symbols in assembly language? */ Extern Biobuf *bins[MaxInclude]; Extern int blocks; Extern Biobuf *bout; /* output file */ Extern Biobuf *bsym; /* symbol output file; nil => no sym out */ Extern double canonnan; /* standard nan */ Extern uchar casttab[Tend][Tend]; /* instruction to cast from [1] to [2] */ Extern long constval; Extern Decl *curfn; Extern char debug[256]; Extern Desc *descriptors; /* list of all possible descriptors */ Extern int dontcompile; /* dis header flag */ Extern int dowarn; Extern char *emitcode; /* emit stub routines for system module functions */ Extern int emitdyn; /* emit stub routines as above but for dynamic modules */ Extern int emitstub; /* emit type and call frames for system modules */ Extern char *emittab; /* emit table of runtime functions for this module */ Extern int errors; Extern char escmap[256]; Extern Inst *firstinst; Extern long fixss; /* set extent from command line */ Extern Decl *fndecls; Extern Decl **fns; Extern int gendis; /* generate dis or asm? */ Extern Decl *impdecl; /* id of implementation module or union if many */ Extern Dlist *impdecls; /* id(s) of implementation module(s) */ /* Extern Sym *impmod; */ /* name of implementation module */ Extern Decl *impmods; /* name of implementation module(s) */ Extern Decl *iota; Extern uchar isbyteinst[256]; Extern int isfatal; Extern int isrelop[Oend]; Extern uchar isused[Oend]; Extern Inst *lastinst; Extern int lenadts; Extern int maxerr; Extern int maxlabdep; /* maximum nesting of breakable/continuable statements */ Extern long maxstack; /* max size of a stack frame called */ Extern int mustcompile; /* dis header flag */ Extern int nadts; Extern int newfnptr; /* ISELF and -ve indices */ Extern int nfns; Extern Decl *nildecl; /* declaration for limbo's nil */ Extern int nlabel; Extern int dontinline; Extern Line noline; Extern Src nosrc; Extern uchar opcommute[Oend]; Extern int opind[Tend]; Extern uchar oprelinvert[Oend]; Extern int optims; Extern char *outfile; Extern Type *precasttab[Tend][Tend]; Extern int scope; Extern Decl *selfdecl; /* declaration for limbo's self */ Extern uchar sideeffect[Oend]; Extern char *signdump; /* dump sig for this fn */ Extern int superwarn; Extern char *symfile; Extern Type *tany; Extern Type *tbig; Extern Type *tbyte; Extern Type *terror; Extern Type *tint; Extern Type *tnone; Extern Type *treal; Extern Node *tree; Extern Type *tstring; Extern Type *texception; Extern Type *tunknown; Extern Type *tfnptr; Extern Type *rtexception; Extern char unescmap[256]; Extern Src unifysrc; Extern Node znode; extern int *blockstack; extern int blockdep; extern int nblocks; extern File **files; extern int nfiles; extern uchar chantab[Tend]; extern uchar disoptab[Oend+1][7]; extern char *instname[]; extern char *kindname[Tend]; extern uchar movetab[Mend][Tend]; extern char *opname[]; extern int setisbyteinst[]; extern int setisused[]; extern int setsideeffect[]; extern char *storename[Dend]; extern int storespace[Dend]; extern Tattr tattr[Tend]; #include "fns.h" #pragma varargck type "D" Decl* #pragma varargck type "I" Inst* #pragma varargck type "K" Decl* #pragma varargck type "k" Decl* #pragma varargck type "L" Line #pragma varargck type "M" Desc* #pragma varargck type "n" Node* #pragma varargck type "O" int #pragma varargck type "O" uint #pragma varargck type "g" double #pragma varargck type "Q" Node* #pragma varargck type "R" Type* #pragma varargck type "T" Type* #pragma varargck type "t" Type* #pragma varargck type "U" Src #pragma varargck type "v" Node* #pragma varargck type "V" Node* ist, etc. */ Decl *old; /* declaration of the symbol in enclosing scope */ Node *eimport; /* expr from which imported */ Decl *importid; /* identifier imported */ Decl *timport; /* stack of identifiers importing a type old_contrib//root/sys/src/cmd/limbo/limbo/limbo.y��������������������������������������������������� 664 � 0 � 0 � 77064 10542012324 21153�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%{ #include "limbo.h" %} %union { struct{ Src src; union{ Sym *idval; Long ival; Real rval; }v; }tok; Decl *ids; Node *node; Type *type; Typelist *types; } %type <type> type fnarg fnargret fnargretp adtk fixtype iditype dotiditype %type <ids> ids rids nids nrids tuplist forms ftypes ftype bclab bctarg ptags rptags polydec %type <node> zexp exp monexp term elist zelist celist idatom idterms idterm idlist initlist elemlist elem qual decl topdecls topdecl fndef fbody stmt stmts qstmts qbodies cqstmts cqbodies mdecl adtdecl mfield mfields field fields fnname pstmts pbodies pqual pfields pfbody pdecl dfield dfields eqstmts eqbodies idexc edecl raises tpoly tpolys texp export exportlist forpoly %type <types> types %right <tok.src> '=' Landeq Loreq Lxoreq Llsheq Lrsheq Laddeq Lsubeq Lmuleq Ldiveq Lmodeq Lexpeq Ldeclas %left <tok.src> Lload %left <tok.src> Loror %left <tok.src> Landand %right <tok.src> Lcons %left <tok.src> '|' %left <tok.src> '^' %left <tok.src> '&' %left <tok.src> Leq Lneq %left <tok.src> '<' '>' Lleq Lgeq %left <tok.src> Llsh Lrsh %left <tok.src> '+' '-' %left <tok.src> '*' '/' '%' %right <tok.src> Lexp %right <tok.src> Lcomm %left <tok.src> '(' ')' '[' ']' Linc Ldec Lof Lref %right <tok.src> Lif Lelse Lfn ':' Lexcept Lraises %left <tok.src> Lmdot %left <tok.src> '.' %left <tok.src> Lto %left <tok.src> Lor %nonassoc <tok.v.rval> Lrconst %nonassoc <tok.v.ival> Lconst %nonassoc <tok.v.idval> Lid Ltid Lsconst %nonassoc <tok.src> Llabs Lnil '!' '~' Llen Lhd Ltl Ltagof '{' '}' ';' Limplement Limport Linclude Lcon Ltype Lmodule Lcyclic Ladt Larray Llist Lchan Lself Ldo Lwhile Lfor Lbreak Lalt Lcase Lpick Lcont Lreturn Lexit Lspawn Lraise Lfix Ldynamic %% prog : Limplement ids ';' { impmods = $2; } topdecls { tree = rotater($5); } | topdecls { impmods = nil; tree = rotater($1); } ; topdecls: topdecl | topdecls topdecl { if($1 == nil) $$ = $2; else if($2 == nil) $$ = $1; else $$ = mkbin(Oseq, $1, $2); } ; topdecl : error ';' { $$ = nil; } | decl | fndef | adtdecl ';' | mdecl ';' | idatom '=' exp ';' { $$ = mkbin(Oas, $1, $3); } | idterm '=' exp ';' { $$ = mkbin(Oas, $1, $3); } | idatom Ldeclas exp ';' { $$ = mkbin(Odas, $1, $3); } | idterm Ldeclas exp ';' { $$ = mkbin(Odas, $1, $3); } | idterms ':' type ';' { yyerror("illegal declaration"); $$ = nil; } | idterms ':' type '=' exp ';' { yyerror("illegal declaration"); $$ = nil; } ; idterms : idterm | idterms ',' idterm { $$ = mkbin(Oseq, $1, $3); } ; decl : Linclude Lsconst ';' { includef($2); $$ = nil; } | ids ':' Ltype type ';' { $$ = typedecl($1, $4); } | ids ':' Limport exp ';' { $$ = importdecl($4, $1); $$->src.start = $1->src.start; $$->src.stop = $5.stop; } | ids ':' type ';' { $$ = vardecl($1, $3); } | ids ':' type '=' exp ';' { $$ = mkbin(Ovardecli, vardecl($1, $3), varinit($1, $5)); } | ids ':' Lcon exp ';' { $$ = condecl($1, $4); } | edecl ; edecl : ids ':' Lexcept ';' { $$ = exdecl($1, nil); } | ids ':' Lexcept '(' tuplist ')' ';' { $$ = exdecl($1, revids($5)); } ; mdecl : ids ':' Lmodule '{' mfields '}' { $1->src.stop = $6.stop; $$ = moddecl($1, rotater($5)); } ; mfields : { $$ = nil; } | mfields mfield { if($1 == nil) $$ = $2; else if($2 == nil) $$ = $1; else $$ = mkn(Oseq, $1, $2); } | error { $$ = nil; } ; mfield : ids ':' type ';' { $$ = fielddecl(Dglobal, typeids($1, $3)); } | adtdecl ';' | ids ':' Ltype type ';' { $$ = typedecl($1, $4); } | ids ':' Lcon exp ';' { $$ = condecl($1, $4); } | edecl ; adtdecl : ids ':' Ladt polydec '{' fields '}' forpoly { $1->src.stop = $7.stop; $$ = adtdecl($1, rotater($6)); $$->ty->polys = $4; $$->ty->val = rotater($8); } | ids ':' Ladt polydec Lfor '{' tpolys '}' '{' fields '}' { $1->src.stop = $11.stop; $$ = adtdecl($1, rotater($10)); $$->ty->polys = $4; $$->ty->val = rotater($7); } ; forpoly : { $$ = nil; } | Lfor '{' tpolys '}' { $$ = $3; } ; fields : { $$ = nil; } | fields field { if($1 == nil) $$ = $2; else if($2 == nil) $$ = $1; else $$ = mkn(Oseq, $1, $2); } | error { $$ = nil; } ; field : dfield | pdecl | ids ':' Lcon exp ';' { $$ = condecl($1, $4); } ; dfields : { $$ = nil; } | dfields dfield { if($1 == nil) $$ = $2; else if($2 == nil) $$ = $1; else $$ = mkn(Oseq, $1, $2); } ; dfield : ids ':' Lcyclic type ';' { Decl *d; for(d = $1; d != nil; d = d->next) d->cyc = 1; $$ = fielddecl(Dfield, typeids($1, $4)); } | ids ':' type ';' { $$ = fielddecl(Dfield, typeids($1, $3)); } ; pdecl : Lpick '{' pfields '}' { $$ = $3; } ; pfields : pfbody dfields { $1->right->right = $2; $$ = $1; } | pfbody error { $$ = nil; } | error { $$ = nil; } ; pfbody : ptags Llabs { $$ = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, $1), nil)); typeids($1, mktype(&$1->src.start, &$1->src.stop, Tadtpick, nil, nil)); } | pfbody dfields ptags Llabs { $1->right->right = $2; $$ = mkn(Opickdecl, $1, mkn(Oseq, fielddecl(Dtag, $3), nil)); typeids($3, mktype(&$3->src.start, &$3->src.stop, Tadtpick, nil, nil)); } | pfbody error ptags Llabs { $$ = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, $3), nil)); typeids($3, mktype(&$3->src.start, &$3->src.stop, Tadtpick, nil, nil)); } ; ptags : rptags { $$ = revids($1); } ; rptags : Lid { $$ = mkids(&$<tok.src>1, $1, nil, nil); } | rptags Lor Lid { $$ = mkids(&$<tok.src>3, $3, nil, $1); } ; ids : rids { $$ = revids($1); } ; rids : Lid { $$ = mkids(&$<tok.src>1, $1, nil, nil); } | rids ',' Lid { $$ = mkids(&$<tok.src>3, $3, nil, $1); } ; fixtype : Lfix '(' exp ',' exp ')' { $$ = mktype(&$1.start, &$6.stop, Tfix, nil, nil); $$->val = mkbin(Oseq, $3, $5); } | Lfix '(' exp ')' { $$ = mktype(&$1.start, &$4.stop, Tfix, nil, nil); $$->val = $3; } ; types : type { $$ = addtype($1, nil); } | Lcyclic type { $$ = addtype($2, nil); $2->flags |= CYCLIC; } | types ',' type { $$ = addtype($3, $1); } | types ',' Lcyclic type { $$ = addtype($4, $1); $4->flags |= CYCLIC; } ; type : Ltid { $$ = mkidtype(&$<tok.src>1, $1); } | iditype { $$ = $1; } | dotiditype { $$ = $1; } | type Lmdot Lid { $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3); } | type Lmdot Lid '[' types ']' { $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3); $$ = mkinsttype(&$1->src, $$, $5); } | Lref type { $$ = mktype(&$1.start, &$2->src.stop, Tref, $2, nil); } | Lchan Lof type { $$ = mktype(&$1.start, &$3->src.stop, Tchan, $3, nil); } | '(' tuplist ')' { if($2->next == nil) $$ = $2->ty; else $$ = mktype(&$1.start, &$3.stop, Ttuple, nil, revids($2)); } | Larray Lof type { $$ = mktype(&$1.start, &$3->src.stop, Tarray, $3, nil); } | Llist Lof type { $$ = mktype(&$1.start, &$3->src.stop, Tlist, $3, nil); } | Lfn polydec fnargretp raises { $3->src.start = $1.start; $3->polys = $2; $3->u.eraises = $4; $$ = $3; } | fixtype /* | Lexcept { $$ = mktype(&$1.start, &$1.stop, Texception, nil, nil); $$->cons = 1; } | Lexcept '(' tuplist ')' { $$ = mktype(&$1.start, &$4.stop, Texception, nil, revids($3)); $$->cons = 1; } */ ; iditype : Lid { $$ = mkidtype(&$<tok.src>1, $1); } | Lid '[' types ']' { $$ = mkinsttype(&$<tok.src>1, mkidtype(&$<tok.src>1, $1), $3); } ; dotiditype : type '.' Lid { $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3); } | type '.' Lid '[' types ']' { $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3); $$ = mkinsttype(&$1->src, $$, $5); } ; tuplist : type { $$ = mkids(&$1->src, nil, $1, nil); } | tuplist ',' type { $$ = mkids(&$1->src, nil, $3, $1); } ; polydec : { $$ = nil; } | '[' ids ']' { $$ = polydecl($2); } ; fnarg : '(' forms ')' { $$ = mktype(&$1.start, &$3.stop, Tfn, tnone, $2); } | '(' '*' ')' { $$ = mktype(&$1.start, &$3.stop, Tfn, tnone, nil); $$->varargs = 1; } | '(' ftypes ',' '*' ')' { $$ = mktype(&$1.start, &$5.stop, Tfn, tnone, $2); $$->varargs = 1; } ; fnargret: fnarg %prec ':' { $$ = $1; } | fnarg ':' type { $1->tof = $3; $1->src.stop = $3->src.stop; $$ = $1; } ; fnargretp: fnargret %prec '=' { $$ = $1; } | fnargret Lfor '{' tpolys '}' { $$ = $1; $$->val = rotater($4); } ; forms : { $$ = nil; } | ftypes ; ftypes : ftype | ftypes ',' ftype { $$ = appdecls($1, $3); } ; ftype : nids ':' type { $$ = typeids($1, $3); } | nids ':' adtk { Decl *d; $$ = typeids($1, $3); for(d = $$; d != nil; d = d->next) d->implicit = 1; } | idterms ':' type { $$ = mkids(&$1->src, enter("junk", 0), $3, nil); $$->store = Darg; yyerror("illegal argument declaraion"); } | idterms ':' adtk { $$ = mkids(&$1->src, enter("junk", 0), $3, nil); $$->store = Darg; yyerror("illegal argument declaraion"); } ; nids : nrids { $$ = revids($1); } ; nrids : Lid { $$ = mkids(&$<tok.src>1, $1, nil, nil); $$->store = Darg; } | Lnil { $$ = mkids(&$1, nil, nil, nil); $$->store = Darg; } | nrids ',' Lid { $$ = mkids(&$<tok.src>3, $3, nil, $1); $$->store = Darg; } | nrids ',' Lnil { $$ = mkids(&$3, nil, nil, $1); $$->store = Darg; } ; /* adttype : Lid { $$ = mkidtype(&$<tok.src>1, $1); } | adttype '.' Lid { $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3); } | adttype Lmdot Lid { $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3); } | Lref adttype { $$ = mktype(&$1.start, &$2->src.stop, Tref, $2, nil); } ; adtk : Lself adttype { $$ = $2; } ; */ adtk : Lself iditype { $$ = $2; } | Lself Lref iditype { $$ = mktype(&$<tok.src>2.start, &$<tok.src>3.stop, Tref, $3, nil); } | Lself dotiditype { $$ = $2; } | Lself Lref dotiditype { $$ = mktype(&$<tok.src>2.start, &$<tok.src>3.stop, Tref, $3, nil); } ; fndef : fnname fnargretp raises fbody { $$ = fndecl($1, $2, $4); nfns++; /* patch up polydecs */ if($1->op == Odot){ if($1->right->left != nil){ $2->polys = $1->right->left->decl; $1->right->left = nil; } if($1->left->op == Oname && $1->left->left != nil){ $$->decl = $1->left->left->decl; $1->left->left = nil; } } else{ if($1->left != nil){ $2->polys = $1->left->decl; $1->left = nil; } } $2->u.eraises = $3; $$->src = $1->src; } ; raises : Lraises '(' idlist ')' { $$ = mkn(Otuple, rotater($3), nil); $$->src.start = $1.start; $$->src.stop = $4.stop; } | Lraises idatom { $$ = mkn(Otuple, mkunary(Oseq, $2), nil); $$->src.start = $1.start; $$->src.stop = $2->src.stop; } | /* empty */ %prec Lraises { $$ = nil; } ; fbody : '{' stmts '}' { if($2 == nil){ $2 = mkn(Onothing, nil, nil); $2->src.start = curline(); $2->src.stop = $2->src.start; } $$ = rotater($2); $$->src.start = $1.start; $$->src.stop = $3.stop; } | error '}' { $$ = mkn(Onothing, nil, nil); } | error '{' stmts '}' { $$ = mkn(Onothing, nil, nil); } ; fnname : Lid polydec { $$ = mkname(&$<tok.src>1, $1); if($2 != nil){ $$->left = mkn(Onothing, nil ,nil); $$->left->decl = $2; } } | fnname '.' Lid polydec { $$ = mkbin(Odot, $1, mkname(&$<tok.src>3, $3)); if($4 != nil){ $$->right->left = mkn(Onothing, nil ,nil); $$->right->left->decl = $4; } } ; stmts : { $$ = nil; } | stmts decl { if($1 == nil) $$ = $2; else if($2 == nil) $$ = $1; else $$ = mkbin(Oseq, $1, $2); } | stmts stmt { if($1 == nil) $$ = $2; else $$ = mkbin(Oseq, $1, $2); } ; elists : '(' elist ')' | elists ',' '(' elist ')' ; stmt : error ';' { $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } | error '}' { $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } | error '{' stmts '}' { $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } | '{' stmts '}' { if($2 == nil){ $2 = mkn(Onothing, nil, nil); $2->src.start = curline(); $2->src.stop = $2->src.start; } $$ = mkscope(rotater($2)); } | elists ':' type ';' { yyerror("illegal declaration"); $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } | elists ':' type '=' exp';' { yyerror("illegal declaration"); $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } | zexp ';' { $$ = $1; } | Lif '(' exp ')' stmt { $$ = mkn(Oif, $3, mkunary(Oseq, $5)); $$->src.start = $1.start; $$->src.stop = $5->src.stop; } | Lif '(' exp ')' stmt Lelse stmt { $$ = mkn(Oif, $3, mkbin(Oseq, $5, $7)); $$->src.start = $1.start; $$->src.stop = $7->src.stop; } | bclab Lfor '(' zexp ';' zexp ';' zexp ')' stmt { $$ = mkunary(Oseq, $10); if($8->op != Onothing) $$->right = $8; $$ = mkbin(Ofor, $6, $$); $$->decl = $1; if($4->op != Onothing) $$ = mkbin(Oseq, $4, $$); } | bclab Lwhile '(' zexp ')' stmt { $$ = mkn(Ofor, $4, mkunary(Oseq, $6)); $$->src.start = $2.start; $$->src.stop = $6->src.stop; $$->decl = $1; } | bclab Ldo stmt Lwhile '(' zexp ')' ';' { $$ = mkn(Odo, $6, $3); $$->src.start = $2.start; $$->src.stop = $7.stop; $$->decl = $1; } | Lbreak bctarg ';' { $$ = mkn(Obreak, nil, nil); $$->decl = $2; $$->src = $1; } | Lcont bctarg ';' { $$ = mkn(Ocont, nil, nil); $$->decl = $2; $$->src = $1; } | Lreturn zexp ';' { $$ = mkn(Oret, $2, nil); $$->src = $1; if($2->op == Onothing) $$->left = nil; else $$->src.stop = $2->src.stop; } | Lspawn exp ';' { $$ = mkn(Ospawn, $2, nil); $$->src.start = $1.start; $$->src.stop = $2->src.stop; } | Lraise zexp ';' { $$ = mkn(Oraise, $2, nil); $$->src.start = $1.start; $$->src.stop = $2->src.stop; } | bclab Lcase exp '{' cqstmts '}' { $$ = mkn(Ocase, $3, caselist($5, nil)); $$->src = $3->src; $$->decl = $1; } | bclab Lalt '{' qstmts '}' { $$ = mkn(Oalt, caselist($4, nil), nil); $$->src = $2; $$->decl = $1; } | bclab Lpick Lid Ldeclas exp '{' pstmts '}' { $$ = mkn(Opick, mkbin(Odas, mkname(&$<tok.src>3, $3), $5), caselist($7, nil)); $$->src.start = $<tok.src>3.start; $$->src.stop = $5->src.stop; $$->decl = $1; } | Lexit ';' { $$ = mkn(Oexit, nil, nil); $$->src = $1; } | '{' stmts '}' Lexcept idexc '{' eqstmts '}' { if($2 == nil){ $2 = mkn(Onothing, nil, nil); $2->src.start = curline(); $2->src.stop = curline(); } $2 = mkscope(rotater($2)); $$ = mkbin(Oexstmt, $2, mkn(Oexcept, $5, caselist($7, nil))); } /* | stmt Lexcept idexc '{' eqstmts '}' { $$ = mkbin(Oexstmt, $1, mkn(Oexcept, $3, caselist($5, nil))); } */ ; bclab : { $$ = nil; } | ids ':' { if($1->next != nil) yyerror("only one identifier allowed in a label"); $$ = $1; } ; bctarg : { $$ = nil; } | Lid { $$ = mkids(&$<tok.src>1, $1, nil, nil); } ; qstmts : qbodies stmts { $1->left->right->right = $2; $$ = $1; } ; qbodies : qual Llabs { $$ = mkunary(Oseq, mkscope(mkunary(Olabel, rotater($1)))); } | qbodies stmts qual Llabs { $1->left->right->right = $2; $$ = mkbin(Oseq, mkscope(mkunary(Olabel, rotater($3))), $1); } ; cqstmts : cqbodies stmts { $1->left->right = mkscope($2); $$ = $1; } ; cqbodies : qual Llabs { $$ = mkunary(Oseq, mkunary(Olabel, rotater($1))); } | cqbodies stmts qual Llabs { $1->left->right = mkscope($2); $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1); } ; eqstmts : eqbodies stmts { $1->left->right = mkscope($2); $$ = $1; } ; eqbodies : qual Llabs { $$ = mkunary(Oseq, mkunary(Olabel, rotater($1))); } | eqbodies stmts qual Llabs { $1->left->right = mkscope($2); $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1); } ; qual : exp | exp Lto exp { $$ = mkbin(Orange, $1, $3); } | '*' { $$ = mkn(Owild, nil, nil); $$->src = $1; } | qual Lor qual { $$ = mkbin(Oseq, $1, $3); } | error { $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } ; pstmts : pbodies stmts { $1->left->right = mkscope($2); $$ = $1; } ; pbodies : pqual Llabs { $$ = mkunary(Oseq, mkunary(Olabel, rotater($1))); } | pbodies stmts pqual Llabs { $1->left->right = mkscope($2); $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1); } ; pqual : Lid { $$ = mkname(&$<tok>1.src, $1); } | '*' { $$ = mkn(Owild, nil, nil); $$->src = $1; } | pqual Lor pqual { $$ = mkbin(Oseq, $1, $3); } | error { $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } ; zexp : { $$ = mkn(Onothing, nil, nil); $$->src.start = curline(); $$->src.stop = $$->src.start; } | exp ; exp : monexp | exp '=' exp { $$ = mkbin(Oas, $1, $3); } | exp Landeq exp { $$ = mkbin(Oandas, $1, $3); } | exp Loreq exp { $$ = mkbin(Ooras, $1, $3); } | exp Lxoreq exp { $$ = mkbin(Oxoras, $1, $3); } | exp Llsheq exp { $$ = mkbin(Olshas, $1, $3); } | exp Lrsheq exp { $$ = mkbin(Orshas, $1, $3); } | exp Laddeq exp { $$ = mkbin(Oaddas, $1, $3); } | exp Lsubeq exp { $$ = mkbin(Osubas, $1, $3); } | exp Lmuleq exp { $$ = mkbin(Omulas, $1, $3); } | exp Ldiveq exp { $$ = mkbin(Odivas, $1, $3); } | exp Lmodeq exp { $$ = mkbin(Omodas, $1, $3); } | exp Lexpeq exp { $$ = mkbin(Oexpas, $1, $3); } | exp Lcomm '=' exp { $$ = mkbin(Osnd, $1, $4); } | exp Ldeclas exp { $$ = mkbin(Odas, $1, $3); } | Lload Lid exp %prec Lload { $$ = mkn(Oload, $3, nil); $$->src.start = $<tok.src.start>1; $$->src.stop = $3->src.stop; $$->ty = mkidtype(&$<tok.src>2, $2); } | exp Lexp exp { $$ = mkbin(Oexp, $1, $3); } | exp '*' exp { $$ = mkbin(Omul, $1, $3); } | exp '/' exp { $$ = mkbin(Odiv, $1, $3); } | exp '%' exp { $$ = mkbin(Omod, $1, $3); } | exp '+' exp { $$ = mkbin(Oadd, $1, $3); } | exp '-' exp { $$ = mkbin(Osub, $1, $3); } | exp Lrsh exp { $$ = mkbin(Orsh, $1, $3); } | exp Llsh exp { $$ = mkbin(Olsh, $1, $3); } | exp '<' exp { $$ = mkbin(Olt, $1, $3); } | exp '>' exp { $$ = mkbin(Ogt, $1, $3); } | exp Lleq exp { $$ = mkbin(Oleq, $1, $3); } | exp Lgeq exp { $$ = mkbin(Ogeq, $1, $3); } | exp Leq exp { $$ = mkbin(Oeq, $1, $3); } | exp Lneq exp { $$ = mkbin(Oneq, $1, $3); } | exp '&' exp { $$ = mkbin(Oand, $1, $3); } | exp '^' exp { $$ = mkbin(Oxor, $1, $3); } | exp '|' exp { $$ = mkbin(Oor, $1, $3); } | exp Lcons exp { $$ = mkbin(Ocons, $1, $3); } | exp Landand exp { $$ = mkbin(Oandand, $1, $3); } | exp Loror exp { $$ = mkbin(Ooror, $1, $3); } ; monexp : term | '+' monexp { $2->src.start = $1.start; $$ = $2; } | '-' monexp { $$ = mkunary(Oneg, $2); $$->src.start = $1.start; } | '!' monexp { $$ = mkunary(Onot, $2); $$->src.start = $1.start; } | '~' monexp { $$ = mkunary(Ocomp, $2); $$->src.start = $1.start; } | '*' monexp { $$ = mkunary(Oind, $2); $$->src.start = $1.start; } | Linc monexp { $$ = mkunary(Opreinc, $2); $$->src.start = $1.start; } | Ldec monexp { $$ = mkunary(Opredec, $2); $$->src.start = $1.start; } | Lcomm monexp { $$ = mkunary(Orcv, $2); $$->src.start = $1.start; } | Lhd monexp { $$ = mkunary(Ohd, $2); $$->src.start = $1.start; } | Ltl monexp { $$ = mkunary(Otl, $2); $$->src.start = $1.start; } | Llen monexp { $$ = mkunary(Olen, $2); $$->src.start = $1.start; } | Lref monexp { $$ = mkunary(Oref, $2); $$->src.start = $1.start; } | Ltagof monexp { $$ = mkunary(Otagof, $2); $$->src.start = $1.start; } | Larray '[' exp ']' Lof type { $$ = mkn(Oarray, $3, nil); $$->ty = mktype(&$1.start, &$6->src.stop, Tarray, $6, nil); $$->src = $$->ty->src; } | Larray '[' exp ']' Lof '{' initlist '}' { $$ = mkn(Oarray, $3, $7); $$->src.start = $1.start; $$->src.stop = $8.stop; } | Larray '[' ']' Lof '{' initlist '}' { $$ = mkn(Onothing, nil, nil); $$->src.start = $2.start; $$->src.stop = $3.stop; $$ = mkn(Oarray, $$, $6); $$->src.start = $1.start; $$->src.stop = $7.stop; } | Llist Lof '{' celist '}' { $$ = etolist($4); $$->src.start = $1.start; $$->src.stop = $5.stop; } | Lchan Lof type { $$ = mkn(Ochan, nil, nil); $$->ty = mktype(&$1.start, &$3->src.stop, Tchan, $3, nil); $$->src = $$->ty->src; } | Lchan '[' exp ']' Lof type { $$ = mkn(Ochan, $3, nil); $$->ty = mktype(&$1.start, &$6->src.stop, Tchan, $6, nil); $$->src = $$->ty->src; } | Larray Lof Ltid monexp { $$ = mkunary(Ocast, $4); $$->ty = mktype(&$1.start, &$4->src.stop, Tarray, mkidtype(&$<tok.src>3, $3), nil); $$->src = $$->ty->src; } | Ltid monexp { $$ = mkunary(Ocast, $2); $$->src.start = $<tok.src>1.start; $$->ty = mkidtype(&$$->src, $1); } | Lid monexp { $$ = mkunary(Ocast, $2); $$->src.start = $<tok.src>1.start; $$->ty = mkidtype(&$$->src, $1); } | fixtype monexp { $$ = mkunary(Ocast, $2); $$->src.start = $<tok.src>1.start; $$->ty = $1; } ; term : idatom | term '(' zelist ')' { $$ = mkn(Ocall, $1, $3); $$->src.start = $1->src.start; $$->src.stop = $4.stop; } | '(' elist ')' { $$ = $2; if($2->op == Oseq) $$ = mkn(Otuple, rotater($2), nil); else $$->flags |= PARENS; $$->src.start = $1.start; $$->src.stop = $3.stop; } | term '.' Lid { $$ = mkbin(Odot, $1, mkname(&$<tok.src>3, $3)); } | term Lmdot term { $$ = mkbin(Omdot, $1, $3); } | term '[' export ']' { $$ = mkbin(Oindex, $1, $3); $$->src.stop = $4.stop; } | term '[' zexp ':' zexp ']' { if($3->op == Onothing) $3->src = $4; if($5->op == Onothing) $5->src = $4; $$ = mkbin(Oslice, $1, mkbin(Oseq, $3, $5)); $$->src.stop = $6.stop; } | term Linc { $$ = mkunary(Oinc, $1); $$->src.stop = $2.stop; } | term Ldec { $$ = mkunary(Odec, $1); $$->src.stop = $2.stop; } | Lsconst { $$ = mksconst(&$<tok.src>1, $1); } | Lconst { $$ = mkconst(&$<tok.src>1, $1); if($1 > 0x7fffffff || $1 < -0x7fffffff) $$->ty = tbig; $$ = $$; } | Lrconst { $$ = mkrconst(&$<tok.src>1, $1); } | term '[' exportlist ',' export ']' { $$ = mkbin(Oindex, $1, rotater(mkbin(Oseq, $3, $5))); $$->src.stop = $6.stop; } ; idatom : Lid { $$ = mkname(&$<tok.src>1, $1); } | Lnil { $$ = mknil(&$<tok.src>1); } ; idterm : '(' idlist ')' { $$ = mkn(Otuple, rotater($2), nil); $$->src.start = $1.start; $$->src.stop = $3.stop; } ; exportlist : export | exportlist ',' export { $$ = mkbin(Oseq, $1, $3); } ; export : exp | texp ; texp : Ltid { $$ = mkn(Otype, nil, nil); $$->ty = mkidtype(&$<tok.src>1, $1); $$->src = $$->ty->src; } | Larray Lof type { $$ = mkn(Otype, nil, nil); $$->ty = mktype(&$1.start, &$3->src.stop, Tarray, $3, nil); $$->src = $$->ty->src; } | Llist Lof type { $$ = mkn(Otype, nil, nil); $$->ty = mktype(&$1.start, &$3->src.stop, Tlist, $3, nil); $$->src = $$->ty->src; } | Lcyclic type { $$ = mkn(Otype, nil ,nil); $$->ty = $2; $$->ty->flags |= CYCLIC; $$->src = $$->ty->src; } ; idexc : Lid { $$ = mkname(&$<tok.src>1, $1); } | /* empty */ { $$ = nil; } ; idlist : idterm | idatom | idlist ',' idterm { $$ = mkbin(Oseq, $1, $3); } | idlist ',' idatom { $$ = mkbin(Oseq, $1, $3); } ; zelist : { $$ = nil; } | elist { $$ = rotater($1); } ; celist : elist | elist ',' ; elist : exp | elist ',' exp { $$ = mkbin(Oseq, $1, $3); } ; initlist : elemlist { $$ = rotater($1); } | elemlist ',' { $$ = rotater($1); } ; elemlist : elem | elemlist ',' elem { $$ = mkbin(Oseq, $1, $3); } ; elem : exp { $$ = mkn(Oelem, nil, $1); $$->src = $1->src; } | qual Llabs exp { $$ = mkbin(Oelem, rotater($1), $3); } ; /* tpoly : ids Llabs '{' dfields '}' { $$ = typedecl($1, mktype(&$1->src.start, &$5.stop, Tpoly, nil, nil)); $$->left = rotater($4); } ; tpolys : tpoly { $$ = $1; } | tpolys tpoly { $$ = mkbin(Oseq, $1, $2); } ; */ tpolys : tpoly dfields { if($1->op == Oseq) $1->right->left = rotater($2); else $1->left = rotater($2); $$ = $1; } ; tpoly : ids Llabs { $$ = typedecl($1, mktype(&$1->src.start, &$2.stop, Tpoly, nil, nil)); } | tpoly dfields ids Llabs { if($1->op == Oseq) $1->right->left = rotater($2); else $1->left = rotater($2); $$ = mkbin(Oseq, $1, typedecl($3, mktype(&$3->src.start, &$4.stop, Tpoly, nil, nil))); } ; %% static char *mkfileext(char*, char*, char*); static void usage(void); static int dosym; static int toterrors; static ulong canonnanbits[] = { 0x7fffffff, 0xffffffff}; static char* infile; #define SLASHMOD "/module" static char* getroot(void) { int n; char *e, *l, *s; if((e = getenv("EMU")) != nil){ for(s = e; *e != '\0'; e++){ if(*e == '-' && *(e+1) == 'r' && (e == s || *(e-1) == ' ' || *(e-1) == '\t')){ e += 2; l = strchr(e, ' '); if(l != nil) *l = '\0'; if((n = strlen(e)) > 0){ s = malloc(n+1); strcpy(s, e); return s; } } } } if((e = getenv("ROOT")) != nil) return strdup(e); return nil; } void main(int argc, char *argv[]) { char *s, *ofile, *ext, *root; int i; FPinit(); FPcontrol(0, INVAL|ZDIV|OVFL|UNFL|INEX); canonnan = canontod(canonnanbits); fmtinstall('D', dotconv); fmtinstall('I', instconv); fmtinstall('K', declconv); fmtinstall('k', storeconv); fmtinstall('L', lineconv); fmtinstall('M', mapconv); fmtinstall('n', nodeconv); /* exp structure */ fmtinstall('O', opconv); fmtinstall('g', gfltconv); fmtinstall('Q', etconv); /* src expression with type */ fmtinstall('R', ctypeconv); /* c equivalent type */ fmtinstall('P', ctypeconv); /* c equivalent type - pointer type */ fmtinstall('T', typeconv); /* source style types */ fmtinstall('t', stypeconv); /* structurally descriptive type */ fmtinstall('U', srcconv); fmtinstall('v', expconv); /* src expression */ fmtinstall('V', expconv); /* src expression in '' */ lexinit(); typeinit(); optabinit(); gendis = 1; asmsym = 0; maxerr = 20; ofile = nil; ext = nil; ARGBEGIN{ case 'D': /* * debug flags: * * a alt compilation * A array constructor compilation * b boolean and branch compilation * c case compilation * d function declaration * D descriptor generation * e expression compilation * E addressable expression compilation * f print arguments for compiled functions * F constant folding * g print out globals * m module declaration and type checking * n nil references * s print sizes of output file sections * S type signing * t type checking function bodies * T timing * v global var and constant compilation * x adt verification * Y tuple compilation * z Z bug fixes */ s = ARGF(); while(s && *s) debug[*s++] = 1; break; case 'I': s = ARGF(); if(s == nil) usage(); addinclude(s); break; case 'G': asmsym = 1; break; case 'S': gendis = 0; break; case 'a': emitstub = 1; break; case 'A': emitstub = emitdyn = 1; break; case 'c': mustcompile = 1; break; case 'C': dontcompile = 1; break; case 'e': maxerr = 1000; break; case 'f': isfatal = 1; break; case 'F': newfnptr = 1; break; case 'g': dosym = 1; break; case 'i': dontinline = 1; break; case 'o': ofile = ARGF(); break; case 'O': optims = 1; break; case 's': s = ARGF(); if(s != nil) fixss = atoi(s); break; case 't': emittab = ARGF(); if(emittab == nil) usage(); break; case 'T': emitcode = ARGF(); if(emitcode == nil) usage(); break; case 'd': emitcode = ARGF(); if(emitcode == nil) usage(); emitdyn = 1; break; case 'w': superwarn = dowarn; dowarn = 1; break; case 'x': ext = ARGF(); break; case 'X': signdump = ARGF(); break; case 'z': arrayz = 1; break; default: usage(); break; }ARGEND if((root = getroot()) != nil){ char *r; r = malloc(strlen(root)+strlen(SLASHMOD)+1); strcpy(r, root); strcat(r, SLASHMOD); addinclude(r); free(root); } else addinclude(INCPATH); if(argc == 0){ usage(); }else if(ofile != nil){ if(argc != 1) usage(); translate(argv[0], ofile, mkfileext(ofile, ".dis", ".sbl")); }else{ if(ext == nil){ ext = ".s"; if(gendis) ext = ".dis"; } for(i = 0; i < argc; i++){ s = strrchr(argv[i], '/'); if(s == nil) s = argv[i]; else s++; if(argc > 1) print("%s:\n", argv[i]); ofile = mkfileext(s, ".b", ext); translate(argv[i], ofile, mkfileext(ofile, ext, ".sbl")); } } if(toterrors) exits("errors"); exits(0); } static void usage(void) { fprint(2, "usage: limbo [-CGSacgwe] [-I incdir] [-o outfile] [-{T|t|d} module] [-D debug] file ...\n"); exits("usage"); } static char* mkfileext(char *file, char *oldext, char *ext) { char *ofile; int n, n2; n = strlen(file); n2 = strlen(oldext); if(n >= n2 && strcmp(&file[n-n2], oldext) == 0) n -= n2; ofile = malloc(n + strlen(ext) + 1); memmove(ofile, file, n); strcpy(ofile+n, ext); return ofile; } void translate(char *in, char *out, char *dbg) { Decl *entry; int doemit; infile = in; outfile = out; symfile = dbg; errors = 0; bins[0] = Bopen(in, OREAD); if(bins[0] == nil){ fprint(2, "can't open %s: %r\n", in); toterrors++; return; } doemit = emitstub || emittab || emitcode; if(!doemit){ bout = Bopen(out, OWRITE); if(bout == nil){ fprint(2, "can't open %s: %r\n", out); toterrors++; Bterm(bins[0]); return; } if(dosym){ bsym = Bopen(dbg, OWRITE); if(bsym == nil) fprint(2, "can't open %s: %r\n", dbg); } } lexstart(in); popscopes(); typestart(); declstart(); yyparse(); entry = typecheck(!doemit); modcom(entry); fns = nil; nfns = 0; descriptors = nil; if(bout != nil) Bterm(bout); if(bsym != nil) Bterm(bsym); toterrors += errors; if(errors && bout != nil) remove(out); if(errors && bsym != nil) remove(dbg); } void trapFPE(unsigned exception[5], int value[2]) { /* can't happen; it's just here to keep FPinit happy. */ USED(exception); USED(value); } static char * win2inf(char *s) { int nt = 0; char *t; if(strlen(s) > 1 && s[1] == ':'){ s[1] = '/'; s++; nt = 1; } for(t = s; *t != '\0'; t++){ if(*t == '\\') *t = '/'; if(nt) *t = tolower(*t); } return s; } static char *cd; /* static char * pwd(void) { int ok, qid, l1, l2; Dir d; char *p; char hd[64], buf[128], path[256]; if(cd != nil) return cd; *hd = *path = '\0'; qid = -1; strcpy(buf, "."); for(;;){ ok = dirstat(buf, &d); if(ok < 0) return ""; if(d.qid.path == qid && strcmp(d.name, hd) == 0) break; l1 = strlen(d.name); l2 = strlen(path); memmove(path+l1+1, path, l2+1); memcpy(path+1, d.name, l1); path[0] = '/'; strcpy(hd, d.name); qid = d.qid.path; strcat(buf, "/.."); } p = win2inf(path); while(*p == '/' && p[1] == '/') p++; cd = malloc(strlen(p)+1); strcpy(cd, p); return cd; } */ static char * cleann(char *s) { char *p, *r, *t; char buf[256]; r = t = malloc(strlen(s)+1); strcpy(t, s); t = win2inf(t); if(*t != '/'){ /* p = pwd(); */ p = win2inf(getwd(buf, sizeof(buf))); s = malloc(strlen(p)+strlen(t)+2); strcpy(s, p); strcat(s, "/"); strcat(s, t); } else{ s = malloc(strlen(t)+1); strcpy(s, t); } free(r); /* print("cleann: %s\n", p); */ return cleanname(s); } char * srcpath(char *name, int nlen) { int l1, l2; char *r, *srcp, *t; srcp = cleann(infile); r = getroot(); if(r == nil){ l1 = strlen(INCPATH); r = malloc(l1+1); strcpy(r, INCPATH); if(l1 >= strlen(SLASHMOD) && strcmp(r+l1-strlen(SLASHMOD), SLASHMOD) == 0) r[l1-strlen(SLASHMOD)] = '\0'; } t = cleann(r); free(r); r = t; /* srcp relative to r */ l1 = strlen(srcp); l2 = strlen(r); if(l1 >= l2 && strncmp(srcp, r, l2) == 0){ /* nothing to do */ }else l2 = 0; strncpy(name, srcp+l2, nlen); name[nlen-1] = '\0'; free(r); free(srcp); /* print("srcpath: %s\n", name); */ return name; } top = $2.stop; } | term Ldec { $$ = mkunary(Odec, $1); $$->src.stop = $2.stop; } | Lsconst { $$ = mksconst(&$<tok.src>1, $1); } | Lconst { $$ = mkconst(&$<tok.src>1, $1); if($1 > 0x7fffffff || $1 < -0x7fffffff) $$->ty = tbig; $$ = $$; } | Lrconst { $$ = mkrconst(&$<tok.src>1, $1); } | term '[' exportlist ',' export ']' { $$ = mkbin(Oindex, $1, rotater(mkbin(Oseq, $3, $5))); $$->src.stop = $6.stop; } ; idatom : Lid { old_contrib//root/sys/src/cmd/limbo/limbo/mkfile���������������������������������������������������� 664 � 0 � 0 � 715 10745517137 21017�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������</$objtype/mkfile TARG=limbo OFILES= asm.$O\ com.$O\ decls.$O\ dis.$O\ dtocanon.$O\ ecom.$O\ gen.$O\ lex.$O\ nodes.$O\ optab.$O\ optim.$O\ sbl.$O\ stubs.$O\ typecheck.$O\ types.$O\ y.tab.$O\ HFILES= limbo.h\ fns.h\ y.tab.h\ LIBS= bio\ math\ sec\ mp\ 9\ YFILES= limbo.y BIN=/$objtype/bin LIB=../libmath/libmath.a ../libsec/libsec.a ../libmp/libmp.a </sys/src/cmd/mkone CFLAGS= '-DINCPATH="../module"' -I../include $CFLAGS YFLAGS=-d ���������������������������������������������������old_contrib//root/sys/src/cmd/limbo/limbo/nodes.c��������������������������������������������������� 664 � 0 � 0 � 64135 10176463740 21145�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" static vlong ipow(vlong x, int n) { int inv; vlong r; inv = 0; if(n < 0){ n = -n; inv = 1; } r = 1; for(;;){ if(n&1) r *= x; if((n >>= 1) == 0) break; x *= x; } if(inv) r = 1/r; return r; } double rpow(double x, int n) { int inv; double r; inv = 0; if(n < 0){ n = -n; inv = 1; } r = 1; for(;;){ if(n&1) r *= x; if((n >>= 1) == 0) break; x *= x; } if(inv) r = 1/r; return r; } Long real2fix(double v, Type *t) { v /= scale(t); v = v < 0 ? v-0.5: v+0.5; return v; } Long fix2fix(Long v, Type *f, Type *t) { double r; r = (double)v * (scale(f)/scale(t)); r = r < 0 ? r-0.5: r+0.5; return r; } double fix2real(Long v, Type *f) { return (double)v * scale(f); } int istuple(Node *n) { Decl *d; switch(n->op){ case Otuple: return 1; case Oname: d = n->decl; if(d->importid != nil) d = d->importid; return d->store == Dconst && (n->ty->kind == Ttuple || n->ty->kind == Tadt); case Odot: return 0; /* istuple(n->left); */ } return 0; } static Node* tuplemem(Node *n, Decl *d) { Type *ty; Decl *ids; ty = n->ty; n = n->left; for(ids = ty->ids; ids != nil; ids = ids->next){ if(ids->sym == d->sym) break; else n = n->right; } if(n == nil) fatal("tuplemem cannot cope !\n"); return n->left; } int varcom(Decl *v) { Node *n, tn; n = v->init; n = fold(n); v->init = n; if(debug['v']) print("variable '%D' val %V\n", v, n); if(n == nil) return 1; tn = znode; tn.op = Oname; tn.decl = v; tn.src = v->src; tn.ty = v->ty; return initable(&tn, n, 0); } int initable(Node *v, Node *n, int allocdep) { Node *e; switch(n->ty->kind){ case Tiface: case Tgoto: case Tcase: case Tcasel: case Tcasec: case Talt: case Texcept: return 1; case Tint: case Tbig: case Tbyte: case Treal: case Tstring: case Tfix: if(n->op != Oconst) break; return 1; case Tadt: case Tadtpick: case Ttuple: if(n->op == Otuple) n = n->left; else if(n->op == Ocall) n = n->right; else break; for(; n != nil; n = n->right) if(!initable(v, n->left, allocdep)) return 0; return 1; case Tarray: if(n->op != Oarray) break; if(allocdep >= DADEPTH){ nerror(v, "%Vs initializer has arrays nested more than %d deep", v, allocdep); return 0; } allocdep++; usedesc(mktdesc(n->ty->tof)); if(n->left->op != Oconst){ nerror(v, "%Vs size is not a constant", v); return 0; } for(e = n->right; e != nil; e = e->right) if(!initable(v, e->left->right, allocdep)) return 0; return 1; case Tany: return 1; case Tref: case Tlist: case Tpoly: default: nerror(v, "can't initialize %Q", v); return 0; } nerror(v, "%Vs initializer, %V, is not a constant expression", v, n); return 0; } /* * merge together two sorted lists, yielding a sorted list */ static Node* elemmerge(Node *e, Node *f) { Node rock, *r; r = &rock; while(e != nil && f != nil){ if(e->left->left->val <= f->left->left->val){ r->right = e; e = e->right; }else{ r->right = f; f = f->right; } r = r->right; } if(e != nil) r->right = e; else r->right = f; return rock.right; } /* * recursively split lists and remerge them after they are sorted */ static Node* recelemsort(Node *e, int n) { Node *r, *ee; int i, m; if(n <= 1) return e; m = n / 2 - 1; ee = e; for(i = 0; i < m; i++) ee = ee->right; r = ee->right; ee->right = nil; return elemmerge(recelemsort(e, n / 2), recelemsort(r, (n + 1) / 2)); } /* * sort the elems by index; wild card is first */ Node* elemsort(Node *e) { Node *ee; int n; n = 0; for(ee = e; ee != nil; ee = ee->right){ if(ee->left->left->op == Owild) ee->left->left->val = -1; n++; } return recelemsort(e, n); } int sametree(Node *n1, Node *n2) { if(n1 == n2) return 1; if(n1 == nil || n2 == nil) return 0; if(n1->op != n2->op || n1->ty != n2->ty) return 0; if(n1->op == Oconst){ switch(n1->ty->kind){ case Tbig: case Tbyte: case Tint: return n1->val == n2->val; case Treal: return n1->rval == n2->rval; case Tfix: return n1->val == n2->val && tequal(n1->ty, n2->ty); case Tstring: return n1->decl->sym == n2->decl->sym; } return 0; } return n1->decl == n2->decl && sametree(n1->left, n2->left) && sametree(n1->right, n2->right); } int occurs(Decl *d, Node *n) { if(n == nil) return 0; if(n->op == Oname){ if(d == n->decl) return 1; return 0; } return occurs(d, n->left) + occurs(d, n->right); } /* * left and right subtrees the same */ Node* folds(Node *n) { if(hasside(n, 1)) return n; switch(n->op){ case Oeq: case Oleq: case Ogeq: n->val = 1; break; case Osub: n->val = 0; n->rval = 0.0; break; case Oxor: case Oneq: case Olt: case Ogt: n->val = 0; break; case Oand: case Oor: case Oandand: case Ooror: return n->left; default: return n; } n->op = Oconst; n->left = n->right = nil; n->decl = nil; return n; } /* * constant folding for typechecked expressions, */ Node* fold(Node *n) { if(n == nil) return nil; if(debug['F']) print("fold %n\n", n); n = efold(n); if(debug['F']) print("folded %n\n", n); return n; } Node* efold(Node *n) { Decl *d; Node *left, *right; if(n == nil) return nil; left = n->left; right = n->right; switch(n->op){ case Oname: d = n->decl; if(d->importid != nil) d = d->importid; if(d->store != Dconst){ if(d->store == Dtag){ n->op = Oconst; n->ty = tint; n->val = d->tag; } break; } switch(n->ty->kind){ case Tbig: n->op = Oconst; n->val = d->init->val; break; case Tbyte: n->op = Oconst; n->val = d->init->val & 0xff; break; case Tint: case Tfix: n->op = Oconst; n->val = d->init->val; break; case Treal: n->op = Oconst; n->rval = d->init->rval; break; case Tstring: n->op = Oconst; n->decl = d->init->decl; break; case Ttuple: *n = *d->init; break; case Tadt: *n = *d->init; n = rewrite(n); /* was call */ break; case Texception: if(!n->ty->cons) fatal("non-const exception type in efold"); n->op = Oconst; break; default: fatal("unknown const type %T in efold", n->ty); break; } break; case Oadd: left = efold(left); right = efold(right); n->left = left; n->right = right; if(n->ty == tstring && right->op == Oconst){ if(left->op == Oconst) n = mksconst(&n->src, stringcat(left->decl->sym, right->decl->sym)); else if(left->op == Oadd && left->ty == tstring && left->right->op == Oconst){ left->right = mksconst(&n->src, stringcat(left->right->decl->sym, right->decl->sym)); n = left; } } break; case Olen: left = efold(left); n->left = left; if(left->ty == tstring && left->op == Oconst) n = mkconst(&n->src, utflen(left->decl->sym->name)); break; case Oslice: if(right->left->op == Onothing) right->left = mkconst(&right->left->src, 0); n->left = efold(left); n->right = efold(right); break; case Oinds: n->left = left = efold(left); n->right = right = efold(right); if(right->op == Oconst && left->op == Oconst){ ; } break; case Ocast: n->op = Ocast; left = efold(left); n->left = left; if(n->ty == left->ty || n->ty->kind == Tfix && tequal(n->ty, left->ty)) return left; if(left->op == Oconst) return foldcast(n, left); break; case Odot: case Omdot: /* * what about side effects from left? */ d = right->decl; switch(d->store){ case Dconst: case Dtag: case Dtype: /* * set it up as a name and let that case do the hard work */ n->op = Oname; n->decl = d; n->left = nil; n->right = nil; return efold(n); } n->left = efold(left); if(n->left->op == Otuple) n = tuplemem(n->left, d); else n->right = efold(right); break; case Otagof: if(n->decl != nil){ n->op = Oconst; n->left = nil; n->right = nil; n->val = n->decl->tag; return efold(n); } n->left = efold(left); break; case Oif: n->left = left = efold(left); n->right = right = efold(right); if(left->op == Oconst){ if(left->val) return right->left; else return right->right; } break; default: n->left = efold(left); n->right = efold(right); break; } left = n->left; right = n->right; if(left == nil) return n; if(right == nil){ if(left->op == Oconst){ if(left->ty == tint || left->ty == tbyte || left->ty == tbig) return foldc(n); if(left->ty == treal) return foldr(n); } return n; } if(left->op == Oconst){ switch(n->op){ case Olsh: case Orsh: if(left->val == 0 && !hasside(right, 1)) return left; break; case Ooror: if(left->ty == tint || left->ty == tbyte || left->ty == tbig){ if(left->val == 0){ n = mkbin(Oneq, right, mkconst(&right->src, 0)); n->ty = right->ty; n->left->ty = right->ty; return efold(n); } left->val = 1; return left; } break; case Oandand: if(left->ty == tint || left->ty == tbyte || left->ty == tbig){ if(left->val == 0) return left; n = mkbin(Oneq, right, mkconst(&right->src, 0)); n->ty = right->ty; n->left->ty = right->ty; return efold(n); } break; } } if(left->op == Oconst && right->op != Oconst && opcommute[n->op] && n->ty != tstring){ n->op = opcommute[n->op]; n->left = right; n->right = left; left = right; right = n->right; } if(right->op == Oconst && left->op == n->op && left->right->op == Oconst && (n->op == Oadd || n->op == Omul || n->op == Oor || n->op == Oxor || n->op == Oand) && n->ty != tstring){ n->left = left->left; left->left = right; right = efold(left); n->right = right; left = n->left; } if(right->op == Oconst){ if(n->op == Oexp && left->ty == treal){ if(left->op == Oconst) return foldr(n); return n; } if(right->ty == tint || right->ty == tbyte || left->ty == tbig){ if(left->op == Oconst) return foldc(n); return foldvc(n); } if(right->ty == treal && left->op == Oconst) return foldr(n); } if(sametree(left, right)) return folds(n); return n; } /* * does evaluating the node have any side effects? */ int hasside(Node *n, int strict) { for(; n != nil; n = n->right){ if(sideeffect[n->op] && (strict || n->op != Oadr && n->op != Oind)) return 1; if(hasside(n->left, strict)) return 1; } return 0; } int hascall(Node *n) { for(; n != nil; n = n->right){ if(n->op == Ocall || n->op == Ospawn) return 1; if(hascall(n->left)) return 1; } return 0; } int hasasgns(Node *n) { if(n == nil) return 0; if(n->op != Ocall && isused[n->op] && n->op != Onothing) return 1; return hasasgns(n->left) || hasasgns(n->right); } int nodes(Node *n) { if(n == nil) return 0; return 1+nodes(n->left)+nodes(n->right); } Node* foldcast(Node *n, Node *left) { Real r; char *buf, *e; switch(left->ty->kind){ case Tint: left->val &= 0xffffffff; if(left->val & 0x80000000) left->val |= (Long)0xffffffff << 32; return foldcasti(n, left); case Tbyte: left->val &= 0xff; return foldcasti(n, left); case Tbig: return foldcasti(n, left); case Treal: switch(n->ty->kind){ case Tint: case Tbyte: case Tbig: r = left->rval; left->val = r < 0 ? r - .5 : r + .5; break; case Tfix: left->val = real2fix(left->rval, n->ty); break; case Tstring: buf = allocmem(NumSize); e = seprint(buf, buf+NumSize, "%g", left->rval); return mksconst(&n->src, enterstring(buf, e-buf)); default: return n; } break; case Tfix: switch(n->ty->kind){ case Tint: case Tbyte: case Tbig: left->val = fix2real(left->val, left->ty); break; case Treal: left->rval = fix2real(left->val, left->ty); break; case Tfix: if(tequal(left->ty, n->ty)) return left; left->val = fix2fix(left->val, left->ty, n->ty); break; case Tstring: buf = allocmem(NumSize); e = seprint(buf, buf+NumSize, "%g", fix2real(left->val, left->ty)); return mksconst(&n->src, enterstring(buf, e-buf)); default: return n; } break; case Tstring: switch(n->ty->kind){ case Tint: case Tbyte: case Tbig: left->val = strtoi(left->decl->sym->name, 10); break; case Treal: left->rval = strtod(left->decl->sym->name, nil); break; case Tfix: left->val = real2fix(strtod(left->decl->sym->name, nil), n->ty); break; default: return n; } break; default: return n; } left->ty = n->ty; left->src = n->src; return left; } /* * left is some kind of int type */ Node* foldcasti(Node *n, Node *left) { char *buf, *e; switch(n->ty->kind){ case Tint: left->val &= 0xffffffff; if(left->val & 0x80000000) left->val |= (Long)0xffffffff << 32; break; case Tbyte: left->val &= 0xff; break; case Tbig: break; case Treal: left->rval = left->val; break; case Tfix: left->val = real2fix(left->val, n->ty); break; case Tstring: buf = allocmem(NumSize); e = seprint(buf, buf+NumSize, "%lld", left->val); return mksconst(&n->src, enterstring(buf, e-buf)); default: return n; } left->ty = n->ty; left->src = n->src; return left; } /* * right is a const int */ Node* foldvc(Node *n) { Node *left, *right; left = n->left; right = n->right; switch(n->op){ case Oadd: case Osub: case Oor: case Oxor: case Olsh: case Orsh: case Ooror: if(right->val == 0) return left; if(n->op == Ooror && !hasside(left, 1)) return right; break; case Oand: if(right->val == 0 && !hasside(left, 1)) return right; break; case Omul: if(right->val == 1) return left; if(right->val == 0 && !hasside(left, 1)) return right; break; case Odiv: if(right->val == 1) return left; break; case Omod: if(right->val == 1 && !hasside(left, 1)){ right->val = 0; return right; } break; case Oexp: if(right->val == 0){ right->val = 1; return right; } if(right->val == 1) return left; break; case Oandand: if(right->val != 0) return left; if(!hasside(left, 1)) return right; break; case Oneq: if(!isrelop[left->op]) return n; if(right->val == 0) return left; n->op = Onot; n->right = nil; break; case Oeq: if(!isrelop[left->op]) return n; if(right->val != 0) return left; n->op = Onot; n->right = nil; break; } return n; } /* * left and right are const ints */ Node* foldc(Node *n) { Node *left, *right; Long lv, v; int rv, nb; left = n->left; right = n->right; switch(n->op){ case Oadd: v = left->val + right->val; break; case Osub: v = left->val - right->val; break; case Omul: v = left->val * right->val; break; case Odiv: if(right->val == 0){ nerror(n, "divide by 0 in constant expression"); return n; } v = left->val / right->val; break; case Omod: if(right->val == 0){ nerror(n, "mod by 0 in constant expression"); return n; } v = left->val % right->val; break; case Oexp: if(left->val == 0 && right->val < 0){ nerror(n, "0 to negative power in constant expression"); return n; } v = ipow(left->val, right->val); break; case Oand: v = left->val & right->val; break; case Oor: v = left->val | right->val; break; case Oxor: v = left->val ^ right->val; break; case Olsh: lv = left->val; rv = right->val; if(rv < 0 || rv >= n->ty->size * 8){ nwarn(n, "shift amount %d out of range", rv); rv = 0; } if(rv == 0){ v = lv; break; } v = lv << rv; break; case Orsh: lv = left->val; rv = right->val; nb = n->ty->size * 8; if(rv < 0 || rv >= nb){ nwarn(n, "shift amount %d out of range", rv); rv = 0; } if(rv == 0){ v = lv; break; } v = lv >> rv; /* * properly sign extend c right shifts */ if((n->ty == tint || n->ty == tbig) && rv != 0 && (lv & (1<<(nb-1)))){ lv = 0; lv = ~lv; v |= lv << (nb - rv); } break; case Oneg: v = -left->val; break; case Ocomp: v = ~left->val; break; case Oeq: v = left->val == right->val; break; case Oneq: v = left->val != right->val; break; case Ogt: v = left->val > right->val; break; case Ogeq: v = left->val >= right->val; break; case Olt: v = left->val < right->val; break; case Oleq: v = left->val <= right->val; break; case Oandand: v = left->val && right->val; break; case Ooror: v = left->val || right->val; break; case Onot: v = !left->val; break; default: return n; } if(n->ty == tint){ v &= 0xffffffff; if(v & 0x80000000) v |= (Long)0xffffffff << 32; }else if(n->ty == tbyte) v &= 0xff; n->left = nil; n->right = nil; n->decl = nil; n->op = Oconst; n->val = v; return n; } /* * left and right are const reals */ Node* foldr(Node *n) { Node *left, *right; double rv; Long v; rv = 0.; v = 0; left = n->left; right = n->right; switch(n->op){ case Ocast: return n; case Oadd: rv = left->rval + right->rval; break; case Osub: rv = left->rval - right->rval; break; case Omul: rv = left->rval * right->rval; break; case Odiv: rv = left->rval / right->rval; break; case Oexp: rv = rpow(left->rval, right->val); break; case Oneg: rv = -left->rval; break; case Oinv: if(left->rval == 0.0){ error(n->src.start, "divide by 0 in fixed point type"); return n; } rv = 1/left->rval; break; case Oeq: v = left->rval == right->rval; break; case Oneq: v = left->rval != right->rval; break; case Ogt: v = left->rval > right->rval; break; case Ogeq: v = left->rval >= right->rval; break; case Olt: v = left->rval < right->rval; break; case Oleq: v = left->rval <= right->rval; break; default: return n; } n->left = nil; n->right = nil; if(isnan(rv)) rv = canonnan; n->rval = rv; n->val = v; n->op = Oconst; return n; } Node* varinit(Decl *d, Node *e) { Node *n; n = mkdeclname(&e->src, d); if(d->next == nil) return mkbin(Oas, n, e); return mkbin(Oas, n, varinit(d->next, e)); } /* * given: an Oseq list with left == next or the last child * make a list with the right == next * ie: Oseq(Oseq(a, b),c) ==> Oseq(a, Oseq(b, Oseq(c, nil)))) */ Node* rotater(Node *e) { Node *left; if(e == nil) return e; if(e->op != Oseq) return mkunary(Oseq, e); e->right = mkunary(Oseq, e->right); while(e->left->op == Oseq){ left = e->left; e->left = left->right; left->right = e; e = left; } return e; } /* * reverse the case labels list */ Node* caselist(Node *s, Node *nr) { Node *r; r = s->right; s->right = nr; if(r == nil) return s; return caselist(r, s); } /* * e is a seq of expressions; make into cons's to build a list */ Node* etolist(Node *e) { Node *left, *n; if(e == nil) return nil; n = mknil(&e->src); n->src.start = n->src.stop; if(e->op != Oseq) return mkbin(Ocons, e, n); e->right = mkbin(Ocons, e->right, n); while(e->left->op == Oseq){ e->op = Ocons; left = e->left; e->left = left->right; left->right = e; e = left; } e->op = Ocons; return e; } Node* dupn(int resrc, Src *src, Node *n) { Node *nn; nn = allocmem(sizeof *nn); *nn = *n; if(resrc) nn->src = *src; if(nn->left != nil) nn->left = dupn(resrc, src, nn->left); if(nn->right != nil) nn->right = dupn(resrc, src, nn->right); return nn; } Node* mkn(int op, Node *left, Node *right) { Node *n; n = allocmem(sizeof *n); *n = znode; n->op = op; n->left = left; n->right = right; return n; } Node* mkunary(int op, Node *left) { Node *n; n = mkn(op, left, nil); n->src = left->src; return n; } Node* mkbin(int op, Node *left, Node *right) { Node *n; n = mkn(op, left, right); n->src.start = left->src.start; n->src.stop = right->src.stop; return n; } Node* mkdeclname(Src *src, Decl *d) { Node *n; n = mkn(Oname, nil, nil); n->src = *src; n->decl = d; n->ty = d->ty; d->refs++; return n; } Node* mknil(Src *src) { return mkdeclname(src, nildecl); } Node* mkname(Src *src, Sym *s) { Node *n; n = mkn(Oname, nil, nil); n->src = *src; if(s->unbound == nil){ s->unbound = mkdecl(src, Dunbound, nil); s->unbound->sym = s; } n->decl = s->unbound; return n; } Node* mkconst(Src *src, Long v) { Node *n; n = mkn(Oconst, nil, nil); n->ty = tint; n->val = v; n->src = *src; return n; } Node* mkrconst(Src *src, Real v) { Node *n; n = mkn(Oconst, nil, nil); n->ty = treal; n->rval = v; n->src = *src; return n; } Node* mksconst(Src *src, Sym *s) { Node *n; n = mkn(Oconst, nil, nil); n->ty = tstring; n->decl = mkdecl(src, Dconst, tstring); n->decl->sym = s; n->src = *src; return n; } int opconv(Fmt *f) { int op; char buf[32]; op = va_arg(f->args, int); if(op < 0 || op > Oend) { seprint(buf, buf+sizeof(buf), "op %d", op); return fmtstrcpy(f, buf); } return fmtstrcpy(f, opname[op]); } int etconv(Fmt *f) { Node *n; char buf[1024]; n = va_arg(f->args, Node*); if(n->ty == tany || n->ty == tnone || n->ty == terror) seprint(buf, buf+sizeof(buf), "%V", n); else seprint(buf, buf+sizeof(buf), "%V of type %T", n, n->ty); return fmtstrcpy(f, buf); } int expconv(Fmt *f) { Node *n; char buf[4096], *p; n = va_arg(f->args, Node*); p = buf; *p = 0; if(f->r == 'V') *p++ = '\''; p = eprint(p, buf+sizeof(buf)-1, n); if(f->r == 'V') *p++ = '\''; *p = 0; return fmtstrcpy(f, buf); } char* eprint(char *buf, char *end, Node *n) { if(n == nil) return buf; if(n->flags & PARENS) buf = secpy(buf, end, "("); switch(n->op){ case Obreak: case Ocont: buf = secpy(buf, end, opname[n->op]); if(n->decl != nil){ buf = seprint(buf, end, " %s", n->decl->sym->name); } break; case Oexit: case Owild: buf = secpy(buf, end, opname[n->op]); break; case Onothing: break; case Oadr: case Oused: buf = eprint(buf, end, n->left); break; case Oseq: buf = eprintlist(buf, end, n, ", "); break; case Oname: if(n->decl == nil) buf = secpy(buf, end, "<nil>"); else buf = seprint(buf, end, "%s", n->decl->sym->name); break; case Oconst: if(n->ty->kind == Tstring){ buf = stringpr(buf, end, n->decl->sym); break; } if(n->decl != nil && n->decl->sym != nil){ buf = seprint(buf, end, "%s", n->decl->sym->name); break; } switch(n->ty->kind){ case Tint: case Tbyte: buf = seprint(buf, end, "%ld", (long)n->val); break; case Tbig: buf = seprint(buf, end, "%lld", n->val); break; case Treal: buf = seprint(buf, end, "%g", n->rval); break; case Tfix: buf = seprint(buf, end, "%ld(%g)", (long)n->val, n->ty->val->rval); break; default: buf = secpy(buf, end, opname[n->op]); break; } break; case Ocast: buf = seprint(buf, end, "%T ", n->ty); buf = eprint(buf, end, n->left); break; case Otuple: if(n->ty != nil && n->ty->kind == Tadt) buf = seprint(buf, end, "%s", n->ty->decl->sym->name); buf = seprint(buf, end, "("); buf = eprintlist(buf, end, n->left, ", "); buf = secpy(buf, end, ")"); break; case Ochan: if(n->left){ buf = secpy(buf, end, "chan ["); buf = eprint(buf, end, n->left); buf = secpy(buf, end, "] of "); buf = seprint(buf, end, "%T", n->ty->tof); }else buf = seprint(buf, end, "chan of %T", n->ty->tof); break; case Oarray: buf = secpy(buf, end, "array ["); if(n->left != nil) buf = eprint(buf, end, n->left); buf = secpy(buf, end, "] of "); if(n->right != nil){ buf = secpy(buf, end, "{"); buf = eprintlist(buf, end, n->right, ", "); buf = secpy(buf, end, "}"); }else{ buf = seprint(buf, end, "%T", n->ty->tof); } break; case Oelem: case Olabel: if(n->left != nil){ buf = eprintlist(buf, end, n->left, " or "); buf = secpy(buf, end, " =>"); } buf = eprint(buf, end, n->right); break; case Orange: buf = eprint(buf, end, n->left); buf = secpy(buf, end, " to "); buf = eprint(buf, end, n->right); break; case Ospawn: buf = secpy(buf, end, "spawn "); buf = eprint(buf, end, n->left); break; case Oraise: buf = secpy(buf, end, "raise "); buf = eprint(buf, end, n->left); break; case Ocall: buf = eprint(buf, end, n->left); buf = secpy(buf, end, "("); buf = eprintlist(buf, end, n->right, ", "); buf = secpy(buf, end, ")"); break; case Oinc: case Odec: buf = eprint(buf, end, n->left); buf = secpy(buf, end, opname[n->op]); break; case Oindex: case Oindx: case Oinds: buf = eprint(buf, end, n->left); buf = secpy(buf, end, "["); buf = eprint(buf, end, n->right); buf = secpy(buf, end, "]"); break; case Oslice: buf = eprint(buf, end, n->left); buf = secpy(buf, end, "["); buf = eprint(buf, end, n->right->left); buf = secpy(buf, end, ":"); buf = eprint(buf, end, n->right->right); buf = secpy(buf, end, "]"); break; case Oload: buf = seprint(buf, end, "load %T ", n->ty); buf = eprint(buf, end, n->left); break; case Oref: case Olen: case Ohd: case Otl: case Otagof: buf = secpy(buf, end, opname[n->op]); buf = secpy(buf, end, " "); buf = eprint(buf, end, n->left); break; default: if(n->right == nil){ buf = secpy(buf, end, opname[n->op]); buf = eprint(buf, end, n->left); }else{ buf = eprint(buf, end, n->left); buf = secpy(buf, end, opname[n->op]); buf = eprint(buf, end, n->right); } break; } if(n->flags & PARENS) buf = secpy(buf, end, ")"); return buf; } char* eprintlist(char *buf, char *end, Node *elist, char *sep) { if(elist == nil) return buf; for(; elist->right != nil; elist = elist->right){ if(elist->op == Onothing) continue; if(elist->left->op == Ofnptr) return buf; buf = eprint(buf, end, elist->left); if(elist->right->left->op != Ofnptr) buf = secpy(buf, end, sep); } buf = eprint(buf, end, elist->left); return buf; } int nodeconv(Fmt *f) { Node *n; char buf[4096]; n = va_arg(f->args, Node*); buf[0] = 0; nprint(buf, buf+sizeof(buf), n, 0); return fmtstrcpy(f, buf); } char* nprint(char *buf, char *end, Node *n, int indent) { int i; if(n == nil) return buf; buf = seprint(buf, end, "\n"); for(i = 0; i < indent; i++) if(buf < end-1) *buf++ = ' '; switch(n->op){ case Oname: if(n->decl == nil) buf = secpy(buf, end, "name <nil>"); else buf = seprint(buf, end, "name %s", n->decl->sym->name); break; case Oconst: if(n->decl != nil && n->decl->sym != nil) buf = seprint(buf, end, "const %s", n->decl->sym->name); else buf = seprint(buf, end, "%O", n->op); if(n->ty == tint || n->ty == tbyte || n->ty == tbig) buf = seprint(buf, end, " (%ld)", (long)n->val); break; default: buf = seprint(buf, end, "%O", n->op); break; } buf = seprint(buf, end, " %T %d %d", n->ty, n->addable, n->temps); indent += 2; buf = nprint(buf, end, n->left, indent); buf = nprint(buf, end, n->right, indent); return buf; } & 0x80000000) v |= (Long)0xffffffff << 32; }else if(n->ty == tbyte) v &= 0xff; n->left = nil; n->right = nil; n->decl = nil; n->op = Oconst; n->val = v; return n; } /* * left and right are const reals */ Node* foldr(Node *n) { Node *left, *right; double rv; Long v; rv = 0.; v = 0; left = n->left; right = n->right; switch(n->op){ case Ocast: return n; case Oadd: rv = left->rval + right-old_contrib//root/sys/src/cmd/limbo/limbo/optab.c��������������������������������������������������� 664 � 0 � 0 � 24675 10215531030 21125�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" uchar movetab[Mend][Tend] = { /* Mas */ { /* Tnone */ 0, /* Tadt */ IMOVM, /* Tadtpick */ IMOVM, /* Tarray */ IMOVP, /* Tbig */ IMOVL, /* Tbyte */ IMOVB, /* Tchan */ IMOVP, /* Treal */ IMOVF, /* Tfn */ 0, /* Tint */ IMOVW, /* Tlist */ IMOVP, /* Tmodule */ IMOVP, /* Tref */ IMOVP, /* Tstring */ IMOVP, /* Ttuple */ IMOVM, /* Texception */ IMOVM, /* Tfix */ IMOVW, /* Tpoly */ IMOVP, /* Tainit */ 0, /* Talt */ 0, /* Tany */ IMOVP, /* Tarrow */ 0, /* Tcase */ 0, /* Tcasel */ 0, /* Tcasec */ 0, /* Tdot */ 0, /* Terror */ 0, /* Tgoto */ 0, /* Tid */ 0, }, /* Mcons */ { /* Tnone */ 0, /* Tadt */ ICONSM, /* Tadtpick */ 0, /* Tarray */ ICONSP, /* Tbig */ ICONSL, /* Tbyte */ ICONSB, /* Tchan */ ICONSP, /* Treal */ ICONSF, /* Tfn */ 0, /* Tint */ ICONSW, /* Tlist */ ICONSP, /* Tmodule */ ICONSP, /* Tref */ ICONSP, /* Tstring */ ICONSP, /* Ttuple */ ICONSM, /* Texception */ ICONSM, /* Tfix */ ICONSW, /* Tpoly */ ICONSP, /* Tainit */ 0, /* Talt */ 0, /* Tany */ ICONSP, /* Tarrow */ 0, /* Tcase */ 0, /* Tcasel */ 0, /* Tcasec */ 0, /* Tdot */ 0, /* Terror */ 0, /* Tgoto */ 0, /* Tid */ 0, }, /* Mhd */ { /* Tnone */ 0, /* Tadt */ IHEADM, /* Tadtpick */ 0, /* Tarray */ IHEADP, /* Tbig */ IHEADL, /* Tbyte */ IHEADB, /* Tchan */ IHEADP, /* Treal */ IHEADF, /* Tfn */ 0, /* Tint */ IHEADW, /* Tlist */ IHEADP, /* Tmodule */ IHEADP, /* Tref */ IHEADP, /* Tstring */ IHEADP, /* Ttuple */ IHEADM, /* Texception */ IHEADM, /* Tfix */ IHEADW, /* Tpoly */ IHEADP, /* Tainit */ 0, /* Talt */ 0, /* Tany */ IHEADP, /* Tarrow */ 0, /* Tcase */ 0, /* Tcasel */ 0, /* Tcasec */ 0, /* Tdot*/ 0, /* Terror */ 0, /* Tgoto */ 0, /* Tid */ 0, }, /* Mtl */ { /* Tnone */ 0, /* Tadt */ 0, /* Tadtpick */ 0, /* Tarray */ 0, /* Tbig */ 0, /* Tbyte */ 0, /* Tchan */ 0, /* Treal */ 0, /* Tfn */ 0, /* Tint */ 0, /* Tlist */ ITAIL, /* Tmodule */ 0, /* Tref */ 0, /* Tstring */ 0, /* Ttuple */ 0, /* Texception */ 0, /* Tfix */ 0, /* Tpoly */ 0, /* Tainit */ 0, /* Talt */ 0, /* Tany */ 0, /* Tarrow */ 0, /* Tcase */ 0, /* Tcasel */ 0, /* Tcasec */ 0, /* Tdot */ 0, /* Terror */ 0, /* Tgoto */ 0, /* Tid */ 0, }, }; uchar chantab[Tend] = { /* Tnone */ 0, /* Tadt */ INEWCM, /* Tadtpick */ 0, /* Tarray */ INEWCP, /* Tbig */ INEWCL, /* Tbyte */ INEWCB, /* Tchan */ INEWCP, /* Treal */ INEWCF, /* Tfn */ 0, /* Tint */ INEWCW, /* Tlist */ INEWCP, /* Tmodule */ INEWCP, /* Tref */ INEWCP, /* Tstring */ INEWCP, /* Ttuple */ INEWCM, /* Texception */ INEWCM, /* Tfix */ INEWCW, /* Tpoly */ INEWCP, /* Tainit */ 0, /* Talt */ 0, /* Tany */ INEWCP, /* Tarrow */ 0, /* Tcase */ 0, /* Tcasel */ 0, /* Tcasec */ 0, /* Tdot */ 0, /* Terror */ 0, /* Tgoto */ 0, /* Tid */ 0, }; uchar disoptab[Oend+1][7] = { /* opcode default byte word big real string fixed */ {0}, /* Oadd */ {0, IADDB, IADDW, IADDL, IADDF, IADDC, IADDW,}, /* Oaddas */ {0, IADDB, IADDW, IADDL, IADDF, IADDC, IADDW,}, /* Oadr */ {0}, /* Oadtdecl */ {0}, /* Oalt */ {0}, /* Oand */ {0, IANDB, IANDW, IANDL, 0, 0, 0,}, /* Oandand */ {0}, /* Oandas */ {0, IANDB, IANDW, IANDL, 0, 0, 0,}, /* Oarray */ {0}, /* Oas */ {0}, /* Obreak */ {0}, /* Ocall */ {0}, /* Ocase */ {0}, /* Ocast */ {0}, /* Ochan */ {0}, /* Ocomma */ {0}, /* Ocomp */ {0}, /* Ocondecl */ {0}, /* Ocons */ {0}, /* Oconst */ {0}, /* Ocont */ {0}, /* Odas */ {0}, /* Odec */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,}, /* Odiv */ {0, IDIVB, IDIVW, IDIVL, IDIVF, 0, IDIVX,}, /* Odivas */ {0, IDIVB, IDIVW, IDIVL, IDIVF, 0, IDIVX,}, /* Odo */ {0}, /* Odot */ {0}, /* Oelem */ {0}, /* Oeq */ {IBEQW, IBEQB, IBEQW, IBEQL, IBEQF, IBEQC, IBEQW,}, /* Oexcept */ {0}, /* Oexdecl */ {0}, /* Oexit */ {0}, /* Oexp */ {0, 0, IEXPW, IEXPL, IEXPF, 0, 0,}, /* Oexpas */ {0, 0, IEXPW, IEXPL, IEXPF, 0, 0,}, /* Oexstmt */ {0}, /* Ofielddecl */{0}, /* Ofnptr */ {0}, /* Ofor */ {0}, /* Ofunc */ {0}, /* Ogeq */ {0, IBGEB, IBGEW, IBGEL, IBGEF, IBGEC, IBGEW,}, /* Ogt */ {0, IBGTB, IBGTW, IBGTL, IBGTF, IBGTC, IBGTW,}, /* Ohd */ {0}, /* Oif */ {0}, /* Oimport */ {0}, /* Oinc */ {0, IADDB, IADDW, IADDL, IADDF, 0, IADDW,}, /* Oind */ {0}, /* Oindex */ {0,}, /* Oinds */ {0, 0, IINDC, 0, 0, 0, 0,}, /* Oindx */ {0, 0, IINDX, 0, 0, 0, 0,}, /* Oinv */ {0}, /* Ojmp */ {0}, /* Olabel */ {0}, /* Olen */ {ILENA, 0, 0, 0, 0, ILENC, 0,}, /* Oleq */ {0, IBLEB, IBLEW, IBLEL, IBLEF, IBLEC, IBLEW,}, /* Oload */ {0}, /* Olsh */ {0, ISHLB, ISHLW, ISHLL, 0, 0, 0,}, /* Olshas */ {0, ISHLB, ISHLW, ISHLL, 0, 0, 0,}, /* Olt */ {0, IBLTB, IBLTW, IBLTL, IBLTF, IBLTC, IBLTW,}, /* Omdot */ {0}, /* Omod */ {0, IMODB, IMODW, IMODL, 0, 0, 0,}, /* Omodas */ {0, IMODB, IMODW, IMODL, 0, 0, 0,}, /* Omoddecl */ {0}, /* Omul */ {0, IMULB, IMULW, IMULL, IMULF, 0, IMULX,}, /* Omulas */ {0, IMULB, IMULW, IMULL, IMULF, 0, IMULX,}, /* Oname */ {0}, /* Oneg */ {0, 0, 0, 0, INEGF, 0, 0,}, /* Oneq */ {IBNEW, IBNEB, IBNEW, IBNEL, IBNEF, IBNEC, IBNEW,}, /* Onot */ {0}, /* Onothing */ {0}, /* Oor */ {0, IORB, IORW, IORL, 0, 0, 0,}, /* Ooras */ {0, IORB, IORW, IORL, 0, 0, 0,}, /* Ooror */ {0}, /* Opick */ {0}, /* Opickdecl */ {0}, /* Opredec */ {0}, /* Opreinc */ {0}, /* Oraise */ {0}, /* Orange */ {0}, /* Orcv */ {0}, /* Oref */ {0}, /* Oret */ {0}, /* Orsh */ {0, ISHRB, ISHRW, ISHRL, 0, 0, 0,}, /* Orshas */ {0, ISHRB, ISHRW, ISHRL, 0, 0, 0,}, /* Oscope */ {0}, /* Oself */ {0}, /* Oseq */ {0}, /* Oslice */ {ISLICEA,0, 0, 0, 0, ISLICEC, 0,}, /* Osnd */ {0}, /* Ospawn */ {0}, /* Osub */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,}, /* Osubas */ {0, ISUBB, ISUBW, ISUBL, ISUBF, 0, ISUBW,}, /* Otagof */ {0}, /* Otl */ {0}, /* Otuple */ {0}, /* Otype */ {0}, /* Otypedecl */ {0}, /* Oused */ {0}, /* Ovardecl */ {0}, /* Ovardecli */ {0}, /* Owild */ {0}, /* Oxor */ {0, IXORB, IXORW, IXORL, 0, 0, 0,}, /* Oxoras */ {0, IXORB, IXORW, IXORL, 0, 0, 0,}, /* Oend */ {0} }; int setisused[] = { Oas, Odas, Oaddas, Osubas, Omulas, Odivas, Omodas, Oexpas, Oandas, Ooras, Oxoras, Olshas, Onothing, Orshas, Oinc, Odec, Opreinc, Opredec, Ocall, Oraise, Ospawn, Osnd, Orcv, -1 }; int setsideeffect[] = { Oas, Odas, Oaddas, Osubas, Omulas, Odivas, Omodas, Oexpas, Oandas, Ooras, Oxoras, Olshas, Orshas, Oinc, Odec, Opreinc, Opredec, Ocall, Oraise, Ospawn, Osnd, Orcv, Oadr, Oarray, Ocast, Ochan, Ocons, Odiv, Odot, Oind, Oindex, Oinds, Oindx, Olen, Oload, Omod, Oref, -1 }; char *opname[Oend+1] = { "unknown", /* Oadd */ "+", /* Oaddas */ "+=", /* Oadr */ "adr", /* Oadtdecl */ "adtdecl", /* Oalt */ "alt", /* Oand */ "&", /* Oandand */ "&&", /* Oandas */ "&=", /* Oarray */ "array", /* Oas */ "=", /* Obreak */ "break", /* Ocall */ "call", /* Ocase */ "case", /* Ocast */ "cast", /* Ochan */ "chan", /* Ocomma */ ",", /* Ocomp */ "~", /* Ocondecl */ "condecl", /* Ocons */ "::", /* Oconst */ "const", /* Ocont */ "continue", /* Odas */ ":=", /* Odec */ "--", /* Odiv */ "/", /* Odivas */ "/=", /* Odo */ "do", /* Odot */ ".", /* Oelem */ "elem", /* Oeq */ "==", /* Oexcept */ "except", /* Oexdecl */ "exdecl", /* Oexit */ "exit", /* Oexp */ "**", /* Oexpas */ "**=", /* Oexstmt */ "exstat", /* Ofielddecl */"fielddecl", /* Ofnptr */ "fnptr", /* Ofor */ "for", /* Ofunc */ "fn(){}", /* Ogeq */ ">=", /* Ogt */ ">", /* Ohd */ "hd", /* Oif */ "if", /* Oimport */ "import", /* Oinc */ "++", /* Oind */ "*", /* Oindex */ "index", /* Oinds */ "inds", /* Oindx */ "indx", /* Oinv */ "inv", /* Ojmp */ "jmp", /* Olabel */ "label", /* Olen */ "len", /* Oleq */ "<=", /* Oload */ "load", /* Olsh */ "<<", /* Olshas */ "<<=", /* Olt */ "<", /* Omdot */ "->", /* Omod */ "%", /* Omodas */ "%=", /* Omoddecl */ "moddecl", /* Omul */ "*", /* Omulas */ "*=", /* Oname */ "name", /* Oneg */ "-", /* Oneq */ "!=", /* Onot */ "!", /* Onothing */ "nothing", /* Oor */ "|", /* Ooras */ "|=", /* Ooror */ "||", /* Opick */ "pick", /* Opickdecl */ "pickdecl", /* Opredec */ "--", /* Opreinc */ "++", /* Oraise */ "raise", /* Orange */ "range", /* Orcv */ "<-", /* Oref */ "ref", /* Oret */ "return", /* Orsh */ ">>", /* Orshas */ ">>=", /* Oscope */ "scope", /* Oself */ "self", /* Oseq */ "seq", /* Oslice */ "slice", /* Osnd */ "<-=", /* Ospawn */ "spawn", /* Osub */ "-", /* Osubas */ "-=", /* Otl */ "tagof", /* Otl */ "tl", /* Otuple */ "tuple", /* Otype */ "type", /* Otypedecl */ "typedecl", /* Oused */ "used", /* Ovardecl */ "vardecl", /* Ovardecli */ "vardecli", /* Owild */ "*", /* Oxor */ "^", /* Oxoras */ "^=", /* Oend */ "unknown" }; int setisbyteinst[] = { IMULB, ISUBB, IADDB, IDIVB, IORB, IXORB, ISHLB, ISHRB, IMODB, IANDB, IBEQB, IBNEB, IBLTB, IBLEB, IBGTB, IBGEB, -1 }; char *instname[256] = { "nop", "alt", "nbalt", "goto", "call", "frame", "spawn", "runt", "load", "mcall", "mspawn", "mframe", "ret", "jmp", "case", "exit", "new", "newa", "newcb", "newcw", "newcf", "newcp", "newcm", "newcmp", "send", "recv", "consb", "consw", "consp", "consf", "consm", "consmp", "headb", "headw", "headp", "headf", "headm", "headmp", "tail", "lea", "indx", "movp", "movm", "movmp", "movb", "movw", "movf", "cvtbw", "cvtwb", "cvtfw", "cvtwf", "cvtca", "cvtac", "cvtwc", "cvtcw", "cvtfc", "cvtcf", "addb", "addw", "addf", "subb", "subw", "subf", "mulb", "mulw", "mulf", "divb", "divw", "divf", "modw", "modb", "andb", "andw", "orb", "orw", "xorb", "xorw", "shlb", "shlw", "shrb", "shrw", "insc", "indc", "addc", "lenc", "lena", "lenl", "beqb", "bneb", "bltb", "bleb", "bgtb", "bgeb", "beqw", "bnew", "bltw", "blew", "bgtw", "bgew", "beqf", "bnef", "bltf", "blef", "bgtf", "bgef", "beqc", "bnec", "bltc", "blec", "bgtc", "bgec", "slicea", "slicela", "slicec", "indw", "indf", "indb", "negf", "movl", "addl", "subl", "divl", "modl", "mull", "andl", "orl", "xorl", "shll", "shrl", "bnel", "bltl", "blel", "bgtl", "bgel", "beql", "cvtlf", "cvtfl", "cvtlw", "cvtwl", "cvtlc", "cvtcl", "headl", "consl", "newcl", "casec", "indl", "movpc", "tcmp", "mnewz", "cvtrf", "cvtfr", "cvtws", "cvtsw", "lsrw", "lsrl", "eclr", "newz", "newaz", "raise", "casel", "mulx", "divx", "cvtxx", "mulx0", "divx0", "cvtxx0", "mulx1", "divx1", "cvtxx1", "cvtfx", "cvtxf", "expw", "expl", "expf", "self", }; * Tainit */ 0, /* Talt */ 0, /* Tany */ IMOVP, /* Tarrow */ 0old_contrib//root/sys/src/cmd/limbo/limbo/optim.c��������������������������������������������������� 664 � 0 � 0 � 74707 10540574276 21175�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" #define bzero bbzero /* bsd name space pollution */ /* (r, s) := f(); => r, s have def on same pc s = g(); => this def kills previous r def (and s def) solution: r has def pc, s has def pc+1 and next instruction has pc pc+2 */ #define BLEN (8*sizeof(ulong)) #define BSHIFT 5 /* assumes ulong 4 */ #define BMASK (BLEN-1) #define SIGN(n) (1<<(n-1)) #define MSK(n) (SIGN(n)|(SIGN(n)-1)) #define MASK(a, b) (MSK((b)-(a)+1)<<(a)) #define isnilsrc(s) ((s)->start.line == 0 && (s)->stop.line == 0 && (s)->start.pos == 0 && (s)->stop.pos == 0) #define limbovar(d) ((d)->sym->name[0] != '.') #define structure(t) ((t)->kind == Tadt || (t)->kind == Ttuple) enum { Bclr, Band, Bandinv, Bstore, Bandrev, Bnoop, Bxor, Bor, Bnor, Bequiv, Binv, Bimpby, Brev, Bimp, Bnand, Bset, }; enum { Suse = 1, Muse = 2, Duse = 4, Sdef = 8, Mdef = 16, Ddef = 32, Tuse1 = 64, /* fixed point temporary */ Tuse2 = 128, /* fixed point temporary */ Mduse = 256, /* D used if M nil */ None = 0, Unop = Suse|Ddef, Cunop = Muse|Ddef, Threop = Suse|Muse|Ddef, Binop = Suse|Muse|Ddef|Mduse, Mbinop = Suse|Mdef|Duse, /* strange */ Abinop=Suse|Duse|Ddef, Mabinop = Suse|Muse|Duse|Ddef, Use1 = Suse, Use2 = Suse|Duse, Use3 = Suse|Muse|Duse, }; enum { Sshift = 10, Mshift = 5, Dshift = 0, }; #define S(x) ((x)<<Sshift) #define M(x) ((x)<<Mshift) #define D(x) ((x)<<Dshift) #define SS(x) (((x)>>Sshift)&0x1f) #define SM(x) (((x)>>Mshift)&0x1f) #define SD(x) (((x)>>Dshift)&0x1f) enum { I = 0, /* ignore */ B = 1, /* byte */ W = 4, /* int */ P = 4, /* pointer */ A = 4, /* array */ C = 4, /* string */ X = 4, /* fixed */ R = 4, /* float */ L = 8, /* big */ F = 8, /* real */ Sh = 2, /* short */ Pc = 4, /* pc */ Mp = 16, /* memory */ Bop2 = S(B)|D(B), Bop = S(B)|M(B)|D(B), Bopb = S(B)|M(B)|D(Pc), Wop2 = S(W)|D(W), Wop = S(W)|M(W)|D(W), Wopb = S(W)|M(W)|D(Pc), Lop2 = S(L)|D(L), Lop = S(L)|M(L)|D(L), Lopb = S(L)|M(L)|D(Pc), Cop2 = Wop2, Cop = Wop, Copb = Wopb, Fop2 = Lop2, Fop = Lop, Fopb = Lopb, Xop = Wop, }; typedef struct Array Array; typedef struct Bits Bits; typedef struct Blist Blist; typedef struct Block Block; typedef struct Idlist Idlist; typedef struct Optab Optab; struct Array { int n; int m; Block **a; }; struct Bits { int n; ulong *b; }; struct Blist { Block *block; Blist *next; }; struct Block { int dfn; int flags; Inst *first; Inst *last; Block *prev; Block *next; Blist *pred; Blist *succ; Bits kill; Bits gen; Bits in; Bits out; }; struct Idlist { int id; Idlist *next; }; struct Optab { short flags; short size; }; Block zblock; Decl *regdecls; Idlist *frelist; Idlist *deflist; Idlist *uselist; static void addlist(Idlist **hd, int id) { Idlist *il; if(frelist == nil) il = (Idlist*)malloc(sizeof(Idlist)); else{ il = frelist; frelist = frelist->next; } il->id = id; il->next = *hd; *hd = il; } static void freelist(Idlist **hd) { Idlist *il; for(il = *hd; il != nil && il->next != nil; il = il->next) ; if(il != nil){ il->next = frelist; frelist = *hd; *hd = nil; } } Optab opflags[] = { /* INOP */ None, 0, /* IALT */ Unop, S(Mp)|D(W), /* INBALT */ Unop, S(Mp)|D(W), /* IGOTO */ Use2, S(W)|D(I), /* ICALL */ Use2, S(P)|D(Pc), /* IFRAME */ Unop, S(W)|D(P), /* ISPAWN */ Use2, S(P)|D(Pc), /* IRUNT */ None, 0, /* ILOAD */ Threop, S(C)|M(P)|D(P), /* IMCALL */ Use3, S(P)|M(W)|D(P), /* IMSPAWN */ Use3, S(P)|M(W)|D(P), /* IMFRAME */ Threop, S(P)|M(W)|D(P), /* IRET */ None, 0, /* IJMP */ Duse, D(Pc), /* ICASE */ Use2, S(W)|D(I), /* IEXIT */ None, 0, /* INEW */ Unop, S(W)|D(P), /* INEWA */ Threop, S(W)|M(W)|D(P), /* INEWCB */ Cunop, M(W)|D(P), /* INEWCW */ Cunop, M(W)|D(P), /* INEWCF */ Cunop, M(W)|D(P), /* INEWCP */ Cunop, M(W)|D(P), /* INEWCM */ Threop, S(W)|M(W)|D(P), /* INEWCMP */ Threop, S(W)|M(W)|D(P), /* ISEND */ Use2, S(Mp)|D(P), /* IRECV */ Unop, S(P)|D(Mp), /* ICONSB */ Abinop, S(B)|D(P), /* ICONSW */ Abinop, S(W)|D(P), /* ICONSP */ Abinop, S(P)|D(P), /* ICONSF */ Abinop, S(F)|D(P), /* ICONSM */ Mabinop, S(Mp)|M(W)|D(P), /* ICONSMP */ Mabinop, S(Mp)|M(W)|D(P), /* IHEADB */ Unop, S(P)|D(B), /* IHEADW */ Unop, S(P)|D(W), /* IHEADP */ Unop, S(P)|D(P), /* IHEADF */ Unop, S(P)|D(F), /* IHEADM */ Threop, S(P)|M(W)|D(Mp), /* IHEADMP */ Threop, S(P)|M(W)|D(Mp), /* ITAIL */ Unop, S(P)|D(P), /* ILEA */ Ddef, S(Mp)|D(P), /* S done specially cos of ALT */ /* IINDX */ Mbinop, S(P)|M(P)|D(W), /* IMOVP */ Unop, S(P)|D(P), /* IMOVM */ Threop, S(Mp)|M(W)|D(Mp), /* IMOVMP */ Threop, S(Mp)|M(W)|D(Mp), /* IMOVB */ Unop, Bop2, /* IMOVW */ Unop, Wop2, /* IMOVF */ Unop, Fop2, /* ICVTBW */ Unop, S(B)|D(W), /* ICVTWB */ Unop, S(W)|D(B), /* ICVTFW */ Unop, S(F)|D(W), /* ICVTWF */ Unop, S(W)|D(F), /* ICVTCA */ Unop, S(C)|D(A), /* ICVTAC */ Unop, S(A)|D(C), /* ICVTWC */ Unop, S(W)|D(C), /* ICVTCW */ Unop, S(C)|D(W), /* ICVTFC */ Unop, S(F)|D(C), /* ICVTCF */ Unop, S(C)|D(F), /* IADDB */ Binop, Bop, /* IADDW */ Binop, Wop, /* IADDF */ Binop, Fop, /* ISUBB */ Binop, Bop, /* ISUBW */ Binop, Wop, /* ISUBF */ Binop, Fop, /* IMULB */ Binop, Bop, /* IMULW */ Binop, Wop, /* IMULF */ Binop, Fop, /* IDIVB */ Binop, Bop, /* IDIVW */ Binop, Wop, /* IDIVF */ Binop, Fop, /* IMODW */ Binop, Wop, /* IMODB */ Binop, Bop, /* IANDB */ Binop, Bop, /* IANDW */ Binop, Wop, /* IORB */ Binop, Bop, /* IORW */ Binop, Wop, /* IXORB */ Binop, Bop, /* IXORW */ Binop, Wop, /* ISHLB */ Binop, S(W)|M(B)|D(B), /* ISHLW */ Binop, Wop, /* ISHRB */ Binop, S(W)|M(B)|D(B), /* ISHRW */ Binop, Wop, /* IINSC */ Mabinop, S(W)|M(W)|D(C), /* IINDC */ Threop, S(C)|M(W)|D(W), /* IADDC */ Binop, Cop, /* ILENC */ Unop, S(C)|D(W), /* ILENA */ Unop, S(A)|D(W), /* ILENL */ Unop, S(P)|D(W), /* IBEQB */ Use3, Bopb, /* IBNEB */ Use3, Bopb, /* IBLTB */ Use3, Bopb, /* IBLEB */ Use3, Bopb, /* IBGTB */ Use3, Bopb, /* IBGEB */ Use3, Bopb, /* IBEQW */ Use3, Wopb, /* IBNEW */ Use3, Wopb, /* IBLTW */ Use3, Wopb, /* IBLEW */ Use3, Wopb, /* IBGTW */ Use3, Wopb, /* IBGEW */ Use3, Wopb, /* IBEQF */ Use3, Fopb, /* IBNEF */ Use3, Fopb, /* IBLTF */ Use3, Fopb, /* IBLEF */ Use3, Fopb, /* IBGTF */ Use3, Fopb, /* IBGEF */ Use3, Fopb, /* IBEQC */ Use3, Copb, /* IBNEC */ Use3, Copb, /* IBLTC */ Use3, Copb, /* IBLEC */ Use3, Copb, /* IBGTC */ Use3, Copb, /* IBGEC */ Use3, Copb, /* ISLICEA */ Mabinop, S(W)|M(W)|D(P), /* ISLICELA */ Use3, S(P)|M(W)|D(P), /* ISLICEC */ Mabinop, S(W)|M(W)|D(C), /* IINDW */ Mbinop, S(P)|M(P)|D(W), /* IINDF */ Mbinop, S(P)|M(P)|D(W), /* IINDB */ Mbinop, S(P)|M(P)|D(W), /* INEGF */ Unop, Fop2, /* IMOVL */ Unop, Lop2, /* IADDL */ Binop, Lop, /* ISUBL */ Binop, Lop, /* IDIVL */ Binop, Lop, /* IMODL */ Binop, Lop, /* IMULL */ Binop, Lop, /* IANDL */ Binop, Lop, /* IORL */ Binop, Lop, /* IXORL */ Binop, Lop, /* ISHLL */ Binop, S(W)|M(L)|D(L), /* ISHRL */ Binop, S(W)|M(L)|D(L), /* IBNEL */ Use3, Lopb, /* IBLTL */ Use3, Lopb, /* IBLEL */ Use3, Lopb, /* IBGTL */ Use3, Lopb, /* IBGEL */ Use3, Lopb, /* IBEQL */ Use3, Lopb, /* ICVTLF */ Unop, S(L)|D(F), /* ICVTFL */ Unop, S(F)|D(L), /* ICVTLW */ Unop, S(L)|D(W), /* ICVTWL */ Unop, S(W)|D(L), /* ICVTLC */ Unop, S(L)|D(C), /* ICVTCL */ Unop, S(C)|D(L), /* IHEADL */ Unop, S(P)|D(L), /* ICONSL */ Abinop, S(L)|D(P), /* INEWCL */ Cunop, M(W)|D(P), /* ICASEC */ Use2, S(C)|D(I), /* IINDL */ Mbinop, S(P)|M(P)|D(W), /* IMOVPC */ Unop, S(W)|D(P), /* ITCMP */ Use2, S(P)|D(P), /* IMNEWZ */ Threop, S(P)|M(W)|D(P), /* ICVTRF */ Unop, S(R)|D(F), /* ICVTFR */ Unop, S(F)|D(R), /* ICVTWS */ Unop, S(W)|D(Sh), /* ICVTSW */ Unop, S(Sh)|D(W), /* ILSRW */ Binop, Wop, /* ILSRL */ Binop, S(W)|M(L)|D(L), /* IECLR */ None, 0, /* INEWZ */ Unop, S(W)|D(P), /* INEWAZ */ Threop, S(W)|M(W)|D(P), /* IRAISE */ Use1, S(P), /* ICASEL */ Use2, S(L)|D(I), /* IMULX */ Binop|Tuse2, Xop, /* IDIVX */ Binop|Tuse2, Xop, /* ICVTXX */ Threop, Xop, /* IMULX0 */ Binop|Tuse1|Tuse2, Xop, /* IDIVX0 */ Binop|Tuse1|Tuse2, Xop, /* ICVTXX0 */ Threop|Tuse1, Xop, /* IMULX1 */ Binop|Tuse1|Tuse2, Xop, /* IDIVX1 */ Binop|Tuse1|Tuse2, Xop, /* ICVTXX1 */ Threop|Tuse1, Xop, /* ICVTFX */ Threop, S(F)|M(F)|D(X), /* ICVTXF */ Threop, S(X)|M(F)|D(F), /* IEXPW */ Binop, S(W)|M(W)|D(W), /* IEXPL */ Binop, S(W)|M(L)|D(L), /* IEXPF */ Binop, S(W)|M(F)|D(F), /* ISELF */ Ddef, D(P), /* IEXC */ None, 0, /* IEXC0 */ None, 0, /* INOOP */ None, 0, }; /* static int pop(int i) { i = (i & 0x55555555) + ((i>>1) & 0x55555555); i = (i & 0x33333333) + ((i>>2) & 0x33333333); i = (i & 0x0F0F0F0F) + ((i>>4) & 0x0F0F0F0F); i = (i & 0x00FF00FF) + ((i>>8) & 0x00FF00FF); i = (i & 0x0000FFFF) + ((i>>16) & 0x0000FFFF); return i; } */ static int bitc(uint x) { uint n; n = (x>>1)&0x77777777; x -= n; n = (n>>1)&0x77777777; x -= n; n = (n>>1)&0x77777777; x -= n; x = (x+(x>>4))&0x0f0f0f0f; x *= 0x01010101; return x>>24; } /* static int top(uint x) { int i; for(i = -1; x; i++) x >>= 1; return i; } */ static int topb(uint x) { int i; if(x == 0) return -1; i = 0; if(x&0xffff0000){ i |= 16; x >>= 16; } if(x&0xff00){ i |= 8; x >>= 8; } if(x&0xf0){ i |= 4; x >>= 4; } if(x&0xc){ i |= 2; x >>= 2; } if(x&0x2) i |= 1; return i; } /* static int lowb(uint x) { int i; if(x == 0) return -1; for(i = BLEN; x; i--) x <<= 1; return i; } */ static int lowb(uint x) { int i; if(x == 0) return -1; i = 0; if((x&0xffff) == 0){ i |= 16; x >>= 16; } if((x&0xff) == 0){ i |= 8; x >>= 8; } if((x&0xf) == 0){ i |= 4; x >>= 4; } if((x&0x3) == 0){ i |= 2; x >>= 2; } return i+1-(x&1); } static void pbit(int x, int n) { int i, m; m = 1; for(i = 0; i < BLEN; i++){ if(x&m) print("%d ", i+n); m <<= 1; } } static ulong bop(int o, ulong s, ulong d) { switch(o){ case Bclr: return 0; case Band: return s & d; case Bandinv: return s & ~d; case Bstore: return s; case Bandrev: return ~s & d; case Bnoop: return d; case Bxor: return s ^ d; case Bor: return s | d; case Bnor: return ~(s | d); case Bequiv: return ~(s ^ d); case Binv: return ~d; case Bimpby: return s | ~d; case Brev: return ~s; case Bimp: return ~s | d; case Bnand: return ~(s & d); case Bset: return 0xffffffff; } return 0; } static Bits bnew(int n, int bits) { Bits b; if(bits) b.n = (n+BLEN-1)>>BSHIFT; else b.n = n; b.b = allocmem(b.n*sizeof(ulong)); memset(b.b, 0, b.n*sizeof(ulong)); return b; } static void bfree(Bits b) { free(b.b); } static void bset(Bits b, int n) { b.b[n>>BSHIFT] |= 1<<(n&BMASK); } static void bclr(Bits b, int n) { b.b[n>>BSHIFT] &= ~(1<<(n&BMASK)); } static int bmem(Bits b, int n) { return b.b[n>>BSHIFT] & (1<<(n&BMASK)); } static void bsets(Bits b, int m, int n) { int i, c1, c2; c1 = m>>BSHIFT; c2 = n>>BSHIFT; m &= BMASK; n &= BMASK; if(c1 == c2){ b.b[c1] |= MASK(m, n); return; } for(i = c1+1; i < c2; i++) b.b[i] = 0xffffffff; b.b[c1] |= MASK(m, BLEN-1); b.b[c2] |= MASK(0, n); } static void bclrs(Bits b, int m, int n) { int i, c1, c2; if(n < 0) n = (b.n<<BSHIFT)-1; c1 = m>>BSHIFT; c2 = n>>BSHIFT; m &= BMASK; n &= BMASK; if(c1 == c2){ b.b[c1] &= ~MASK(m, n); return; } for(i = c1+1; i < c2; i++) b.b[i] = 0; b.b[c1] &= ~MASK(m, BLEN-1); b.b[c2] &= ~MASK(0, n); } /* b = a op b */ static Bits boper(int o, Bits a, Bits b) { int i, n; n = a.n; if(b.n != n) fatal("boper %d %d %d", o, a.n, b.n); for(i = 0; i < n; i++) b.b[i] = bop(o, a.b[i], b.b[i]); return b; } static int beq(Bits a, Bits b) { int i, n; n = a.n; for(i = 0; i < n; i++) if(a.b[i] != b.b[i]) return 0; return 1; } static int bzero(Bits b) { int i, n; n = b.n; for(i = 0; i < n; i++) if(b.b[i] != 0) return 0; return 1; } static int bitcnt(Bits b) { int i, m, n; m = b.n; n = 0; for(i = 0; i < m; i++) n += bitc(b.b[i]); return n; } static int topbit(Bits b) { int i, n; n = b.n; for(i = n-1; i >= 0; i--) if(b.b[i] != 0) return (i<<BSHIFT)+topb(b.b[i]); return -1; } static int lowbit(Bits b) { int i, n; n = b.n; for(i = 0; i < n; i++) if(b.b[i] != 0) return (i<<BSHIFT)+lowb(b.b[i]); return -1; } static void pbits(Bits b) { int i, n; n = b.n; for(i = 0; i < n; i++) pbit(b.b[i], i<<BSHIFT); } static char* decname(Decl *d) { if(d->sym == nil) return "<nil>"; return d->sym->name; } static void warning(Inst *i, char *s, Decl *d, Decl *sd) { int n; char *f; Decl *ds; n = 0; for(ds = sd; ds != nil; ds = ds->next) if(ds->link == d) n += strlen(ds->sym->name)+1; if(n == 0){ warn(i->src.start, "%s: %s", d->sym->name, s); return; } n += strlen(d->sym->name); f = malloc(n+1); strcpy(f, d->sym->name); for(ds = sd; ds != nil; ds = ds->next){ if(ds->link == d){ strcat(f, "/"); strcat(f, ds->sym->name); } } warn(i->src.start, "%s: %s", f, s); free(f); } static int inspc(Inst *in) { int n; Inst *i; n = 0; for(i = in; i != nil; i = i->next) i->pc = n++; return n; } static Inst* pc2i(Block *b, int pc) { Inst *i; for( ; b != nil; b = b->next){ if(pc > b->last->pc) continue; for(i = b->first; ; i = i->next){ if(i->pc == pc) return i; if(i == b->last) fatal("pc2i a"); } } fatal("pc2i b"); return nil; } static void padr(int am, Addr *a, Inst *br) { long reg; if(br != nil){ print("$%ld", br->pc); return; } reg = a->reg; if(a->decl != nil && am != Adesc) reg += a->decl->offset; switch(am){ case Anone: print("-"); break; case Aimm: case Apc: case Adesc: print("$%ld", a->offset); break; case Aoff: print("$%ld", a->decl->iface->offset); break; case Anoff: print("-$%ld", a->decl->iface->offset); break; case Afp: print("%ld(fp)", reg); break; case Afpind: print("%ld(%ld(fp))", a->offset, reg); break; case Amp: print("%ld(mp)", reg); break; case Ampind: print("%ld(%ld(mp))", a->offset, reg); break; case Aldt: print("$%ld", reg); break; case Aerr: default: print("%ld(%ld(?%d?))", a->offset, reg, am); break; } } static void pins(Inst *i) { /* print("%L %ld ", i->src.start, i->pc); */ print(" %ld ", i->pc); if(i->op >= 0 && i->op < MAXDIS) print("%s", instname[i->op]); else print("noop"); print(" "); padr(i->sm, &i->s, nil); print(", "); padr(i->mm, &i->m, nil); print(", "); padr(i->dm, &i->d, i->branch); print("\n"); } static void blfree(Blist *bl) { Blist *nbl; for( ; bl != nil; bl = nbl){ nbl = bl->next; free(bl); } } static void freebits(Bits *bs, int nv) { int i; for(i = 0; i < nv; i++) bfree(bs[i]); free(bs); } static void freeblks(Block *b) { Block *nb; for( ; b != nil; b = nb){ blfree(b->pred); blfree(b->succ); bfree(b->kill); bfree(b->gen); bfree(b->in); bfree(b->out); nb = b->next; free(b); } } static int len(Decl *d) { int n; n = 0; for( ; d != nil; d = d->next) n++; return n; } static Bits* allocbits(int nv, int npc) { int i; Bits *defs; defs = (Bits*)allocmem(nv*sizeof(Bits)); for(i = 0; i < nv; i++) defs[i] = bnew(npc, 1); return defs; } static int bitcount(Bits *bs, int nv) { int i, n; n = 0; for(i = 0; i < nv; i++) n += bitcnt(bs[i]); return n; } static Block* mkblock(Inst *i) { Block *b; b = allocmem(sizeof(Block)); *b = zblock; b->first = b->last = i; return b; } static Blist* mkblist(Block *b, Blist *nbl) { Blist *bl; bl = allocmem(sizeof(Blist)); bl->block = b; bl->next = nbl; return bl; } static void leader(Inst *i, Array *ab) { int m, n; Block *b, **a; if(i != nil && i->pc == 0){ if((n = ab->n) == (m = ab->m)){ a = ab->a; ab->a = allocmem(2*m*sizeof(Block*)); memcpy(ab->a, a, m*sizeof(Block*)); ab->m = 2*m; free(a); } b = mkblock(i); b->dfn = n; ab->a[n] = b; i->pc = ab->n = n+1; } } static Block* findb(Inst *i, Array *ab) { if(i == nil) return nil; if(i->pc <= 0) fatal("pc <= 0 in findb"); return ab->a[i->pc-1]; } static int memb(Block *b, Blist *bl) { for( ; bl != nil; bl = bl->next) if(bl->block == b) return 1; return 0; } static int canfallthrough(Inst *i) { if(i == nil) return 0; switch(i->op){ case IGOTO: case ICASE: case ICASEL: case ICASEC: case IRET: case IEXIT: case IRAISE: case IJMP: return 0; case INOOP: return i->branch != nil; } return 1; } static void predsucc(Block *b1, Block *b2) { if(b1 == nil || b2 == nil) return; if(!memb(b1, b2->pred)) b2->pred = mkblist(b1, b2->pred); if(!memb(b2, b1->succ)) b1->succ = mkblist(b2, b1->succ); } static Block* mkblocks(Inst *in, int *nb) { Inst *i; Block *b, *firstb, *lastb; Label *lab; Array *ab; int j, n; ab = allocmem(sizeof(Array)); ab->n = 0; ab->m = 16; ab->a = allocmem(ab->m*sizeof(Block*)); leader(in, ab); for(i = in; i != nil; i = i->next){ switch(i->op){ case IGOTO: case ICASE: case ICASEL: case ICASEC: case INOOP: if(i->op == INOOP && i->branch != nil){ leader(i->branch, ab); leader(i->next, ab); break; } leader(i->d.decl->ty->cse->iwild, ab); lab = i->d.decl->ty->cse->labs; n = i->d.decl->ty->cse->nlab; for(j = 0; j < n; j++) leader(lab[j].inst, ab); leader(i->next, ab); break; case IRET: case IEXIT: case IRAISE: leader(i->next, ab); break; case IJMP: leader(i->branch, ab); leader(i->next, ab); break; default: if(i->branch != nil){ leader(i->branch, ab); leader(i->next, ab); } break; } } firstb = lastb = mkblock(nil); for(i = in; i != nil; i = i->next){ if(i->pc != 0){ b = findb(i, ab); b->prev = lastb; lastb->next = b; if(canfallthrough(lastb->last)) predsucc(lastb, b); lastb = b; } else lastb->last = i; switch(i->op){ case IGOTO: case ICASE: case ICASEL: case ICASEC: case INOOP: if(i->op == INOOP && i->branch != nil){ b = findb(i->next, ab); predsucc(lastb, b); b = findb(i->branch, ab); predsucc(lastb, b); break; } b = findb(i->d.decl->ty->cse->iwild, ab); predsucc(lastb, b); lab = i->d.decl->ty->cse->labs; n = i->d.decl->ty->cse->nlab; for(j = 0; j < n; j++){ b = findb(lab[j].inst, ab); predsucc(lastb, b); } break; case IRET: case IEXIT: case IRAISE: break; case IJMP: b = findb(i->branch, ab); predsucc(lastb, b); break; default: if(i->branch != nil){ b = findb(i->next, ab); predsucc(lastb, b); b = findb(i->branch, ab); predsucc(lastb, b); } break; } } *nb = ab->n; free(ab->a); free(ab); b = firstb->next; b->prev = nil; return b; } static int back(Block *b1, Block *b2) { return b1->dfn >= b2->dfn; } static void pblocks(Block *b, int nb) { Inst *i; Blist *bl; print("--------------------%d blocks--------------------\n", nb); print("------------------------------------------------\n"); for( ; b != nil; b = b->next){ print("dfn=%d\n", b->dfn); print(" pred "); for(bl = b->pred; bl != nil; bl = bl->next) print("%d%s ", bl->block->dfn, back(bl->block, b) ? "*" : ""); print("\n"); print(" succ "); for(bl = b->succ; bl != nil; bl = bl->next) print("%d%s ", bl->block->dfn, back(b, bl->block) ? "*" : ""); print("\n"); for(i = b->first; i != nil; i = i->next){ // print(" %I\n", i); pins(i); if(i == b->last) break; } } print("------------------------------------------------\n"); } static void ckblocks(Inst *in, Block *b, int nb) { int n; Block *lastb; if(b->first != in) fatal("A - %d", b->dfn); n = 0; lastb = nil; for( ; b != nil; b = b->next){ n++; if(b->prev != lastb) fatal("a - %d\n", b->dfn); if(b->prev != nil && b->prev->next != b) fatal("b - %d\n", b->dfn); if(b->next != nil && b->next->prev != b) fatal("c - %d\n", b->dfn); if(b->prev != nil && b->prev->last->next != b->first) fatal("B - %d\n", b->dfn); if(b->next != nil && b->last->next != b->next->first) fatal("C - %d\n", b->dfn); if(b->next == nil && b->last->next != nil) fatal("D - %d\n", b->dfn); if(b->last->branch != nil && b->succ->block->first != b->last->branch) fatal("0 - %d\n", b->dfn); lastb = b; } if(n != nb) fatal("N - %d %d\n", n, nb); } static void dfs0(Block *b, int *n) { Block *s; Blist *bl; b->flags = 1; for(bl = b->succ; bl != nil; bl = bl->next){ s = bl->block; if(s->flags == 0) dfs0(s, n); } b->dfn = --(*n); } static int dfs(Block *b, int nb) { int n, u; Block *b0; b0 = b; n = nb; dfs0(b0, &n); u = 0; for(b = b0; b != nil; b = b->next){ if(b->flags == 0){ /* unreachable: see foldbranch */ fatal("found unreachable code"); u++; b->prev->next = b->next; if(b->next){ b->next->prev = b->prev; b->prev->last->next = b->next->first; } else b->prev->last->next = nil; } b->flags = 0; } if(u){ for(b = b0; b != nil; b = b->next) b->dfn -= u; } return nb-u; } static void loop0(Block *b) { Block *p; Blist *bl; b->flags = 1; for(bl = b->pred; bl != nil; bl = bl->next){ p = bl->block; if(p->flags == 0) loop0(p); } } /* b1->b2 a back edge */ static void loop(Block *b, Block *b1, Block *b2) { if(0 && debug['o']) print("back edge %d->%d\n", b1->dfn, b2->dfn); b2->flags = 1; if(b1->flags == 0) loop0(b1); if(0 && debug['o']) print(" loop "); for( ; b != nil; b = b->next){ if(b->flags && 0 && debug['o']) print("%d ", b->dfn); b->flags = 0; } if(0 && debug['o']) print("\n"); } static void loops(Block *b) { Block *b0; Blist *bl; b0 = b; for( ; b != nil; b = b->next){ for(bl = b->succ; bl != nil; bl = bl->next){ if(back(b, bl->block)) loop(b0, b, bl->block); } } } static int imm(int m, Addr *a) { if(m == Aimm) return a->offset; fatal("bad immediate value"); return -1; } static int desc(int m, Addr *a) { if(m == Adesc) return a->decl->desc->size; fatal("bad descriptor value"); return -1; } static int fpoff(int m, Addr *a) { int off; Decl *d; if(m == Afp || m == Afpind){ off = a->reg; if((d = a->decl) != nil) off += d->offset; return off; } return -1; } static int size(Inst *i) { switch(i->op){ case ISEND: case IRECV: case IALT: case INBALT: case ILEA: return i->m.offset; case IMOVM: case IHEADM: case ICONSM: return imm(i->mm, &i->m); case IMOVMP: case IHEADMP: case ICONSMP: return desc(i->mm, &i->m); break; } fatal("bad op in size"); return -1; } static Decl* mkdec(int o) { Decl *d; d = mkdecl(&nosrc, Dlocal, tint); d->offset = o; return d; } static void mkdecls(void) { regdecls = mkdec(REGRET*IBY2WD); regdecls->next = mkdec(STemp); regdecls->next->next = mkdec(DTemp); } static Decl* sharedecls(Decl *d) { Decl *ld; ld = d; for(d = d->next ; d != nil; d = d->next){ if(d->offset <= ld->offset) break; ld = d; } return d; } static int finddec(int o, int s, Decl *vars, int *nv, Inst *i) { int m, n; Decl *d; n = 0; for(d = vars; d != nil; d = d->next){ if(o >= d->offset && o < d->offset+d->ty->size){ m = 1; while(o+s > d->offset+d->ty->size){ m++; d = d->next; } *nv = m; return n; } n++; } // print("%d %d missing\n", o, s); pins(i); fatal("missing decl"); return -1; } static void setud(Bits *b, int id, int n, int pc) { if(id < 0) return; while(--n >= 0) bset(b[id++], pc); } static void ud(Inst *i, Decl *vars, Bits *uses, Bits *defs) { ushort f; int id, j, nv, pc, sz, s, m, d, ss, sm, sd; Optab *t; Idlist *l; pc = i->pc; ss = 0; t = &opflags[i->op]; f = t->flags; sz = t->size; s = fpoff(i->sm, &i->s); m = fpoff(i->mm, &i->m); d = fpoff(i->dm, &i->d); if(f&Mduse && i->mm == Anone) f |= Duse; if(s >= 0){ if(i->sm == Afp){ ss = SS(sz); if(ss == Mp) ss = size(i); } else ss = IBY2WD; id = finddec(s, ss, vars, &nv, i); if(f&Suse) setud(uses, id, nv, pc); if(f&Sdef){ if(i->sm == Afp) setud(defs, id, nv, pc); else setud(uses, id, nv, pc); } } if(m >= 0){ if(i->mm == Afp){ sm = SM(sz); if(sm == Mp) sm = size(i); } else sm = IBY2WD; id = finddec(m, sm, vars, &nv, i); if(f&Muse) setud(uses, id, nv, pc); if(f&Mdef){ if(i->mm == Afp) setud(defs, id, nv, pc); else setud(uses, id, nv, pc); } } if(d >= 0){ if(i->dm == Afp){ sd = SD(sz); if(sd == Mp) sd = size(i); } else sd = IBY2WD; id = finddec(d, sd, vars, &nv, i); if(f&Duse) setud(uses, id, nv, pc); if(f&Ddef){ if(i->dm == Afp) setud(defs, id, nv, pc); else setud(uses, id, nv, pc); } } if(f&Tuse1){ id = finddec(STemp, IBY2WD, vars, &nv, i); setud(uses, id, nv, pc); } if(f&Tuse2){ id = finddec(DTemp, IBY2WD, vars, &nv, i); setud(uses, id, nv, pc); } if(i->op == ILEA){ if(s >= 0){ id = finddec(s, ss, vars, &nv, i); if(i->sm == Afp && i->m.reg == 0) setud(defs, id, nv, pc); else setud(uses, id, nv, pc); } } if(0) switch(i->op){ case ILEA: if(s >= 0){ id = finddec(s, ss, vars, &nv, i); if(id < 0) break; for(j = 0; j < nv; j++){ if(i->sm == Afp && i->m.reg == 0) addlist(&deflist, id++); else addlist(&uselist, id++); } } break; case IALT: case INBALT: case ICALL: case IMCALL: for(l = deflist; l != nil; l = l->next){ id = l->id; bset(defs[id], pc); } for(l = uselist; l != nil; l = l->next){ id = l->id; bset(uses[id], pc); } freelist(&deflist); freelist(&uselist); break; } } static void usedef(Inst *in, Decl *vars, Bits *uses, Bits *defs) { Inst *i; for(i = in; i != nil; i = i->next) ud(i, vars, uses, defs); } static void pusedef(Bits *ud, int nv, Decl *d, char *s) { int i; print("%s\n", s); for(i = 0; i < nv; i++){ if(!bzero(ud[i])){ print("\t%s(%ld): ", decname(d), d->offset); pbits(ud[i]); print("\n"); } d = d->next; } } static void dummydefs(Bits *defs, int nv, int npc) { int i; for(i = 0; i < nv; i++) bset(defs[i], npc++); } static void dogenkill(Block *b, Bits *defs, int nv) { int i, n, t; Bits v; n = defs[0].n; v = bnew(n, 0); for( ; b != nil; b = b->next){ b->gen = bnew(n, 0); b->kill = bnew(n, 0); b->in = bnew(n, 0); b->out = bnew(n, 0); for(i = 0; i < nv; i++){ boper(Bclr, v, v); bsets(v, b->first->pc, b->last->pc); boper(Band, defs[i], v); t = topbit(v); if(t >= 0) bset(b->gen, t); else continue; boper(Bclr, v, v); bsets(v, b->first->pc, b->last->pc); boper(Binv, v, v); boper(Band, defs[i], v); boper(Bor, v, b->kill); } } bfree(v); } static void udflow(Block *b, int nv, int npc) { int iter; Block *b0, *p; Blist *bl; Bits newin; b0 = b; for(b = b0; b != nil; b = b->next) boper(Bstore, b->gen, b->out); newin = bnew(b0->in.n, 0); iter = 1; while(iter){ iter = 0; for(b = b0; b != nil; b = b->next){ boper(Bclr, newin, newin); for(bl = b->pred; bl != nil; bl = bl->next){ p = bl->block; boper(Bor, p->out, newin); } if(b == b0) bsets(newin, npc, npc+nv-1); if(!beq(b->in, newin)) iter = 1; boper(Bstore, newin, b->in); boper(Bstore, b->in, b->out); boper(Bandrev, b->kill, b->out); boper(Bor, b->gen, b->out); } } bfree(newin); } static void pflows(Block *b) { for( ; b != nil; b = b->next){ print("block %d\n", b->dfn); print(" gen: "); pbits(b->gen); print("\n"); print(" kill: "); pbits(b->kill); print("\n"); print(" in: "); pbits(b->in); print("\n"); print(" out: "); pbits(b->out); print("\n"); } } static int set(Decl *d) { if(d->store == Darg) return 1; if(d->sym == nil) /* || d->sym->name[0] == '.') */ return 1; if(tattr[d->ty->kind].isptr || d->ty->kind == Texception) return 1; return 0; } static int used(Decl *d) { if(d->sym == nil ) /* || d->sym->name[0] == '.') */ return 1; return 0; } static void udchain(Block *b, Decl *ds, int nv, int npc, Bits *defs, Bits *uses, Decl *sd) { int i, n, p, q; Bits d, u, dd, ud; Block *b0; Inst *in; b0 = b; n = defs[0].n; u = bnew(n, 0); d = bnew(n, 0); dd = bnew(n, 0); ud = bnew(n, 0); for(i = 0; i < nv; i++){ boper(Bstore, defs[i], ud); bclr(ud, npc+i); for(b = b0 ; b != nil; b = b->next){ boper(Bclr, u, u); bsets(u, b->first->pc, b->last->pc); boper(Band, uses[i], u); boper(Bclr, d, d); bsets(d, b->first->pc, b->last->pc); boper(Band, defs[i], d); for(;;){ p = topbit(u); if(p < 0) break; bclr(u, p); bclrs(d, p, -1); q = topbit(d); if(q >= 0){ bclr(ud, q); if(debug['o']) print("udc b=%d v=%d(%s/%ld) u=%d d=%d\n", b->dfn, i, decname(ds), ds->offset, p, q); } else{ boper(Bstore, defs[i], dd); boper(Band, b->in, dd); boper(Bandrev, dd, ud); if(!bzero(dd)){ if(debug['o']){ print("udc b=%d v=%d(%s/%ld) u=%d d=", b->dfn, i, decname(ds), ds->offset, p); pbits(dd); print("\n"); } if(bmem(dd, npc+i) && !set(ds)) warning(pc2i(b0, p), "used and not set", ds, sd); } else fatal("no defs in udchain"); } } } for(;;){ p = topbit(ud); if(p < 0) break; bclr(ud, p); if(!used(ds)){ in = pc2i(b0, p); if(isnilsrc(&in->src)) /* nilling code */ in->op = INOOP; /* elim p from bitmaps ? */ else if(limbovar(ds) && !structure(ds->ty)) warning(in, "set and not used", ds, sd); } } ds = ds->next; } bfree(u); bfree(d); bfree(dd); bfree(ud); } static void ckflags(void) { int i, j, k, n; Optab *o; n = nelem(opflags); o = opflags; for(i = 0; i < n; i++){ j = (o->flags&(Suse|Sdef)) != 0; k = SS(o->size) != 0; if(j != k){ if(!(j == 0 && k == 1 && i == ILEA)) fatal("S %ld %s\n", o-opflags, instname[i]); } j = (o->flags&(Muse|Mdef)) != 0; k = SM(o->size) != 0; if(j != k) fatal("M %ld %s\n", o-opflags, instname[i]); j = (o->flags&(Duse|Ddef)) != 0; k = SD(o->size) != 0; if(j != k){ if(!(j == 1 && k == 0 && (i == IGOTO || i == ICASE || i == ICASEC || i == ICASEL))) fatal("D %ld %s\n", o-opflags, instname[i]); } o++; } } void optim(Inst *in, Decl *d) { int nb, npc, nv, nd, nu; Block *b; Bits *uses, *defs; Decl *sd; ckflags(); if(debug['o']) print("************************************************\nfunction %s\n************************************************\n", d->sym->name); if(in == nil || errors > 0) return; d = d->ty->ids; if(regdecls == nil) mkdecls(); regdecls->next->next->next = d; d = regdecls; sd = sharedecls(d); if(debug['o']) printdecls(d); b = mkblocks(in, &nb); ckblocks(in, b, nb); npc = inspc(in); nb = dfs(b, nb); if(debug['o']) pblocks(b, nb); loops(b); nv = len(d); uses = allocbits(nv, npc+nv); defs = allocbits(nv, npc+nv); dummydefs(defs, nv, npc); usedef(in, d, uses, defs); if(debug['o']){ pusedef(uses, nv, d, "uses"); pusedef(defs, nv, d, "defs"); } nu = bitcount(uses, nv); nd = bitcount(defs, nv); dogenkill(b, defs, nv); udflow(b, nv, npc); if(debug['o']) pflows(b); udchain(b, d, nv, npc, defs, uses, sd); freeblks(b); freebits(uses, nv); freebits(defs, nv); if(debug['o']) print("nb=%d npc=%d nv=%d nd=%d nu=%d\n", nb, npc, nv, nd, nu); } lock *b) { Block *p; Blist *bl; b->flags = 1; for(blold_contrib//root/sys/src/cmd/limbo/limbo/runt.h���������������������������������������������������� 664 � 0 � 0 � 110411 10176463740 21037�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������typedef struct Sys_Qid Sys_Qid; typedef struct Sys_Dir Sys_Dir; typedef struct Sys_FD Sys_FD; typedef struct Sys_Connection Sys_Connection; typedef struct Sys_FileIO Sys_FileIO; typedef struct Draw_Point Draw_Point; typedef struct Draw_Rect Draw_Rect; typedef struct Draw_Image Draw_Image; typedef struct Draw_Font Draw_Font; typedef struct Draw_Display Draw_Display; typedef struct Draw_Screen Draw_Screen; typedef struct Draw_Pointer Draw_Pointer; typedef struct Draw_Context Draw_Context; typedef struct Prefab_Style Prefab_Style; typedef struct Prefab_Environ Prefab_Environ; typedef struct Prefab_Layout Prefab_Layout; typedef struct Prefab_Element Prefab_Element; typedef struct Prefab_Compound Prefab_Compound; typedef struct Tk_Toplevel Tk_Toplevel; typedef struct Keyring_SigAlg Keyring_SigAlg; typedef struct Keyring_PK Keyring_PK; typedef struct Keyring_SK Keyring_SK; typedef struct Keyring_Certificate Keyring_Certificate; typedef struct Keyring_DigestState Keyring_DigestState; struct Sys_Qid { WORD path; WORD vers; }; #define Sys_Qid_size 8 #define Sys_Qid_map {0} struct Sys_Dir { String* name; String* uid; String* gid; Sys_Qid qid; WORD mode; WORD atime; WORD mtime; WORD length; WORD dtype; WORD dev; }; #define Sys_Dir_size 44 #define Sys_Dir_map {0xe0,} struct Sys_FD { WORD fd; }; #define Sys_FD_size 4 #define Sys_FD_map {0} struct Sys_Connection { Sys_FD* dfd; Sys_FD* cfd; String* dir; }; #define Sys_Connection_size 12 #define Sys_Connection_map {0xe0,} struct Sys_FileIO { Channel* rd_req; Channel* rd_rep; Channel* wr_req; Channel* wr_rep; }; typedef struct{ WORD t0; WORD t1; WORD t2; } Sys_FileIO_rd_req; #define Sys_FileIO_rd_req_size 12 #define Sys_FileIO_rd_req_map {0} typedef struct{ Array* t0; String* t1; } Sys_FileIO_rd_rep; #define Sys_FileIO_rd_rep_size 8 #define Sys_FileIO_rd_rep_map {0xc0,} typedef struct{ WORD t0; Array* t1; WORD t2; } Sys_FileIO_wr_req; #define Sys_FileIO_wr_req_size 12 #define Sys_FileIO_wr_req_map {0x40,} typedef struct{ WORD t0; String* t1; } Sys_FileIO_wr_rep; #define Sys_FileIO_wr_rep_size 8 #define Sys_FileIO_wr_rep_map {0x40,} #define Sys_FileIO_size 16 #define Sys_FileIO_map {0xf0,} struct Draw_Point { WORD x; WORD y; }; #define Draw_Point_size 8 #define Draw_Point_map {0} struct Draw_Rect { Draw_Point min; Draw_Point max; }; #define Draw_Rect_size 16 #define Draw_Rect_map {0} struct Draw_Image { Draw_Rect r; Draw_Rect clipr; WORD ldepth; WORD repl; }; #define Draw_Image_size 40 #define Draw_Image_map {0} struct Draw_Font { String* name; WORD height; WORD ascent; }; #define Draw_Font_size 12 #define Draw_Font_map {0x80,} struct Draw_Display { Draw_Image* image; Draw_Image* ones; Draw_Image* zeros; }; #define Draw_Display_size 12 #define Draw_Display_map {0xe0,} struct Draw_Screen { WORD id; Draw_Image* image; Draw_Image* fill; }; #define Draw_Screen_size 12 #define Draw_Screen_map {0x60,} struct Draw_Pointer { WORD buttons; Draw_Point xy; }; #define Draw_Pointer_size 12 #define Draw_Pointer_map {0} struct Draw_Context { Draw_Screen* screen; Draw_Display* display; Channel* cir; Channel* ckbd; Channel* cptr; Channel* ctoappl; Channel* ctomux; }; typedef WORD Draw_Context_cir; #define Draw_Context_cir_size 4 #define Draw_Context_cir_map {0} typedef WORD Draw_Context_ckbd; #define Draw_Context_ckbd_size 4 #define Draw_Context_ckbd_map {0} typedef Draw_Pointer* Draw_Context_cptr; #define Draw_Context_cptr_size 4 #define Draw_Context_cptr_map {0x80,} typedef WORD Draw_Context_ctoappl; #define Draw_Context_ctoappl_size 4 #define Draw_Context_ctoappl_map {0} typedef WORD Draw_Context_ctomux; #define Draw_Context_ctomux_size 4 #define Draw_Context_ctomux_map {0} #define Draw_Context_size 28 #define Draw_Context_map {0xfe,} struct Prefab_Style { Draw_Font* titlefont; Draw_Font* textfont; Draw_Image* screencolor; Draw_Image* elemcolor; Draw_Image* edgecolor; Draw_Image* titlecolor; Draw_Image* textcolor; Draw_Image* highlightcolor; }; #define Prefab_Style_size 32 #define Prefab_Style_map {0xff,} struct Prefab_Environ { Draw_Screen* screen; Prefab_Style* style; }; #define Prefab_Environ_size 8 #define Prefab_Environ_map {0xc0,} struct Prefab_Layout { Draw_Font* font; Draw_Image* color; String* text; Draw_Image* icon; Draw_Image* mask; String* tag; }; #define Prefab_Layout_size 24 #define Prefab_Layout_map {0xfc,} struct Prefab_Element { WORD kind; Draw_Rect r; Prefab_Environ* environ; String* tag; List* kids; String* str; Draw_Image* mask; Draw_Image* image; Draw_Font* font; }; #define Prefab_Element_size 48 #define Prefab_Element_map {0x7,0xf0,} struct Prefab_Compound { Draw_Image* image; Prefab_Environ* environ; Draw_Rect r; Prefab_Element* title; Prefab_Element* contents; }; #define Prefab_Compound_size 32 #define Prefab_Compound_map {0xc3,} struct Tk_Toplevel { WORD id; }; #define Tk_Toplevel_size 4 #define Tk_Toplevel_map {0} struct Keyring_SigAlg { String* name; }; #define Keyring_SigAlg_size 4 #define Keyring_SigAlg_map {0x80,} struct Keyring_PK { Keyring_SigAlg* sa; String* owner; }; #define Keyring_PK_size 8 #define Keyring_PK_map {0xc0,} struct Keyring_SK { Keyring_SigAlg* sa; String* owner; }; #define Keyring_SK_size 8 #define Keyring_SK_map {0xc0,} struct Keyring_Certificate { Keyring_SigAlg* sa; String* signer; WORD exp; }; #define Keyring_Certificate_size 12 #define Keyring_Certificate_map {0xc0,} struct Keyring_DigestState { WORD x; }; #define Keyring_DigestState_size 4 #define Keyring_DigestState_map {0} void Sys_announce(void*); typedef struct F_Sys_announce F_Sys_announce; struct F_Sys_announce { WORD regs[NREG-1]; struct{ WORD t0; Sys_Connection t1; }* ret; uchar temps[12]; String* addr; }; void Sys_bind(void*); typedef struct F_Sys_bind F_Sys_bind; struct F_Sys_bind { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; String* s; String* on; WORD flags; }; void Sys_byte2char(void*); typedef struct F_Sys_byte2char F_Sys_byte2char; struct F_Sys_byte2char { WORD regs[NREG-1]; struct{ WORD t0; WORD t1; WORD t2; }* ret; uchar temps[12]; Array* buf; WORD n; }; void Sys_char2byte(void*); typedef struct F_Sys_char2byte F_Sys_char2byte; struct F_Sys_char2byte { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD c; Array* buf; WORD n; }; void Sys_chdir(void*); typedef struct F_Sys_chdir F_Sys_chdir; struct F_Sys_chdir { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; String* path; }; void Sys_create(void*); typedef struct F_Sys_create F_Sys_create; struct F_Sys_create { WORD regs[NREG-1]; Sys_FD** ret; uchar temps[12]; String* s; WORD mode; WORD perm; }; void Sys_dial(void*); typedef struct F_Sys_dial F_Sys_dial; struct F_Sys_dial { WORD regs[NREG-1]; struct{ WORD t0; Sys_Connection t1; }* ret; uchar temps[12]; String* addr; String* local; }; void Sys_dirread(void*); typedef struct F_Sys_dirread F_Sys_dirread; struct F_Sys_dirread { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* fd; Array* dir; }; void Sys_dup(void*); typedef struct F_Sys_dup F_Sys_dup; struct F_Sys_dup { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD old; WORD new; }; void Sys_export(void*); typedef struct F_Sys_export F_Sys_export; struct F_Sys_export { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* c; WORD flag; }; void Sys_fildes(void*); typedef struct F_Sys_fildes F_Sys_fildes; struct F_Sys_fildes { WORD regs[NREG-1]; Sys_FD** ret; uchar temps[12]; WORD fd; }; void Sys_file2chan(void*); typedef struct F_Sys_file2chan F_Sys_file2chan; struct F_Sys_file2chan { WORD regs[NREG-1]; Sys_FileIO** ret; uchar temps[12]; String* dir; String* file; WORD flags; }; void Sys_fprint(void*); typedef struct F_Sys_fprint F_Sys_fprint; struct F_Sys_fprint { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* fd; String* s; WORD vargs; }; void Sys_fstat(void*); typedef struct F_Sys_fstat F_Sys_fstat; struct F_Sys_fstat { WORD regs[NREG-1]; struct{ WORD t0; Sys_Dir t1; }* ret; uchar temps[12]; Sys_FD* fd; }; void Sys_fwstat(void*); typedef struct F_Sys_fwstat F_Sys_fwstat; struct F_Sys_fwstat { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* fd; Sys_Dir d; }; void Sys_listen(void*); typedef struct F_Sys_listen F_Sys_listen; struct F_Sys_listen { WORD regs[NREG-1]; struct{ WORD t0; Sys_Connection t1; }* ret; uchar temps[12]; Sys_Connection c; }; void Sys_millisec(void*); typedef struct F_Sys_millisec F_Sys_millisec; struct F_Sys_millisec { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; }; void Sys_mount(void*); typedef struct F_Sys_mount F_Sys_mount; struct F_Sys_mount { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* fd; String* on; WORD flags; String* spec; }; void Sys_open(void*); typedef struct F_Sys_open F_Sys_open; struct F_Sys_open { WORD regs[NREG-1]; Sys_FD** ret; uchar temps[12]; String* s; WORD mode; }; void Sys_pctl(void*); typedef struct F_Sys_pctl F_Sys_pctl; struct F_Sys_pctl { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD flags; }; void Sys_print(void*); typedef struct F_Sys_print F_Sys_print; struct F_Sys_print { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; String* s; WORD vargs; }; void Sys_read(void*); typedef struct F_Sys_read F_Sys_read; struct F_Sys_read { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* fd; Array* buf; WORD n; }; void Sys_remove(void*); typedef struct F_Sys_remove F_Sys_remove; struct F_Sys_remove { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; String* s; }; void Sys_seek(void*); typedef struct F_Sys_seek F_Sys_seek; struct F_Sys_seek { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* fd; WORD off; WORD start; }; void Sys_sleep(void*); typedef struct F_Sys_sleep F_Sys_sleep; struct F_Sys_sleep { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD period; }; void Sys_sprint(void*); typedef struct F_Sys_sprint F_Sys_sprint; struct F_Sys_sprint { WORD regs[NREG-1]; String** ret; uchar temps[12]; String* s; WORD vargs; }; void Sys_stat(void*); typedef struct F_Sys_stat F_Sys_stat; struct F_Sys_stat { WORD regs[NREG-1]; struct{ WORD t0; Sys_Dir t1; }* ret; uchar temps[12]; String* s; }; void Sys_stream(void*); typedef struct F_Sys_stream F_Sys_stream; struct F_Sys_stream { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* src; Sys_FD* dst; WORD bufsiz; }; void Sys_tokenize(void*); typedef struct F_Sys_tokenize F_Sys_tokenize; struct F_Sys_tokenize { WORD regs[NREG-1]; struct{ WORD t0; List* t1; }* ret; uchar temps[12]; String* s; String* delim; }; void Sys_unmount(void*); typedef struct F_Sys_unmount F_Sys_unmount; struct F_Sys_unmount { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; String* s1; String* s2; }; void Sys_utfbytes(void*); typedef struct F_Sys_utfbytes F_Sys_utfbytes; struct F_Sys_utfbytes { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Array* buf; WORD n; }; void Sys_write(void*); typedef struct F_Sys_write F_Sys_write; struct F_Sys_write { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Sys_FD* fd; Array* buf; WORD n; }; void Sys_wstat(void*); typedef struct F_Sys_wstat F_Sys_wstat; struct F_Sys_wstat { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; String* s; Sys_Dir d; }; #define Sys_ERRLEN 64 #define Sys_WAITLEN 64 #define Sys_OREAD 0 #define Sys_OWRITE 1 #define Sys_ORDWR 2 #define Sys_CHDIR -2147483648 #define Sys_MREPL 0 #define Sys_MBEFORE 1 #define Sys_MAFTER 2 #define Sys_MCREATE 4 #define Sys_NEWFD 1 #define Sys_FORKFD 2 #define Sys_NEWNS 4 #define Sys_FORKNS 8 #define Sys_NEWPGRP 16 #define Sys_NODEVS 32 #define Sys_EXPWAIT 0 #define Sys_EXPASYNC 1 #define Sys_UTFmax 3 #define Sys_UTFerror 128 void Point_add(void*); typedef struct F_Point_add F_Point_add; struct F_Point_add { WORD regs[NREG-1]; Draw_Point* ret; uchar temps[12]; Draw_Point p; Draw_Point q; }; void Point_sub(void*); typedef struct F_Point_sub F_Point_sub; struct F_Point_sub { WORD regs[NREG-1]; Draw_Point* ret; uchar temps[12]; Draw_Point p; Draw_Point q; }; void Point_mul(void*); typedef struct F_Point_mul F_Point_mul; struct F_Point_mul { WORD regs[NREG-1]; Draw_Point* ret; uchar temps[12]; Draw_Point p; WORD i; }; void Point_div(void*); typedef struct F_Point_div F_Point_div; struct F_Point_div { WORD regs[NREG-1]; Draw_Point* ret; uchar temps[12]; Draw_Point p; WORD i; }; void Point_eq(void*); typedef struct F_Point_eq F_Point_eq; struct F_Point_eq { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Point p; Draw_Point q; }; void Rect_canon(void*); typedef struct F_Rect_canon F_Rect_canon; struct F_Rect_canon { WORD regs[NREG-1]; Draw_Rect* ret; uchar temps[12]; Draw_Rect r; }; void Rect_dx(void*); typedef struct F_Rect_dx F_Rect_dx; struct F_Rect_dx { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Rect r; }; void Rect_dy(void*); typedef struct F_Rect_dy F_Rect_dy; struct F_Rect_dy { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Rect r; }; void Rect_eq(void*); typedef struct F_Rect_eq F_Rect_eq; struct F_Rect_eq { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Rect r; Draw_Rect s; }; void Rect_Xrect(void*); typedef struct F_Rect_Xrect F_Rect_Xrect; struct F_Rect_Xrect { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Rect r; Draw_Rect s; }; void Rect_inrect(void*); typedef struct F_Rect_inrect F_Rect_inrect; struct F_Rect_inrect { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Rect r; Draw_Rect s; }; void Rect_clip(void*); typedef struct F_Rect_clip F_Rect_clip; struct F_Rect_clip { WORD regs[NREG-1]; struct{ Draw_Rect t0; WORD t1; }* ret; uchar temps[12]; Draw_Rect r; Draw_Rect s; }; void Rect_contains(void*); typedef struct F_Rect_contains F_Rect_contains; struct F_Rect_contains { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Rect r; Draw_Point p; }; void Rect_addpt(void*); typedef struct F_Rect_addpt F_Rect_addpt; struct F_Rect_addpt { WORD regs[NREG-1]; Draw_Rect* ret; uchar temps[12]; Draw_Rect r; Draw_Point p; }; void Rect_subpt(void*); typedef struct F_Rect_subpt F_Rect_subpt; struct F_Rect_subpt { WORD regs[NREG-1]; Draw_Rect* ret; uchar temps[12]; Draw_Rect r; Draw_Point p; }; void Rect_inset(void*); typedef struct F_Rect_inset F_Rect_inset; struct F_Rect_inset { WORD regs[NREG-1]; Draw_Rect* ret; uchar temps[12]; Draw_Rect r; WORD n; }; void Image_draw(void*); typedef struct F_Image_draw F_Image_draw; struct F_Image_draw { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Draw_Image* dst; Draw_Rect r; Draw_Image* src; Draw_Image* mask; Draw_Point p; }; void Image_line(void*); typedef struct F_Image_line F_Image_line; struct F_Image_line { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Draw_Image* dst; Draw_Point p0; Draw_Point p1; WORD radius; Draw_Image* src; }; void Image_text(void*); typedef struct F_Image_text F_Image_text; struct F_Image_text { WORD regs[NREG-1]; Draw_Point* ret; uchar temps[12]; Draw_Image* dst; Draw_Point p; Draw_Image* src; Draw_Font* font; String* str; }; void Image_readpixels(void*); typedef struct F_Image_readpixels F_Image_readpixels; struct F_Image_readpixels { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Image* src; Draw_Rect r; Array* data; }; void Image_writepixels(void*); typedef struct F_Image_writepixels F_Image_writepixels; struct F_Image_writepixels { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Image* dst; Draw_Rect r; Array* data; }; void Image_top(void*); typedef struct F_Image_top F_Image_top; struct F_Image_top { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Draw_Image* win; }; void Image_bottom(void*); typedef struct F_Image_bottom F_Image_bottom; struct F_Image_bottom { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Draw_Image* win; }; void Image_setrefresh(void*); typedef struct F_Image_setrefresh F_Image_setrefresh; struct F_Image_setrefresh { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Draw_Image* win; WORD func; }; void Font_open(void*); typedef struct F_Font_open F_Font_open; struct F_Font_open { WORD regs[NREG-1]; Draw_Font** ret; uchar temps[12]; Draw_Display* d; String* name; }; void Font_build(void*); typedef struct F_Font_build F_Font_build; struct F_Font_build { WORD regs[NREG-1]; Draw_Font** ret; uchar temps[12]; Draw_Display* d; String* name; String* desc; }; void Font_width(void*); typedef struct F_Font_width F_Font_width; struct F_Font_width { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Draw_Font* f; String* str; }; void Display_allocate(void*); typedef struct F_Display_allocate F_Display_allocate; struct F_Display_allocate { WORD regs[NREG-1]; Draw_Display** ret; uchar temps[12]; String* dev; }; void Display_startrefresh(void*); typedef struct F_Display_startrefresh F_Display_startrefresh; struct F_Display_startrefresh { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Draw_Display* d; }; void Display_publicscreen(void*); typedef struct F_Display_publicscreen F_Display_publicscreen; struct F_Display_publicscreen { WORD regs[NREG-1]; Draw_Screen** ret; uchar temps[12]; Draw_Display* d; WORD id; }; void Display_newimage(void*); typedef struct F_Display_newimage F_Display_newimage; struct F_Display_newimage { WORD regs[NREG-1]; Draw_Image** ret; uchar temps[12]; Draw_Display* d; Draw_Rect r; WORD ldepth; WORD repl; WORD color; }; void Display_readimage(void*); typedef struct F_Display_readimage F_Display_readimage; struct F_Display_readimage { WORD regs[NREG-1]; Draw_Image** ret; uchar temps[12]; Draw_Display* d; Sys_FD* fd; }; void Display_open(void*); typedef struct F_Display_open F_Display_open; struct F_Display_open { WORD regs[NREG-1]; Draw_Image** ret; uchar temps[12]; Draw_Display* d; String* name; }; void Display_color(void*); typedef struct F_Display_color F_Display_color; struct F_Display_color { WORD regs[NREG-1]; Draw_Image** ret; uchar temps[12]; Draw_Display* d; WORD color; }; void Display_rgb(void*); typedef struct F_Display_rgb F_Display_rgb; struct F_Display_rgb { WORD regs[NREG-1]; Draw_Image** ret; uchar temps[12]; Draw_Display* d; WORD r; WORD g; WORD b; }; void Screen_allocate(void*); typedef struct F_Screen_allocate F_Screen_allocate; struct F_Screen_allocate { WORD regs[NREG-1]; Draw_Screen** ret; uchar temps[12]; Draw_Image* image; Draw_Image* fill; WORD public; }; void Screen_newwindow(void*); typedef struct F_Screen_newwindow F_Screen_newwindow; struct F_Screen_newwindow { WORD regs[NREG-1]; Draw_Image** ret; uchar temps[12]; Draw_Screen* screen; Draw_Rect r; }; void Screen_top(void*); typedef struct F_Screen_top F_Screen_top; struct F_Screen_top { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Draw_Screen* screen; Array* wins; }; #define Draw_Black 255 #define Draw_Blue 201 #define Draw_Red 15 #define Draw_Yellow 3 #define Draw_Green 192 #define Draw_White 0 #define Draw_Backup 0 #define Draw_Prefab 1 #define Draw_AMexit 10 #define Draw_AMstartir 11 #define Draw_AMstartkbd 12 #define Draw_AMstartptr 13 #define Draw_AMnewpin 14 #define Draw_MAtop 20 void Element_icon(void*); typedef struct F_Element_icon F_Element_icon; struct F_Element_icon { WORD regs[NREG-1]; Prefab_Element** ret; uchar temps[12]; Prefab_Environ* env; Draw_Rect r; Draw_Image* icon; Draw_Image* mask; }; void Element_text(void*); typedef struct F_Element_text F_Element_text; struct F_Element_text { WORD regs[NREG-1]; Prefab_Element** ret; uchar temps[12]; Prefab_Environ* env; String* text; Draw_Rect r; WORD kind; }; void Element_layout(void*); typedef struct F_Element_layout F_Element_layout; struct F_Element_layout { WORD regs[NREG-1]; Prefab_Element** ret; uchar temps[12]; Prefab_Environ* env; List* lay; Draw_Rect r; WORD kind; }; void Element_elist(void*); typedef struct F_Element_elist F_Element_elist; struct F_Element_elist { WORD regs[NREG-1]; Prefab_Element** ret; uchar temps[12]; Prefab_Environ* env; Prefab_Element* elem; WORD kind; }; void Element_separator(void*); typedef struct F_Element_separator F_Element_separator; struct F_Element_separator { WORD regs[NREG-1]; Prefab_Element** ret; uchar temps[12]; Prefab_Environ* env; Draw_Rect r; Draw_Image* icon; Draw_Image* mask; }; void Element_append(void*); typedef struct F_Element_append F_Element_append; struct F_Element_append { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Prefab_Element* elist; Prefab_Element* elem; }; void Element_adjust(void*); typedef struct F_Element_adjust F_Element_adjust; struct F_Element_adjust { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Prefab_Element* elem; WORD equal; WORD dir; }; void Element_clip(void*); typedef struct F_Element_clip F_Element_clip; struct F_Element_clip { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Prefab_Element* elem; Draw_Rect r; }; void Element_scroll(void*); typedef struct F_Element_scroll F_Element_scroll; struct F_Element_scroll { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Prefab_Element* elem; Draw_Point d; }; void Element_translate(void*); typedef struct F_Element_translate F_Element_translate; struct F_Element_translate { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Prefab_Element* elem; Draw_Point d; }; void Element_show(void*); typedef struct F_Element_show F_Element_show; struct F_Element_show { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Prefab_Element* elist; Prefab_Element* elem; }; void Compound_iconbox(void*); typedef struct F_Compound_iconbox F_Compound_iconbox; struct F_Compound_iconbox { WORD regs[NREG-1]; Prefab_Compound** ret; uchar temps[12]; Prefab_Environ* env; Draw_Point p; String* title; Draw_Image* icon; Draw_Image* mask; }; void Compound_textbox(void*); typedef struct F_Compound_textbox F_Compound_textbox; struct F_Compound_textbox { WORD regs[NREG-1]; Prefab_Compound** ret; uchar temps[12]; Prefab_Environ* env; Draw_Rect r; String* title; String* text; }; void Compound_layoutbox(void*); typedef struct F_Compound_layoutbox F_Compound_layoutbox; struct F_Compound_layoutbox { WORD regs[NREG-1]; Prefab_Compound** ret; uchar temps[12]; Prefab_Environ* env; Draw_Rect r; String* title; List* lay; }; void Compound_box(void*); typedef struct F_Compound_box F_Compound_box; struct F_Compound_box { WORD regs[NREG-1]; Prefab_Compound** ret; uchar temps[12]; Prefab_Environ* env; Draw_Point p; Prefab_Element* title; Prefab_Element* elist; }; void Compound_draw(void*); typedef struct F_Compound_draw F_Compound_draw; struct F_Compound_draw { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Prefab_Compound* comp; }; void Compound_scroll(void*); typedef struct F_Compound_scroll F_Compound_scroll; struct F_Compound_scroll { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Prefab_Compound* comp; String* elem; Draw_Point d; }; void Compound_show(void*); typedef struct F_Compound_show F_Compound_show; struct F_Compound_show { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Prefab_Compound* comp; String* elem; }; void Compound_select(void*); typedef struct F_Compound_select F_Compound_select; struct F_Compound_select { WORD regs[NREG-1]; struct{ WORD t0; WORD t1; Prefab_Element* t2; }* ret; uchar temps[12]; Prefab_Compound* comp; String* elem; WORD i; Channel* c; }; void Compound_tagselect(void*); typedef struct F_Compound_tagselect F_Compound_tagselect; struct F_Compound_tagselect { WORD regs[NREG-1]; struct{ WORD t0; WORD t1; Prefab_Element* t2; }* ret; uchar temps[12]; Prefab_Compound* comp; String* elem; WORD i; Channel* c; }; void Compound_highlight(void*); typedef struct F_Compound_highlight F_Compound_highlight; struct F_Compound_highlight { WORD regs[NREG-1]; WORD noret; uchar temps[12]; Prefab_Compound* comp; String* elem; WORD on; }; #define Prefab_EIcon 0 #define Prefab_EText 1 #define Prefab_ETitle 2 #define Prefab_EHorizontal 3 #define Prefab_EVertical 4 #define Prefab_ESeparator 5 #define Prefab_Adjpack 10 #define Prefab_Adjequal 11 #define Prefab_Adjfill 12 #define Prefab_Adjleft 20 #define Prefab_Adjup 20 #define Prefab_Adjcenter 21 #define Prefab_Adjright 22 #define Prefab_Adjdown 22 void Tk_toplevel(void*); typedef struct F_Tk_toplevel F_Tk_toplevel; struct F_Tk_toplevel { WORD regs[NREG-1]; Tk_Toplevel** ret; uchar temps[12]; Draw_Screen* screen; String* arg; }; void Tk_namechan(void*); typedef struct F_Tk_namechan F_Tk_namechan; struct F_Tk_namechan { WORD regs[NREG-1]; String** ret; uchar temps[12]; Tk_Toplevel* t; Channel* c; String* n; }; void Tk_cmd(void*); typedef struct F_Tk_cmd F_Tk_cmd; struct F_Tk_cmd { WORD regs[NREG-1]; String** ret; uchar temps[12]; Tk_Toplevel* t; String* arg; }; void Tk_mouse(void*); typedef struct F_Tk_mouse F_Tk_mouse; struct F_Tk_mouse { WORD regs[NREG-1]; WORD noret; uchar temps[12]; WORD x; WORD y; WORD button; }; void Tk_keyboard(void*); typedef struct F_Tk_keyboard F_Tk_keyboard; struct F_Tk_keyboard { WORD regs[NREG-1]; WORD noret; uchar temps[12]; WORD key; }; void Real_acos(void*); typedef struct F_Real_acos F_Real_acos; struct F_Real_acos { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_acosh(void*); typedef struct F_Real_acosh F_Real_acosh; struct F_Real_acosh { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_asin(void*); typedef struct F_Real_asin F_Real_asin; struct F_Real_asin { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_asinh(void*); typedef struct F_Real_asinh F_Real_asinh; struct F_Real_asinh { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_atan(void*); typedef struct F_Real_atan F_Real_atan; struct F_Real_atan { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_atan2(void*); typedef struct F_Real_atan2 F_Real_atan2; struct F_Real_atan2 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL y; REAL x; }; void Real_atanh(void*); typedef struct F_Real_atanh F_Real_atanh; struct F_Real_atanh { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_cbrt(void*); typedef struct F_Real_cbrt F_Real_cbrt; struct F_Real_cbrt { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_ceil(void*); typedef struct F_Real_ceil F_Real_ceil; struct F_Real_ceil { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_copysign(void*); typedef struct F_Real_copysign F_Real_copysign; struct F_Real_copysign { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL s; }; void Real_cos(void*); typedef struct F_Real_cos F_Real_cos; struct F_Real_cos { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_cosh(void*); typedef struct F_Real_cosh F_Real_cosh; struct F_Real_cosh { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_dot(void*); typedef struct F_Real_dot F_Real_dot; struct F_Real_dot { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; Array* x; Array* y; }; void Real_erf(void*); typedef struct F_Real_erf F_Real_erf; struct F_Real_erf { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_erfc(void*); typedef struct F_Real_erfc F_Real_erfc; struct F_Real_erfc { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_exp(void*); typedef struct F_Real_exp F_Real_exp; struct F_Real_exp { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_expm1(void*); typedef struct F_Real_expm1 F_Real_expm1; struct F_Real_expm1 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_fabs(void*); typedef struct F_Real_fabs F_Real_fabs; struct F_Real_fabs { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_fdim(void*); typedef struct F_Real_fdim F_Real_fdim; struct F_Real_fdim { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL y; }; void Real_fmin(void*); typedef struct F_Real_fmin F_Real_fmin; struct F_Real_fmin { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL y; }; void Real_fmax(void*); typedef struct F_Real_fmax F_Real_fmax; struct F_Real_fmax { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL y; }; void Real_finite(void*); typedef struct F_Real_finite F_Real_finite; struct F_Real_finite { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; REAL x; }; void Real_floor(void*); typedef struct F_Real_floor F_Real_floor; struct F_Real_floor { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_fmod(void*); typedef struct F_Real_fmod F_Real_fmod; struct F_Real_fmod { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL y; }; void Real_gemm(void*); typedef struct F_Real_gemm F_Real_gemm; struct F_Real_gemm { WORD regs[NREG-1]; WORD noret; uchar temps[12]; WORD transa; WORD transb; WORD m; WORD n; WORD k; WORD _pad52; REAL alpha; Array* a; WORD ai0; WORD aj0; WORD lda; Array* b; WORD bi0; WORD bj0; WORD ldb; REAL beta; Array* c; WORD ci0; WORD cj0; WORD ldc; }; void Real_getFPcontrol(void*); typedef struct F_Real_getFPcontrol F_Real_getFPcontrol; struct F_Real_getFPcontrol { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; }; void Real_getFPstatus(void*); typedef struct F_Real_getFPstatus F_Real_getFPstatus; struct F_Real_getFPstatus { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; }; void Real_FPcontrol(void*); typedef struct F_Real_FPcontrol F_Real_FPcontrol; struct F_Real_FPcontrol { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD r; WORD mask; }; void Real_FPstatus(void*); typedef struct F_Real_FPstatus F_Real_FPstatus; struct F_Real_FPstatus { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD r; WORD mask; }; void Real_hypot(void*); typedef struct F_Real_hypot F_Real_hypot; struct F_Real_hypot { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL y; }; void Real_iamax(void*); typedef struct F_Real_iamax F_Real_iamax; struct F_Real_iamax { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Array* x; }; void Real_ilogb(void*); typedef struct F_Real_ilogb F_Real_ilogb; struct F_Real_ilogb { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; REAL x; }; void Real_isnan(void*); typedef struct F_Real_isnan F_Real_isnan; struct F_Real_isnan { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; REAL x; }; void Real_j0(void*); typedef struct F_Real_j0 F_Real_j0; struct F_Real_j0 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_j1(void*); typedef struct F_Real_j1 F_Real_j1; struct F_Real_j1 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_jn(void*); typedef struct F_Real_jn F_Real_jn; struct F_Real_jn { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; WORD n; WORD _pad36; REAL x; }; void Real_lgamma(void*); typedef struct F_Real_lgamma F_Real_lgamma; struct F_Real_lgamma { WORD regs[NREG-1]; struct{ WORD t0; REAL t1; }* ret; uchar temps[12]; REAL x; }; void Real_log(void*); typedef struct F_Real_log F_Real_log; struct F_Real_log { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_log10(void*); typedef struct F_Real_log10 F_Real_log10; struct F_Real_log10 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_log1p(void*); typedef struct F_Real_log1p F_Real_log1p; struct F_Real_log1p { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_modf(void*); typedef struct F_Real_modf F_Real_modf; struct F_Real_modf { WORD regs[NREG-1]; struct{ WORD t0; REAL t1; }* ret; uchar temps[12]; REAL x; }; void Real_nextafter(void*); typedef struct F_Real_nextafter F_Real_nextafter; struct F_Real_nextafter { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL y; }; void Real_norm1(void*); typedef struct F_Real_norm1 F_Real_norm1; struct F_Real_norm1 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; Array* x; }; void Real_norm2(void*); typedef struct F_Real_norm2 F_Real_norm2; struct F_Real_norm2 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; Array* x; }; void Real_pow(void*); typedef struct F_Real_pow F_Real_pow; struct F_Real_pow { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL y; }; void Real_pow10(void*); typedef struct F_Real_pow10 F_Real_pow10; struct F_Real_pow10 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; WORD p; }; void Real_remainder(void*); typedef struct F_Real_remainder F_Real_remainder; struct F_Real_remainder { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; REAL p; }; void Real_rint(void*); typedef struct F_Real_rint F_Real_rint; struct F_Real_rint { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_scalbn(void*); typedef struct F_Real_scalbn F_Real_scalbn; struct F_Real_scalbn { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; WORD n; }; void Real_sin(void*); typedef struct F_Real_sin F_Real_sin; struct F_Real_sin { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_sinh(void*); typedef struct F_Real_sinh F_Real_sinh; struct F_Real_sinh { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_sqrt(void*); typedef struct F_Real_sqrt F_Real_sqrt; struct F_Real_sqrt { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_tan(void*); typedef struct F_Real_tan F_Real_tan; struct F_Real_tan { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_tanh(void*); typedef struct F_Real_tanh F_Real_tanh; struct F_Real_tanh { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_y0(void*); typedef struct F_Real_y0 F_Real_y0; struct F_Real_y0 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_y1(void*); typedef struct F_Real_y1 F_Real_y1; struct F_Real_y1 { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_yn(void*); typedef struct F_Real_yn F_Real_yn; struct F_Real_yn { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; WORD n; WORD _pad36; REAL x; }; #define Real_Infinity Infinity #define Real_NaN NaN #define Real_MachEps 2.220446049250313e-16 #define Real_Pi 3.141592653589793 #define Real_Degree .017453292519943295 #define Real_INVAL 1 #define Real_ZDIV 2 #define Real_OVFL 4 #define Real_UNFL 8 #define Real_INEX 16 #define Real_RND_NR 0 #define Real_RND_NINF 256 #define Real_RND_PINF 512 #define Real_RND_Z 768 #define Real_RND_MASK 768 void Keyring_certtostr(void*); typedef struct F_Keyring_certtostr F_Keyring_certtostr; struct F_Keyring_certtostr { WORD regs[NREG-1]; String** ret; uchar temps[12]; Keyring_Certificate* c; }; void Keyring_pktostr(void*); typedef struct F_Keyring_pktostr F_Keyring_pktostr; struct F_Keyring_pktostr { WORD regs[NREG-1]; String** ret; uchar temps[12]; Keyring_PK* pk; }; void Keyring_sktostr(void*); typedef struct F_Keyring_sktostr F_Keyring_sktostr; struct F_Keyring_sktostr { WORD regs[NREG-1]; String** ret; uchar temps[12]; Keyring_SK* sk; }; void Keyring_strtocert(void*); typedef struct F_Keyring_strtocert F_Keyring_strtocert; struct F_Keyring_strtocert { WORD regs[NREG-1]; Keyring_Certificate** ret; uchar temps[12]; String* s; }; void Keyring_strtopk(void*); typedef struct F_Keyring_strtopk F_Keyring_strtopk; struct F_Keyring_strtopk { WORD regs[NREG-1]; Keyring_PK** ret; uchar temps[12]; String* s; }; void Keyring_strtosk(void*); typedef struct F_Keyring_strtosk F_Keyring_strtosk; struct F_Keyring_strtosk { WORD regs[NREG-1]; Keyring_SK** ret; uchar temps[12]; String* s; }; void Keyring_sign(void*); typedef struct F_Keyring_sign F_Keyring_sign; struct F_Keyring_sign { WORD regs[NREG-1]; Keyring_Certificate** ret; uchar temps[12]; Keyring_SK* sk; WORD exp; Keyring_DigestState* state; WORD alg; }; void Keyring_verify(void*); typedef struct F_Keyring_verify F_Keyring_verify; struct F_Keyring_verify { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; Keyring_PK* pk; Keyring_Certificate* cert; Keyring_DigestState* state; WORD alg; }; void Keyring_genSK(void*); typedef struct F_Keyring_genSK F_Keyring_genSK; struct F_Keyring_genSK { WORD regs[NREG-1]; Keyring_SK** ret; uchar temps[12]; String* algname; String* owner; WORD length; }; void Keyring_genSKfromPK(void*); typedef struct F_Keyring_genSKfromPK F_Keyring_genSKfromPK; struct F_Keyring_genSKfromPK { WORD regs[NREG-1]; Keyring_SK** ret; uchar temps[12]; Keyring_PK* pk; String* owner; }; void Keyring_sktopk(void*); typedef struct F_Keyring_sktopk F_Keyring_sktopk; struct F_Keyring_sktopk { WORD regs[NREG-1]; Keyring_PK** ret; uchar temps[12]; Keyring_SK* sk; }; void Keyring_sha(void*); typedef struct F_Keyring_sha F_Keyring_sha; struct F_Keyring_sha { WORD regs[NREG-1]; Keyring_DigestState** ret; uchar temps[12]; Array* buf; WORD n; Array* digest; Keyring_DigestState* state; }; void Keyring_md5(void*); typedef struct F_Keyring_md5 F_Keyring_md5; struct F_Keyring_md5 { WORD regs[NREG-1]; Keyring_DigestState** ret; uchar temps[12]; Array* buf; WORD n; Array* digest; Keyring_DigestState* state; }; #define Keyring_DEScbc 0 #define Keyring_DESecb 1 #define Keyring_SHA 2 #define Keyring_MD5 3 #define Keyring_SHAdlen 20 #define Keyring_MD5dlen 16 Real_dot { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; Array* x; Array* y; }; void Real_erf(void*); typedef struct F_Real_erf F_Real_erf; struct F_Real_erf { WORD regs[NREG-1]; REAL* ret; uchar temps[12]; REAL x; }; void Real_erfc(voidold_contrib//root/sys/src/cmd/limbo/limbo/sbl.c����������������������������������������������������� 664 � 0 � 0 � 15177 10540602577 20615�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" static char sbltname[Tend] = { /* Tnone */ 'n', /* Tadt */ 'a', /* Tadtpick */ 'a', /* Tarray */ 'A', /* Tbig */ 'B', /* Tbyte */ 'b', /* Tchan */ 'C', /* Treal */ 'f', /* Tfn */ 'F', /* Tint */ 'i', /* Tlist */ 'L', /* Tmodule */ 'm', /* Tref */ 'R', /* Tstring */ 's', /* Ttuple */ 't', /* Texception */ 't', /* Tfix */ 'i', /* Tpoly */ 'P', /* Tainit */ '?', /* Talt */ '?', /* Tany */ 'N', /* Tarrow */ '?', /* Tcase */ '?', /* Tcasel */ '?', /* Tcasec */ '?', /* Tdot */ '?', /* Terror */ '?', /* Tgoto */ '?', /* Tid */ '?', /* Tiface */ '?', /* Texcept */ '?', /* Tinst */ '?', }; int sbltadtpick = 'p'; static Sym *sfiles; static Sym *ftail; static int nsfiles; static int blockid; static int lastf; static int lastline; static void sbltype(Type*, int); static void sbldecl(Decl*, int); static void sblftype(Type*); static void sblfdecl(Decl*, int); void sblmod(Decl *m) { Bprint(bsym, "limbo .sbl 2.1\n"); Bprint(bsym, "%s\n", m->sym->name); blockid = 0; nsfiles = 0; sfiles = ftail = nil; lastf = 0; lastline = 0; } static int sblfile(char *name) { Sym *s; int i; i = 0; for(s = sfiles; s != nil; s = s->next){ if(strcmp(s->name, name) == 0) return i; i++; } s = allocmem(sizeof(Sym)); s->name = name; s->next = nil; if(sfiles == nil) sfiles = s; else ftail->next = s; ftail = s; nsfiles = i + 1; return i; } static char * filename(char *s) { char *t; t = strrchr(s, '/'); if(t != nil) s = t + 1; t = strrchr(s, '\\'); if(t != nil) s = t+1; t = strrchr(s, ' '); if(t != nil) s = t + 1; return s; } void sblfiles(void) { Sym *s; int i; for(i = 0; i < nfiles; i++) files[i]->sbl = sblfile(files[i]->name); Bprint(bsym, "%d\n", nsfiles); for(s = sfiles; s != nil; s = s->next) Bprint(bsym, "%s\n", filename(s->name)); } static char* sblsrcconv(char *buf, char *end, Src *src) { Fline fl; File *startf, *stopf; char *s; int startl, stopl; s = buf; fl = fline(src->start.line); startf = fl.file; startl = fl.line; fl = fline(src->stop.line); stopf = fl.file; stopl = fl.line; if(lastf != startf->sbl) s = seprint(s, end, "%d:", startf->sbl); if(lastline != startl) s = seprint(s, end, "%d.", startl); s = seprint(s, end, "%d,", src->start.pos); if(startf->sbl != stopf->sbl) s = seprint(s, end, "%d:", stopf->sbl); if(startl != stopl) s = seprint(s, end, "%d.", stopl); seprint(s, end, "%d ", src->stop.pos); lastf = stopf->sbl; lastline = stopl; return buf; } #define isnilsrc(s) ((s)->start.line == 0 && (s)->stop.line == 0 && (s)->start.pos == 0 && (s)->stop.pos == 0) #define isnilstopsrc(s) ((s)->stop.line == 0 && (s)->stop.pos == 0) void sblinst(Inst *inst, long ninst) { Inst *in; char buf[StrSize]; int *sblblocks, i, b; Src src; Bprint(bsym, "%ld\n", ninst); sblblocks = allocmem(nblocks * sizeof *sblblocks); for(i = 0; i < nblocks; i++) sblblocks[i] = -1; src = nosrc; for(in = inst; in != nil; in = in->next){ if(in->op == INOOP) continue; if(in->src.start.line < 0) fatal("no file specified for %I", in); b = sblblocks[in->block]; if(b < 0) sblblocks[in->block] = b = blockid++; if(isnilsrc(&in->src)) in->src = src; else if(isnilstopsrc(&in->src)){ /* how does this happen ? */ in->src.stop = in->src.start; in->src.stop.pos++; } Bprint(bsym, "%s%d\n", sblsrcconv(buf, buf+sizeof(buf), &in->src), b); src = in->src; } free(sblblocks); } void sblty(Decl **tys, int ntys) { Decl *d; int i; Bprint(bsym, "%d\n", ntys); for(i = 0; i < ntys; i++){ d = tys[i]; d->ty->sbl = i; } for(i = 0; i < ntys; i++){ d = tys[i]; sbltype(d->ty, 1); } } void sblfn(Decl **fns, int nfns) { Decl *f; int i; Bprint(bsym, "%d\n", nfns); for(i = 0; i < nfns; i++){ f = fns[i]; if(ispoly(f)) rmfnptrs(f); if(f->dot != nil && f->dot->ty->kind == Tadt) Bprint(bsym, "%ld:%s.%s\n", f->pc->pc, f->dot->sym->name, f->sym->name); else Bprint(bsym, "%ld:%s\n", f->pc->pc, f->sym->name); sbldecl(f->ty->ids, Darg); sbldecl(f->locals, Dlocal); sbltype(f->ty->tof, 0); } } void sblvar(Decl *vars) { sbldecl(vars, Dglobal); } static int isvis(Decl *id) { if(!tattr[id->ty->kind].vis || id->sym == nil || id->sym->name == nil /*????*/ || id->sym->name[0] == '.') return 0; if(id->ty == tstring && id->init != nil && id->init->op == Oconst) return 0; if(id->src.start.line < 0 || id->src.stop.line < 0) return 0; return 1; } static void sbldecl(Decl *ids, int store) { Decl *id; char buf[StrSize]; int n; n = 0; for(id = ids; id != nil; id = id->next){ if(id->store != store || !isvis(id)) continue; n++; } Bprint(bsym, "%d\n", n); for(id = ids; id != nil; id = id->next){ if(id->store != store || !isvis(id)) continue; Bprint(bsym, "%ld:%s:%s", id->offset, id->sym->name, sblsrcconv(buf, buf+sizeof(buf), &id->src)); sbltype(id->ty, 0); Bprint(bsym, "\n"); } } static void sbltype(Type *t, int force) { Type *lastt; Decl *tg, *d; char buf[StrSize]; if(t->kind == Tadtpick) t = t->decl->dot->ty; d = t->decl; if(!force && d != nil && d->ty->sbl >= 0){ Bprint(bsym, "@%d\n", d->ty->sbl); return; } switch(t->kind){ default: fatal("bad type %T in sbltype", t); break; case Tnone: case Tany: case Tint: case Tbig: case Tbyte: case Treal: case Tstring: case Tfix: case Tpoly: Bprint(bsym, "%c", sbltname[t->kind]); break; case Tfn: Bprint(bsym, "%c", sbltname[t->kind]); sbldecl(t->ids, Darg); sbltype(t->tof, 0); break; case Tarray: case Tlist: case Tchan: case Tref: Bprint(bsym, "%c", sbltname[t->kind]); if(t->kind == Tref && t->tof->kind == Tfn){ tattr[Tany].vis = 1; sbltype(tfnptr, 0); tattr[Tany].vis = 0; } else sbltype(t->tof, 0); break; case Ttuple: case Texception: Bprint(bsym, "%c%d.", sbltname[t->kind], t->size); sbldecl(t->ids, Dfield); break; case Tadt: if(t->tags != nil) Bputc(bsym, sbltadtpick); else Bputc(bsym, sbltname[t->kind]); if(d->dot != nil && !isimpmod(d->dot->sym)) Bprint(bsym, "%s->", d->dot->sym->name); Bprint(bsym, "%s %s%d\n", d->sym->name, sblsrcconv(buf, buf+sizeof(buf), &d->src), d->ty->size); sbldecl(t->ids, Dfield); if(t->tags != nil){ Bprint(bsym, "%d\n", t->decl->tag); lastt = nil; for(tg = t->tags; tg != nil; tg = tg->next){ Bprint(bsym, "%s:%s", tg->sym->name, sblsrcconv(buf, buf+sizeof(buf), &tg->src)); if(lastt == tg->ty){ Bputc(bsym, '\n'); }else{ Bprint(bsym, "%d\n", tg->ty->size); sbldecl(tg->ty->ids, Dfield); } lastt = tg->ty; } } break; case Tmodule: Bprint(bsym, "%c%s\n%s", sbltname[t->kind], d->sym->name, sblsrcconv(buf, buf+sizeof(buf), &d->src)); sbldecl(t->ids, Dglobal); break; } } _certtostr { WORD regs[NREG-1]; String** ret; uchar temps[12]; Keyring_Certificate* c; }; void Keyring_pktostr(void*); typedef struct F_Keyring_pktostr F_Keyring_pktostr; struct F_Keyring_pktostr { WORD regs[NREG-1]; String** ret; uchar temps[12]; Keyring_PK* pk; }; void Keyring_sktostr(void*); typedef struct F_Keyring_sktostr F_Keyring_sktostr; struct F_Keyring_sktostr { Wold_contrib//root/sys/src/cmd/limbo/limbo/stubs.c��������������������������������������������������� 664 � 0 � 0 � 33523 10177720062 21164�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" static long stubalign(long offset, int a, char** b, char *e); static void pickadtstub(Type *t); void emit(Decl *globals) { Decl *m, *d, *id; for(m = globals; m != nil; m = m->next){ if(m->store != Dtype || m->ty->kind != Tmodule) continue; m->ty = usetype(m->ty); for(d = m->ty->ids; d != nil; d = d->next){ d->ty = usetype(d->ty); if(d->store == Dglobal || d->store == Dfn) modrefable(d->ty); if(d->store == Dtype && d->ty->kind == Tadt){ for(id = d->ty->ids; id != nil; id = id->next){ id->ty = usetype(id->ty); modrefable(d->ty); } } } } if(emitstub){ print("#pragma hjdicks x4\n"); print("#pragma pack x4\n"); adtstub(globals); modstub(globals); print("#pragma pack off\n"); print("#pragma hjdicks off\n"); } if(emittab != nil) modtab(globals); if(emitcode) modcode(globals); } static char* lowercase(char *f) { char *s = f; for( ; *s != 0; s++) if(*s >= 'A' && *s <= 'Z') *s += 'a' - 'A'; return f; } void modcode(Decl *globals) { Decl *d, *id; char buf[32]; if(emitdyn){ strcpy(buf, emitcode); lowercase(buf); print("#include \"%s.h\"\n", buf); } else{ print("#include <lib9.h>\n"); print("#include <isa.h>\n"); print("#include <interp.h>\n"); print("#include \"%smod.h\"\n", emitcode); } print("\n"); for(d = globals; d != nil; d = d->next) if(d->store == Dtype && d->ty->kind == Tmodule && strcmp(d->sym->name, emitcode) == 0) break; if(d == nil) return; /* * stub types */ for(id = d->ty->ids; id != nil; id = id->next){ if(id->store == Dtype && id->ty->kind == Tadt){ id->ty = usetype(id->ty); print("Type*\tT_%s;\n", id->sym->name); } } /* * type maps */ if(emitdyn){ for(id = d->ty->ids; id != nil; id = id->next) if(id->store == Dtype && id->ty->kind == Tadt) print("uchar %s_map[] = %s_%s_map;\n", id->sym->name, emitcode, id->sym->name); } /* * heap allocation and garbage collection for a type */ if(emitdyn){ for(id = d->ty->ids; id != nil; id = id->next) if(id->store == Dtype && id->ty->kind == Tadt){ print("\n%s_%s*\n%salloc%s(void)\n{\n\tHeap *h;\n\n\th = heap(T_%s);\n\treturn H2D(%s_%s*, h);\n}\n", emitcode, id->sym->name, emitcode, id->sym->name, id->sym->name, emitcode, id->sym->name); print("\nvoid\n%sfree%s(Heap *h, int swept)\n{\n\t%s_%s *d;\n\n\td = H2D(%s_%s*, h);\n\tfreeheap(h, swept);\n}\n", emitcode, id->sym->name, emitcode, id->sym->name, emitcode, id->sym->name); } } /* * initialization function */ if(emitdyn) print("\nvoid\n%sinit(void)\n{\n", emitcode); else{ print("\nvoid\n%smodinit(void)\n{\n", emitcode); print("\tbuiltinmod(\"$%s\", %smodtab);\n", emitcode, emitcode); } for(id = d->ty->ids; id != nil; id = id->next){ if(id->store == Dtype && id->ty->kind == Tadt){ if(emitdyn) print("\tT_%s = dtype(%sfree%s, %s_%s_size, %s_map, sizeof(%s_map));\n", id->sym->name, emitcode, id->sym->name, emitcode, id->sym->name, id->sym->name, id->sym->name); else print("\tT_%s = dtype(freeheap, sizeof(%s), %smap, sizeof(%smap));\n", id->sym->name, id->sym->name, id->sym->name, id->sym->name); } } print("}\n"); /* * end function */ if(emitdyn){ print("\nvoid\n%send(void)\n{\n", emitcode); for(id = d->ty->ids; id != nil; id = id->next) if(id->store == Dtype && id->ty->kind == Tadt) print("\tfreetype(T_%s);\n", id->sym->name); print("}\n"); } /* * stub functions */ for(id = d->ty->tof->ids; id != nil; id = id->next){ print("\nvoid\n%s_%s(void *fp)\n{\n\tF_%s_%s *f = fp;\n", id->dot->sym->name, id->sym->name, id->dot->sym->name, id->sym->name); if(id->ty->tof != tnone && tattr[id->ty->tof->kind].isptr) print("\n\tdestroy(*f->ret);\n\t*f->ret = H;\n"); print("}\n"); } if(emitdyn) print("\n#include \"%smod.h\"\n", buf); } void modtab(Decl *globals) { int n; Desc *md; Decl *d, *id; print("typedef struct{char *name; long sig; void (*fn)(void*); int size; int np; uchar map[16];} Runtab;\n"); for(d = globals; d != nil; d = d->next){ if(d->store == Dtype && d->ty->kind == Tmodule && strcmp(d->sym->name, emittab) == 0){ n = 0; print("Runtab %smodtab[]={\n", d->sym->name); for(id = d->ty->tof->ids; id != nil; id = id->next){ n++; print("\t\""); if(id->dot != d) print("%s.", id->dot->sym->name); print("%s\",0x%lux,%s_%s,", id->sym->name, sign(id), id->dot->sym->name, id->sym->name); if(id->ty->varargs) print("0,0,{0},"); else{ md = mkdesc(idoffsets(id->ty->ids, MaxTemp, MaxAlign), id->ty->ids); print("%ld,%ld,%M,", md->size, md->nmap, md); } print("\n"); } print("\t0\n};\n"); print("#define %smodlen %d\n", d->sym->name, n); } } } /* * produce activation records for all the functions in modules */ void modstub(Decl *globals) { Type *t; Decl *d, *id, *m; char buf[StrSize*2], *p; long offset; int arg; for(d = globals; d != nil; d = d->next){ if(d->store != Dtype || d->ty->kind != Tmodule) continue; arg = 0; for(id = d->ty->tof->ids; id != nil; id = id->next){ if(emitdyn && id->dot->dot != nil) seprint(buf, buf+sizeof(buf), "%s_%s_%s", id->dot->dot->sym->name, id->dot->sym->name, id->sym->name); else seprint(buf, buf+sizeof(buf), "%s_%s", id->dot->sym->name, id->sym->name); print("void %s(void*);\ntypedef struct F_%s F_%s;\nstruct F_%s\n{\n", buf, buf, buf, buf); print(" WORD regs[NREG-1];\n"); if(id->ty->tof != tnone) print(" %R* ret;\n", id->ty->tof); else print(" WORD noret;\n"); print(" uchar temps[%d];\n", MaxTemp-NREG*IBY2WD); offset = MaxTemp; for(m = id->ty->ids; m != nil; m = m->next){ if(m->sym != nil) p = m->sym->name; else{ seprint(buf, buf+sizeof(buf), "arg%d", arg); p = buf; } /* * explicit pads for structure alignment */ t = m->ty; offset = stubalign(offset, t->align, nil, nil); if(offset != m->offset) yyerror("module stub must not contain data objects"); // fatal("modstub bad offset"); print(" %R %s;\n", t, p); arg++; offset += t->size; } if(id->ty->varargs) print(" WORD vargs;\n"); print("};\n"); } for(id = d->ty->ids; id != nil; id = id->next) if(id->store == Dconst) constub(id); } } static void chanstub(char *in, Decl *id) { Desc *desc; print("typedef %R %s_%s;\n", id->ty->tof, in, id->sym->name); desc = mktdesc(id->ty->tof); print("#define %s_%s_size %ld\n", in, id->sym->name, desc->size); print("#define %s_%s_map %M\n", in, id->sym->name, desc); } /* * produce c structs for all adts */ void adtstub(Decl *globals) { Type *t, *tt; Desc *desc; Decl *m, *d, *id; char buf[2*StrSize]; long offset; for(m = globals; m != nil; m = m->next){ if(m->store != Dtype || m->ty->kind != Tmodule) continue; for(d = m->ty->ids; d != nil; d = d->next){ if(d->store != Dtype) continue; t = usetype(d->ty); d->ty = t; dotprint(buf, buf+sizeof(buf), d->ty->decl, '_'); switch(d->ty->kind){ case Tadt: print("typedef struct %s %s;\n", buf, buf); break; case Tint: case Tbyte: case Treal: case Tbig: case Tfix: print("typedef %T %s;\n", t, buf); break; } } } for(m = globals; m != nil; m = m->next){ if(m->store != Dtype || m->ty->kind != Tmodule) continue; for(d = m->ty->ids; d != nil; d = d->next){ if(d->store != Dtype) continue; t = d->ty; if(t->kind == Tadt || t->kind == Ttuple && t->decl->sym != anontupsym){ if(t->tags != nil){ pickadtstub(t); continue; } dotprint(buf, buf+sizeof(buf), t->decl, '_'); print("struct %s\n{\n", buf); offset = 0; for(id = t->ids; id != nil; id = id->next){ if(id->store == Dfield){ tt = id->ty; offset = stubalign(offset, tt->align, nil, nil); if(offset != id->offset) fatal("adtstub bad offset"); print(" %R %s;\n", tt, id->sym->name); offset += tt->size; } } if(t->ids == nil){ print(" char dummy[1];\n"); offset = 1; } offset = stubalign(offset, t->align, nil ,nil); offset = stubalign(offset, IBY2WD, nil , nil); if(offset != t->size && t->ids != nil) fatal("adtstub: bad size"); print("};\n"); for(id = t->ids; id != nil; id = id->next) if(id->store == Dconst) constub(id); for(id = t->ids; id != nil; id = id->next) if(id->ty->kind == Tchan) chanstub(buf, id); desc = mktdesc(t); if(offset != desc->size && t->ids != nil) fatal("adtstub: bad desc size"); print("#define %s_size %ld\n", buf, offset); print("#define %s_map %M\n", buf, desc); if(0) print("struct %s_check {int s[2*(sizeof(%s)==%s_size)-1];};\n", buf, buf, buf); }else if(t->kind == Tchan) chanstub(m->sym->name, d); } } } /* * emit an expicit pad field for aligning emitted c structs * according to limbo's definition */ static long stubalign(long offset, int a, char **buf, char *end) { long x; x = offset & (a-1); if(x == 0) return offset; x = a - x; if(buf == nil) print("\tuchar\t_pad%ld[%ld];\n", offset, x); else *buf = seprint(*buf, end, "uchar\t_pad%ld[%ld]; ", offset, x); offset += x; if((offset & (a-1)) || x >= a) fatal("compiler stub misalign"); return offset; } void constub(Decl *id) { char buf[StrSize*2]; seprint(buf, buf+sizeof(buf), "%s_%s", id->dot->sym->name, id->sym->name); switch(id->ty->kind){ case Tbyte: print("#define %s %d\n", buf, (int)id->init->val & 0xff); break; case Tint: case Tfix: print("#define %s %ld\n", buf, (long)id->init->val); break; case Tbig: print("#define %s %ld\n", buf, (long)id->init->val); break; case Treal: print("#define %s %g\n", buf, id->init->rval); break; case Tstring: print("#define %s \"%s\"\n", buf, id->init->decl->sym->name); break; } } int mapconv(Fmt *f) { Desc *d; char *s, *e, buf[1024]; int i; d = va_arg(f->args, Desc*); e = buf+sizeof(buf); s = buf; s = secpy(s, e, "{"); for(i = 0; i < d->nmap; i++) s = seprint(s, e, "0x%x,", d->map[i]); if(i == 0) s = seprint(s, e, "0"); seprint(s, e, "}"); return fmtstrcpy(f, buf); } char* dotprint(char *buf, char *end, Decl *d, int dot) { if(d->dot != nil){ buf = dotprint(buf, end, d->dot, dot); if(buf < end) *buf++ = dot; } if(d->sym == nil) return buf; return seprint(buf, end, "%s", d->sym->name); } char *ckindname[Tend] = { /* Tnone */ "void", /* Tadt */ "struct", /* Tadtpick */ "?adtpick?", /* Tarray */ "Array*", /* Tbig */ "LONG", /* Tbyte */ "BYTE", /* Tchan */ "Channel*", /* Treal */ "REAL", /* Tfn */ "?fn?", /* Tint */ "WORD", /* Tlist */ "List*", /* Tmodule */ "Modlink*", /* Tref */ "?ref?", /* Tstring */ "String*", /* Ttuple */ "?tuple?", /* Texception */ "?exception", /* Tfix */ "WORD", /* Tpoly */ "void*", /* Tainit */ "?ainit?", /* Talt */ "?alt?", /* Tany */ "void*", /* Tarrow */ "?arrow?", /* Tcase */ "?case?", /* Tcasel */ "?casel", /* Tcasec */ "?casec?", /* Tdot */ "?dot?", /* Terror */ "?error?", /* Tgoto */ "?goto?", /* Tid */ "?id?", /* Tiface */ "?iface?", /* Texcept */ "?except?", /* Tinst */ "?inst?", }; char* ctprint(char *buf, char *end, Type *t) { Decl *id; Type *tt; long offset; if(t == nil) return secpy(buf, end, "void"); switch(t->kind){ case Tref: return seprint(buf, end, "%R*", t->tof); case Tarray: case Tlist: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tchan: case Tmodule: case Tfix: case Tpoly: return seprint(buf, end, "%s", ckindname[t->kind]); case Tadt: case Ttuple: if(t->decl->sym != anontupsym) return dotprint(buf, end, t->decl, '_'); offset = 0; buf = secpy(buf, end, "struct{ "); for(id = t->ids; id != nil; id = id->next){ tt = id->ty; offset = stubalign(offset, tt->align, &buf, end); if(offset != id->offset) fatal("ctypeconv tuple bad offset"); buf = seprint(buf, end, "%R %s; ", tt, id->sym->name); offset += tt->size; } offset = stubalign(offset, t->align, &buf, end); if(offset != t->size) fatal("ctypeconv tuple bad t=%T size=%ld offset=%ld", t, t->size, offset); return secpy(buf, end, "}"); default: if(t->kind >= Tend) yyerror("no C equivalent for type %d", t->kind); else yyerror("no C equivalent for type %s", kindname[t->kind]); break; } return buf; } static void pickadtstub(Type *t) { Type *tt; Desc *desc; Decl *id, *tg; char buf[2*StrSize]; int ok; long offset, tgoffset; dotprint(buf, buf+sizeof(buf), t->decl, '_'); offset = 0; for(tg = t->tags; tg != nil; tg = tg->next) print("#define %s_%s %ld\n", buf, tg->sym->name, offset++); print("struct %s\n{\n", buf); print(" int pick;\n"); offset = IBY2WD; for(id = t->ids; id != nil; id = id->next){ if(id->store == Dfield){ tt = id->ty; offset = stubalign(offset, tt->align, nil, nil); if(offset != id->offset) fatal("pickadtstub bad offset"); print(" %R %s;\n", tt, id->sym->name); offset += tt->size; } } print(" union{\n"); for(tg = t->tags; tg != nil; tg = tg->next){ tgoffset = offset; print(" struct{\n"); for(id = tg->ty->ids; id != nil; id = id->next){ if(id->store == Dfield){ tt = id->ty; tgoffset = stubalign(tgoffset, tt->align, nil, nil); if(tgoffset != id->offset) fatal("pickadtstub bad offset"); print(" %R %s;\n", tt, id->sym->name); tgoffset += tt->size; } } if(tg->ty->ids == nil) print(" char dummy[1];\n"); print(" } %s;\n", tg->sym->name); } print(" } u;\n"); print("};\n"); for(id = t->ids; id != nil; id = id->next) if(id->store == Dconst) constub(id); for(id = t->ids; id != nil; id = id->next) if(id->ty->kind == Tchan) chanstub(buf, id); for(tg = t->tags; tg != nil; tg = tg->next){ ok = tg->ty->tof->ok; tg->ty->tof->ok = OKverify; sizetype(tg->ty->tof); tg->ty->tof->ok = OKmask; desc = mktdesc(tg->ty->tof); tg->ty->tof->ok = ok; print("#define %s_%s_size %ld\n", buf, tg->sym->name, tg->ty->size); print("#define %s_%s_map %M\n", buf, tg->sym->name, desc); } } d, *id; print("typedef struct{char *name; long sig; void (*fn)(void*); int size; int np; uchar map[16];} Runtab;\n"); for(d = globals; d != nil; d = d->next){ if(d->stoold_contrib//root/sys/src/cmd/limbo/limbo/typecheck.c����������������������������������������������� 664 � 0 � 0 � 223253 10416534133 22022�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" #include "y.tab.h" Node **labstack; int labdep; static Node* inexcept; static Decl* fndec; void checkraises(Node *n); static void increfs(Decl *id) { for( ; id != nil; id = id->link) id->refs++; } static int fninline(Decl *d) { Node *n, *left, *right; left = right = nil; n = d->init; if(dontinline || d->caninline < 0 || d->locals != nil || ispoly(d) || n->ty->tof->kind == Tnone || nodes(n) >= 100) return 0; n = n->right; if(n->op == Oseq && n->right == nil) n = n->left; /* * inline * (a) return e; * (b) if(c) return e1; else return e2; * (c) if(c) return e1; return e2; */ switch(n->op){ case Oret: break; case Oif: right = n->right; if(right->right == nil || right->left->op != Oret || right->right->op != Oret || !tequal(right->left->left->ty, right->right->left->ty)) return 0; break; case Oseq: left = n->left; right = n->right; if(left->op != Oif || left->right->right != nil || left->right->left->op != Oret || right->op != Oseq || right->right != nil || right->left->op != Oret || !tequal(left->right->left->left->ty, right->left->left->ty)) return 0; break; default: return 0; } if(occurs(d, n) || hasasgns(n)) return 0; if(n->op == Oseq){ left->right->right = right->left; n = left; right = n->right; d->init->right->right = nil; } if(n->op == Oif){ n->ty = right->ty = right->left->left->ty; right->left = right->left->left; right->right = right->right->left; d->init->right->left = mkunary(Oret, n); } return 1; } static int isfnrefty(Type *t) { return t->kind == Tref && t->tof->kind == Tfn; } static int isfnref(Decl *d) { switch(d->store){ case Dglobal: case Darg: case Dlocal: case Dfield: case Dimport: return isfnrefty(d->ty); } return 0; } int argncompat(Node *n, Decl *f, Node *a) { for(; a != nil; a = a->right){ if(f == nil){ nerror(n, "%V: too many function arguments", n->left); return 0; } f = f->next; } if(f != nil){ nerror(n, "%V: too few function arguments", n->left); return 0; } return 1; } static void rewind(Node *n) { Node *r, *nn; r = n; nn = n->left; for(n = n->right; n != nil; n = n->right){ if(n->right == nil){ r->left = nn; r->right = n->left; } else nn = mkbin(Oindex, nn, n->left); } } static void ckmod(Node *n, Decl *id) { Type *t; Decl *d, *idc; Node *mod; if(id == nil) fatal("can't find function: %n", n); idc = nil; mod = nil; if(n->op == Oname){ idc = id; mod = id->eimport; } else if(n->op == Omdot) mod = n->left; else if(n->op == Odot){ idc = id->dot; t = n->left->ty; if(t->kind == Tref) t = t->tof; if(t->kind == Tadtpick) t = t->decl->dot->ty; d = t->decl; while(d != nil && d->link != nil) d = d->link; if(d != nil && d->timport != nil) mod = d->timport->eimport; n->right->left = mod; } if(mod != nil && mod->ty->kind != Tmodule){ nerror(n, "cannot use %V as a function reference", n); return; } if(mod != nil){ if(valistype(mod)){ nerror(n, "cannot use %V as a function reference because %V is a module interface", n, mod); return; } }else if(idc != nil && idc->dot != nil && !isimpmod(idc->dot->sym)){ nerror(n, "cannot use %V without importing %s from a variable", n, idc->sym->name); return; } if(mod != nil) modrefable(n->ty); } static void addref(Node *n) { Node *nn; nn = mkn(0, nil, nil); *nn = *n; n->op = Oref; n->left = nn; n->right = nil; n->decl = nil; n->ty = usetype(mktype(&n->src.start, &n->src.stop, Tref, nn->ty, nil)); } static void fnref(Node *n, Decl *id) { id->caninline = -1; ckmod(n, id); addref(n); while(id->link != nil) id = id->link; if(ispoly(id) && encpolys(id) != nil) nerror(n, "cannot have a polymorphic adt function reference %s", id->sym->name); } Decl* typecheck(int checkimp) { Decl *entry, *m, *d; Sym *s; int i; if(errors) return nil; /* * generate the set of all functions * compile one function at a time */ gdecl(tree); gbind(tree); fns = allocmem(nfns * sizeof(Decl)); i = gcheck(tree, fns, 0); if(i != nfns) fatal("wrong number of functions found in gcheck"); maxlabdep = 0; for(i = 0; i < nfns; i++){ d = fns[i]; if(d != nil) fndec = d; if(d != nil) fncheck(d); fndec = nil; } if(errors) return nil; entry = nil; if(checkimp){ Decl *im; Dlist *dm; if(impmods == nil){ yyerror("no implementation module"); return nil; } for(im = impmods; im != nil; im = im->next){ for(dm = impdecls; dm != nil; dm = dm->next) if(dm->d->sym == im->sym) break; if(dm == nil || dm->d->ty == nil){ yyerror("no definition for implementation module %s", im->sym->name); return nil; } } /* * can't check the module spec until all types and imports are determined, * which happens in scheck */ for(dm = impdecls; dm != nil; dm = dm->next){ im = dm->d; im->refs++; im->ty = usetype(im->ty); if(im->store != Dtype || im->ty->kind != Tmodule){ error(im->src.start, "cannot implement %K", im); return nil; } } /* now check any multiple implementations */ impdecl = modimp(impdecls, impmods); s = enter("init", 0); entry = nil; for(dm = impdecls; dm != nil; dm = dm->next){ im = dm->d; for(m = im->ty->ids; m != nil; m = m->next){ m->ty = usetype(m->ty); m->refs++; if(m->sym == s && m->ty->kind == Tfn && entry == nil) entry = m; if(m->store == Dglobal || m->store == Dfn) modrefable(m->ty); if(m->store == Dtype && m->ty->kind == Tadt){ for(d = m->ty->ids; d != nil; d = d->next){ d->ty = usetype(d->ty); modrefable(d->ty); d->refs++; } } } checkrefs(im->ty->ids); } } if(errors) return nil; gsort(tree); tree = nil; return entry; } /* * introduce all global declarations * also adds all fields to adts and modules * note the complications due to nested Odas expressions */ void gdecl(Node *n) { for(;;){ if(n == nil) return; if(n->op != Oseq) break; gdecl(n->left); n = n->right; } switch(n->op){ case Oimport: importdecled(n); gdasdecl(n->right); break; case Oadtdecl: adtdecled(n); break; case Ocondecl: condecled(n); gdasdecl(n->right); break; case Oexdecl: exdecled(n); break; case Omoddecl: moddecled(n); break; case Otypedecl: typedecled(n); break; case Ovardecl: vardecled(n); break; case Ovardecli: vardecled(n->left); gdasdecl(n->right); break; case Ofunc: fndecled(n); break; case Oas: case Odas: case Onothing: gdasdecl(n); break; default: fatal("can't deal with %O in gdecl", n->op); } } /* * bind all global type ids, * including those nested inside modules * this needs to be done, since we may use such * a type later in a nested scope, so if we bound * the type ids then, the type could get bound * to a nested declaration */ void gbind(Node *n) { Decl *d, *ids; for(;;){ if(n == nil) return; if(n->op != Oseq) break; gbind(n->left); n = n->right; } switch(n->op){ case Oas: case Ocondecl: case Odas: case Oexdecl: case Ofunc: case Oimport: case Onothing: case Ovardecl: case Ovardecli: break; case Ofielddecl: bindtypes(n->decl->ty); break; case Otypedecl: bindtypes(n->decl->ty); if(n->left != nil) gbind(n->left); break; case Opickdecl: gbind(n->left); d = n->right->left->decl; bindtypes(d->ty); repushids(d->ty->ids); gbind(n->right->right); /* get new ids for undefined types; propagate outwards */ ids = popids(d->ty->ids); if(ids != nil) installids(Dundef, ids); break; case Oadtdecl: case Omoddecl: bindtypes(n->ty); if(n->ty->polys != nil) repushids(n->ty->polys); repushids(n->ty->ids); gbind(n->left); /* get new ids for undefined types; propagate outwards */ ids = popids(n->ty->ids); if(ids != nil) installids(Dundef, ids); if(n->ty->polys != nil) popids(n->ty->polys); break; default: fatal("can't deal with %O in gbind", n->op); } } /* * check all of the > declarations * bind all type ids referred to within types at the global level * record decls for defined functions */ int gcheck(Node *n, Decl **fns, int nfns) { Ok rok; Decl *d; for(;;){ if(n == nil) return nfns; if(n->op != Oseq) break; nfns = gcheck(n->left, fns, nfns); n = n->right; } switch(n->op){ case Ofielddecl: if(n->decl->ty->u.eraises) raisescheck(n->decl->ty); break; case Onothing: case Opickdecl: break; case Otypedecl: tcycle(n->ty); break; case Oadtdecl: case Omoddecl: if(n->ty->polys != nil) repushids(n->ty->polys); repushids(n->ty->ids); if(gcheck(n->left, nil, 0)) fatal("gcheck fn decls nested in modules or adts"); if(popids(n->ty->ids) != nil) fatal("gcheck installs new ids in a module or adt"); if(n->ty->polys != nil) popids(n->ty->polys); break; case Ovardecl: varcheck(n, 1); break; case Ocondecl: concheck(n, 1); break; case Oexdecl: excheck(n, 1); break; case Oimport: importcheck(n, 1); break; case Ovardecli: varcheck(n->left, 1); rok = echeck(n->right, 0, 1, nil); if(rok.ok){ if(rok.allok) n->right = fold(n->right); globalas(n->right->left, n->right->right, rok.allok); } break; case Oas: case Odas: rok = echeck(n, 0, 1, nil); if(rok.ok){ if(rok.allok) n = fold(n); globalas(n->left, n->right, rok.allok); } break; case Ofunc: rok = echeck(n->left, 0, 1, n); if(rok.ok && n->ty->u.eraises) raisescheck(n->ty); d = nil; if(rok.ok) d = fnchk(n); fns[nfns++] = d; break; default: fatal("can't deal with %O in gcheck", n->op); } return nfns; } /* * check for unused expression results * make sure the any calculated expression has * a destination */ Node* checkused(Node *n) { Type *t; Node *nn; /* * only nil; and nil = nil; should have type tany */ if(n->ty == tany){ if(n->op == Oname) return n; if(n->op == Oas) return checkused(n->right); fatal("line %L checkused %n", n->src.start, n); } if(n->op == Ocall && n->left->ty->kind == Tfn && n->left->ty->tof != tnone){ n = mkunary(Oused, n); n->ty = n->left->ty; return n; } if(n->op == Ocall && isfnrefty(n->left->ty)){ if(n->left->ty->tof->tof != tnone){ n = mkunary(Oused, n); n->ty = n->left->ty; } return n; } if(isused[n->op] && (n->op != Ocall || n->left->ty->kind == Tfn)) return n; t = n->ty; if(t->kind == Tfn) nerror(n, "function %V not called", n); else if(t->kind == Tadt && t->tags != nil || t->kind == Tadtpick) nerror(n, "expressions cannot have type %T", t); else if(n->op == Otuple){ for(nn = n->left; nn != nil; nn = nn->right) checkused(nn->left); } else nwarn(n, "result of expression %V not used", n); n = mkunary(Oused, n); n->ty = n->left->ty; return n; } void fncheck(Decl *d) { Node *n; Decl *adtp; n = d->init; if(debug['t']) print("typecheck tree: %n\n", n); fndecls = nil; adtp = outerpolys(n->left); if(n->left->op == Odot) repushids(adtp); if(d->ty->polys != nil) repushids(d->ty->polys); repushids(d->ty->ids); labdep = 0; labstack = allocmem(maxlabdep * sizeof *labstack); n->right = scheck(n->right, d->ty->tof, Sother); if(labdep != 0) fatal("unbalanced label stack in fncheck"); free(labstack); d->locals = appdecls(popids(d->ty->ids), fndecls); if(d->ty->polys != nil) popids(d->ty->polys); if(n->left->op == Odot) popids(adtp); fndecls = nil; checkrefs(d->ty->ids); checkrefs(d->ty->polys); checkrefs(d->locals); checkraises(n); d->caninline = fninline(d); } Node* scheck(Node *n, Type *ret, int kind) { Node *left, *right, *last, *top; Decl *d; Sym *s; Ok rok; int i; top = n; last = nil; for(; n != nil; n = n->right){ left = n->left; right = n->right; switch(n->op){ case Ovardecl: vardecled(n); varcheck(n, 0); if (nested() && tmustzero(n->decl->ty)) decltozero(n); /* else if (inloop() && tmustzero(n->decl->ty)) decltozero(n); */ return top; case Ovardecli: vardecled(left); varcheck(left, 0); echeck(right, 0, 0, nil); if (nested() && tmustzero(left->decl->ty)) decltozero(left); return top; case Otypedecl: typedecled(n); bindtypes(n->ty); tcycle(n->ty); return top; case Ocondecl: condecled(n); concheck(n, 0); return top; case Oexdecl: exdecled(n); excheck(n, 0); return top; case Oimport: importdecled(n); importcheck(n, 0); return top; case Ofunc: fatal("scheck func"); case Oscope: pushscope(n, kind == Sother ? Sscope : kind); if (left != nil) fatal("Oscope has left field"); echeck(left, 0, 0, nil); n->right = scheck(right, ret, Sother); d = popscope(); fndecls = appdecls(fndecls, d); return top; case Olabel: echeck(left, 0, 0, nil); n->right = scheck(right, ret, Sother); return top; case Oseq: n->left = scheck(left, ret, Sother); /* next time will check n->right */ break; case Oif: rok = echeck(left, 0, 0, nil); if(rok.ok && left->op != Onothing && left->ty != tint) nerror(n, "if conditional must be an int, not %Q", left); right->left = scheck(right->left, ret, Sother); /* next time will check n->right->right */ n = right; break; case Ofor: rok = echeck(left, 0, 0, nil); if(rok.ok && left->op != Onothing && left->ty != tint) nerror(n, "for conditional must be an int, not %Q", left); /* * do the continue clause before the body * this reflects the ordering of declarations */ pushlabel(n); right->right = scheck(right->right, ret, Sother); right->left = scheck(right->left, ret, Sloop); labdep--; if(n->decl != nil && !n->decl->refs) nwarn(n, "label %s never referenced", n->decl->sym->name); return top; case Odo: rok = echeck(left, 0, 0, nil); if(rok.ok && left->op != Onothing && left->ty != tint) nerror(n, "do conditional must be an int, not %Q", left); pushlabel(n); n->right = scheck(n->right, ret, Sloop); labdep--; if(n->decl != nil && !n->decl->refs) nwarn(n, "label %s never referenced", n->decl->sym->name); return top; case Oalt: case Ocase: case Opick: case Oexcept: pushlabel(n); switch(n->op){ case Oalt: altcheck(n, ret); break; case Ocase: casecheck(n, ret); break; case Opick: pickcheck(n, ret); break; case Oexcept: exccheck(n, ret); break; } labdep--; if(n->decl != nil && !n->decl->refs) nwarn(n, "label %s never referenced", n->decl->sym->name); return top; case Oret: rok = echeck(left, 0, 0, nil); if(!rok.ok) return top; if(left == nil){ if(ret != tnone) nerror(n, "return of nothing from a fn of %T", ret); }else if(ret == tnone){ if(left->ty != tnone) nerror(n, "return %Q from a fn with no return type", left); }else if(!tcompat(ret, left->ty, 0)) nerror(n, "return %Q from a fn of %T", left, ret); return top; case Obreak: case Ocont: s = nil; if(n->decl != nil) s = n->decl->sym; for(i = 0; i < labdep; i++){ if(s == nil || labstack[i]->decl != nil && labstack[i]->decl->sym == s){ if(n->op == Ocont && labstack[i]->op != Ofor && labstack[i]->op != Odo) continue; if(s != nil) labstack[i]->decl->refs++; return top; } } nerror(n, "no appropriate target for %V", n); return top; case Oexit: case Onothing: return top; case Oexstmt: fndec->handler = 1; n->left = scheck(left, ret, Sother); n->right = scheck(right, ret, Sother); return top; default: rok = echeck(n, 0, 0, nil); if(rok.allok) n = checkused(n); if(last == nil) return n; last->right = n; return top; } last = n; } return top; } void pushlabel(Node *n) { Sym *s; int i; if(labdep >= maxlabdep){ maxlabdep += MaxScope; labstack = reallocmem(labstack, maxlabdep * sizeof *labstack); } if(n->decl != nil){ s = n->decl->sym; n->decl->refs = 0; for(i = 0; i < labdep; i++) if(labstack[i]->decl != nil && labstack[i]->decl->sym == s) nerror(n, "label %s duplicated on line %L", s->name, labstack[i]->decl->src.start); } labstack[labdep++] = n; } void varcheck(Node *n, int isglobal) { Type *t; Decl *ids, *last; t = validtype(n->ty, nil); t = topvartype(t, n->decl, isglobal, 0); last = n->left->decl; for(ids = n->decl; ids != last->next; ids = ids->next){ ids->ty = t; shareloc(ids); } if(t->u.eraises) raisescheck(t); } void concheck(Node *n, int isglobal) { Decl *ids, *last; Type *t; Node *init; Ok rok; int i; pushscope(nil, Sother); installids(Dconst, iota); rok = echeck(n->right, 0, isglobal, nil); popscope(); init = n->right; if(!rok.ok){ t = terror; }else{ t = init->ty; if(!tattr[t->kind].conable){ nerror(init, "cannot have a %T constant", t); rok.allok = 0; } } last = n->left->decl; for(ids = n->decl; ids != last->next; ids = ids->next) ids->ty = t; if(!rok.allok) return; i = 0; for(ids = n->decl; ids != last->next; ids = ids->next){ if(rok.ok){ iota->init->val = i; ids->init = dupn(0, &nosrc, init); if(!varcom(ids)) rok.ok = 0; } i++; } } static char* exname(Decl *d) { int n; Sym *m; char *s; char buf[16]; n = 0; sprint(buf, "%d", scope-ScopeGlobal); m = impmods->sym; if(d->dot) m = d->dot->sym; if(m) n += strlen(m->name)+1; if(fndec) n += strlen(fndec->sym->name)+1; n += strlen(buf)+1+strlen(d->sym->name)+1; s = malloc(n); strcpy(s, ""); if(m){ strcat(s, m->name); strcat(s, "."); } if(fndec){ strcat(s, fndec->sym->name); strcat(s, "."); } strcat(s, buf); strcat(s, "."); strcat(s, d->sym->name); return s; } void excheck(Node *n, int isglobal) { char *nm; Type *t; Decl *ids, *last; t = validtype(n->ty, nil); t = topvartype(t, n->decl, isglobal, 0); last = n->left->decl; for(ids = n->decl; ids != last->next; ids = ids->next){ ids->ty = t; nm = exname(ids); ids->init = mksconst(&n->src, enterstring(nm, strlen(nm))); /* ids->init = mksconst(&n->src, enterstring(strdup(ids->sym->name), strlen(ids->sym->name))); */ } } void importcheck(Node *n, int isglobal) { Node *m; Decl *id, *last, *v; Type *t; Ok rok; rok = echeck(n->right, 1, isglobal, nil); if(!rok.ok) return; m = n->right; if(m->ty->kind != Tmodule || m->op != Oname){ nerror(n, "cannot import from %Q", m); return; } last = n->left->decl; for(id = n->decl; id != last->next; id = id->next){ v = namedot(m->ty->ids, id->sym); if(v == nil){ error(id->src.start, "%s is not a member of %V", id->sym->name, m); id->store = Dwundef; continue; } id->store = v->store; v->ty = validtype(v->ty, nil); id->ty = t = v->ty; if(id->store == Dtype && t->decl != nil){ id->timport = t->decl->timport; t->decl->timport = id; } id->init = v->init; id->importid = v; id->eimport = m; } } static Decl* rewcall(Node *n, Decl *d) { /* put original function back now we're type checked */ while(d->link != nil) d = d->link; if(n->op == Odot) n->right->decl = d; else if(n->op == Omdot){ n->right->right->decl = d; n->right->right->ty = d->ty; } else fatal("bad op in Ocall rewcall"); n->ty = n->right->ty = d->ty; d->refs++; usetype(d->ty); return d; } /* * annotate the expression with types */ Ok echeck(Node *n, int typeok, int isglobal, Node *par) { Type *t, *tt; Node *left, *right, *mod, *nn; Decl *tg, *id, *callee; Sym *s; int max, nocheck; Ok ok, rok, kidsok; static int tagopt; ok.ok = ok.allok = 1; if(n == nil) return ok; /* avoid deep recursions */ if(n->op == Oseq){ for( ; n != nil && n->op == Oseq; n = n->right){ rok = echeck(n->left, typeok == 2, isglobal, n); ok.ok &= rok.ok; ok.allok &= rok.allok; n->ty = tnone; } if(n == nil) return ok; } left = n->left; right = n->right; nocheck = 0; if(n->op == Odot || n->op == Omdot || n->op == Ocall || n->op == Oref || n->op == Otagof || n->op == Oindex) nocheck = 1; if(n->op != Odas /* special case */ && n->op != Oload) /* can have better error recovery */ ok = echeck(left, nocheck, isglobal, n); if(n->op != Odas /* special case */ && n->op != Odot /* special check */ && n->op != Omdot /* special check */ && n->op != Ocall /* can have better error recovery */ && n->op != Oindex){ rok = echeck(right, 0, isglobal, n); ok.ok &= rok.ok; ok.allok &= rok.allok; } if(!ok.ok){ n->ty = terror; ok.allok = 0; return ok; } switch(n->op){ case Odas: kidsok = echeck(right, 0, isglobal, n); if(!kidsok.ok) right->ty = terror; if(!isglobal && !dasdecl(left)){ kidsok.ok = 0; }else if(!specific(right->ty) || !declasinfer(left, right->ty)){ nerror(n, "cannot declare %V from %Q", left, right); declaserr(left); kidsok.ok = 0; } if(right->ty->kind == Texception) left->ty = n->ty = mkextuptype(right->ty); else{ left->ty = n->ty = right->ty; usedty(n->ty); } kidsok.allok &= kidsok.ok; if (nested() && tmustzero(left->ty)) decltozero(left); return kidsok; case Oseq: case Onothing: n->ty = tnone; break; case Owild: n->ty = tint; break; case Ocast: t = usetype(n->ty); n->ty = t; tt = left->ty; if(tcompat(t, tt, 0)){ left->ty = t; break; } if(tt->kind == Tarray){ if(tt->tof == tbyte && t == tstring) break; }else if(t->kind == Tarray){ if(t->tof == tbyte && tt == tstring) break; }else if(casttab[tt->kind][t->kind]){ break; } nerror(n, "cannot make a %T from %Q", n->ty, left); ok.ok = ok.allok = 0; return ok; case Ochan: n->ty = usetype(n->ty); if(left && left->ty->kind != Tint){ nerror(n, "channel size %Q is not an int", left); ok.ok = ok.allok = 0; return ok; } break; case Oload: n->ty = usetype(n->ty); kidsok = echeck(left, 0, isglobal, n); if(n->ty->kind != Tmodule){ nerror(n, "cannot load a %T, ", n->ty); ok.ok = ok.allok = 0; return ok; } if(!kidsok.allok){ ok.allok = 0; break; } if(left->ty != tstring){ nerror(n, "cannot load a module from %Q", left); ok.allok = 0; break; } if(n->ty->tof->decl->refs != 0) n->ty->tof->decl->refs++; n->ty->decl->refs++; usetype(n->ty->tof); break; case Oref: t = left->ty; if(t->kind != Tadt && t->kind != Tadtpick && t->kind != Tfn && t->kind != Ttuple){ nerror(n, "cannot make a ref from %Q", left); ok.ok = ok.allok = 0; return ok; } if(!tagopt && t->kind == Tadt && t->tags != nil && valistype(left)){ nerror(n, "instances of ref %V must be qualified with a pick tag", left); ok.ok = ok.allok = 0; return ok; } if(t->kind == Tadtpick) t->tof = usetype(t->tof); n->ty = usetype(mktype(&n->src.start, &n->src.stop, Tref, t, nil)); break; case Oarray: max = 0; if(right != nil){ max = assignindices(n); if(max < 0){ ok.ok = ok.allok = 0; return ok; } if(!specific(right->left->ty)){ nerror(n, "type for array not specific"); ok.ok = ok.allok = 0; return ok; } n->ty = mktype(&n->src.start, &n->src.stop, Tarray, right->left->ty, nil); } n->ty = usetype(n->ty); if(left->op == Onothing) n->left = left = mkconst(&n->left->src, max); if(left->ty->kind != Tint){ nerror(n, "array size %Q is not an int", left); ok.ok = ok.allok = 0; return ok; } break; case Oelem: n->ty = right->ty; break; case Orange: if(left->ty != right->ty || left->ty != tint && left->ty != tstring){ nerror(left, "range %Q to %Q is not an int or string range", left, right); ok.ok = ok.allok = 0; return ok; } n->ty = left->ty; break; case Oname: id = n->decl; if(id == nil){ nerror(n, "name with no declaration"); ok.ok = ok.allok = 0; return ok; } if(id->store == Dunbound){ s = id->sym; id = s->decl; if(id == nil) id = undefed(&n->src, s); /* save a little space */ s->unbound = nil; n->decl = id; id->refs++; } n->ty = id->ty = usetype(id->ty); switch(id->store){ case Dfn: case Dglobal: case Darg: case Dlocal: case Dimport: case Dfield: case Dtag: break; case Dundef: nerror(n, "%s is not declared", id->sym->name); id->store = Dwundef; ok.ok = ok.allok = 0; return ok; case Dwundef: ok.ok = ok.allok = 0; return ok; case Dconst: if(id->init == nil){ nerror(n, "%s's value cannot be determined", id->sym->name); id->store = Dwundef; ok.ok = ok.allok = 0; return ok; } break; case Dtype: if(typeok) break; nerror(n, "%K is not a variable", id); ok.ok = ok.allok = 0; return ok; default: fatal("echeck: unknown symbol storage"); } if(n->ty == nil){ nerror(n, "%K's type is not fully defined", id); id->store = Dwundef; ok.ok = ok.allok = 0; return ok; } if(id->importid != nil && valistype(id->eimport) && id->store != Dconst && id->store != Dtype && id->store != Dfn){ nerror(n, "cannot use %V because %V is a module interface", n, id->eimport); ok.ok = ok.allok = 0; return ok; } if(n->ty->kind == Texception && !n->ty->cons && par != nil && par->op != Oraise && par->op != Odot){ nn = mkn(0, nil, nil); *nn = *n; n->op = Ocast; n->left = nn; n->decl = nil; n->ty = usetype(mkextuptype(n->ty)); } /* function name as function reference */ if(id->store == Dfn && (par == nil || (par->op != Odot && par->op != Omdot && par->op != Ocall && par->op != Ofunc))) fnref(n, id); break; case Oconst: if(n->ty == nil){ nerror(n, "no type in %V", n); ok.ok = ok.allok = 0; return ok; } break; case Oas: t = right->ty; if(t->kind == Texception) t = mkextuptype(t); if(!tcompat(left->ty, t, 1)){ nerror(n, "type clash in %Q = %Q", left, right); ok.ok = ok.allok = 0; return ok; } if(t == tany) t = left->ty; n->ty = t; left->ty = t; if(t->kind == Tadt && t->tags != nil || t->kind == Tadtpick) if(left->ty->kind != Tadtpick || right->ty->kind != Tadtpick) nerror(n, "expressions cannot have type %T", t); if(left->ty->kind == Texception){ nerror(n, "cannot assign to an exception"); ok.ok = ok.allok = 0; return ok; } if(islval(left)) break; ok.ok = ok.allok = 0; return ok; case Osnd: if(left->ty->kind != Tchan){ nerror(n, "cannot send on %Q", left); ok.ok = ok.allok = 0; return ok; } if(!tcompat(left->ty->tof, right->ty, 0)){ nerror(n, "type clash in %Q <-= %Q", left, right); ok.ok = ok.allok = 0; return ok; } t = right->ty; if(t == tany) t = left->ty->tof; n->ty = t; break; case Orcv: t = left->ty; if(t->kind == Tarray) t = t->tof; if(t->kind != Tchan){ nerror(n, "cannot receive on %Q", left); ok.ok = ok.allok = 0; return ok; } if(left->ty->kind == Tarray) n->ty = usetype(mktype(&n->src.start, &n->src.stop, Ttuple, nil, mkids(&n->src, nil, tint, mkids(&n->src, nil, t->tof, nil)))); else n->ty = t->tof; break; case Ocons: if(right->ty->kind != Tlist && right->ty != tany){ nerror(n, "cannot :: to %Q", right); ok.ok = ok.allok = 0; return ok; } n->ty = right->ty; if(right->ty == tany) n->ty = usetype(mktype(&n->src.start, &n->src.stop, Tlist, left->ty, nil)); else if(!tcompat(right->ty->tof, left->ty, 0)){ t = tparent(right->ty->tof, left->ty); if(!tcompat(t, left->ty, 0)){ nerror(n, "type clash in %Q :: %Q", left, right); ok.ok = ok.allok = 0; return ok; } else n->ty = usetype(mktype(&n->src.start, &n->src.stop, Tlist, t, nil)); } break; case Ohd: case Otl: if(left->ty->kind != Tlist || left->ty->tof == nil){ nerror(n, "cannot %O %Q", n->op, left); ok.ok = ok.allok = 0; return ok; } if(n->op == Ohd) n->ty = left->ty->tof; else n->ty = left->ty; break; case Otuple: n->ty = usetype(mktype(&n->src.start, &n->src.stop, Ttuple, nil, tuplefields(left))); break; case Ospawn: if(left->op != Ocall || left->left->ty->kind != Tfn && !isfnrefty(left->left->ty)){ nerror(left, "cannot spawn %V", left); ok.ok = ok.allok = 0; return ok; } if(left->ty != tnone){ nerror(left, "cannot spawn functions which return values, such as %Q", left); ok.ok = ok.allok = 0; return ok; } break; case Oraise: if(left->op == Onothing){ if(inexcept == nil){ nerror(n, "%V: empty raise not in exception handler", n); ok.ok = ok.allok = 0; return ok; } n->left = dupn(1, &n->src, inexcept); break; } if(left->ty != tstring && left->ty->kind != Texception){ nerror(n, "%V: raise argument %Q is not a string or exception", n, left); ok.ok = ok.allok = 0; return ok; } if((left->op != Ocall || left->left->ty->kind == Tfn) && left->ty->ids != nil && left->ty->cons){ nerror(n, "too few exception arguments"); ok.ok = ok.allok = 0; return ok; } break; case Ocall:{ int pure; kidsok = echeck(right, 0, isglobal, nil); t = left->ty; usedty(t); pure = 1; if(t->kind == Tref){ pure = 0; t = t->tof; } if(t->kind != Tfn) return callcast(n, kidsok.allok, ok.allok); n->ty = t->tof; if(!kidsok.allok){ ok.allok = 0; break; } /* * get the name to call and any associated module */ mod = nil; callee = nil; id = nil; tt = nil; if(left->op == Odot){ Decl *dd; Type *ttt; callee = left->right->decl; id = callee->dot; right = passimplicit(left, right); n->right = right; tt = left->left->ty; if(tt->kind == Tref) tt = tt->tof; ttt = tt; if(tt->kind == Tadtpick) ttt = tt->decl->dot->ty; dd = ttt->decl; while(dd != nil && dd->link != nil) dd = dd->link; if(dd != nil && dd->timport != nil) mod = dd->timport->eimport; /* * stash the import module under a rock, * because we won't be able to get it later * after scopes are popped */ left->right->left = mod; }else if(left->op == Omdot){ if(left->right->op == Odot){ callee = left->right->right->decl; right = passimplicit(left->right, right); n->right = right; tt = left->right->left->ty; if(tt->kind == Tref) tt = tt->tof; }else callee = left->right->decl; mod = left->left; }else if(left->op == Oname){ callee = left->decl; id = callee; mod = id->eimport; }else if(pure){ nerror(left, "%V is not a function name", left); ok.allok = 0; break; } if(pure && callee == nil) fatal("can't find called function: %n", left); if(callee != nil && callee->store != Dfn && !isfnref(callee)){ nerror(left, "%V is not a function or function reference", left); ok.allok = 0; break; } if(mod != nil && mod->ty->kind != Tmodule){ nerror(left, "cannot call %V", left); ok.allok = 0; break; } if(mod != nil){ if(valistype(mod)){ nerror(left, "cannot call %V because %V is a module interface", left, mod); ok.allok = 0; break; } }else if(id != nil && id->dot != nil && !isimpmod(id->dot->sym)){ nerror(left, "cannot call %V without importing %s from a variable", left, id->sym->name); ok.allok = 0; break; } if(mod != nil) modrefable(left->ty); if(callee != nil && callee->store != Dfn) callee = nil; if(t->varargs != 0){ t = mkvarargs(left, right); if(left->ty->kind == Tref) left->ty = usetype(mktype(&t->src.start, &t->src.stop, Tref, t, nil)); else left->ty = t; } else if(ispoly(callee) || isfnrefty(left->ty) && left->ty->tof->polys != nil){ Tpair *tp; unifysrc = n->src; if(!argncompat(n, t->ids, right)) ok.allok = 0; else if(!tunify(left->ty, calltype(left->ty, right, n->ty), &tp)){ nerror(n, "function call type mismatch"); ok.allok = 0; } else{ n->ty = usetype(expandtype(n->ty, nil, nil, &tp)); if(ispoly(callee) && tt != nil && (tt->kind == Tadt || tt->kind == Tadtpick) && (tt->flags&INST)) callee = rewcall(left, callee); n->right = passfns(&n->src, callee, left, right, tt, tp); } } else if(!argcompat(n, t->ids, right)) ok.allok = 0; break; } case Odot: t = left->ty; if(t->kind == Tref) t = t->tof; switch(t->kind){ case Tadt: case Tadtpick: case Ttuple: case Texception: case Tpoly: id = namedot(t->ids, right->decl->sym); if(id == nil){ id = namedot(t->tags, right->decl->sym); if(id != nil && !valistype(left)){ nerror(n, "%V is not a type", left); ok.ok = ok.allok = 0; return ok; } } if(id == nil){ id = namedot(t->polys, right->decl->sym); if(id != nil && !valistype(left)){ nerror(n, "%V is not a type", left); ok.ok = ok.allok = 0; return ok; } } if(id == nil && t->kind == Tadtpick) id = namedot(t->decl->dot->ty->ids, right->decl->sym); if(id == nil){ for(tg = t->tags; tg != nil; tg = tg->next){ id = namedot(tg->ty->ids, right->decl->sym); if(id != nil) break; } if(id != nil){ nerror(n, "cannot yet index field %s of %Q", right->decl->sym->name, left); ok.ok = ok.allok = 0; return ok; } } if(id == nil) break; if(id->store == Dfield && valistype(left)){ nerror(n, "%V is not a value", left); ok.ok = ok.allok = 0; return ok; } id->ty = validtype(id->ty, t->decl); id->ty = usetype(id->ty); break; default: nerror(left, "%Q cannot be qualified with .", left); ok.ok = ok.allok = 0; return ok; } if(id == nil){ nerror(n, "%V is not a member of %Q", right, left); ok.ok = ok.allok = 0; return ok; } if(id->ty == tunknown){ nerror(n, "illegal forward reference to %V", n); ok.ok = ok.allok = 0; return ok; } increfs(id); right->decl = id; n->ty = id->ty; if((id->store == Dconst || id->store == Dtag) && hasside(left, 1)) nwarn(left, "result of expression %Q ignored", left); /* function name as function reference */ if(id->store == Dfn && (par == nil || (par->op != Omdot && par->op != Ocall && par->op != Ofunc))) fnref(n, id); break; case Omdot: t = left->ty; if(t->kind != Tmodule){ nerror(left, "%Q cannot be qualified with ->", left); ok.ok = ok.allok = 0; return ok; } id = nil; if(right->op == Oname){ id = namedot(t->ids, right->decl->sym); }else if(right->op == Odot){ kidsok = echeck(right, 0, isglobal, n); ok.ok = kidsok.ok; ok.allok &= kidsok.allok; if(!ok.ok){ ok.allok = 0; return ok; } tt = right->left->ty; if(tt->kind == Tref) tt = tt->tof; if(right->ty->kind == Tfn && tt->kind == Tadt && tt->decl->dot == t->decl) id = right->right->decl; } if(id == nil){ nerror(n, "%V is not a member of %Q", right, left); ok.ok = ok.allok = 0; return ok; } if(id->store != Dconst && id->store != Dtype && id->store != Dtag){ if(valistype(left)){ nerror(n, "%V is not a value", left); ok.ok = ok.allok = 0; return ok; } }else if(hasside(left, 1)) nwarn(left, "result of expression %Q ignored", left); if(!typeok && id->store == Dtype){ nerror(n, "%V is a type, not a value", n); ok.ok = ok.allok = 0; return ok; } if(id->ty == tunknown){ nerror(n, "illegal forward reference to %V", n); ok.ok = ok.allok = 0; return ok; } id->refs++; right->decl = id; n->ty = id->ty = usetype(id->ty); if(id->store == Dglobal) modrefable(id->ty); /* function name as function reference */ if(id->store == Dfn && (par == nil || (par->op != Ocall && par->op != Ofunc))) fnref(n, id); break; case Otagof: n->ty = tint; t = left->ty; if(t->kind == Tref) t = t->tof; id = nil; switch(left->op){ case Oname: id = left->decl; break; case Odot: id = left->right->decl; break; case Omdot: if(left->right->op == Odot) id = left->right->right->decl; break; } if(id != nil && id->store == Dtag || id != nil && id->store == Dtype && t->kind == Tadt && t->tags != nil) n->decl = id; else if(t->kind == Tadt && t->tags != nil || t->kind == Tadtpick) n->decl = nil; else{ nerror(n, "cannot get the tag value for %Q", left); ok.ok = 1; ok.allok = 0; return ok; } break; case Oind: t = left->ty; if(t->kind != Tref || (t->tof->kind != Tadt && t->tof->kind != Tadtpick && t->tof->kind != Ttuple)){ nerror(n, "cannot * %Q", left); ok.ok = ok.allok = 0; return ok; } n->ty = t->tof; for(tg = t->tof->tags; tg != nil; tg = tg->next) tg->ty->tof = usetype(tg->ty->tof); break; case Oindex: if(valistype(left)){ tagopt = 1; kidsok = echeck(right, 2, isglobal, n); tagopt = 0; if(!kidsok.allok){ ok.ok = ok.allok = 0; return ok; } if((t = exptotype(n)) == nil){ nerror(n, "%V is not a type list", right); ok.ok = ok.allok = 0; return ok; } if(!typeok){ nerror(n, "%Q is not a variable", left); ok.ok = ok.allok = 0; return ok; } *n = *(n->left); n->ty = usetype(t); break; } if(0 && right->op == Oseq){ /* a[e1, e2, ...] */ /* array creation to do before we allow this */ rewind(n); return echeck(n, typeok, isglobal, par); } t = left->ty; kidsok = echeck(right, 0, isglobal, n); if(t->kind != Tarray && t != tstring){ nerror(n, "cannot index %Q", left); ok.ok = ok.allok = 0; return ok; } if(t == tstring){ n->op = Oinds; n->ty = tint; }else{ n->ty = t->tof; } if(!kidsok.allok){ ok.allok = 0; break; } if(right->ty != tint){ nerror(n, "cannot index %Q with %Q", left, right); ok.allok = 0; break; } break; case Oslice: t = n->ty = left->ty; if(t->kind != Tarray && t != tstring){ nerror(n, "cannot slice %Q with '%v:%v'", left, right->left, right->right); ok.ok = ok.allok = 0; return ok; } if(right->left->ty != tint && right->left->op != Onothing || right->right->ty != tint && right->right->op != Onothing){ nerror(n, "cannot slice %Q with '%v:%v'", left, right->left, right->right); ok.allok = 0; return ok; } break; case Olen: t = left->ty; n->ty = tint; if(t->kind != Tarray && t->kind != Tlist && t != tstring){ nerror(n, "len requires an array, string or list in %Q", left); ok.allok = 0; return ok; } break; case Ocomp: case Onot: case Oneg: n->ty = left->ty; usedty(n->ty); switch(left->ty->kind){ case Tint: return ok; case Treal: case Tfix: if(n->op == Oneg) return ok; break; case Tbig: case Tbyte: if(n->op == Oneg || n->op == Ocomp) return ok; break; } nerror(n, "cannot apply %O to %Q", n->op, left); ok.ok = ok.allok = 0; return ok; case Oinc: case Odec: case Opreinc: case Opredec: n->ty = left->ty; switch(left->ty->kind){ case Tint: case Tbig: case Tbyte: case Treal: break; default: nerror(n, "cannot apply %O to %Q", n->op, left); ok.ok = ok.allok = 0; return ok; } if(islval(left)) break; ok.ok = ok.allok = 0; return ok; case Oadd: case Odiv: case Omul: case Osub: if(mathchk(n, 1)) break; ok.ok = ok.allok = 0; return ok; case Oexp: case Oexpas: n->ty = left->ty; if(n->ty != tint && n->ty != tbig && n->ty != treal){ nerror(n, "exponend %Q is not int, big or real", left); ok.ok = ok.allok = 0; return ok; } if(right->ty != tint){ nerror(n, "exponent %Q is not int", right); ok.ok = ok.allok = 0; return ok; } if(n->op == Oexpas && !islval(left)){ ok.ok = ok.allok = 0; return ok; } break; /* if(mathchk(n, 0)){ if(n->ty != tint){ nerror(n, "exponentiation operands not int"); ok.ok = ok.allok = 0; return ok; } break; } ok.ok = ok.allok = 0; return ok; */ case Olsh: case Orsh: if(shiftchk(n)) break; ok.ok = ok.allok = 0; return ok; case Oandand: case Ooror: if(left->ty != tint){ nerror(n, "%O's left operand is not an int: %Q", n->op, left); ok.allok = 0; } if(right->ty != tint){ nerror(n, "%O's right operand is not an int: %Q", n->op, right); ok.allok = 0; } n->ty = tint; break; case Oand: case Omod: case Oor: case Oxor: if(mathchk(n, 0)) break; ok.ok = ok.allok = 0; return ok; case Oaddas: case Odivas: case Omulas: case Osubas: if(mathchk(n, 1) && islval(left)) break; ok.ok = ok.allok = 0; return ok; case Olshas: case Orshas: if(shiftchk(n) && islval(left)) break; ok.ok = ok.allok = 0; return ok; case Oandas: case Omodas: case Oxoras: case Ooras: if(mathchk(n, 0) && islval(left)) break; ok.ok = ok.allok = 0; return ok; case Olt: case Oleq: case Ogt: case Ogeq: if(!mathchk(n, 1)){ ok.ok = ok.allok = 0; return ok; } n->ty = tint; break; case Oeq: case Oneq: switch(left->ty->kind){ case Tint: case Tbig: case Tbyte: case Treal: case Tstring: case Tref: case Tlist: case Tarray: case Tchan: case Tany: case Tmodule: case Tfix: case Tpoly: if(!tcompat(left->ty, right->ty, 0) && !tcompat(right->ty, left->ty, 0)) break; t = left->ty; if(t == tany) t = right->ty; if(t == tany) t = tint; if(left->ty == tany) left->ty = t; if(right->ty == tany) right->ty = t; n->ty = tint; return ok; } nerror(n, "cannot compare %Q to %Q", left, right); usedty(n->ty); ok.ok = ok.allok = 0; return ok; case Otype: if(!typeok){ nerror(n, "%Q is not a variable", n); ok.ok = ok.allok = 0; return ok; } n->ty = usetype(n->ty); break; default: fatal("unknown op in typecheck: %O", n->op); } usedty(n->ty); return ok; } /* * n is syntactically a call, but n->left is not a fn * check if it's the contructor for an adt */ Ok callcast(Node *n, int kidsok, int allok) { Node *left, *right; Decl *id; Type *t, *tt; Ok ok; left = n->left; right = n->right; id = nil; switch(left->op){ case Oname: id = left->decl; break; case Omdot: if(left->right->op == Odot) id = left->right->right->decl; else id = left->right->decl; break; case Odot: id = left->right->decl; break; } /* (chan of int)(nil) looks awkward since both sets of brackets needed if(id == nil && right != nil && right->right == nil && (t = exptotype(left)) != nil){ n->op = Ocast; n->left = right->left; n->right = nil; n->ty = t; return echeck(n, 0, 0, nil); } */ if(id == nil || (id->store != Dtype && id->store != Dtag && id->ty->kind != Texception)){ nerror(left, "%V is not a function or type name", left); ok.ok = ok.allok = 0; return ok; } if(id->store == Dtag) return tagcast(n, left, right, id, kidsok, allok); t = left->ty; n->ty = t; if(!kidsok){ ok.ok = 1; ok.allok = 0; return ok; } if(t->kind == Tref) t = t->tof; tt = mktype(&n->src.start, &n->src.stop, Ttuple, nil, tuplefields(right)); if(t->kind == Tadt && tcompat(t, tt, 1)){ if(right == nil) *n = *n->left; ok.ok = 1; ok.allok = allok; return ok; } /* try an exception with args */ tt = mktype(&n->src.start, &n->src.stop, Texception, nil, tuplefields(right)); tt->cons = 1; if(t->kind == Texception && t->cons && tcompat(t, tt, 1)){ if(right == nil) *n = *n->left; ok.ok = 1; ok.allok = allok; return ok; } /* try a cast */ if(t->kind != Texception && right != nil && right->right == nil){ /* Oseq but single expression */ right = right->left; n->op = Ocast; n->left = right; n->right = nil; n->ty = mkidtype(&n->src, id->sym); return echeck(n, 0, 0, nil); } nerror(left, "cannot make a %V from '(%v)'", left, right); ok.ok = ok.allok = 0; return ok; } Ok tagcast(Node *n, Node *left, Node *right, Decl *id, int kidsok, int allok) { Type *tt; Ok ok; left->ty = id->ty; if(left->op == Omdot) left->right->ty = id->ty; n->ty = id->ty; if(!kidsok){ ok.ok = 1; ok.allok = 0; return ok; } id->ty->tof = usetype(id->ty->tof); if(right != nil) right->ty = id->ty->tof; tt = mktype(&n->src.start, &n->src.stop, Ttuple, nil, mkids(&nosrc, nil, tint, tuplefields(right))); tt->ids->store = Dfield; if(tcompat(id->ty->tof, tt, 1)){ ok.ok = 1; ok.allok = allok; return ok; } nerror(left, "cannot make a %V from '(%v)'", left, right); ok.ok = ok.allok = 0; return ok; } int valistype(Node *n) { switch(n->op){ case Oname: if(n->decl->store == Dtype) return 1; break; case Omdot: return valistype(n->right); } return 0; } int islval(Node *n) { int s; s = marklval(n); if(s == 1) return 1; if(s == 0) nerror(n, "cannot assign to %V", n); else circlval(n, n); return 0; } /* * check to see if n is an lval * mark the lval name as set */ int marklval(Node *n) { Decl *id; Node *nn; int s; if(n == nil) return 0; switch(n->op){ case Oname: return storespace[n->decl->store] && n->ty->kind != Texception; /*ZZZZ && n->decl->tagged == nil;*/ case Odot: if(n->right->decl->store != Dfield) return 0; if(n->right->decl->cycle && !n->right->decl->cyc) return -1; if(n->left->ty->kind != Tref && marklval(n->left) == 0) nwarn(n, "assignment to %Q ignored", n); return 1; case Omdot: if(n->right->decl->store == Dglobal) return 1; return 0; case Oind: for(id = n->ty->ids; id != nil; id = id->next) if(id->cycle && !id->cyc) return -1; return 1; case Oslice: if(n->right->right->op != Onothing || n->ty == tstring) return 0; return 1; case Oinds: /* * make sure we don't change a string constant */ switch(n->left->op){ case Oconst: return 0; case Oname: return storespace[n->left->decl->store]; case Odot: case Omdot: if(n->left->right->decl != nil) return storespace[n->left->right->decl->store]; break; } return 1; case Oindex: case Oindx: return 1; case Otuple: for(nn = n->left; nn != nil; nn = nn->right){ s = marklval(nn->left); if(s != 1) return s; } return 1; default: return 0; } return 0; } /* * n has a circular field assignment. * find it and print an error message. */ int circlval(Node *n, Node *lval) { Decl *id; Node *nn; int s; if(n == nil) return 0; switch(n->op){ case Oname: break; case Odot: if(n->right->decl->cycle && !n->right->decl->cyc){ nerror(lval, "cannot assign to %V because field '%s' of %V could complete a cycle to %V", lval, n->right->decl->sym->name, n->left, n->left); return -1; } return 1; case Oind: for(id = n->ty->ids; id != nil; id = id->next){ if(id->cycle && !id->cyc){ nerror(lval, "cannot assign to %V because field '%s' of %V could complete a cycle to %V", lval, id->sym->name, n, n); return -1; } } return 1; case Oslice: if(n->right->right->op != Onothing || n->ty == tstring) return 0; return 1; case Oindex: case Oinds: case Oindx: return 1; case Otuple: for(nn = n->left; nn != nil; nn = nn->right){ s = circlval(nn->left, lval); if(s != 1) return s; } return 1; default: return 0; } return 0; } int mathchk(Node *n, int realok) { Type *tr, *tl; tl = n->left->ty; tr = n->right->ty; if(tr != tl && !tequal(tl, tr)){ nerror(n, "type clash in %Q %O %Q", n->left, n->op, n->right); return 0; } n->ty = tr; switch(tr->kind){ case Tint: case Tbig: case Tbyte: return 1; case Tstring: switch(n->op){ case Oadd: case Oaddas: case Ogt: case Ogeq: case Olt: case Oleq: return 1; } break; case Treal: case Tfix: if(realok) return 1; break; } nerror(n, "cannot %O %Q and %Q", n->op, n->left, n->right); return 0; } int shiftchk(Node *n) { Node *left, *right; right = n->right; left = n->left; n->ty = left->ty; switch(n->ty->kind){ case Tint: case Tbyte: case Tbig: if(right->ty->kind != Tint){ nerror(n, "shift %Q is not an int", right); return 0; } return 1; } nerror(n, "cannot %Q %O %Q", left, n->op, right); return 0; } /* * check for any tany's in t */ int specific(Type *t) { Decl *d; if(t == nil) return 0; switch(t->kind){ case Terror: case Tnone: case Tint: case Tbig: case Tstring: case Tbyte: case Treal: case Tfn: case Tadt: case Tadtpick: case Tmodule: case Tfix: return 1; case Tany: return 0; case Tpoly: return 1; case Tref: case Tlist: case Tarray: case Tchan: return specific(t->tof); case Ttuple: case Texception: for(d = t->ids; d != nil; d = d->next) if(!specific(d->ty)) return 0; return 1; } fatal("unknown type %T in specific", t); return 0; } /* * infer the type of all variable in n from t * n is the left-hand exp of a := exp */ int declasinfer(Node *n, Type *t) { Decl *ids; int ok; if(t->kind == Texception){ if(t->cons) return 0; t = mkextuptype(t); } switch(n->op){ case Otuple: if(t->kind != Ttuple && t->kind != Tadt && t->kind != Tadtpick) return 0; ok = 1; n->ty = t; n = n->left; ids = t->ids; if(t->kind == Tadtpick) ids = t->tof->ids->next; for(; n != nil && ids != nil; ids = ids->next){ if(ids->store != Dfield) continue; ok &= declasinfer(n->left, ids->ty); n = n->right; } for(; ids != nil; ids = ids->next) if(ids->store == Dfield) break; if(n != nil || ids != nil) return 0; return ok; case Oname: topvartype(t, n->decl, 0, 0); if(n->decl == nildecl) return 1; n->decl->ty = t; n->ty = t; shareloc(n->decl); return 1; } fatal("unknown op %n in declasinfer", n); return 0; } /* * an error occured in declaring n; * set all decl identifiers to Dwundef * so further errors are squashed. */ void declaserr(Node *n) { switch(n->op){ case Otuple: for(n = n->left; n != nil; n = n->right) declaserr(n->left); return; case Oname: if(n->decl != nildecl) n->decl->store = Dwundef; return; } fatal("unknown op %n in declaserr", n); } int argcompat(Node *n, Decl *f, Node *a) { for(; a != nil; a = a->right){ if(f == nil){ nerror(n, "%V: too many function arguments", n->left); return 0; } if(!tcompat(f->ty, a->left->ty, 0)){ nerror(n, "%V: argument type mismatch: expected %T saw %Q", n->left, f->ty, a->left); return 0; } if(a->left->ty == tany) a->left->ty = f->ty; f = f->next; } if(f != nil){ nerror(n, "%V: too few function arguments", n->left); return 0; } return 1; } /* * fn is Odot(adt, methid) * pass adt implicitly if needed * if not, any side effect of adt will be ignored */ Node* passimplicit(Node *fn, Node *args) { Node *n; Type *t; t = fn->ty; n = fn->left; if(t->ids == nil || !t->ids->implicit){ if(!isfnrefty(t) && hasside(n, 1)) nwarn(fn, "result of expression %V ignored", n); return args; } if(n->op == Oname && n->decl->store == Dtype){ nerror(n, "%V is a type and cannot be a self argument", n); n = mkn(Onothing, nil, nil); n->src = fn->src; n->ty = t->ids->ty; } args = mkn(Oseq, n, args); args->src = n->src; return args; } static int mem(Type *t, Decl *d) { for( ; d != nil; d = d->next) if(d->ty == t) /* was if(d->ty == t || tequal(d->ty, t)) */ return 1; return 0; } static int memp(Type *t, Decl *f) { return mem(t, f->ty->polys) || mem(t, encpolys(f)); } static void passfns0(Src *src, Decl *fn, Node *args0, Node **args, Node **a, Tpair *tp, Decl *polys) { Decl *id, *idt, *idf, *dot; Type *tt; Sym *sym; Node *n, *na, *mod; Tpair *p; if(debug['w']){ print("polys: "); for(id=polys; id!=nil; id=id->next) print("%s ", id->sym->name); print("\nmap: "); for(p=tp; p!=nil; p=p->nxt) print("%T -> %T ", p->t1, p->t2); print("\n"); } for(idt = polys; idt != nil; idt = idt->next){ tt = valtmap(idt->ty, tp); if(tt->kind == Tpoly && fndec != nil && !memp(tt, fndec)) error(src->start, "cannot determine the instantiated type of %T", tt); for(idf = idt->ty->ids; idf != nil; idf = idf->next){ sym = idf->sym; id = fnlookup(sym, tt, &mod); while(id != nil && id->link != nil) id = id->link; if(debug['v']) print("fnlookup: %p\n", id); if(id == nil) /* error flagged already */ continue; id->refs++; id->caninline = -1; if(tt->kind == Tmodule){ /* mod an actual parameter */ for(;;){ if(args0 != nil && tequal(tt, args0->left->ty)){ mod = args0->left; break; } if(args0 != nil) args0 = args0->right; } } if(mod == nil && (dot = module(id)) != nil && !isimpmod(dot->sym)) error(src->start, "cannot use %s without importing %s from a variable", id->sym->name, id->dot->sym->name); if(debug['U']) print("fp: %s %s %s\n", fn->sym->name, mod ? mod->decl->sym->name : "nil", id->sym->name); n = mkn(Ofnptr, mod, mkdeclname(src, id)); n->src = *src; n->decl = fn; if(tt->kind == Tpoly) n->flags = FNPTRA; else n->flags = 0; na = mkn(Oseq, n, nil); if(*a == nil) *args = na; else (*a)->right = na; n = mkn(Ofnptr, mod, mkdeclname(src, id)); n->src = *src; n->decl = fn; if(tt->kind == Tpoly) n->flags = FNPTRA|FNPTR2; else n->flags = FNPTR2; *a = na->right = mkn(Oseq, n, nil); } if(args0 != nil) args0 = args0->right; } } Node* passfns(Src *src, Decl *fn, Node *left, Node *args, Type *adt, Tpair *tp) { Node *a, *args0; a = nil; args0 = args; if(args != nil) for(a = args; a->right != nil; a = a->right) ; passfns0(src, fn, args0, &args, &a, tp, ispoly(fn) ? fn->ty->polys : left->ty->tof->polys); if(adt != nil) passfns0(src, fn, args0, &args, &a, adt->u.tmap, ispoly(fn) ? encpolys(fn) : nil); return args; } /* * check the types for a function with a variable number of arguments * last typed argument must be a constant string, and must use the * print format for describing arguments. */ Type* mkvarargs(Node *n, Node *args) { Node *s, *a; Decl *f, *last, *va; Type *nt; nt = copytypeids(n->ty); n->ty = nt; f = n->ty->ids; last = nil; if(f == nil){ nerror(n, "%V's type is illegal", n); return nt; } s = args; for(a = args; a != nil; a = a->right){ if(f == nil) break; if(!tcompat(f->ty, a->left->ty, 0)){ nerror(n, "%V: argument type mismatch: expected %T saw %Q", n, f->ty, a->left); return nt; } if(a->left->ty == tany) a->left->ty = f->ty; last = f; f = f->next; s = a; } if(f != nil){ nerror(n, "%V: too few function arguments", n); return nt; } s->left = fold(s->left); s = s->left; if(s->ty != tstring || s->op != Oconst){ nerror(args, "%V: format argument %Q is not a string constant", n, s); return nt; } fmtcheck(n, s, a); va = tuplefields(a); if(last == nil) nt->ids = va; else last->next = va; return nt; } /* * check that a print style format string matches it's arguments */ void fmtcheck(Node *f, Node *fmtarg, Node *va) { Sym *fmt; Rune r; char *s, flags[10]; int i, c, n1, n2, dot, verb, flag, ns, lens, fmtstart; Type *ty; fmt = fmtarg->decl->sym; s = fmt->name; lens = fmt->len; ns = 0; while(ns < lens){ c = s[ns++]; if(c != '%') continue; verb = -1; n1 = 0; n2 = 0; dot = 0; flag = 0; fmtstart = ns - 1; while(ns < lens && verb < 0){ c = s[ns++]; switch(c){ default: chartorune(&r, &s[ns-1]); nerror(f, "%V: invalid character %C in format '%.*s'", f, r, ns-fmtstart, &s[fmtstart]); return; case '.': if(dot){ nerror(f, "%V: invalid format '%.*s'", f, ns-fmtstart, &s[fmtstart]); return; } n1 = 1; dot = 1; continue; case '*': if(!n1) n1 = 1; else if(!n2 && dot) n2 = 1; else{ nerror(f, "%V: invalid format '%.*s'", f, ns-fmtstart, &s[fmtstart]); return; } if(va == nil){ nerror(f, "%V: too few arguments for format '%.*s'", f, ns-fmtstart, &s[fmtstart]); return; } if(va->left->ty->kind != Tint){ nerror(f, "%V: format '%.*s' incompatible with argument %Q", f, ns-fmtstart, &s[fmtstart], va->left); return; } va = va->right; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': while(ns < lens && s[ns] >= '0' && s[ns] <= '9') ns++; if(!n1) n1 = 1; else if(!n2 && dot) n2 = 1; else{ nerror(f, "%V: invalid format '%.*s'", f, ns-fmtstart, &s[fmtstart]); return; } break; case '+': case '-': case '#': case ',': case 'b': case 'u': for(i = 0; i < flag; i++){ if(flags[i] == c){ nerror(f, "%V: duplicate flag %c in format '%.*s'", f, c, ns-fmtstart, &s[fmtstart]); return; } } flags[flag++] = c; if(flag >= sizeof flags){ nerror(f, "too many flags in format '%.*s'", ns-fmtstart, &s[fmtstart]); return; } break; case '%': case 'r': verb = Tnone; break; case 'H': verb = Tany; break; case 'c': verb = Tint; break; case 'd': case 'o': case 'x': case 'X': verb = Tint; for(i = 0; i < flag; i++){ if(flags[i] == 'b'){ verb = Tbig; break; } } break; case 'e': case 'f': case 'g': case 'E': case 'G': verb = Treal; break; case 's': case 'q': verb = Tstring; break; } } if(verb != Tnone){ if(verb < 0){ nerror(f, "%V: incomplete format '%.*s'", f, ns-fmtstart, &s[fmtstart]); return; } if(va == nil){ nerror(f, "%V: too few arguments for format '%.*s'", f, ns-fmtstart, &s[fmtstart]); return; } ty = va->left->ty; if(ty->kind == Texception) ty = mkextuptype(ty); switch(verb){ case Tint: switch(ty->kind){ case Tstring: case Tarray: case Tref: case Tchan: case Tlist: case Tmodule: if(c == 'x' || c == 'X') verb = ty->kind; break; } break; case Tany: if(tattr[ty->kind].isptr) verb = ty->kind; break; } if(verb != ty->kind){ nerror(f, "%V: format '%.*s' incompatible with argument %Q", f, ns-fmtstart, &s[fmtstart], va->left); return; } va = va->right; } } if(va != nil) nerror(f, "%V: more arguments than formats", f); } Decl* tuplefields(Node *n) { Decl *d, *h, **last; h = nil; last = &h; for(; n != nil; n = n->right){ d = mkdecl(&n->left->src, Dfield, n->left->ty); *last = d; last = &d->next; } return h; } /* * make explicit indices for every element in an array initializer * return the maximum index * sort the indices and check for duplicates */ int assignindices(Node *ar) { Node *wild, *off, *size, *inits, *n, *q; Type *t; Case *c; int amax, max, last, nlab, ok; amax = 0x7fffffff; size = dupn(0, &nosrc, ar->left); if(size->ty == tint){ size = fold(size); if(size->op == Oconst) amax = size->val; } inits = ar->right; max = -1; last = -1; t = inits->left->ty; wild = nil; nlab = 0; ok = 1; for(n = inits; n != nil; n = n->right){ if(!tcompat(t, n->left->ty, 0)){ t = tparent(t, n->left->ty); if(!tcompat(t, n->left->ty, 0)){ nerror(n->left, "inconsistent types %T and %T and in array initializer", t, n->left->ty); return -1; } else inits->left->ty = t; } if(t == tany) t = n->left->ty; /* * make up an index if there isn't one */ if(n->left->left == nil) n->left->left = mkn(Oseq, mkconst(&n->left->right->src, last + 1), nil); for(q = n->left->left; q != nil; q = q->right){ off = q->left; if(off->ty != tint){ nerror(off, "array index %Q is not an int", off); ok = 0; continue; } off = fold(off); switch(off->op){ case Owild: if(wild != nil) nerror(off, "array index * duplicated on line %L", wild->src.start); wild = off; continue; case Orange: if(off->left->op != Oconst || off->right->op != Oconst){ nerror(off, "range %V is not constant", off); off = nil; }else if(off->left->val < 0 || off->right->val >= amax){ nerror(off, "array index %V out of bounds", off); off = nil; }else last = off->right->val; break; case Oconst: last = off->val; if(off->val < 0 || off->val >= amax){ nerror(off, "array index %V out of bounds", off); off = nil; } break; case Onothing: /* get here from a syntax error */ off = nil; break; default: nerror(off, "array index %V is not constant", off); off = nil; break; } nlab++; if(off == nil){ off = mkconst(&n->left->right->src, last); ok = 0; } if(last > max) max = last; q->left = off; } } /* * fix up types of nil elements */ for(n = inits; n != nil; n = n->right) if(n->left->ty == tany) n->left->ty = t; if(!ok) return -1; c = checklabels(inits, tint, nlab, "array index"); t = mktype(&inits->src.start, &inits->src.stop, Tainit, nil, nil); inits->ty = t; t->cse = c; return max + 1; } /* * check the labels of a case statment */ void casecheck(Node *cn, Type *ret) { Node *n, *q, *wild, *left, *arg; Type *t; Case *c; Ok rok; int nlab, ok, op; rok = echeck(cn->left, 0, 0, nil); cn->right = scheck(cn->right, ret, Sother); if(!rok.ok) return; arg = cn->left; t = arg->ty; if(t != tint && t != tbig && t != tstring){ nerror(cn, "case argument %Q is not an int or big or string", arg); return; } wild = nil; nlab= 0; ok = 1; for(n = cn->right; n != nil; n = n->right){ q = n->left->left; if(n->left->right->right == nil) nwarn(q, "no body for case qualifier %V", q); for(; q != nil; q = q->right){ left = fold(q->left); q->left = left; switch(left->op){ case Owild: if(wild != nil) nerror(left, "case qualifier * duplicated on line %L", wild->src.start); wild = left; break; case Orange: if(left->ty != t) nerror(left, "case qualifier %Q clashes with %Q", left, arg); else if(left->left->op != Oconst || left->right->op != Oconst){ nerror(left, "case range %V is not constant", left); ok = 0; } nlab++; break; default: if(left->ty != t){ nerror(left, "case qualifier %Q clashes with %Q", left, arg); ok = 0; }else if(left->op != Oconst){ nerror(left, "case qualifier %V is not constant", left); ok = 0; } nlab++; break; } } } if(!ok) return; c = checklabels(cn->right, t, nlab, "case qualifier"); op = Tcase; if(t == tbig) op = Tcasel; else if(t == tstring) op = Tcasec; t = mktype(&cn->src.start, &cn->src.stop, op, nil, nil); cn->ty = t; t->cse = c; } /* * check the labels and bodies of a pick statment */ void pickcheck(Node *n, Type *ret) { Node *w, *arg, *qs, *q, *qt, *left, **tags; Decl *id, *d; Type *t, *argty; Case *c; Ok rok; int ok, nlab; arg = n->left->right; rok = echeck(arg, 0, 0, nil); if(!rok.allok) return; t = arg->ty; if(t->kind == Tref) t = t->tof; if(arg->ty->kind != Tref || t->kind != Tadt || t->tags == nil){ nerror(arg, "pick argument %Q is not a ref adt with pick tags", arg); return; } argty = usetype(mktype(&arg->ty->src.start, &arg->ty->src.stop, Tref, t, nil)); arg = n->left->left; pushscope(nil, Sother); dasdecl(arg); arg->decl->ty = argty; arg->ty = argty; tags = allocmem(t->decl->tag * sizeof *tags); memset(tags, 0, t->decl->tag * sizeof *tags); w = nil; ok = 1; nlab = 0; for(qs = n->right; qs != nil; qs = qs->right){ qt = nil; for(q = qs->left->left; q != nil; q = q->right){ left = q->left; switch(left->op){ case Owild: /* left->ty = tnone; */ left->ty = t; if(w != nil) nerror(left, "pick qualifier * duplicated on line %L", w->src.start); w = left; break; case Oname: id = namedot(t->tags, left->decl->sym); if(id == nil){ nerror(left, "pick qualifier %V is not a member of %Q", left, arg); ok = 0; continue; } left->decl = id; left->ty = id->ty; if(tags[id->tag] != nil){ nerror(left, "pick qualifier %V duplicated on line %L", left, tags[id->tag]->src.start); ok = 0; } tags[id->tag] = left; nlab++; break; default: fatal("pickcheck can't handle %n", q); break; } if(qt == nil) qt = left; else if(!tequal(qt->ty, left->ty)) nerror(left, "type clash in pick qualifiers %Q and %Q", qt, left); } argty->tof = t; if(qt != nil) argty->tof = qt->ty; qs->left->right = scheck(qs->left->right, ret, Sother); if(qs->left->right == nil) nwarn(qs->left->left, "no body for pick qualifier %V", qs->left->left); } argty->tof = t; for(qs = n->right; qs != nil; qs = qs->right) for(q = qs->left->left; q != nil; q = q->right) q->left = fold(q->left); d = popscope(); d->refs++; if(d->next != nil) fatal("pickcheck: installing more than one id"); fndecls = appdecls(fndecls, d); if(!ok) return; c = checklabels(n->right, tint, nlab, "pick qualifier"); t = mktype(&n->src.start, &n->src.stop, Tcase, nil, nil); n->ty = t; t->cse = c; } void exccheck(Node *en, Type *ret) { Decl *ed; Node *n, *q, *wild, *left, *oinexcept; Type *t, *qt; Case *c; int nlab, ok; Ok rok; char buf[32]; static int nexc; pushscope(nil, Sother); if(en->left == nil){ seprint(buf, buf+sizeof(buf), ".ex%d", nexc++); en->left = mkdeclname(&en->src, mkids(&en->src, enter(buf, 0), texception, nil)); } oinexcept = inexcept; inexcept = en->left; dasdecl(en->left); en->left->ty = en->left->decl->ty = texception; ed = en->left->decl; /* en->right = scheck(en->right, ret, Sother); */ t = tstring; wild = nil; nlab = 0; ok = 1; for(n = en->right; n != nil; n = n->right){ qt = nil; for(q = n->left->left; q != nil; q = q->right){ left = q->left; switch(left->op){ case Owild: left->ty = texception; if(wild != nil) nerror(left, "exception qualifier * duplicated on line %L", wild->src.start); wild = left; break; case Orange: left->ty = tnone; nerror(left, "exception qualifier %V is illegal", left); ok = 0; break; default: rok = echeck(left, 0, 0, nil); if(!rok.ok){ ok = 0; break; } left = q->left = fold(left); if(left->ty != t && left->ty->kind != Texception){ nerror(left, "exception qualifier %Q is not a string or exception", left); ok = 0; }else if(left->op != Oconst){ nerror(left, "exception qualifier %V is not constant", left); ok = 0; } else if(left->ty != t) left->ty = mkextype(left->ty); nlab++; break; } if(qt == nil) qt = left->ty; else if(!tequal(qt, left->ty)) qt = texception; } if(qt != nil) ed->ty = qt; n->left->right = scheck(n->left->right, ret, Sother); if(n->left->right->right == nil) nwarn(n->left->left, "no body for exception qualifier %V", n->left->left); } ed->ty = texception; inexcept = oinexcept; if(!ok) return; c = checklabels(en->right, texception, nlab, "exception qualifier"); t = mktype(&en->src.start, &en->src.stop, Texcept, nil, nil); en->ty = t; t->cse = c; ed = popscope(); fndecls = appdecls(fndecls, ed); } /* * check array and case labels for validity */ Case * checklabels(Node *inits, Type *ctype, int nlab, char *title) { Node *n, *p, *q, *wild; Label *labs, *aux; Case *c; char buf[256], buf1[256]; int i, e; labs = allocmem(nlab * sizeof *labs); i = 0; wild = nil; for(n = inits; n != nil; n = n->right){ for(q = n->left->left; q != nil; q = q->right){ switch(q->left->op){ case Oconst: labs[i].start = q->left; labs[i].stop = q->left; labs[i++].node = n->left; break; case Orange: labs[i].start = q->left->left; labs[i].stop = q->left->right; labs[i++].node = n->left; break; case Owild: wild = n->left; break; default: fatal("bogus index in checklabels"); break; } } } if(i != nlab) fatal("bad label count: %d then %d", nlab, i); aux = allocmem(nlab * sizeof *aux); casesort(ctype, aux, labs, 0, nlab); for(i = 0; i < nlab; i++){ p = labs[i].stop; if(casecmp(ctype, labs[i].start, p) > 0) nerror(labs[i].start, "unmatchable %s %V", title, labs[i].node); for(e = i + 1; e < nlab; e++){ if(casecmp(ctype, labs[e].start, p) <= 0){ eprintlist(buf, buf+sizeof(buf), labs[e].node->left, " or "); eprintlist(buf1, buf1+sizeof(buf1), labs[e-1].node->left, " or "); nerror(labs[e].start,"%s '%s' overlaps with '%s' on line %L", title, buf, buf1, p->src.start); } /* * check for merging case labels */ if(ctype != tint || labs[e].start->val != p->val+1 || labs[e].node != labs[i].node) break; p = labs[e].stop; } if(e != i + 1){ labs[i].stop = p; memmove(&labs[i+1], &labs[e], (nlab-e) * sizeof *labs); nlab -= e - (i + 1); } } free(aux); c = allocmem(sizeof *c); c->nlab = nlab; c->nsnd = 0; c->labs = labs; c->wild = wild; return c; } static int matchcmp(Node *na, Node *nb) { Sym *a, *b; int sa, sb; a = na->decl->sym; b = nb->decl->sym; sa = a->len > 0 && a->name[a->len-1] == '*'; sb = b->len > 0 && b->name[b->len-1] == '*'; if(sa){ if(sb){ if(a->len == b->len) return symcmp(a, b); return b->len-a->len; } else return 1; } else{ if(sb) return -1; else{ if(na->ty == tstring){ if(nb->ty == tstring) return symcmp(a, b); else return 1; } else{ if(nb->ty == tstring) return -1; else return symcmp(a, b); } } } } int casecmp(Type *ty, Node *a, Node *b) { if(ty == tint || ty == tbig){ if(a->val < b->val) return -1; if(a->val > b->val) return 1; return 0; } if(ty == texception) return matchcmp(a, b); return symcmp(a->decl->sym, b->decl->sym); } void casesort(Type *t, Label *aux, Label *labs, int start, int stop) { int n, top, mid, base; n = stop - start; if(n <= 1) return; top = mid = start + n / 2; casesort(t, aux, labs, start, top); casesort(t, aux, labs, mid, stop); /* * merge together two sorted label arrays, yielding a sorted array */ n = 0; base = start; while(base < top && mid < stop){ if(casecmp(t, labs[base].start, labs[mid].start) <= 0) aux[n++] = labs[base++]; else aux[n++] = labs[mid++]; } if(base < top) memmove(&aux[n], &labs[base], (top-base) * sizeof *aux); else if(mid < stop) memmove(&aux[n], &labs[mid], (stop-mid) * sizeof *aux); memmove(&labs[start], &aux[0], (stop-start) * sizeof *labs); } /* * binary search for the label corresponding to a given value */ int findlab(Type *ty, Node *v, Label *labs, int nlab) { int l, r, m; if(nlab <= 1) return 0; l = 1; r = nlab - 1; while(l <= r){ m = (r + l) / 2; if(casecmp(ty, labs[m].start, v) <= 0) l = m + 1; else r = m - 1; } m = l - 1; if(casecmp(ty, labs[m].start, v) > 0 || casecmp(ty, labs[m].stop, v) < 0) fatal("findlab out of range"); return m; } void altcheck(Node *an, Type *ret) { Node *n, *q, *left, *op, *wild; Case *c; int ok, nsnd, nrcv; an->left = scheck(an->left, ret, Sother); ok = 1; nsnd = 0; nrcv = 0; wild = nil; for(n = an->left; n != nil; n = n->right){ q = n->left->right->left; if(n->left->right->right == nil) nwarn(q, "no body for alt guard %V", q); for(; q != nil; q = q->right){ left = q->left; switch(left->op){ case Owild: if(wild != nil) nerror(left, "alt guard * duplicated on line %L", wild->src.start); wild = left; break; case Orange: nerror(left, "alt guard %V is illegal", left); ok = 0; break; default: op = hascomm(left); if(op == nil){ nerror(left, "alt guard %V has no communication", left); ok = 0; break; } if(op->op == Osnd) nsnd++; else nrcv++; break; } } } if(!ok) return; c = allocmem(sizeof *c); c->nlab = nsnd + nrcv; c->nsnd = nsnd; c->wild = wild; an->ty = mktalt(c); } Node* hascomm(Node *n) { Node *r; if(n == nil) return nil; if(n->op == Osnd || n->op == Orcv) return n; r = hascomm(n->left); if(r != nil) return r; return hascomm(n->right); } void raisescheck(Type *t) { Node *n, *nn; Ok ok; if(t->kind != Tfn) return; n = t->u.eraises; for(nn = n->left; nn != nil; nn = nn->right){ ok = echeck(nn->left, 0, 0, nil); if(ok.ok && nn->left->ty->kind != Texception) nerror(n, "%V: illegal raises expression", nn->left); } } typedef struct Elist Elist; struct Elist{ Decl *d; Elist *nxt; }; static Elist* emerge(Elist *el1, Elist *el2) { int f; Elist *el, *nxt; for( ; el1 != nil; el1 = nxt){ f = 0; for(el = el2; el != nil; el = el->nxt){ if(el1->d == el->d){ f = 1; break; } } nxt = el1->nxt; if(!f){ el1->nxt = el2; el2 = el1; } } return el2; } static Elist* equals(Node *n) { Node *q, *nn; Elist *e, *el; el = nil; for(q = n->left->left; q != nil; q = q->right){ nn = q->left; if(nn->op == Owild) return nil; if(nn->ty->kind != Texception) continue; e = (Elist*)malloc(sizeof(Elist)); e->d = nn->decl; e->nxt = el; el = e; } return el; } static int caught(Decl *d, Node *n) { Node *q, *nn; for(n = n->right; n != nil; n = n->right){ for(q = n->left->left; q != nil; q = q->right){ nn = q->left; if(nn->op == Owild) return 1; if(nn->ty->kind != Texception) continue; if(d == nn->decl) return 1; } } return 0; } static Elist* raisecheck(Node *n, Elist *ql) { int exc; Node *e; Elist *el, *nel, *nxt; if(n == nil) return nil; el = nil; for(; n != nil; n = n->right){ switch(n->op){ case Oscope: return raisecheck(n->right, ql); case Olabel: case Odo: return raisecheck(n->right, ql); case Oif: case Ofor: return emerge(raisecheck(n->right->left, ql), raisecheck(n->right->right, ql)); case Oalt: case Ocase: case Opick: case Oexcept: exc = n->op == Oexcept; for(n = n->right; n != nil; n = n->right){ ql = nil; if(exc) ql = equals(n); el = emerge(raisecheck(n->left->right, ql), el); } return el; case Oseq: el = emerge(raisecheck(n->left, ql), el); break; case Oexstmt: el = raisecheck(n->left, ql); nel = nil; for( ; el != nil; el = nxt){ nxt = el->nxt; if(!caught(el->d, n->right)){ el->nxt = nel; nel = el; } } return emerge(nel, raisecheck(n->right, ql)); case Oraise: e = n->left; if(e->ty && e->ty->kind == Texception){ if(!e->ty->cons) return ql; if(e->op == Ocall) e = e->left; if(e->op == Omdot) e = e->right; if(e->op != Oname) fatal("exception %n not a name", e); el = (Elist*)malloc(sizeof(Elist)); el->d = e->decl; el->nxt = nil; return el; } return nil; default: return nil; } } return el; } void checkraises(Node *n) { int f; Decl *d; Elist *e, *el; Node *es, *nn; el = raisecheck(n->right, nil); es = n->ty->u.eraises; if(es != nil){ for(nn = es->left; nn != nil; nn = nn->right){ d = nn->left->decl; f = 0; for(e = el; e != nil; e = e->nxt){ if(d == e->d){ f = 1; e->d = nil; break; } } if(!f) nwarn(n, "function %V does not raise %s but declared", n->left, d->sym->name); } } for(e = el; e != nil; e = e->nxt) if(e->d != nil) nwarn(n, "function %V raises %s but not declared", n->left, e->d->sym->name); } /* sort all globals in modules now that we've finished with 'last' pointers * and before any code generation */ void gsort(Node *n) { for(;;){ if(n == nil) return; if(n->op != Oseq) break; gsort(n->left); n = n->right; } if(n->op == Omoddecl && n->ty->ok & OKverify){ n->ty->ids = namesort(n->ty->ids); sizeids(n->ty->ids, 0); } } l->ty = texception; ed = en->left->decl; /* en->right = scheck(en->right, ret, Sother); */ t = tstring; wild = nil; nlab = 0; ok = 1; for(n = en->right; n != nil; n = n->right){ qt = nil; for(q = n->left->left; q != nil; q = q->right){ left = q->left; switch(left->op){ case Owild: left->ty = texception; if(wild old_contrib//root/sys/src/cmd/limbo/limbo/types.c��������������������������������������������������� 664 � 0 � 0 � 267400 10540603706 21212�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "limbo.h" #include "mp.h" #include "libsec.h" char *kindname[Tend] = { /* Tnone */ "no type", /* Tadt */ "adt", /* Tadtpick */ "adt", /* Tarray */ "array", /* Tbig */ "big", /* Tbyte */ "byte", /* Tchan */ "chan", /* Treal */ "real", /* Tfn */ "fn", /* Tint */ "int", /* Tlist */ "list", /* Tmodule */ "module", /* Tref */ "ref", /* Tstring */ "string", /* Ttuple */ "tuple", /* Texception */ "exception", /* Tfix */ "fixed point", /* Tpoly */ "polymorphic", /* Tainit */ "array initializers", /* Talt */ "alt channels", /* Tany */ "polymorphic type", /* Tarrow */ "->", /* Tcase */ "case int labels", /* Tcasel */ "case big labels", /* Tcasec */ "case string labels", /* Tdot */ ".", /* Terror */ "type error", /* Tgoto */ "goto labels", /* Tid */ "id", /* Tiface */ "module interface", /* Texcept */ "exception handler table", /* Tinst */ "instantiated type", }; Tattr tattr[Tend] = { /* isptr refable conable big vis */ /* Tnone */ { 0, 0, 0, 0, 0, }, /* Tadt */ { 0, 1, 1, 1, 1, }, /* Tadtpick */ { 0, 1, 0, 1, 1, }, /* Tarray */ { 1, 0, 0, 0, 1, }, /* Tbig */ { 0, 0, 1, 1, 1, }, /* Tbyte */ { 0, 0, 1, 0, 1, }, /* Tchan */ { 1, 0, 0, 0, 1, }, /* Treal */ { 0, 0, 1, 1, 1, }, /* Tfn */ { 0, 1, 0, 0, 1, }, /* Tint */ { 0, 0, 1, 0, 1, }, /* Tlist */ { 1, 0, 0, 0, 1, }, /* Tmodule */ { 1, 0, 0, 0, 1, }, /* Tref */ { 1, 0, 0, 0, 1, }, /* Tstring */ { 1, 0, 1, 0, 1, }, /* Ttuple */ { 0, 1, 1, 1, 1, }, /* Texception */ { 0, 0, 0, 1, 1, }, /* Tfix */ { 0, 0, 1, 0, 1, }, /* Tpoly */ { 1, 0, 0, 0, 1, }, /* Tainit */ { 0, 0, 0, 1, 0, }, /* Talt */ { 0, 0, 0, 1, 0, }, /* Tany */ { 1, 0, 0, 0, 0, }, /* Tarrow */ { 0, 0, 0, 0, 1, }, /* Tcase */ { 0, 0, 0, 1, 0, }, /* Tcasel */ { 0, 0, 0, 1, 0, }, /* Tcasec */ { 0, 0, 0, 1, 0, }, /* Tdot */ { 0, 0, 0, 0, 1, }, /* Terror */ { 0, 1, 1, 0, 0, }, /* Tgoto */ { 0, 0, 0, 1, 0, }, /* Tid */ { 0, 0, 0, 0, 1, }, /* Tiface */ { 0, 0, 0, 1, 0, }, /* Texcept */ { 0, 0, 0, 1, 0, }, /* Tinst */ { 0, 1, 1, 1, 1, }, }; static Teq *eqclass[Tend]; static Type ztype; static int eqrec; static int eqset; static int tcomset; static int idcompat(Decl*, Decl*, int, int); static int rtcompat(Type *t1, Type *t2, int any, int); static int assumeteq(Type *t1, Type *t2); static int assumetcom(Type *t1, Type *t2); static int cleartcomrec(Type *t); static int rtequal(Type*, Type*); static int cleareqrec(Type*); static int idequal(Decl*, Decl*, int, int*); static int pyequal(Type*, Type*); static int rtsign(Type*, uchar*, int, int); static int clearrec(Type*); static int idsign(Decl*, int, uchar*, int, int); static int idsign1(Decl*, int, uchar*, int, int); static int raisessign(Node *n, uchar *sig, int lensig, int spos); static void ckfix(Type*, double); static int fnunify(Type*, Type*, Tpair**, int); static int rtunify(Type*, Type*, Tpair**, int); static int idunify(Decl*, Decl*, Tpair**, int); static int toccurs(Type*, Tpair**); static int fncleareqrec(Type*, Type*); static Type* comtype(Src*, Type*, Decl*); static Type* duptype(Type*); static int tpolys(Type*); static void addtmap(Type *t1, Type *t2, Tpair **tpp) { Tpair *tp; tp = allocmem(sizeof *tp); tp->t1 = t1; tp->t2 = t2; tp->nxt = *tpp; *tpp = tp; } Type* valtmap(Type *t, Tpair *tp) { for( ; tp != nil; tp = tp->nxt) if(tp->t1 == t) return tp->t2; return t; } Typelist* addtype(Type *t, Typelist *hd) { Typelist *tl, *p; tl = allocmem(sizeof(*tl)); tl->t = t; tl->nxt = nil; if(hd == nil) return tl; for(p = hd; p->nxt != nil; p = p->nxt) ; p->nxt = tl; return hd; } void typeinit(void) { Decl *id; anontupsym = enter(".tuple", 0); ztype.sbl = -1; ztype.ok = 0; ztype.rec = 0; tbig = mktype(&noline, &noline, Tbig, nil, nil); tbig->size = IBY2LG; tbig->align = IBY2LG; tbig->ok = OKmask; tbyte = mktype(&noline, &noline, Tbyte, nil, nil); tbyte->size = 1; tbyte->align = 1; tbyte->ok = OKmask; tint = mktype(&noline, &noline, Tint, nil, nil); tint->size = IBY2WD; tint->align = IBY2WD; tint->ok = OKmask; treal = mktype(&noline, &noline, Treal, nil, nil); treal->size = IBY2FT; treal->align = IBY2FT; treal->ok = OKmask; tstring = mktype(&noline, &noline, Tstring, nil, nil); tstring->size = IBY2WD; tstring->align = IBY2WD; tstring->ok = OKmask; texception = mktype(&noline, &noline, Texception, nil, nil); texception->size = IBY2WD; texception->align = IBY2WD; texception->ok = OKmask; tany = mktype(&noline, &noline, Tany, nil, nil); tany->size = IBY2WD; tany->align = IBY2WD; tany->ok = OKmask; tnone = mktype(&noline, &noline, Tnone, nil, nil); tnone->size = 0; tnone->align = 1; tnone->ok = OKmask; terror = mktype(&noline, &noline, Terror, nil, nil); terror->size = 0; terror->align = 1; terror->ok = OKmask; tunknown = mktype(&noline, &noline, Terror, nil, nil); tunknown->size = 0; tunknown->align = 1; tunknown->ok = OKmask; tfnptr = mktype(&noline, &noline, Ttuple, nil, nil); id = tfnptr->ids = mkids(&nosrc, nil, tany, nil); id->store = Dfield; id->offset = 0; id->sym = enter("t0", 0); id->src = nosrc; id = tfnptr->ids->next = mkids(&nosrc, nil, tint, nil); id->store = Dfield; id->offset = IBY2WD; id->sym = enter("t1", 0); id->src = nosrc; rtexception = mktype(&noline, &noline, Tref, texception, nil); rtexception->size = IBY2WD; rtexception->align = IBY2WD; rtexception->ok = OKmask; } void typestart(void) { descriptors = nil; nfns = 0; nadts = 0; selfdecl = nil; if(tfnptr->decl != nil) tfnptr->decl->desc = nil; memset(eqclass, 0, sizeof eqclass); typebuiltin(mkids(&nosrc, enter("int", 0), nil, nil), tint); typebuiltin(mkids(&nosrc, enter("big", 0), nil, nil), tbig); typebuiltin(mkids(&nosrc, enter("byte", 0), nil, nil), tbyte); typebuiltin(mkids(&nosrc, enter("string", 0), nil, nil), tstring); typebuiltin(mkids(&nosrc, enter("real", 0), nil, nil), treal); } Teq* modclass(void) { return eqclass[Tmodule]; } Type* mktype(Line *start, Line *stop, int kind, Type *tof, Decl *args) { Type *t; t = allocmem(sizeof *t); *t = ztype; t->src.start = *start; t->src.stop = *stop; t->kind = kind; t->tof = tof; t->ids = args; return t; } Type* mktalt(Case *c) { Type *t; char buf[32]; static int nalt; t = mktype(&noline, &noline, Talt, nil, nil); t->decl = mkdecl(&nosrc, Dtype, t); seprint(buf, buf+sizeof(buf), ".a%d", nalt++); t->decl->sym = enter(buf, 0); t->cse = c; return usetype(t); } /* * copy t and the top level of ids */ Type* copytypeids(Type *t) { Type *nt; Decl *id, *new, *last; nt = allocmem(sizeof *nt); *nt = *t; last = nil; for(id = t->ids; id != nil; id = id->next){ new = allocmem(sizeof *id); *new = *id; if(last == nil) nt->ids = new; else last->next = new; last = new; } return nt; } /* * make each of the ids have type t */ Decl* typeids(Decl *ids, Type *t) { Decl *id; if(ids == nil) return nil; ids->ty = t; for(id = ids->next; id != nil; id = id->next){ id->ty = t; } return ids; } void typebuiltin(Decl *d, Type *t) { d->ty = t; t->decl = d; installids(Dtype, d); } Node * fielddecl(int store, Decl *ids) { Node *n; n = mkn(Ofielddecl, nil, nil); n->decl = ids; for(; ids != nil; ids = ids->next) ids->store = store; return n; } Node * typedecl(Decl *ids, Type *t) { Node *n; if(t->decl == nil) t->decl = ids; n = mkn(Otypedecl, nil, nil); n->decl = ids; n->ty = t; for(; ids != nil; ids = ids->next) ids->ty = t; return n; } void typedecled(Node *n) { installids(Dtype, n->decl); } Node * adtdecl(Decl *ids, Node *fields) { Node *n; Type *t; n = mkn(Oadtdecl, nil, nil); t = mktype(&ids->src.start, &ids->src.stop, Tadt, nil, nil); n->decl = ids; n->left = fields; n->ty = t; t->decl = ids; for(; ids != nil; ids = ids->next) ids->ty = t; return n; } void adtdecled(Node *n) { Decl *d, *ids; d = n->ty->decl; installids(Dtype, d); if(n->ty->polys != nil){ pushscope(nil, Sother); installids(Dtype, n->ty->polys); } pushscope(nil, Sother); fielddecled(n->left); n->ty->ids = popscope(); if(n->ty->polys != nil) n->ty->polys = popscope(); for(ids = n->ty->ids; ids != nil; ids = ids->next) ids->dot = d; } void fielddecled(Node *n) { for(; n != nil; n = n->right){ switch(n->op){ case Oseq: fielddecled(n->left); break; case Oadtdecl: adtdecled(n); return; case Otypedecl: typedecled(n); return; case Ofielddecl: installids(Dfield, n->decl); return; case Ocondecl: condecled(n); gdasdecl(n->right); return; case Oexdecl: exdecled(n); return; case Opickdecl: pickdecled(n); return; default: fatal("can't deal with %O in fielddecled", n->op); } } } int pickdecled(Node *n) { Decl *d; int tag; if(n == nil) return 0; tag = pickdecled(n->left); pushscope(nil, Sother); fielddecled(n->right->right); d = n->right->left->decl; d->ty->ids = popscope(); installids(Dtag, d); for(; d != nil; d = d->next) d->tag = tag++; return tag; } /* * make the tuple type used to initialize adt t */ Type* mkadtcon(Type *t) { Decl *id, *new, *last; Type *nt; nt = allocmem(sizeof *nt); *nt = *t; last = nil; nt->ids = nil; nt->kind = Ttuple; for(id = t->ids; id != nil; id = id->next){ if(id->store != Dfield) continue; new = allocmem(sizeof *id); *new = *id; new->cyc = 0; if(last == nil) nt->ids = new; else last->next = new; last = new; } last->next = nil; return nt; } /* * make the tuple type used to initialize t, * an adt with pick fields tagged by tg */ Type* mkadtpickcon(Type *t, Type *tgt) { Decl *id, *new, *last; Type *nt; last = mkids(&tgt->decl->src, nil, tint, nil); last->store = Dfield; nt = mktype(&t->src.start, &t->src.stop, Ttuple, nil, last); for(id = t->ids; id != nil; id = id->next){ if(id->store != Dfield) continue; new = allocmem(sizeof *id); *new = *id; new->cyc = 0; last->next = new; last = new; } for(id = tgt->ids; id != nil; id = id->next){ if(id->store != Dfield) continue; new = allocmem(sizeof *id); *new = *id; new->cyc = 0; last->next = new; last = new; } last->next = nil; return nt; } /* * make an identifier type */ Type* mkidtype(Src *src, Sym *s) { Type *t; t = mktype(&src->start, &src->stop, Tid, nil, nil); if(s->unbound == nil){ s->unbound = mkdecl(src, Dunbound, nil); s->unbound->sym = s; } t->decl = s->unbound; return t; } /* * make a qualified type for t->s */ Type* mkarrowtype(Line *start, Line *stop, Type *t, Sym *s) { Src src; src.start = *start; src.stop = *stop; t = mktype(start, stop, Tarrow, t, nil); if(s->unbound == nil){ s->unbound = mkdecl(&src, Dunbound, nil); s->unbound->sym = s; } t->decl = s->unbound; return t; } /* * make a qualified type for t.s */ Type* mkdottype(Line *start, Line *stop, Type *t, Sym *s) { Src src; src.start = *start; src.stop = *stop; t = mktype(start, stop, Tdot, t, nil); if(s->unbound == nil){ s->unbound = mkdecl(&src, Dunbound, nil); s->unbound->sym = s; } t->decl = s->unbound; return t; } Type* mkinsttype(Src* src, Type *tt, Typelist *tl) { Type *t; t = mktype(&src->start, &src->stop, Tinst, tt, nil); t->u.tlist = tl; return t; } /* * look up the name f in the fields of a module, adt, or tuple */ Decl* namedot(Decl *ids, Sym *s) { for(; ids != nil; ids = ids->next) if(ids->sym == s) return ids; return nil; } /* * complete the declaration of an adt * methods frames get sized in module definition or during function definition * place the methods at the end of the field list */ void adtdefd(Type *t) { Decl *d, *id, *next, *aux, *store, *auxhd, *tagnext; int seentags; if(debug['x']) print("adt %T defd\n", t); d = t->decl; tagnext = nil; store = nil; for(id = t->polys; id != nil; id = id->next){ id->store = Dtype; id->ty = verifytypes(id->ty, d, nil); } for(id = t->ids; id != nil; id = next){ if(id->store == Dtag){ if(t->tags != nil) error(id->src.start, "only one set of pick fields allowed"); tagnext = pickdefd(t, id); next = tagnext; if(store != nil) store->next = next; else t->ids = next; continue; }else{ id->dot = d; next = id->next; store = id; } } aux = nil; store = nil; auxhd = nil; seentags = 0; for(id = t->ids; id != nil; id = next){ if(id == tagnext) seentags = 1; next = id->next; id->dot = d; id->ty = topvartype(verifytypes(id->ty, d, nil), id, 1, 1); if(id->store == Dfield && id->ty->kind == Tfn) id->store = Dfn; if(id->store == Dfn || id->store == Dconst){ if(store != nil) store->next = next; else t->ids = next; if(aux != nil) aux->next = id; else auxhd = id; aux = id; }else{ if(seentags) error(id->src.start, "pick fields must be the last data fields in an adt"); store = id; } } if(aux != nil) aux->next = nil; if(store != nil) store->next = auxhd; else t->ids = auxhd; for(id = t->tags; id != nil; id = id->next){ id->ty = verifytypes(id->ty, d, nil); if(id->ty->tof == nil) id->ty->tof = mkadtpickcon(t, id->ty); } } /* * assemble the data structure for an adt with a pick clause. * since the scoping rules for adt pick fields are strange, * we have a cutomized check for overlapping defitions. */ Decl* pickdefd(Type *t, Decl *tg) { Decl *id, *xid, *lasttg, *d; Type *tt; int tag; lasttg = nil; d = t->decl; t->tags = tg; tag = 0; while(tg != nil){ tt = tg->ty; if(tt->kind != Tadtpick || tg->tag != tag) break; tt->decl = tg; lasttg = tg; for(; tg != nil; tg = tg->next){ if(tg->ty != tt) break; tag++; lasttg = tg; tg->dot = d; } for(id = tt->ids; id != nil; id = id->next){ xid = namedot(t->ids, id->sym); if(xid != nil) error(id->src.start, "redeclaration of %K, previously declared as %k on line %L", id, xid, xid->src.start); id->dot = d; } } if(lasttg == nil){ error(t->src.start, "empty pick field declaration in %T", t); t->tags = nil; }else lasttg->next = nil; d->tag = tag; return tg; } Node* moddecl(Decl *ids, Node *fields) { Node *n; Type *t; n = mkn(Omoddecl, mkn(Oseq, nil, nil), nil); t = mktype(&ids->src.start, &ids->src.stop, Tmodule, nil, nil); n->decl = ids; n->left = fields; n->ty = t; return n; } void moddecled(Node *n) { Decl *d, *ids, *im, *dot; Type *t; Sym *s; char buf[StrSize]; int isimp; Dlist *dm, *dl; d = n->decl; installids(Dtype, d); isimp = 0; for(ids = d; ids != nil; ids = ids->next){ for(im = impmods; im != nil; im = im->next){ if(ids->sym == im->sym){ isimp = 1; d = ids; dm = malloc(sizeof(Dlist)); dm->d = ids; dm->next = nil; if(impdecls == nil) impdecls = dm; else{ for(dl = impdecls; dl->next != nil; dl = dl->next) ; dl->next = dm; } } } ids->ty = n->ty; } pushscope(nil, Sother); fielddecled(n->left); d->ty->ids = popscope(); /* * make the current module the -> parent of all contained decls-> */ for(ids = d->ty->ids; ids != nil; ids = ids->next) ids->dot = d; t = d->ty; t->decl = d; if(debug['m']) print("declare module %s\n", d->sym->name); /* * add the iface declaration in case it's needed later */ seprint(buf, buf+sizeof(buf), ".m.%s", d->sym->name); installids(Dglobal, mkids(&d->src, enter(buf, 0), tnone, nil)); if(isimp){ for(ids = d->ty->ids; ids != nil; ids = ids->next){ s = ids->sym; if(s->decl != nil && s->decl->scope >= scope){ dot = s->decl->dot; if(s->decl->store != Dwundef && dot != nil && dot != d && isimpmod(dot->sym) && dequal(ids, s->decl, 0)) continue; redecl(ids); ids->old = s->decl->old; }else ids->old = s->decl; s->decl = ids; ids->scope = scope; } } } /* * for each module in id, * link by field ext all of the decls for * functions needed in external linkage table * collect globals and make a tuple for all of them */ Type* mkiface(Decl *m) { Decl *iface, *last, *globals, *glast, *id, *d; Type *t; char buf[StrSize]; iface = last = allocmem(sizeof(Decl)); globals = glast = mkdecl(&m->src, Dglobal, mktype(&m->src.start, &m->src.stop, Tadt, nil, nil)); for(id = m->ty->ids; id != nil; id = id->next){ switch(id->store){ case Dglobal: glast = glast->next = dupdecl(id); id->iface = globals; glast->iface = id; break; case Dfn: id->iface = last = last->next = dupdecl(id); last->iface = id; break; case Dtype: if(id->ty->kind != Tadt) break; for(d = id->ty->ids; d != nil; d = d->next){ if(d->store == Dfn){ d->iface = last = last->next = dupdecl(d); last->iface = d; } } break; } } last->next = nil; iface = namesort(iface->next); if(globals->next != nil){ glast->next = nil; globals->ty->ids = namesort(globals->next); globals->ty->decl = globals; globals->sym = enter(".mp", 0); globals->dot = m; globals->next = iface; iface = globals; } /* * make the interface type and install an identifier for it * the iface has a ref count if it is loaded */ t = mktype(&m->src.start, &m->src.stop, Tiface, nil, iface); seprint(buf, buf+sizeof(buf), ".m.%s", m->sym->name); id = enter(buf, 0)->decl; t->decl = id; id->ty = t; /* * dummy node so the interface is initialized */ id->init = mkn(Onothing, nil, nil); id->init->ty = t; id->init->decl = id; return t; } void joiniface(Type *mt, Type *t) { Decl *id, *d, *iface, *globals; iface = t->ids; globals = iface; if(iface != nil && iface->store == Dglobal) iface = iface->next; for(id = mt->tof->ids; id != nil; id = id->next){ switch(id->store){ case Dglobal: for(d = id->ty->ids; d != nil; d = d->next) d->iface->iface = globals; break; case Dfn: id->iface->iface = iface; iface = iface->next; break; default: fatal("unknown store %k in joiniface", id); break; } } if(iface != nil) fatal("join iface not matched"); mt->tof = t; } void addiface(Decl *m, Decl *d) { Type *t; Decl *id, *last, *dd, *lastorig; Dlist *dl; if(d == nil || !local(d)) return; modrefable(d->ty); if(m == nil){ if(impdecls->next != nil) for(dl = impdecls; dl != nil; dl = dl->next) if(dl->d->ty->tof != impdecl->ty->tof) /* impdecl last */ addiface(dl->d, d); addiface(impdecl, d); return; } t = m->ty->tof; last = nil; lastorig = nil; for(id = t->ids; id != nil; id = id->next){ if(d == id || d == id->iface) return; last = id; if(id->tag == 0) lastorig = id; } dd = dupdecl(d); if(d->dot == nil) d->dot = dd->dot = m; d->iface = dd; dd->iface = d; if(debug['v']) print("addiface %p %p\n", d, dd); if(last == nil) t->ids = dd; else last->next = dd; dd->tag = 1; /* mark so not signed */ if(lastorig == nil) t->ids = namesort(t->ids); else lastorig->next = namesort(lastorig->next); } /* * eliminate unused declarations from interfaces * label offset within interface */ void narrowmods(void) { Teq *eq; Decl *id, *last; Type *t; long offset; for(eq = modclass(); eq != nil; eq = eq->eq){ t = eq->ty->tof; if(t->linkall == 0){ last = nil; for(id = t->ids; id != nil; id = id->next){ if(id->refs == 0){ if(last == nil) t->ids = id->next; else last->next = id->next; }else last = id; } /* * need to resize smaller interfaces */ resizetype(t); } offset = 0; for(id = t->ids; id != nil; id = id->next) id->offset = offset++; /* * rathole to stuff number of entries in interface */ t->decl->init->val = offset; } } /* * check to see if any data field of module m if referenced. * if so, mark all data in m */ void moddataref(void) { Teq *eq; Decl *id; for(eq = modclass(); eq != nil; eq = eq->eq){ id = eq->ty->tof->ids; if(id != nil && id->store == Dglobal && id->refs) for(id = eq->ty->ids; id != nil; id = id->next) if(id->store == Dglobal) modrefable(id->ty); } } /* * move the global declarations in interface to the front */ Decl* modglobals(Decl *mod, Decl *globals) { Decl *id, *head, *last; /* * make a copy of all the global declarations * used for making a type descriptor for globals ONLY * note we now have two declarations for the same variables, * which is apt to cause problems if code changes * * here we fix up the offsets for the real declarations */ idoffsets(mod->ty->ids, 0, 1); last = head = allocmem(sizeof(Decl)); for(id = mod->ty->ids; id != nil; id = id->next) if(id->store == Dglobal) last = last->next = dupdecl(id); last->next = globals; return head->next; } /* * snap all id type names to the actual type * check that all types are completely defined * verify that the types look ok */ Type* validtype(Type *t, Decl *inadt) { if(t == nil) return t; bindtypes(t); t = verifytypes(t, inadt, nil); cycsizetype(t); teqclass(t); return t; } Type* usetype(Type *t) { if(t == nil) return t; t = validtype(t, nil); reftype(t); return t; } Type* internaltype(Type *t) { bindtypes(t); t->ok = OKverify; sizetype(t); t->ok = OKmask; return t; } /* * checks that t is a valid top-level type */ Type* topvartype(Type *t, Decl *id, int tyok, int polyok) { if(t->kind == Tadt && t->tags != nil || t->kind == Tadtpick) error(id->src.start, "cannot declare %s with type %T", id->sym->name, t); if(!tyok && t->kind == Tfn) error(id->src.start, "cannot declare %s to be a function", id->sym->name); if(!polyok && (t->kind == Tadt || t->kind == Tadtpick) && ispolyadt(t)) error(id->src.start, "cannot declare %s of a polymorphic type", id->sym->name); return t; } Type* toptype(Src *src, Type *t) { if(t->kind == Tadt && t->tags != nil || t->kind == Tadtpick) error(src->start, "%T, an adt with pick fields, must be used with ref", t); if(t->kind == Tfn) error(src->start, "data cannot have a fn type like %T", t); return t; } static Type* comtype(Src *src, Type *t, Decl* adtd) { if(adtd == nil && (t->kind == Tadt || t->kind == Tadtpick) && ispolyadt(t)) error(src->start, "polymorphic type %T illegal here", t); return t; } void usedty(Type *t) { if(t != nil && (t->ok | OKmodref) != OKmask) fatal("used ty %t %2.2ux", t, t->ok); } void bindtypes(Type *t) { Decl *id; Typelist *tl; if(t == nil) return; if((t->ok & OKbind) == OKbind) return; t->ok |= OKbind; switch(t->kind){ case Tadt: if(t->polys != nil){ pushscope(nil, Sother); installids(Dtype, t->polys); } if(t->val != nil) mergepolydecs(t); if(t->polys != nil){ popscope(); for(id = t->polys; id != nil; id = id->next) bindtypes(id->ty); } break; case Tadtpick: case Tmodule: case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tiface: case Tainit: case Talt: case Tcase: case Tcasel: case Tcasec: case Tgoto: case Texcept: case Tfix: case Tpoly: break; case Tarray: case Tarrow: case Tchan: case Tdot: case Tlist: case Tref: bindtypes(t->tof); break; case Tid: id = t->decl->sym->decl; if(id == nil) id = undefed(&t->src, t->decl->sym); /* save a little space */ id->sym->unbound = nil; t->decl = id; break; case Ttuple: case Texception: for(id = t->ids; id != nil; id = id->next) bindtypes(id->ty); break; case Tfn: if(t->polys != nil){ pushscope(nil, Sother); installids(Dtype, t->polys); } for(id = t->ids; id != nil; id = id->next) bindtypes(id->ty); bindtypes(t->tof); if(t->val != nil) mergepolydecs(t); if(t->polys != nil){ popscope(); for(id = t->polys; id != nil; id = id->next) bindtypes(id->ty); } break; case Tinst: bindtypes(t->tof); for(tl = t->u.tlist; tl != nil; tl = tl->nxt) bindtypes(tl->t); break; default: fatal("bindtypes: unknown type kind %d", t->kind); } } /* * walk the type checking for validity */ Type* verifytypes(Type *t, Decl *adtt, Decl *poly) { Node *n; Decl *id, *id1, *last; char buf[32]; int i, cyc; Ok ok, ok1; double max; Typelist *tl; if(t == nil) return nil; if((t->ok & OKverify) == OKverify) return t; t->ok |= OKverify; if((t->ok & (OKverify|OKbind)) != (OKverify|OKbind)) fatal("verifytypes bogus ok for %t", t); cyc = t->flags&CYCLIC; switch(t->kind){ case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tiface: case Tainit: case Talt: case Tcase: case Tcasel: case Tcasec: case Tgoto: case Texcept: break; case Tfix: n = t->val; max = 0.0; if(n->op == Oseq){ ok = echeck(n->left, 0, 0, n); ok1 = echeck(n->right, 0, 0, n); if(!ok.ok || !ok1.ok) return terror; if(n->left->ty != treal || n->right->ty != treal){ error(t->src.start, "fixed point scale/maximum not real"); return terror; } n->right = fold(n->right); if(n->right->op != Oconst){ error(t->src.start, "fixed point maximum not constant"); return terror; } if((max = n->right->rval) <= 0){ error(t->src.start, "non-positive fixed point maximum"); return terror; } n = n->left; } else{ ok = echeck(n, 0, 0, nil); if(!ok.ok) return terror; if(n->ty != treal){ error(t->src.start, "fixed point scale not real"); return terror; } } n = t->val = fold(n); if(n->op != Oconst){ error(t->src.start, "fixed point scale not constant"); return terror; } if(n->rval <= 0){ error(t->src.start, "non-positive fixed point scale"); return terror; } ckfix(t, max); break; case Tref: t->tof = comtype(&t->src, verifytypes(t->tof, adtt, nil), adtt); if(t->tof != nil && !tattr[t->tof->kind].refable){ error(t->src.start, "cannot have a ref %T", t->tof); return terror; } if(0 && t->tof->kind == Tfn && t->tof->ids != nil && t->tof->ids->implicit) error(t->src.start, "function references cannot have a self argument"); if(0 && t->tof->kind == Tfn && t->polys != nil) error(t->src.start, "function references cannot be polymorphic"); break; case Tchan: case Tarray: case Tlist: t->tof = comtype(&t->src, toptype(&t->src, verifytypes(t->tof, adtt, nil)), adtt); break; case Tid: t->ok &= ~OKverify; t = verifytypes(idtype(t), adtt, nil); break; case Tarrow: t->ok &= ~OKverify; t = verifytypes(arrowtype(t, adtt), adtt, nil); break; case Tdot: /* * verify the parent adt & lookup the tag fields */ t->ok &= ~OKverify; t = verifytypes(dottype(t, adtt), adtt, nil); break; case Tadt: /* * this is where Tadt may get tag fields added */ adtdefd(t); break; case Tadtpick: for(id = t->ids; id != nil; id = id->next){ id->ty = topvartype(verifytypes(id->ty, id->dot, nil), id, 0, 1); if(id->store == Dconst) error(t->src.start, "pick fields cannot be a con like %s", id->sym->name); } verifytypes(t->decl->dot->ty, nil, nil); break; case Tmodule: for(id = t->ids; id != nil; id = id->next){ id->ty = verifytypes(id->ty, nil, nil); if(id->store == Dglobal && id->ty->kind == Tfn) id->store = Dfn; if(id->store != Dtype && id->store != Dfn) topvartype(id->ty, id, 0, 0); } break; case Ttuple: case Texception: if(t->decl == nil){ t->decl = mkdecl(&t->src, Dtype, t); t->decl->sym = enter(".tuple", 0); } i = 0; for(id = t->ids; id != nil; id = id->next){ id->store = Dfield; if(id->sym == nil){ seprint(buf, buf+sizeof(buf), "t%d", i); id->sym = enter(buf, 0); } i++; id->ty = toptype(&id->src, verifytypes(id->ty, adtt, nil)); /* id->ty = comtype(&id->src, toptype(&id->src, verifytypes(id->ty, adtt, nil)), adtt); */ } break; case Tfn: last = nil; for(id = t->ids; id != nil; id = id->next){ id->store = Darg; id->ty = topvartype(verifytypes(id->ty, adtt, nil), id, 0, 1); if(id->implicit){ Decl *selfd; selfd = poly ? poly : adtt; if(selfd == nil) error(t->src.start, "function is not a member of an adt, so can't use self"); else if(id != t->ids) error(id->src.start, "only the first argument can use self"); else if(id->ty != selfd->ty && (id->ty->kind != Tref || id->ty->tof != selfd->ty)) error(id->src.start, "self argument's type must be %s or ref %s", selfd->sym->name, selfd->sym->name); } last = id; } for(id = t->polys; id != nil; id = id->next){ if(adtt != nil){ for(id1 = adtt->ty->polys; id1 != nil; id1 = id1->next){ if(id1->sym == id->sym) id->ty = id1->ty; } } id->store = Dtype; id->ty = verifytypes(id->ty, adtt, nil); } t->tof = comtype(&t->src, toptype(&t->src, verifytypes(t->tof, adtt, nil)), adtt); if(t->varargs && (last == nil || last->ty != tstring)) error(t->src.start, "variable arguments must be preceded by a string"); if(t->varargs && t->polys != nil) error(t->src.start, "polymorphic functions must not have variable arguments"); break; case Tpoly: for(id = t->ids; id != nil; id = id->next){ id->store = Dfn; id->ty = verifytypes(id->ty, adtt, t->decl); } break; case Tinst: t->ok &= ~OKverify; t->tof = verifytypes(t->tof, adtt, nil); for(tl = t->u.tlist; tl != nil; tl = tl->nxt) tl->t = verifytypes(tl->t, adtt, nil); t = verifytypes(insttype(t, adtt, nil), adtt, nil); break; default: fatal("verifytypes: unknown type kind %d", t->kind); } if(cyc) t->flags |= CYCLIC; return t; } /* * resolve an id type */ Type* idtype(Type *t) { Decl *id; Type *tt; id = t->decl; if(id->store == Dunbound) fatal("idtype: unbound decl"); tt = id->ty; if(id->store != Dtype && id->store != Dtag){ if(id->store == Dundef){ id->store = Dwundef; error(t->src.start, "%s is not declared", id->sym->name); }else if(id->store == Dimport){ id->store = Dwundef; error(t->src.start, "%s's type cannot be determined", id->sym->name); }else if(id->store != Dwundef) error(t->src.start, "%s is not a type", id->sym->name); return terror; } if(tt == nil){ error(t->src.start, "%t not fully defined", t); return terror; } return tt; } /* * resolve a -> qualified type */ Type* arrowtype(Type *t, Decl *adtt) { Type *tt; Decl *id; id = t->decl; if(id->ty != nil){ if(id->store == Dunbound) fatal("arrowtype: unbound decl has a type"); return id->ty; } /* * special hack to allow module variables to derive other types */ tt = t->tof; if(tt->kind == Tid){ id = tt->decl; if(id->store == Dunbound) fatal("arrowtype: Tid's decl unbound"); if(id->store == Dimport){ id->store = Dwundef; error(t->src.start, "%s's type cannot be determined", id->sym->name); return terror; } /* * forward references to module variables can't be resolved */ if(id->store != Dtype && !(id->ty->ok & OKbind)){ error(t->src.start, "%s's type cannot be determined", id->sym->name); return terror; } if(id->store == Dwundef) return terror; tt = id->ty = verifytypes(id->ty, adtt, nil); if(tt == nil){ error(t->tof->src.start, "%T is not a module", t->tof); return terror; } }else tt = verifytypes(t->tof, adtt, nil); t->tof = tt; if(tt == terror) return terror; if(tt->kind != Tmodule){ error(t->src.start, "%T is not a module", tt); return terror; } id = namedot(tt->ids, t->decl->sym); if(id == nil){ error(t->src.start, "%s is not a member of %T", t->decl->sym->name, tt); return terror; } if(id->store == Dtype && id->ty != nil){ t->decl = id; return id->ty; } error(t->src.start, "%T is not a type", t); return terror; } /* * resolve a . qualified type */ Type* dottype(Type *t, Decl *adtt) { Type *tt; Decl *id; if(t->decl->ty != nil){ if(t->decl->store == Dunbound) fatal("dottype: unbound decl has a type"); return t->decl->ty; } t->tof = tt = verifytypes(t->tof, adtt, nil); if(tt == terror) return terror; if(tt->kind != Tadt){ error(t->src.start, "%T is not an adt", tt); return terror; } id = namedot(tt->tags, t->decl->sym); if(id != nil && id->ty != nil){ t->decl = id; return id->ty; } error(t->src.start, "%s is not a pick tag of %T", t->decl->sym->name, tt); return terror; } Type* insttype(Type *t, Decl *adtt, Tpair **tp) { Type *tt; Typelist *tl; Decl *ids; Tpair *tp1, *tp2; Src src; src = t->src; if(tp == nil){ tp2 = nil; tp = &tp2; } if(t->tof->kind != Tadt && t->tof->kind != Tadtpick){ error(src.start, "%T is not an adt", t->tof); return terror; } if(t->tof->kind == Tadt) ids = t->tof->polys; else ids = t->tof->decl->dot->ty->polys; if(ids == nil){ error(src.start, "%T is not a polymorphic adt", t->tof); return terror; } for(tl = t->u.tlist; tl != nil && ids != nil; tl = tl->nxt, ids = ids->next){ tt = tl->t; if(!tattr[tt->kind].isptr){ error(src.start, "%T is not a pointer type", tt); return terror; } unifysrc = src; if(!tunify(ids->ty, tt, &tp1)){ error(src.start, "type %T does not match %T", tt, ids->ty); return terror; } /* usetype(tt); */ tt = verifytypes(tt, adtt, nil); addtmap(ids->ty, tt, tp); } if(tl != nil){ error(src.start, "too many actual types in instantiation"); return terror; } if(ids != nil){ error(src.start, "too few actual types in instantiation"); return terror; } tp1 = *tp; tt = t->tof; t = expandtype(tt, t, adtt, tp); if(t == tt && adtt == nil) t = duptype(t); if(t != tt){ t->u.tmap = tp1; if(debug['w']){ print("tmap for %T: ", t); for( ; tp1!=nil; tp1=tp1->nxt) print("%T -> %T ", tp1->t1, tp1->t2); print("\n"); } } t->src = src; return t; } /* * walk a type, putting all adts, modules, and tuples into equivalence classes */ void teqclass(Type *t) { Decl *id, *tg; Teq *teq; if(t == nil || (t->ok & OKclass) == OKclass) return; t->ok |= OKclass; switch(t->kind){ case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tiface: case Tainit: case Talt: case Tcase: case Tcasel: case Tcasec: case Tgoto: case Texcept: case Tfix: case Tpoly: return; case Tref: teqclass(t->tof); return; case Tchan: case Tarray: case Tlist: teqclass(t->tof); if(!debug['Z']) return; break; case Tadt: case Tadtpick: case Ttuple: case Texception: for(id = t->ids; id != nil; id = id->next) teqclass(id->ty); for(tg = t->tags; tg != nil; tg = tg->next) teqclass(tg->ty); for(id = t->polys; id != nil; id = id->next) teqclass(id->ty); break; case Tmodule: t->tof = mkiface(t->decl); for(id = t->ids; id != nil; id = id->next) teqclass(id->ty); break; case Tfn: for(id = t->ids; id != nil; id = id->next) teqclass(id->ty); for(id = t->polys; id != nil; id = id->next) teqclass(id->ty); teqclass(t->tof); return; default: fatal("teqclass: unknown type kind %d", t->kind); return; } /* * find an equivalent type * stupid linear lookup could be made faster */ if((t->ok & OKsized) != OKsized) fatal("eqclass type not sized: %t", t); for(teq = eqclass[t->kind]; teq != nil; teq = teq->eq){ if(t->size == teq->ty->size && tequal(t, teq->ty)){ t->eq = teq; if(t->kind == Tmodule) joiniface(t, t->eq->ty->tof); return; } } /* * if no equiv type, make one */ t->eq = allocmem(sizeof(Teq)); t->eq->id = 0; t->eq->ty = t; t->eq->eq = eqclass[t->kind]; eqclass[t->kind] = t->eq; } /* * record that we've used the type * using a type uses all types reachable from that type */ void reftype(Type *t) { Decl *id, *tg; if(t == nil || (t->ok & OKref) == OKref) return; t->ok |= OKref; if(t->decl != nil && t->decl->refs == 0) t->decl->refs++; switch(t->kind){ case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tiface: case Tainit: case Talt: case Tcase: case Tcasel: case Tcasec: case Tgoto: case Texcept: case Tfix: case Tpoly: break; case Tref: case Tchan: case Tarray: case Tlist: if(t->decl != nil){ if(nadts >= lenadts){ lenadts = nadts + 32; adts = reallocmem(adts, lenadts * sizeof *adts); } adts[nadts++] = t->decl; } reftype(t->tof); break; case Tadt: case Tadtpick: case Ttuple: case Texception: if(t->kind == Tadt || t->kind == Ttuple && t->decl->sym != anontupsym){ if(nadts >= lenadts){ lenadts = nadts + 32; adts = reallocmem(adts, lenadts * sizeof *adts); } adts[nadts++] = t->decl; } for(id = t->ids; id != nil; id = id->next) if(id->store != Dfn) reftype(id->ty); for(tg = t->tags; tg != nil; tg = tg->next) reftype(tg->ty); for(id = t->polys; id != nil; id = id->next) reftype(id->ty); if(t->kind == Tadtpick) reftype(t->decl->dot->ty); break; case Tmodule: /* * a module's elements should get used individually * but do the globals for any sbl file */ if(bsym != nil) for(id = t->ids; id != nil; id = id->next) if(id->store == Dglobal) reftype(id->ty); break; case Tfn: for(id = t->ids; id != nil; id = id->next) reftype(id->ty); for(id = t->polys; id != nil; id = id->next) reftype(id->ty); reftype(t->tof); break; default: fatal("reftype: unknown type kind %d", t->kind); break; } } /* * check all reachable types for cycles and illegal forward references * find the size of all the types */ void cycsizetype(Type *t) { Decl *id, *tg; if(t == nil || (t->ok & (OKcycsize|OKcyc|OKsized)) == (OKcycsize|OKcyc|OKsized)) return; t->ok |= OKcycsize; switch(t->kind){ case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tiface: case Tainit: case Talt: case Tcase: case Tcasel: case Tcasec: case Tgoto: case Texcept: case Tfix: case Tpoly: t->ok |= OKcyc; sizetype(t); break; case Tref: case Tchan: case Tarray: case Tlist: cyctype(t); sizetype(t); cycsizetype(t->tof); break; case Tadt: case Ttuple: case Texception: cyctype(t); sizetype(t); for(id = t->ids; id != nil; id = id->next) cycsizetype(id->ty); for(tg = t->tags; tg != nil; tg = tg->next){ if((tg->ty->ok & (OKcycsize|OKcyc|OKsized)) == (OKcycsize|OKcyc|OKsized)) continue; tg->ty->ok |= (OKcycsize|OKcyc|OKsized); for(id = tg->ty->ids; id != nil; id = id->next) cycsizetype(id->ty); } for(id = t->polys; id != nil; id = id->next) cycsizetype(id->ty); break; case Tadtpick: t->ok &= ~OKcycsize; cycsizetype(t->decl->dot->ty); break; case Tmodule: cyctype(t); sizetype(t); for(id = t->ids; id != nil; id = id->next) cycsizetype(id->ty); sizeids(t->ids, 0); break; case Tfn: cyctype(t); sizetype(t); for(id = t->ids; id != nil; id = id->next) cycsizetype(id->ty); for(id = t->polys; id != nil; id = id->next) cycsizetype(id->ty); cycsizetype(t->tof); sizeids(t->ids, MaxTemp); break; default: fatal("cycsizetype: unknown type kind %d", t->kind); break; } } /* check for circularity in type declarations * - has to be called before verifytypes */ void tcycle(Type *t) { Decl *id; Type *tt; Typelist *tl; if(t == nil) return; switch(t->kind){ default: break; case Tchan: case Tarray: case Tref: case Tlist: case Tdot: tcycle(t->tof); break; case Tfn: case Ttuple: tcycle(t->tof); for(id = t->ids; id != nil; id = id->next) tcycle(id->ty); break; case Tarrow: if(t->rec&TRvis){ error(t->src.start, "circularity in definition of %T", t); *t = *terror; /* break the cycle */ return; } tt = t->tof; t->rec |= TRvis; tcycle(tt); if(tt->kind == Tid) tt = tt->decl->ty; id = namedot(tt->ids, t->decl->sym); if(id != nil) tcycle(id->ty); t->rec &= ~TRvis; break; case Tid: if(t->rec&TRvis){ error(t->src.start, "circularity in definition of %T", t); *t = *terror; /* break the cycle */ return; } t->rec |= TRvis; tcycle(t->decl->ty); t->rec &= ~TRvis; break; case Tinst: tcycle(t->tof); for(tl = t->u.tlist; tl != nil; tl = tl->nxt) tcycle(tl->t); break; } } /* * marks for checking for arcs */ enum { ArcValue = 1 << 0, ArcList = 1 << 1, ArcArray = 1 << 2, ArcRef = 1 << 3, ArcCyc = 1 << 4, /* cycle found */ ArcPolycyc = 1 << 5, }; void cyctype(Type *t) { Decl *id, *tg; if((t->ok & OKcyc) == OKcyc) return; t->ok |= OKcyc; t->rec |= TRcyc; switch(t->kind){ case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tfn: case Tchan: case Tarray: case Tref: case Tlist: case Tfix: case Tpoly: break; case Tadt: case Tmodule: case Ttuple: case Texception: for(id = t->ids; id != nil; id = id->next) cycfield(t, id); for(tg = t->tags; tg != nil; tg = tg->next){ if((tg->ty->ok & OKcyc) == OKcyc) continue; tg->ty->ok |= OKcyc; for(id = tg->ty->ids; id != nil; id = id->next) cycfield(t, id); } break; default: fatal("checktype: unknown type kind %d", t->kind); break; } t->rec &= ~TRcyc; } void cycfield(Type *base, Decl *id) { int arc; if(!storespace[id->store]) return; arc = cycarc(base, id->ty); if((arc & (ArcCyc|ArcValue)) == (ArcCyc|ArcValue)){ if(id->cycerr == 0) error(base->src.start, "illegal type cycle without a reference in field %s of %t", id->sym->name, base); id->cycerr = 1; }else if(arc & ArcCyc){ if((arc & ArcArray) && id->cyc == 0 && !(arc & ArcPolycyc)){ if(id->cycerr == 0) error(base->src.start, "illegal circular reference to type %T in field %s of %t", id->ty, id->sym->name, base); id->cycerr = 1; } id->cycle = 1; }else if(id->cyc != 0){ if(id->cycerr == 0) error(id->src.start, "spurious cyclic qualifier for field %s of %t", id->sym->name, base); id->cycerr = 1; } } int cycarc(Type *base, Type *t) { Decl *id, *tg; int me, arc; if(t == nil) return 0; if(t->rec & TRcyc){ if(tequal(t, base)){ if(t->kind == Tmodule) return ArcCyc | ArcRef; else return ArcCyc | ArcValue; } return 0; } t->rec |= TRcyc; me = 0; switch(t->kind){ case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tchan: case Tfn: case Tfix: case Tpoly: break; case Tarray: me = cycarc(base, t->tof) & ~ArcValue | ArcArray; break; case Tref: me = cycarc(base, t->tof) & ~ArcValue | ArcRef; break; case Tlist: me = cycarc(base, t->tof) & ~ArcValue | ArcList; break; case Tadt: case Tadtpick: case Tmodule: case Ttuple: case Texception: me = 0; for(id = t->ids; id != nil; id = id->next){ if(!storespace[id->store]) continue; arc = cycarc(base, id->ty); if((arc & ArcCyc) && id->cycerr == 0) me |= arc; } for(tg = t->tags; tg != nil; tg = tg->next){ arc = cycarc(base, tg->ty); if((arc & ArcCyc) && tg->cycerr == 0) me |= arc; } if(t->kind == Tmodule) me = me & ArcCyc | ArcRef | ArcPolycyc; else me &= ArcCyc | ArcValue | ArcPolycyc; break; default: fatal("cycarc: unknown type kind %d", t->kind); break; } t->rec &= ~TRcyc; if(t->flags&CYCLIC) me |= ArcPolycyc; return me; } /* * set the sizes and field offsets for t * look only as deeply as needed to size this type. * cycsize type will clean up the rest. */ void sizetype(Type *t) { Decl *id, *tg; Szal szal; long sz, al, a; if(t == nil) return; if((t->ok & OKsized) == OKsized) return; t->ok |= OKsized; if((t->ok & (OKverify|OKsized)) != (OKverify|OKsized)) fatal("sizetype bogus ok for %t", t); switch(t->kind){ default: fatal("sizetype: unknown type kind %d", t->kind); break; case Terror: case Tnone: case Tbyte: case Tint: case Tbig: case Tstring: case Tany: case Treal: fatal("%T should have a size", t); break; case Tref: case Tchan: case Tarray: case Tlist: case Tmodule: case Tfix: case Tpoly: t->size = t->align = IBY2WD; break; case Ttuple: case Tadt: case Texception: if(t->tags == nil){ if(!debug['z']){ szal = sizeids(t->ids, 0); t->size = align(szal.size, szal.align); t->align = szal.align; }else{ szal = sizeids(t->ids, 0); t->align = IBY2LG; t->size = align(szal.size, IBY2LG); } return; } if(!debug['z']){ szal = sizeids(t->ids, IBY2WD); sz = szal.size; al = szal.align; if(al < IBY2WD) al = IBY2WD; }else{ szal = sizeids(t->ids, IBY2WD); sz = szal.size; al = IBY2LG; } for(tg = t->tags; tg != nil; tg = tg->next){ if((tg->ty->ok & OKsized) == OKsized) continue; tg->ty->ok |= OKsized; if(!debug['z']){ szal = sizeids(tg->ty->ids, sz); a = szal.align; if(a < al) a = al; tg->ty->size = align(szal.size, a); tg->ty->align = a; }else{ szal = sizeids(tg->ty->ids, sz); tg->ty->size = align(szal.size, IBY2LG); tg->ty->align = IBY2LG; } } break; case Tfn: t->size = 0; t->align = 1; break; case Tainit: t->size = 0; t->align = 1; break; case Talt: t->size = t->cse->nlab * 2*IBY2WD + 2*IBY2WD; t->align = IBY2WD; break; case Tcase: case Tcasec: t->size = t->cse->nlab * 3*IBY2WD + 2*IBY2WD; t->align = IBY2WD; break; case Tcasel: t->size = t->cse->nlab * 6*IBY2WD + 3*IBY2WD; t->align = IBY2LG; break; case Tgoto: t->size = t->cse->nlab * IBY2WD + IBY2WD; if(t->cse->iwild != nil) t->size += IBY2WD; t->align = IBY2WD; break; case Tiface: sz = IBY2WD; for(id = t->ids; id != nil; id = id->next){ sz = align(sz, IBY2WD) + IBY2WD; sz += id->sym->len + 1; if(id->dot->ty->kind == Tadt) sz += id->dot->sym->len + 1; } t->size = sz; t->align = IBY2WD; break; case Texcept: t->size = 0; t->align = IBY2WD; break; } } Szal sizeids(Decl *id, long off) { Szal szal; int a, al; al = 1; for(; id != nil; id = id->next){ if(storespace[id->store]){ sizetype(id->ty); /* * alignment can be 0 if we have * illegal forward declarations. * just patch a; other code will flag an error */ a = id->ty->align; if(a == 0) a = 1; if(a > al) al = a; off = align(off, a); id->offset = off; off += id->ty->size; } } szal.size = off; szal.align = al; return szal; } long align(long off, int align) { if(align == 0) fatal("align 0"); while(off % align) off++; return off; } /* * recalculate a type's size */ void resizetype(Type *t) { if((t->ok & OKsized) == OKsized){ t->ok &= ~OKsized; cycsizetype(t); } } /* * check if a module is accessable from t * if so, mark that module interface */ void modrefable(Type *t) { Decl *id, *m, *tg; if(t == nil || (t->ok & OKmodref) == OKmodref) return; if((t->ok & OKverify) != OKverify) fatal("modrefable unused type %t", t); t->ok |= OKmodref; switch(t->kind){ case Terror: case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tnone: case Tany: case Tfix: case Tpoly: break; case Tchan: case Tref: case Tarray: case Tlist: modrefable(t->tof); break; case Tmodule: t->tof->linkall = 1; t->decl->refs++; for(id = t->ids; id != nil; id = id->next){ switch(id->store){ case Dglobal: case Dfn: modrefable(id->ty); break; case Dtype: if(id->ty->kind != Tadt) break; for(m = id->ty->ids; m != nil; m = m->next) if(m->store == Dfn) modrefable(m->ty); break; } } break; case Tfn: case Tadt: case Ttuple: case Texception: for(id = t->ids; id != nil; id = id->next) if(id->store != Dfn) modrefable(id->ty); for(tg = t->tags; tg != nil; tg = tg->next){ /* if((tg->ty->ok & OKmodref) == OKmodref) continue; */ tg->ty->ok |= OKmodref; for(id = tg->ty->ids; id != nil; id = id->next) modrefable(id->ty); } for(id = t->polys; id != nil; id = id->next) modrefable(id->ty); modrefable(t->tof); break; case Tadtpick: modrefable(t->decl->dot->ty); break; default: fatal("unknown type kind %d", t->kind); break; } } Desc* gendesc(Decl *d, long size, Decl *decls) { Desc *desc; if(debug['D']) print("generate desc for %D\n", d); if(ispoly(d)) addfnptrs(d, 0); desc = usedesc(mkdesc(size, decls)); return desc; } Desc* mkdesc(long size, Decl *d) { uchar *pmap; long len, n; len = (size+8*IBY2WD-1) / (8*IBY2WD); pmap = allocmem(len); memset(pmap, 0, len); n = descmap(d, pmap, 0); if(n >= 0) n = n / (8*IBY2WD) + 1; else n = 0; if(n > len) fatal("wrote off end of decl map: %ld %ld", n, len); return enterdesc(pmap, size, n); } Desc* mktdesc(Type *t) { Desc *d; uchar *pmap; long len, n; usedty(t); if(debug['D']) print("generate desc for %T\n", t); if(t->decl == nil){ t->decl = mkdecl(&t->src, Dtype, t); t->decl->sym = enter("_mktdesc_", 0); } if(t->decl->desc != nil) return t->decl->desc; len = (t->size+8*IBY2WD-1) / (8*IBY2WD); pmap = allocmem(len); memset(pmap, 0, len); n = tdescmap(t, pmap, 0); if(n >= 0) n = n / (8*IBY2WD) + 1; else n = 0; if(n > len) fatal("wrote off end of type map for %T: %ld %ld 0x%2.2ux", t, n, len, t->ok); d = enterdesc(pmap, t->size, n); t->decl->desc = d; if(debug['j']){ uchar *m, *e; print("generate desc for %T\n", t); print("\tdesc\t$%d,%lud,\"", d->id, d->size); e = d->map + d->nmap; for(m = d->map; m < e; m++) print("%.2x", *m); print("\"\n"); } return d; } Desc* enterdesc(uchar *map, long size, long nmap) { Desc *d, *last; int c; last = nil; for(d = descriptors; d != nil; d = d->next){ if(d->size > size || d->size == size && d->nmap > nmap) break; if(d->size == size && d->nmap == nmap){ c = memcmp(d->map, map, nmap); if(c == 0){ free(map); return d; } if(c > 0) break; } last = d; } d = allocmem(sizeof *d); d->id = -1; d->used = 0; d->map = map; d->size = size; d->nmap = nmap; if(last == nil){ d->next = descriptors; descriptors = d; }else{ d->next = last->next; last->next = d; } return d; } Desc* usedesc(Desc *d) { d->used = 1; return d; } /* * create the pointer description byte map for every type in decls * each bit corresponds to a word, and is 1 if occupied by a pointer * the high bit in the byte maps the first word */ long descmap(Decl *decls, uchar *map, long start) { Decl *d; long last, m; if(debug['D']) print("descmap offset %ld\n", start); last = -1; for(d = decls; d != nil; d = d->next){ if(d->store == Dtype && d->ty->kind == Tmodule || d->store == Dfn || d->store == Dconst) continue; if(d->store == Dlocal && d->link != nil) continue; m = tdescmap(d->ty, map, d->offset + start); if(debug['D']){ if(d->sym != nil) print("descmap %s type %T offset %ld returns %ld\n", d->sym->name, d->ty, d->offset+start, m); else print("descmap type %T offset %ld returns %ld\n", d->ty, d->offset+start, m); } if(m >= 0) last = m; } return last; } long tdescmap(Type *t, uchar *map, long offset) { Label *lab; long i, e, m; int bit; if(t == nil) return -1; m = -1; if(t->kind == Talt){ lab = t->cse->labs; e = t->cse->nlab; offset += IBY2WD * 2; for(i = 0; i < e; i++){ if(lab[i].isptr){ bit = offset / IBY2WD % 8; map[offset / (8*IBY2WD)] |= 1 << (7 - bit); m = offset; } offset += 2*IBY2WD; } return m; } if(t->kind == Tcasec){ e = t->cse->nlab; offset += IBY2WD; for(i = 0; i < e; i++){ bit = offset / IBY2WD % 8; map[offset / (8*IBY2WD)] |= 1 << (7 - bit); offset += IBY2WD; bit = offset / IBY2WD % 8; map[offset / (8*IBY2WD)] |= 1 << (7 - bit); m = offset; offset += 2*IBY2WD; } return m; } if(tattr[t->kind].isptr){ bit = offset / IBY2WD % 8; map[offset / (8*IBY2WD)] |= 1 << (7 - bit); return offset; } if(t->kind == Tadtpick) t = t->tof; if(t->kind == Ttuple || t->kind == Tadt || t->kind == Texception){ if(debug['D']) print("descmap adt offset %ld\n", offset); if(t->rec != 0) fatal("illegal cyclic type %t in tdescmap", t); t->rec = 1; offset = descmap(t->ids, map, offset); t->rec = 0; return offset; } return -1; } /* * can a t2 be assigned to a t1? * any means Tany matches all types, * not just references */ int tcompat(Type *t1, Type *t2, int any) { int ok, v; if(t1 == t2) return 1; if(t1 == nil || t2 == nil) return 0; if(t2->kind == Texception && t1->kind != Texception) t2 = mkextuptype(t2); tcomset = 0; ok = rtcompat(t1, t2, any, 0); v = cleartcomrec(t1) + cleartcomrec(t2); if(v != tcomset) fatal("recid t1 %t and t2 %t not balanced in tcompat: %d v %d", t1, t2, v, tcomset); return ok; } static int rtcompat(Type *t1, Type *t2, int any, int inaorc) { if(t1 == t2) return 1; if(t1 == nil || t2 == nil) return 0; if(t1->kind == Terror || t2->kind == Terror) return 1; if(t2->kind == Texception && t1->kind != Texception) t2 = mkextuptype(t2); if(debug['x']) print("rtcompat: %t and %t\n", t1, t2); t1->rec |= TRcom; t2->rec |= TRcom; switch(t1->kind){ default: fatal("unknown type %t v %t in rtcompat", t1, t2); case Tstring: return t2->kind == Tstring || t2->kind == Tany; case Texception: if(t2->kind == Texception && t1->cons == t2->cons){ if(assumetcom(t1, t2)) return 1; return idcompat(t1->ids, t2->ids, 0, inaorc); } return 0; case Tnone: case Tint: case Tbig: case Tbyte: case Treal: return t1->kind == t2->kind; case Tfix: return t1->kind == t2->kind && sametree(t1->val, t2->val); case Tany: if(tattr[t2->kind].isptr) return 1; return any; case Tref: case Tlist: case Tarray: case Tchan: if(t1->kind != t2->kind){ if(t2->kind == Tany) return 1; return 0; } if(t1->kind != Tref && assumetcom(t1, t2)) return 1; return rtcompat(t1->tof, t2->tof, 0, t1->kind == Tarray || t1->kind == Tchan || inaorc); case Tfn: break; case Ttuple: if(t2->kind == Tadt && t2->tags == nil || t2->kind == Ttuple){ if(assumetcom(t1, t2)) return 1; return idcompat(t1->ids, t2->ids, any, inaorc); } if(t2->kind == Tadtpick){ t2->tof->rec |= TRcom; if(assumetcom(t1, t2->tof)) return 1; return idcompat(t1->ids, t2->tof->ids->next, any, inaorc); } return 0; case Tadt: if(t2->kind == Ttuple && t1->tags == nil){ if(assumetcom(t1, t2)) return 1; return idcompat(t1->ids, t2->ids, any, inaorc); } if(t1->tags != nil && t2->kind == Tadtpick && !inaorc) t2 = t2->decl->dot->ty; break; case Tadtpick: /* if(t2->kind == Ttuple) return idcompat(t1->tof->ids->next, t2->ids, any, inaorc); */ break; case Tmodule: if(t2->kind == Tany) return 1; break; case Tpoly: if(t2->kind == Tany) return 1; break; } return tequal(t1, t2); } /* * add the assumption that t1 and t2 are compatable */ static int assumetcom(Type *t1, Type *t2) { Type *r1, *r2; if(t1->tcom == nil && t2->tcom == nil){ tcomset += 2; t1->tcom = t2->tcom = t1; }else{ if(t1->tcom == nil){ r1 = t1; t1 = t2; t2 = r1; } for(r1 = t1->tcom; r1 != r1->tcom; r1 = r1->tcom) ; for(r2 = t2->tcom; r2 != nil && r2 != r2->tcom; r2 = r2->tcom) ; if(r1 == r2) return 1; if(r2 == nil) tcomset++; t2->tcom = t1; for(; t2 != r1; t2 = r2){ r2 = t2->tcom; t2->tcom = r1; } } return 0; } static int cleartcomrec(Type *t) { Decl *id; int n; n = 0; for(; t != nil && (t->rec & TRcom) == TRcom; t = t->tof){ t->rec &= ~TRcom; if(t->tcom != nil){ t->tcom = nil; n++; } if(t->kind == Tadtpick) n += cleartcomrec(t->tof); if(t->kind == Tmodule) t = t->tof; for(id = t->ids; id != nil; id = id->next) n += cleartcomrec(id->ty); for(id = t->tags; id != nil; id = id->next) n += cleartcomrec(id->ty); for(id = t->polys; id != nil; id = id->next) n += cleartcomrec(id->ty); } return n; } /* * id1 and id2 are the fields in an adt or tuple * simple structural check; ignore names */ static int idcompat(Decl *id1, Decl *id2, int any, int inaorc) { for(; id1 != nil; id1 = id1->next){ if(id1->store != Dfield) continue; while(id2 != nil && id2->store != Dfield) id2 = id2->next; if(id2 == nil || id1->store != id2->store || !rtcompat(id1->ty, id2->ty, any, inaorc)) return 0; id2 = id2->next; } while(id2 != nil && id2->store != Dfield) id2 = id2->next; return id2 == nil; } int tequal(Type *t1, Type *t2) { int ok, v; eqrec = 0; eqset = 0; ok = rtequal(t1, t2); v = cleareqrec(t1) + cleareqrec(t2); if(0 && v != eqset) fatal("recid t1 %t and t2 %t not balanced in tequal: %d %d", t1, t2, v, eqset); eqset = 0; return ok; } /* * structural equality on types */ static int rtequal(Type *t1, Type *t2) { /* * this is just a shortcut */ if(t1 == t2) return 1; if(t1 == nil || t2 == nil) return 0; if(t1->kind == Terror || t2->kind == Terror) return 1; if(t1->kind != t2->kind) return 0; if(t1->eq != nil && t2->eq != nil) return t1->eq == t2->eq; if(debug['x']) print("rtequal: %t and %t\n", t1, t2); t1->rec |= TReq; t2->rec |= TReq; switch(t1->kind){ default: fatal("unknown type %t v %t in rtequal", t1, t2); case Tnone: case Tbig: case Tbyte: case Treal: case Tint: case Tstring: /* * this should always be caught by t1 == t2 check */ fatal("bogus value type %t vs %t in rtequal", t1, t2); return 1; case Tfix: return sametree(t1->val, t2->val); case Tref: case Tlist: case Tarray: case Tchan: if(t1->kind != Tref && assumeteq(t1, t2)) return 1; return rtequal(t1->tof, t2->tof); case Tfn: if(t1->varargs != t2->varargs) return 0; if(!idequal(t1->ids, t2->ids, 0, storespace)) return 0; /* if(!idequal(t1->polys, t2->polys, 1, nil)) */ if(!pyequal(t1, t2)) return 0; return rtequal(t1->tof, t2->tof); case Ttuple: case Texception: if(t1->kind != t2->kind || t1->cons != t2->cons) return 0; if(assumeteq(t1, t2)) return 1; return idequal(t1->ids, t2->ids, 0, storespace); case Tadt: case Tadtpick: case Tmodule: if(assumeteq(t1, t2)) return 1; /* * compare interfaces when comparing modules */ if(t1->kind == Tmodule) return idequal(t1->tof->ids, t2->tof->ids, 1, nil); /* * picked adts; check parent, * assuming equiv picked fields, * then check picked fields are equiv */ if(t1->kind == Tadtpick && !rtequal(t1->decl->dot->ty, t2->decl->dot->ty)) return 0; /* * adts with pick tags: check picked fields for equality */ if(!idequal(t1->tags, t2->tags, 1, nil)) return 0; /* if(!idequal(t1->polys, t2->polys, 1, nil)) */ if(!pyequal(t1, t2)) return 0; return idequal(t1->ids, t2->ids, 1, storespace); case Tpoly: if(assumeteq(t1, t2)) return 1; if(t1->decl->sym != t2->decl->sym) return 0; return idequal(t1->ids, t2->ids, 1, nil); } } static int assumeteq(Type *t1, Type *t2) { Type *r1, *r2; if(t1->teq == nil && t2->teq == nil){ eqrec++; eqset += 2; t1->teq = t2->teq = t1; }else{ if(t1->teq == nil){ r1 = t1; t1 = t2; t2 = r1; } for(r1 = t1->teq; r1 != r1->teq; r1 = r1->teq) ; for(r2 = t2->teq; r2 != nil && r2 != r2->teq; r2 = r2->teq) ; if(r1 == r2) return 1; if(r2 == nil) eqset++; t2->teq = t1; for(; t2 != r1; t2 = r2){ r2 = t2->teq; t2->teq = r1; } } return 0; } /* * checking structural equality for adts, tuples, and fns */ static int idequal(Decl *id1, Decl *id2, int usenames, int *storeok) { /* * this is just a shortcut */ if(id1 == id2) return 1; for(; id1 != nil; id1 = id1->next){ if(storeok != nil && !storeok[id1->store]) continue; while(id2 != nil && storeok != nil && !storeok[id2->store]) id2 = id2->next; if(id2 == nil || usenames && id1->sym != id2->sym || id1->store != id2->store || id1->implicit != id2->implicit || id1->cyc != id2->cyc || (id1->dot == nil) != (id2->dot == nil) || id1->dot != nil && id2->dot != nil && id1->dot->ty->kind != id2->dot->ty->kind || !rtequal(id1->ty, id2->ty)) return 0; id2 = id2->next; } while(id2 != nil && storeok != nil && !storeok[id2->store]) id2 = id2->next; return id1 == nil && id2 == nil; } static int pyequal(Type *t1, Type *t2) { Type *pt1, *pt2; Decl *id1, *id2; if(t1 == t2) return 1; id1 = t1->polys; id2 = t2->polys; for(; id1 != nil; id1 = id1->next){ if(id2 == nil) return 0; pt1 = id1->ty; pt2 = id2->ty; if(!rtequal(pt1, pt2)){ if(t1->u.tmap != nil) pt1 = valtmap(pt1, t1->u.tmap); if(t2->u.tmap != nil) pt2 = valtmap(pt2, t2->u.tmap); if(!rtequal(pt1, pt2)) return 0; } id2 = id2->next; } return id1 == nil && id2 == nil; } static int cleareqrec(Type *t) { Decl *id; int n; n = 0; for(; t != nil && (t->rec & TReq) == TReq; t = t->tof){ t->rec &= ~TReq; if(t->teq != nil){ t->teq = nil; n++; } if(t->kind == Tadtpick) n += cleareqrec(t->decl->dot->ty); if(t->kind == Tmodule) t = t->tof; for(id = t->ids; id != nil; id = id->next) n += cleareqrec(id->ty); for(id = t->tags; id != nil; id = id->next) n += cleareqrec(id->ty); for(id = t->polys; id != nil; id = id->next) n += cleareqrec(id->ty); } return n; } int raisescompat(Node *n1, Node *n2) { if(n1 == n2) return 1; if(n2 == nil) return 1; /* no need to repeat in definition if given in declaration */ if(n1 == nil) return 0; for(n1 = n1->left, n2 = n2->left; n1 != nil && n2 != nil; n1 = n1->right, n2 = n2->right){ if(n1->left->decl != n2->left->decl) return 0; } return n1 == n2; } /* t1 a polymorphic type */ static int fnunify(Type *t1, Type *t2, Tpair **tp, int swapped) { Decl *id, *ids; Sym *sym; for(ids = t1->ids; ids != nil; ids = ids->next){ sym = ids->sym; id = fnlookup(sym, t2, nil); if(id != nil) usetype(id->ty); if(id == nil){ if(dowarn) error(unifysrc.start, "type %T does not have a '%s' function", t2, sym->name); return 0; } else if(id->ty->kind != Tfn){ if(dowarn) error(unifysrc.start, "%T is not a function", id->ty); return 0; } else if(!rtunify(ids->ty, id->ty, tp, !swapped)){ if(dowarn) error(unifysrc.start, "%T and %T are not compatible wrt %s", ids->ty, id->ty, sym->name); return 0; } } return 1; } static int fncleareqrec(Type *t1, Type *t2) { Decl *id, *ids; int n; n = 0; n += cleareqrec(t1); n += cleareqrec(t2); for(ids = t1->ids; ids != nil; ids = ids->next){ id = fnlookup(ids->sym, t2, nil); if(id == nil) continue; else{ n += cleareqrec(ids->ty); n += cleareqrec(id->ty); } } return n; } int tunify(Type *t1, Type *t2, Tpair **tp) { int ok, v; Tpair *p; *tp = nil; eqrec = 0; eqset = 0; ok = rtunify(t1, t2, tp, 0); v = cleareqrec(t1) + cleareqrec(t2); for(p = *tp; p != nil; p = p->nxt) v += fncleareqrec(p->t1, p->t2); if(0 && v != eqset) fatal("recid t1 %t and t2 %t not balanced in tunify: %d %d", t1, t2, v, eqset); return ok; } static int rtunify(Type *t1, Type *t2, Tpair **tp, int swapped) { Type *tmp; if(debug['w']) print("rtunifya - %T %T\n", t1, t2); t1 = valtmap(t1, *tp); t2 = valtmap(t2, *tp); if(debug['w']) print("rtunifyb - %T %T\n", t1, t2); if(t1 == t2) return 1; if(t1 == nil || t2 == nil) return 0; if(t1->kind == Terror || t2->kind == Terror) return 1; if(t1->kind != Tpoly && t2->kind == Tpoly){ tmp = t1; t1 = t2; t2 = tmp; swapped = !swapped; } if(t1->kind == Tpoly){ /* if(typein(t1, t2)) return 0; */ if(!tattr[t2->kind].isptr) return 0; if(t2->kind != Tany) addtmap(t1, t2, tp); return fnunify(t1, t2, tp, swapped); } if(t1->kind != Tany && t2->kind == Tany){ tmp = t1; t1 = t2; t2 = tmp; swapped = !swapped; } if(t1->kind == Tadt && t1->tags != nil && t2->kind == Tadtpick && !swapped) t2 = t2->decl->dot->ty; if(t2->kind == Tadt && t2->tags != nil && t1->kind == Tadtpick && swapped) t1 = t1->decl->dot->ty; if(t1->kind != Tany && t1->kind != t2->kind) return 0; t1->rec |= TReq; t2->rec |= TReq; switch(t1->kind){ default: return tequal(t1, t2); case Tany: return tattr[t2->kind].isptr; case Tref: case Tlist: case Tarray: case Tchan: if(t1->kind != Tref && assumeteq(t1, t2)) return 1; return rtunify(t1->tof, t2->tof, tp, swapped); case Tfn: if(!idunify(t1->ids, t2->ids, tp, swapped)) return 0; if(!idunify(t1->polys, t2->polys, tp, swapped)) return 0; return rtunify(t1->tof, t2->tof, tp, swapped); case Ttuple: if(assumeteq(t1, t2)) return 1; return idunify(t1->ids, t2->ids, tp, swapped); case Tadt: case Tadtpick: if(assumeteq(t1, t2)) return 1; if(!idunify(t1->polys, t2->polys, tp, swapped)) return 0; if(!idunify(t1->tags, t2->tags, tp, swapped)) return 0; return idunify(t1->ids, t2->ids, tp, swapped); case Tmodule: if(assumeteq(t1, t2)) return 1; return idunify(t1->tof->ids, t2->tof->ids, tp, swapped); case Tpoly: return t1 == t2; } return 1; } static int idunify(Decl *id1, Decl *id2, Tpair **tp, int swapped) { if(id1 == id2) return 1; for(; id1 != nil; id1 = id1->next){ if(id2 == nil || !rtunify(id1->ty, id2->ty, tp, swapped)) return 0; id2 = id2->next; } return id1 == nil && id2 == nil; } int polyequal(Decl *id1, Decl *id2) { int ck2; Decl *d; /* allow id2 list to have an optional for clause */ ck2 = 0; for(d = id2; d != nil; d = d->next) if(d->ty->ids != nil) ck2 = 1; for( ; id1 != nil; id1 = id1->next){ if(id2 == nil || id1->sym != id2->sym || id1->ty->decl != nil && id2->ty->decl != nil && id1->ty->decl->sym != id2->ty->decl->sym) return 0; if(ck2 && !idequal(id1->ty->ids, id2->ty->ids, 1, nil)) return 0; id2 = id2->next; } return id1 == nil && id2 == nil; } Type* calltype(Type *f, Node *a, Type *rt) { Type *t; Decl *id, *first, *last; first = last = nil; t = mktype(&f->src.start, &f->src.stop, Tfn, rt, nil); t->polys = f->kind == Tref ? f->tof->polys : f->polys; for( ; a != nil; a = a->right){ id = mkdecl(&f->src, Darg, a->left->ty); if(last == nil) first = id; else last->next = id; last = id; } t->ids = first; if(f->kind == Tref) t = mktype(&f->src.start, &f->src.stop, Tref, t, nil); return t; } static Type* duptype(Type *t) { Type *nt; nt = allocmem(sizeof(*nt)); *nt = *t; nt->ok &= ~(OKverify|OKref|OKclass|OKsized|OKcycsize|OKcyc); nt->flags |= INST; nt->eq = nil; nt->sbl = -1; if(t->decl != nil && (nt->kind == Tadt || nt->kind == Tadtpick || nt->kind == Ttuple)){ nt->decl = dupdecl(t->decl); nt->decl->ty = nt; nt->decl->link = t->decl; if(t->decl->dot != nil){ nt->decl->dot = dupdecl(t->decl->dot); nt->decl->dot->link = t->decl->dot; } } else nt->decl = nil; return nt; } static int dpolys(Decl *ids) { Decl *p; for(p = ids; p != nil; p = p->next) if(tpolys(p->ty)) return 1; return 0; } static int tpolys(Type *t) { int v; Typelist *tl; if(t == nil) return 0; if(t->flags&(POLY|NOPOLY)) return t->flags&POLY; switch(t->kind){ default: v = 0; break; case Tarrow: case Tdot: case Tpoly: v = 1; break; case Tref: case Tlist: case Tarray: case Tchan: v = tpolys(t->tof); break; case Tid: v = tpolys(t->decl->ty); break; case Tinst: for(tl = t->u.tlist; tl != nil; tl = tl->nxt) if(tpolys(tl->t)){ v = 1; break; } v = tpolys(t->tof); break; case Tfn: case Tadt: case Tadtpick: case Ttuple: case Texception: if(t->polys != nil){ v = 1; break; } if(t->rec&TRvis) return 0; t->rec |= TRvis; v = tpolys(t->tof) || dpolys(t->polys) || dpolys(t->ids) || dpolys(t->tags); t->rec &= ~TRvis; if(t->kind == Tadtpick && v == 0) v = tpolys(t->decl->dot->ty); break; } if(v) t->flags |= POLY; else t->flags |= NOPOLY; return v; } static int doccurs(Decl *ids, Tpair **tp) { Decl *p; for(p = ids; p != nil; p = p->next) if(toccurs(p->ty, tp)) return 1; return 0; } static int toccurs(Type *t, Tpair **tp) { int o; Typelist *tl; if(t == nil) return 0; if(!(t->flags&(POLY|NOPOLY))) tpolys(t); if(t->flags&NOPOLY) return 0; switch(t->kind){ default: fatal("unknown type %t in toccurs", t); case Tnone: case Tbig: case Tbyte: case Treal: case Tint: case Tstring: case Tfix: case Tmodule: case Terror: return 0; case Tarrow: case Tdot: return 1; case Tpoly: return valtmap(t, *tp) != t; case Tref: case Tlist: case Tarray: case Tchan: return toccurs(t->tof, tp); case Tid: return toccurs(t->decl->ty, tp); case Tinst: for(tl = t->u.tlist; tl != nil; tl = tl->nxt) if(toccurs(tl->t, tp)) return 1; return toccurs(t->tof, tp); case Tfn: case Tadt: case Tadtpick: case Ttuple: case Texception: if(t->rec&TRvis) return 0; t->rec |= TRvis; o = toccurs(t->tof, tp) || doccurs(t->polys, tp) || doccurs(t->ids, tp) || doccurs(t->tags, tp); t->rec &= ~TRvis; if(t->kind == Tadtpick && o == 0) o = toccurs(t->decl->dot->ty, tp); return o; } } static Decl* expandids(Decl *ids, Decl *adtt, Tpair **tp, int sym) { Decl *p, *q, *nids, *last; nids = last = nil; for(p = ids; p != nil; p = p->next){ q = dupdecl(p); q->ty = expandtype(p->ty, nil, adtt, tp); if(sym && q->ty->decl != nil) q->sym = q->ty->decl->sym; if(q->store == Dfn){ if(debug['v']) print("%p->link = %p\n", q, p); q->link = p; } if(nids == nil) nids = q; else last->next = q; last = q; } return nids; } Type* expandtype(Type *t, Type *instt, Decl *adtt, Tpair **tp) { Type *nt; Decl *ids; if(t == nil) return nil; if(debug['w']) print("expandtype %d %lux %T\n", t->kind, (ulong)t, t); if(!toccurs(t, tp)) return t; if(debug['w']) print("\texpanding\n"); switch(t->kind){ default: fatal("unknown type %t in expandtype", t); case Tpoly: return valtmap(t, *tp); case Tref: case Tlist: case Tarray: case Tchan: nt = duptype(t); nt->tof = expandtype(t->tof, nil, adtt, tp); return nt; case Tid: return expandtype(idtype(t), nil, adtt, tp); case Tdot: return expandtype(dottype(t, adtt), nil, adtt, tp); case Tarrow: return expandtype(arrowtype(t, adtt), nil, adtt, tp); case Tinst: if((nt = valtmap(t, *tp)) != t) return nt; return expandtype(insttype(t, adtt, tp), nil, adtt, tp); case Tfn: case Tadt: case Tadtpick: case Ttuple: case Texception: if((nt = valtmap(t, *tp)) != t) return nt; if(t->kind == Tadt) adtt = t->decl; nt = duptype(t); addtmap(t, nt, tp); if(instt != nil) addtmap(instt, nt, tp); nt->tof = expandtype(t->tof, nil, adtt, tp); nt->polys = expandids(t->polys, adtt, tp, 1); nt->ids = expandids(t->ids, adtt, tp, 0); nt->tags = expandids(t->tags, adtt, tp, 0); if(t->kind == Tadt){ for(ids = nt->tags; ids != nil; ids = ids->next) ids->ty->decl->dot = nt->decl; } if(t->kind == Tadtpick){ nt->decl->dot->ty = expandtype(t->decl->dot->ty, nil, adtt, tp); } if((t->kind == Tadt || t->kind == Tadtpick) && t->u.tmap != nil){ Tpair *p; nt->u.tmap = nil; for(p = t->u.tmap; p != nil; p = p->nxt) addtmap(valtmap(p->t1, *tp), valtmap(p->t2, *tp), &nt->u.tmap); if(debug['w']){ print("new tmap for %T->%T: ", t, nt); for(p=nt->u.tmap;p!=nil;p=p->nxt)print("%T -> %T ", p->t1, p->t2); print("\n"); } } return nt; } } /* * create type signatures * sign the same information used * for testing type equality */ ulong sign(Decl *d) { Type *t; uchar *sig, md5sig[MD5dlen]; char buf[StrSize]; int i, sigend, sigalloc, v; t = d->ty; if(t->sig != 0) return t->sig; if(ispoly(d)) rmfnptrs(d); sig = 0; sigend = -1; sigalloc = 1024; while(sigend < 0 || sigend >= sigalloc){ sigalloc *= 2; sig = reallocmem(sig, sigalloc); eqrec = 0; sigend = rtsign(t, sig, sigalloc, 0); v = clearrec(t); if(v != eqrec) fatal("recid not balanced in sign: %d %d", v, eqrec); eqrec = 0; } sig[sigend] = '\0'; if(signdump != nil){ seprint(buf, buf+sizeof(buf), "%D", d); if(strcmp(buf, signdump) == 0){ print("sign %D len %d\n", d, sigend); print("%s\n", (char*)sig); } } md5(sig, sigend, md5sig, nil); for(i = 0; i < MD5dlen; i += 4) t->sig ^= md5sig[i+0] | (md5sig[i+1]<<8) | (md5sig[i+2]<<16) | (md5sig[i+3]<<24); if(debug['S']) print("signed %D type %T len %d sig %#lux\n", d, t, sigend, t->sig); free(sig); return t->sig; } enum { SIGSELF = 'S', SIGVARARGS = '*', SIGCYC = 'y', SIGREC = '@' }; static int sigkind[Tend] = { /* Tnone */ 'n', /* Tadt */ 'a', /* Tadtpick */ 'p', /* Tarray */ 'A', /* Tbig */ 'B', /* Tbyte */ 'b', /* Tchan */ 'C', /* Treal */ 'r', /* Tfn */ 'f', /* Tint */ 'i', /* Tlist */ 'L', /* Tmodule */ 'm', /* Tref */ 'R', /* Tstring */ 's', /* Ttuple */ 't', /* Texception */ 'e', /* Tfix */ 'x', /* Tpoly */ 'P', }; static int rtsign(Type *t, uchar *sig, int lensig, int spos) { Decl *id, *tg; char name[32]; int kind, lenname; if(t == nil) return spos; if(spos < 0 || spos + 8 >= lensig) return -1; if(t->eq != nil && t->eq->id){ if(t->eq->id < 0 || t->eq->id > eqrec) fatal("sign rec %T %d %d", t, t->eq->id, eqrec); sig[spos++] = SIGREC; seprint(name, name+sizeof(name), "%d", t->eq->id); lenname = strlen(name); if(spos + lenname > lensig) return -1; strcpy((char*)&sig[spos], name); spos += lenname; return spos; } if(t->eq != nil){ eqrec++; t->eq->id = eqrec; } kind = sigkind[t->kind]; sig[spos++] = kind; if(kind == 0) fatal("no sigkind for %t", t); t->rec = 1; switch(t->kind){ default: fatal("bogus type %t in rtsign", t); return -1; case Tnone: case Tbig: case Tbyte: case Treal: case Tint: case Tstring: case Tpoly: return spos; case Tfix: seprint(name, name+sizeof(name), "%g", t->val->rval); lenname = strlen(name); if(spos+lenname-1 >= lensig) return -1; strcpy((char*)&sig[spos], name); spos += lenname; return spos; case Tref: case Tlist: case Tarray: case Tchan: return rtsign(t->tof, sig, lensig, spos); case Tfn: if(t->varargs != 0) sig[spos++] = SIGVARARGS; if(t->polys != nil) spos = idsign(t->polys, 0, sig, lensig, spos); spos = idsign(t->ids, 0, sig, lensig, spos); if(t->u.eraises) spos = raisessign(t->u.eraises, sig, lensig, spos); return rtsign(t->tof, sig, lensig, spos); case Ttuple: return idsign(t->ids, 0, sig, lensig, spos); case Tadt: /* * this is a little different than in rtequal, * since we flatten the adt we used to represent the globals */ if(t->eq == nil){ if(strcmp(t->decl->sym->name, ".mp") != 0) fatal("no t->eq field for %t", t); spos--; for(id = t->ids; id != nil; id = id->next){ spos = idsign1(id, 1, sig, lensig, spos); if(spos < 0 || spos >= lensig) return -1; sig[spos++] = ';'; } return spos; } if(t->polys != nil) spos = idsign(t->polys, 0, sig, lensig, spos); spos = idsign(t->ids, 1, sig, lensig, spos); if(spos < 0 || t->tags == nil) return spos; /* * convert closing ')' to a ',', then sign any tags */ sig[spos-1] = ','; for(tg = t->tags; tg != nil; tg = tg->next){ lenname = tg->sym->len; if(spos + lenname + 2 >= lensig) return -1; strcpy((char*)&sig[spos], tg->sym->name); spos += lenname; sig[spos++] = '='; sig[spos++] = '>'; spos = rtsign(tg->ty, sig, lensig, spos); if(spos < 0 || spos >= lensig) return -1; if(tg->next != nil) sig[spos++] = ','; } if(spos >= lensig) return -1; sig[spos++] = ')'; return spos; case Tadtpick: spos = idsign(t->ids, 1, sig, lensig, spos); if(spos < 0) return spos; return rtsign(t->decl->dot->ty, sig, lensig, spos); case Tmodule: if(t->tof->linkall == 0) fatal("signing a narrowed module"); if(spos >= lensig) return -1; sig[spos++] = '{'; for(id = t->tof->ids; id != nil; id = id->next){ if(id->tag) continue; if(strcmp(id->sym->name, ".mp") == 0){ spos = rtsign(id->ty, sig, lensig, spos); if(spos < 0) return -1; continue; } spos = idsign1(id, 1, sig, lensig, spos); if(spos < 0 || spos >= lensig) return -1; sig[spos++] = ';'; } if(spos >= lensig) return -1; sig[spos++] = '}'; return spos; } } static int idsign(Decl *id, int usenames, uchar *sig, int lensig, int spos) { int first; if(spos >= lensig) return -1; sig[spos++] = '('; first = 1; for(; id != nil; id = id->next){ if(id->store == Dlocal) fatal("local %s in idsign", id->sym->name); if(!storespace[id->store]) continue; if(!first){ if(spos >= lensig) return -1; sig[spos++] = ','; } spos = idsign1(id, usenames, sig, lensig, spos); if(spos < 0) return -1; first = 0; } if(spos >= lensig) return -1; sig[spos++] = ')'; return spos; } static int idsign1(Decl *id, int usenames, uchar *sig, int lensig, int spos) { char *name; int lenname; if(usenames){ name = id->sym->name; lenname = id->sym->len; if(spos + lenname + 1 >= lensig) return -1; strcpy((char*)&sig[spos], name); spos += lenname; sig[spos++] = ':'; } if(spos + 2 >= lensig) return -1; if(id->implicit != 0) sig[spos++] = SIGSELF; if(id->cyc != 0) sig[spos++] = SIGCYC; return rtsign(id->ty, sig, lensig, spos); } static int raisessign(Node *n, uchar *sig, int lensig, int spos) { int m; char *s; Node *nn; if(spos >= lensig) return -1; sig[spos++] = '('; for(nn = n->left; nn != nil; nn = nn->right){ s = nn->left->decl->sym->name; m = nn->left->decl->sym->len; if(spos+m-1 >= lensig) return -1; strcpy((char*)&sig[spos], s); spos += m; if(nn->right != nil){ if(spos >= lensig) return -1; sig[spos++] = ','; } } if(spos >= lensig) return -1; sig[spos++] = ')'; return spos; } static int clearrec(Type *t) { Decl *id; int n; n = 0; for(; t != nil && t->rec; t = t->tof){ t->rec = 0; if(t->eq != nil && t->eq->id != 0){ t->eq->id = 0; n++; } if(t->kind == Tmodule){ for(id = t->tof->ids; id != nil; id = id->next) n += clearrec(id->ty); return n; } if(t->kind == Tadtpick) n += clearrec(t->decl->dot->ty); for(id = t->ids; id != nil; id = id->next) n += clearrec(id->ty); for(id = t->tags; id != nil; id = id->next) n += clearrec(id->ty); for(id = t->polys; id != nil; id = id->next) n += clearrec(id->ty); } return n; } /* must a variable of the given type be zeroed ? (for uninitialized declarations inside loops) */ int tmustzero(Type *t) { if(t==nil) return 0; if(tattr[t->kind].isptr) return 1; if(t->kind == Tadtpick) t = t->tof; if(t->kind == Ttuple || t->kind == Tadt) return mustzero(t->ids); return 0; } int mustzero(Decl *decls) { Decl *d; for (d = decls; d != nil; d = d->next) if (tmustzero(d->ty)) return 1; return 0; } int typeconv(Fmt *f) { Type *t; char *p, buf[1024]; t = va_arg(f->args, Type*); if(t == nil){ p = "nothing"; }else{ p = buf; buf[0] = 0; tprint(buf, buf+sizeof(buf), t); } return fmtstrcpy(f, p); } int stypeconv(Fmt *f) { Type *t; char *p, buf[1024]; t = va_arg(f->args, Type*); if(t == nil){ p = "nothing"; }else{ p = buf; buf[0] = 0; stprint(buf, buf+sizeof(buf), t); } return fmtstrcpy(f, p); } int ctypeconv(Fmt *f) { Type *t; char buf[1024]; t = va_arg(f->args, Type*); buf[0] = 0; ctprint(buf, buf+sizeof(buf), t); return fmtstrcpy(f, buf); } char* tprint(char *buf, char *end, Type *t) { Decl *id; Typelist *tl; if(t == nil) return buf; if(t->kind >= Tend) return seprint(buf, end, "kind %d", t->kind); switch(t->kind){ case Tarrow: buf = seprint(buf, end, "%T->%s", t->tof, t->decl->sym->name); break; case Tdot: buf = seprint(buf, end, "%T.%s", t->tof, t->decl->sym->name); break; case Tid: case Tpoly: buf = seprint(buf, end, "%s", t->decl->sym->name); break; case Tinst: buf = tprint(buf, end, t->tof); buf = secpy(buf ,end, "["); for(tl = t->u.tlist; tl != nil; tl = tl->nxt){ buf = tprint(buf, end, tl->t); if(tl->nxt != nil) buf = secpy(buf, end, ", "); } buf = secpy(buf, end, "]"); break; case Tint: case Tbig: case Tstring: case Treal: case Tbyte: case Tany: case Tnone: case Terror: case Tainit: case Talt: case Tcase: case Tcasel: case Tcasec: case Tgoto: case Tiface: case Texception: case Texcept: buf = secpy(buf, end, kindname[t->kind]); break; case Tfix: buf = seprint(buf, end, "%s(%v)", kindname[t->kind], t->val); break; case Tref: buf = secpy(buf, end, "ref "); buf = tprint(buf, end, t->tof); break; case Tchan: case Tarray: case Tlist: buf = seprint(buf, end, "%s of ", kindname[t->kind]); buf = tprint(buf, end, t->tof); break; case Tadtpick: buf = seprint(buf, end, "%s.%s", t->decl->dot->sym->name, t->decl->sym->name); break; case Tadt: if(t->decl->dot != nil && !isimpmod(t->decl->dot->sym)) buf = seprint(buf, end, "%s->%s", t->decl->dot->sym->name, t->decl->sym->name); else buf = seprint(buf, end, "%s", t->decl->sym->name); if(t->polys != nil){ buf = secpy(buf ,end, "["); for(id = t->polys; id != nil; id = id->next){ if(t->u.tmap != nil) buf = tprint(buf, end, valtmap(id->ty, t->u.tmap)); else buf = seprint(buf, end, "%s", id->sym->name); if(id->next != nil) buf = secpy(buf, end, ", "); } buf = secpy(buf, end, "]"); } break; case Tmodule: buf = seprint(buf, end, "%s", t->decl->sym->name); break; case Ttuple: buf = secpy(buf, end, "("); for(id = t->ids; id != nil; id = id->next){ buf = tprint(buf, end, id->ty); if(id->next != nil) buf = secpy(buf, end, ", "); } buf = secpy(buf, end, ")"); break; case Tfn: buf = secpy(buf, end, "fn"); if(t->polys != nil){ buf = secpy(buf, end, "["); for(id = t->polys; id != nil; id = id->next){ buf = seprint(buf, end, "%s", id->sym->name); if(id->next != nil) buf = secpy(buf, end, ", "); } buf = secpy(buf, end, "]"); } buf = secpy(buf, end, "("); for(id = t->ids; id != nil; id = id->next){ if(id->sym == nil) buf = secpy(buf, end, "nil: "); else buf = seprint(buf, end, "%s: ", id->sym->name); if(id->implicit) buf = secpy(buf, end, "self "); buf = tprint(buf, end, id->ty); if(id->next != nil) buf = secpy(buf, end, ", "); } if(t->varargs && t->ids != nil) buf = secpy(buf, end, ", *"); else if(t->varargs) buf = secpy(buf, end, "*"); if(t->tof != nil && t->tof->kind != Tnone){ buf = secpy(buf, end, "): "); buf = tprint(buf, end, t->tof); break; } buf = secpy(buf, end, ")"); break; default: yyerror("tprint: unknown type kind %d", t->kind); break; } return buf; } char* stprint(char *buf, char *end, Type *t) { if(t == nil) return buf; switch(t->kind){ case Tid: return seprint(buf, end, "id %s", t->decl->sym->name); case Tadt: case Tadtpick: case Tmodule: buf = secpy(buf, end, kindname[t->kind]); buf = secpy(buf, end, " "); return tprint(buf, end, t); } return tprint(buf, end, t); } /* generalize ref P.A, ref P.B to ref P */ /* Type* tparentx(Type *t1, Type* t2) { if(t1 == nil || t2 == nil || t1->kind != Tref || t2->kind != Tref) return t1; t1 = t1->tof; t2 = t2->tof; if(t1 == nil || t2 == nil || t1->kind != Tadtpick || t2->kind != Tadtpick) return t1; t1 = t1->decl->dot->ty; t2 = t2->decl->dot->ty; if(tequal(t1, t2)) return mktype(&t1->src.start, &t1->src.stop, Tref, t1, nil); return t1; } */ static int tparent0(Type *t1, Type *t2) { Decl *id1, *id2; if(t1 == t2) return 1; if(t1 == nil || t2 == nil) return 0; if(t1->kind == Tadt && t2->kind == Tadtpick) t2 = t2->decl->dot->ty; if(t1->kind == Tadtpick && t2->kind == Tadt) t1 = t1->decl->dot->ty; if(t1->kind != t2->kind) return 0; switch(t1->kind){ default: fatal("unknown type %t v %t in tparent", t1, t2); break; case Terror: case Tstring: case Tnone: case Tint: case Tbig: case Tbyte: case Treal: case Tany: return 1; case Texception: case Tfix: case Tfn: case Tadt: case Tmodule: case Tpoly: return tcompat(t1, t2, 0); case Tref: case Tlist: case Tarray: case Tchan: return tparent0(t1->tof, t2->tof); case Ttuple: for(id1 = t1->ids, id2 = t2->ids; id1 != nil && id2 != nil; id1 = id1->next, id2 = id2->next) if(!tparent0(id1->ty, id2->ty)) return 0; return id1 == nil && id2 == nil; case Tadtpick: return tequal(t1->decl->dot->ty, t2->decl->dot->ty); } return 0; } static Type* tparent1(Type *t1, Type *t2) { Type *t, *nt; Decl *id, *id1, *id2, *idt; if(t1->kind == Tadt && t2->kind == Tadtpick) t2 = t2->decl->dot->ty; if(t1->kind == Tadtpick && t2->kind == Tadt) t1 = t1->decl->dot->ty; switch(t1->kind){ default: return t1; case Tref: case Tlist: case Tarray: case Tchan: t = tparent1(t1->tof, t2->tof); if(t == t1->tof) return t1; return mktype(&t1->src.start, &t1->src.stop, t1->kind, t, nil); case Ttuple: nt = nil; id = nil; for(id1 = t1->ids, id2 = t2->ids; id1 != nil && id2 != nil; id1 = id1->next, id2 = id2->next){ t = tparent1(id1->ty, id2->ty); if(t != id1->ty){ if(nt == nil){ nt = mktype(&t1->src.start, &t1->src.stop, Ttuple, nil, dupdecls(t1->ids)); for(id = nt->ids, idt = t1->ids; idt != id1; id = id->next, idt = idt->next) ; } id->ty = t; } if(id != nil) id = id->next; } if(nt == nil) return t1; return nt; case Tadtpick: if(tequal(t1, t2)) return t1; return t1->decl->dot->ty; } return t1; } Type* tparent(Type *t1, Type *t2) { if(tparent0(t1, t2)) return tparent1(t1, t2); return t1; } /* * make the tuple type used to initialize an exception type */ Type* mkexbasetype(Type *t) { Decl *id, *new, *last; Type *nt; if(!t->cons) fatal("mkexbasetype on non-constant"); last = mkids(&t->decl->src, nil, tstring, nil); last->store = Dfield; nt = mktype(&t->src.start, &t->src.stop, Texception, nil, last); nt->cons = 0; new = mkids(&t->decl->src, nil, tint, nil); new->store = Dfield; last->next = new; last = new; for(id = t->ids; id != nil; id = id->next){ new = allocmem(sizeof *id); *new = *id; new->cyc = 0; last->next = new; last = new; } last->next = nil; return usetype(nt); } /* * make an instantiated exception type */ Type* mkextype(Type *t) { Type *nt; if(!t->cons) fatal("mkextype on non-constant"); if(t->tof != nil) return t->tof; nt = copytypeids(t); nt->cons = 0; t->tof = usetype(nt); return t->tof; } /* * convert an instantiated exception type to it's underlying type */ Type* mkextuptype(Type *t) { Decl *id; Type *nt; if(t->cons) return t; if(t->tof != nil) return t->tof; id = t->ids; if(id == nil) nt = t; else if(id->next == nil) nt = id->ty; else{ nt = copytypeids(t); nt->cons = 0; nt->kind = Ttuple; } t->tof = usetype(nt); return t->tof; } static void ckfix(Type *t, double max) { int p; vlong k, x; double s; s = t->val->rval; if(max == 0.0) k = ((vlong)1<<32)-1; else k = 2*(vlong)(max/s+0.5)+1; x = 1; for(p = 0; k > x; p++) x *= 2; if(p == 0 || p > 32){ error(t->src.start, "cannot fit fixed type into an int"); return; } if(p < 32) t->val->rval /= (double)(1<<(32-p)); } double scale(Type *t) { Node *n; if(t->kind == Tint || t->kind == Treal) return 1.0; if(t->kind != Tfix) fatal("scale() on non fixed point type"); n = t->val; if(n->op != Oconst) fatal("non constant scale"); if(n->ty != treal) fatal("non real scale"); return n->rval; } double scale2(Type *f, Type *t) { return scale(f)/scale(t); } #define I(x) ((int)(x)) #define V(x) ((Long)(x)) #define D(x) ((double)(x)) /* put x in normal form */ static int nf(double x, int *mant) { int p; double m; p = 0; m = x; while(m >= 1){ p++; m /= 2; } while(m < 0.5){ p--; m *= 2; } m *= D(1<<16)*D(1<<15); if(m >= D(0x7fffffff) - 0.5){ *mant = 0x7fffffff; return p; } *mant = I(m+0.5); return p; } static int ispow2(double x) { int m; nf(x, &m); if(m != 1<<30) return 0; return 1; } static int fround(double x, int n, int *m) { if(n != 31) fatal("not 31 in fround"); return nf(x, m); } static int fixmul2(double sx, double sy, double sr, int *rp, int *ra) { int k, n, a; double alpha; alpha = (sx*sy)/sr; n = 31; k = fround(1/alpha, n, &a); *rp = 1-k; *ra = 0; return IMULX; } static int fixdiv2(double sx, double sy, double sr, int *rp, int *ra) { int k, n, b; double beta; beta = sx/(sy*sr); n = 31; k = fround(beta, n, &b); *rp = k-1; *ra = 0; return IDIVX; } static int fixmul(double sx, double sy, double sr, int *rp, int *ra) { int k, m, n, a, v; vlong W; double alpha, eps; alpha = (sx*sy)/sr; if(ispow2(alpha)) return fixmul2(sx, sy, sr, rp, ra); n = 31; k = fround(1/alpha, n, &a); m = n-k; if(m < -n-1) return IMOVW; /* result is zero whatever the values */ v = 0; W = 0; eps = D(1<<m)/(alpha*D(a)) - 1; if(eps < 0){ v = a-1; eps = -eps; } if(m < 0 && D(1<<n)*eps*D(a) >= D(a)-1+D(1<<m)) W = (V(1)<<(-m)) - 1; if(v != 0 || W != 0) m = m<<2|(v != 0)<<1|(W != 0); *rp = m; *ra = a; return v == 0 && W == 0 ? IMULX0: IMULX1; } static int fixdiv(double sx, double sy, double sr, int *rp, int *ra) { int k, m, n, b, v; vlong W; double beta, eps; beta = sx/(sy*sr); if(ispow2(beta)) return fixdiv2(sx, sy, sr, rp, ra); n = 31; k = fround(beta, n, &b); m = k-n; if(m <= -2*n) return IMOVW; /* result is zero whatever the values */ v = 0; W = 0; eps = (D(1<<m)*D(b))/beta - 1; if(eps < 0) v = 1; if(m < 0) W = (V(1)<<(-m)) - 1; if(v != 0 || W != 0) m = m<<2|(v != 0)<<1|(W != 0); *rp = m; *ra = b; return v == 0 && W == 0 ? IDIVX0: IDIVX1; } static int fixcast(double sx, double sr, int *rp, int *ra) { int op; op = fixmul(sx, 1.0, sr, rp, ra); return op-IMULX+ICVTXX; } int fixop(int op, Type *tx, Type *ty, Type *tr, int *rp, int *ra) { double sx, sy, sr; sx = scale(tx); sy = scale(ty); sr = scale(tr); if(op == IMULX) op = fixmul(sx, sy, sr, rp, ra); else if(op == IDIVX) op = fixdiv(sx, sy, sr, rp, ra); else op = fixcast(sx, sr, rp, ra); return op; } int ispoly(Decl *d) { Type *t; if(d == nil) return 0; t = d->ty; if(t->kind == Tfn){ if(t->polys != nil) return 1; if((d = d->dot) == nil) return 0; t = d->ty; return t->kind == Tadt && t->polys != nil; } return 0; } int ispolyadt(Type *t) { return (t->kind == Tadt || t->kind == Tadtpick) && t->polys != nil && !(t->flags & INST); } Decl* polydecl(Decl *ids) { Decl *id; Type *t; for(id = ids; id != nil; id = id->next){ t = mktype(&id->src.start, &id->src.stop, Tpoly, nil, nil); id->ty = t; t->decl = id; } return ids; } /* try to convert an expression tree to a type */ Type* exptotype(Node *n) { Type *t, *tt; Decl *d; Typelist *tl; Src *src; if(n == nil) return nil; t = nil; switch(n->op){ case Oname: if((d = n->decl) != nil && d->store == Dtype) t = d->ty; break; case Otype: case Ochan: t = n->ty; break; case Oref: t = exptotype(n->left); if(t != nil) t = mktype(&n->src.start, &n->src.stop, Tref, t, nil); break; case Odot: t = exptotype(n->left); if(t != nil){ d = namedot(t->tags, n->right->decl->sym); if(d == nil) t = nil; else t = d->ty; } if(t == nil) t = exptotype(n->right); break; case Omdot: t = exptotype(n->right); break; case Oindex: t = exptotype(n->left); if(t != nil){ src = &n->src; tl = nil; for(n = n->right; n != nil; n = n->right){ if(n->op == Oseq) tt = exptotype(n->left); else tt = exptotype(n); if(tt == nil) return nil; tl = addtype(tt, tl); if(n->op != Oseq) break; } t = mkinsttype(src, t, tl); } break; } return t; } static char* uname(Decl *im) { Decl *p; int n; char *s; n = 0; for(p = im; p != nil; p = p->next) n += strlen(p->sym->name)+1; s = allocmem(n); strcpy(s, ""); for(p = im; p != nil; p = p->next){ strcat(s, p->sym->name); if(p->next != nil) strcat(s, "+"); } return s; } /* check all implementation modules have consistent declarations * and create their union if needed */ Decl* modimp(Dlist *dl, Decl *im) { Decl *u, *d, *dd, *ids, *dot, *last; Sym *s; Dlist *dl0; long sg, sg0; char buf[StrSize], *un; if(dl->next == nil) return dl->d; dl0 = dl; sg0 = 0; un = uname(im); seprint(buf, buf+sizeof(buf), ".m.%s", un); installids(Dglobal, mkids(&dl->d->src, enter(buf, 0), tnone, nil)); u = dupdecl(dl->d); u->sym = enter(un, 0); u->sym->decl = u; u->ty = mktype(&u->src.start, &u->src.stop, Tmodule, nil, nil); u->ty->decl = u; last = nil; for( ; dl != nil; dl = dl->next){ d = dl->d; ids = d->ty->tof->ids; /* iface */ if(ids != nil && ids->store == Dglobal) /* .mp */ sg = sign(ids); else sg = 0; if(dl == dl0) sg0 = sg; else if(sg != sg0) error(d->src.start, "%s's module data not consistent with that of %s\n", d->sym->name, dl0->d->sym->name); for(ids = d->ty->ids; ids != nil; ids = ids->next){ s = ids->sym; if(s->decl != nil && s->decl->scope >= scope){ if(ids == s->decl){ dd = dupdecl(ids); if(u->ty->ids == nil) u->ty->ids = dd; else last->next = dd; last = dd; continue; } dot = s->decl->dot; if(s->decl->store != Dwundef && dot != nil && dot != d && isimpmod(dot->sym) && dequal(ids, s->decl, 1)) ids->refs = s->decl->refs; else redecl(ids); ids->init = s->decl->init; } } } u->ty = usetype(u->ty); return u; } static void modres(Decl *d) { Decl *ids, *id, *n, *i; Type *t; for(ids = d->ty->ids; ids != nil; ids = ids->next){ id = ids->sym->decl; if(ids != id){ n = ids->next; i = ids->iface; t = ids->ty; *ids = *id; ids->next = n; ids->iface = i; ids->ty = t; } } } /* update the fields of duplicate declarations in other implementation modules * and their union */ void modresolve(void) { Dlist *dl; dl = impdecls; if(dl->next == nil) return; for( ; dl != nil; dl = dl->next) modres(dl->d); modres(impdecl); } se Tnone: case Tint: case Tbig: case Tbyte: case Treal: case Tany: return 1; case Texception: case Tfix: case Tfn: case Tadt: case Tmodule: case Tpoly: return tcompat(t1, t2, 0); case Tref: case Tlist: case Tarray: case Tchan: return told_contrib//root/sys/src/cmd/limbo/limbo.1��������������������������������������������������������� 664 � 0 � 0 � 7503 10745531345 17242�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������sys��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.TH LIMBO 1E .SH NAME limbo \- Limbo compiler .SH SYNOPSIS .EX limbo [ \f2option ...\fP ] [ \f2file ...\fP ] .EE .SH DESCRIPTION .B Limbo compiles the named Limbo .I files into machine-independent object files for the Dis virtual machine. Depending on the options, the compiler may create output files or write information to its standard output. Conventional files and their extensions include the following. .TP 10 .IB file .b Limbo source file. .TP .IB file .dis Object code for the Dis virtual machine. .TP .IB file .m Limbo source file for .B module declarations. .TP .IB file .s Assembly code. .TP .IB file .sbl Symbolic debugging information. .PP With no options, .B limbo produces a .B \&.dis file for each source file. .PP The compiler options are: .TP 1i .B -a Print on standard output type definitions and call frames useful for writing C language implementations of Limbo modules. Suppresses normal output file generation. .TP .B -C Mark the Dis object file to prevent run-time compilation. .TP .B -c Mark the Dis object file to guarantee run-time compilation. .TP .BI -D " flags" Turn on debugging .IR flags . Flags include .B A for arrays, .B a for .B alt statements, .B b for booleans, .B C for .B case body statements, .B c for .B case statements, .B D for use descriptors, .B d for declarations, .B e for expressions, .B E for extended expressions, .B F for function information, .B f for constant folding, .B m for modules, .B n for .B nil references, .B P for program counter manipulations, .B r for reference types, .B S for type signatures, .B s for a code generation summary, .B T for tuples, .B t for type checking, and .B v for variable initialization. .TP .B -e Increase the number of errors the compiler will report before exiting. .TP .B -G Annotate assembly language output with debugging information. A no-op unless .B -S is set. .TP .B -g Generate debugging information for the input files and place it in a file named by stripping any trailing .B \&.b from the input file name and appending .BR .sbl . .TP .B -i Disable inlining of functions. Currently functions containing a single return statement or two return statements and an if clause are candidates for inlining. .TP .BI \-I " dir" An .B include file whose name does not begin with slash is sought first relative to the working directory, regardless of the source .I file argument. If this fails, .B limbo sequences through directories named in .B \-I options, then searches in .BR /module . An .B include file contains Limbo source code, normally holding one or more .B module declarations. .TP .BI \-o " obj" Place output in file .I obj (allowed only if there is a single input .IR file ). The output file will hold either object or assembly code, depending on .BR \-S . Default is to take the last element of the input file name, strip any trailing .BR .b , and append .B .dis for object code and .B .s for assembly code. Thus, the default output file for .B dir/mod.b would be .BR mod.dis . .TP .B \-S Create assembly language output instead of object code. .TP \f5\-T\fP\ \f2module Print on standard output C stub functions, useful for implementing Limbo modules in the C language for linkage with the interpreter. .TP \f5\-t\fP\ \f2module Print on standard output a table of runtime functions, to link C language implementations of modules with the Limbo interpreter. Suppresses normal output file generation. .TP .B \-w Print warning messages about unused variables, etc. More \f5w\fP's (e.g., \f5\-ww\fP) increase the pedantry of the checking. .PP .SH FILES .TF /sys/src/cmd/limbo/module .TP .B /sys/src/cmd/limbo/module default directory for Limbo .B include modules .SH SOURCE .TF /sys/src/cmd/limbo .TP .B /sys/src/cmd/limbo compiler source in C for host .SH "SEE ALSO" .IR dis (1) .PP ``The Limbo Programming Language'' .br ``Program Development in Inferno'' .br ``A Descent into Limbo'' .br in Volume 2. e sx, double sy, double sr, int *rp, int *ra) { int k, m, n, a, v; vlong W; double alpha, eps; alpha = (sx*sy)/sr; if(ispow2(alpha)) return fixmul2(sx, sy, sr, rp, ra); n = 31; k old_contrib//root/sys/src/cmd/limbo/limbo.proto����������������������������������������������������� 664 � 0 � 0 � 101 10745531002 20662�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������386 bin limbo sys man 1 limbo src cmd limbo + ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/mkfile���������������������������������������������������������� 664 � 0 � 0 � 313 10745516332 17703�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������default:VQ: all all:VQ: for (i in libmp libsec libmath) @{ cd $i mk all } @{ cd limbo; mk } install:VQ: all @{ cd limbo; mk install } clean:VQ: for (i in lib* limbo) @{ cd $i mk clean } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/��������������������������������������������������������� 775 � 0 � 0 � 0 11411740064 20011��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/NOTICE��������������������������������������������������� 664 � 0 � 0 � 2423 10560641720 20721�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This copyright NOTICE applies to all files in this directory and subdirectories, unless another copyright notice appears in a given file or subdirectory. If you take substantial code from this software to use in other programs, you must somehow include with it an appropriate copyright notice that includes the copyright notice and the other notices below. It is fine (and often tidier) to do that in a separate file such as NOTICE, LICENCE or COPYING. Copyright © 1995-1999 Lucent Technologies Inc. Portions Copyright © 1997-2000 Vita Nuova Limited Portions Copyright © 2000-2007 Vita Nuova Holdings Limited This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (`LGPL') as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ope >= scope){ if(ids == s->decl){ dd = dupdecl(ids); if(u->ty->ids == nil) u->ty->ids = dd; else last->next = dd; last = dd; continue; } dot = s->decl->dot; if(s->decl->store != Dwundold_contrib//root/sys/src/cmd/limbo/module/alphabet/������������������������������������������������ 775 � 0 � 0 � 0 11411740034 21566��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/alphabet/abc.m������������������������������������������� 664 � 0 � 0 � 3442 10141507350 22475�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# warning: autogenerated code; don't bother to change this, change mktypeset.b or abc.b instead Abc: module { PATH: con "/dis/alphabet/abc.dis"; Value: adt { m: fn(v: self ref Value): ref Value.Vm; # vmods t: fn(v: self ref Value): ref Value.Vt; # vtypes A: fn(v: self ref Value): ref Value.VA; # abc w: fn(v: self ref Value): ref Value.Vw; # wfd c: fn(v: self ref Value): ref Value.Vc; # cmd r: fn(v: self ref Value): ref Value.Vr; # status f: fn(v: self ref Value): ref Value.Vf; # fd s: fn(v: self ref Value): ref Value.Vs; # string typec: fn(v: self ref Value): int; type2s: fn(t: int): string; free: fn(v: self ref Value, used: int); dup: fn(v: self ref Value): ref Value; pick { Vm => i: Modulesval; Vt => i: Typesval; VA => i: Abcval; Vw => i: chan of ref Sys->FD; Vc => i: ref Sh->Cmd; Vr => i: chan of string; Vf => i: chan of ref Sys->FD; Vs => i: string; } }; init: fn(); Abcval: adt { refcount: chan of int; alphabet: Alphabet; }; Typesval: adt { abc: ref Value.VA; types: list of ref Type; }; Modulesval: adt { abc: ref Value.VA; types: list of ref Type; mods: list of (string, string, ref Sh->Cmd); query: chan of (string, chan of (string, ref Sh->Cmd)); }; Type: adt { name: string; actname: string; nodup: int; destructor: ref Sh->Cmd; }; mkabc: fn(alphabet: Alphabet): ref Value.VA; }; Abcmodule: module { types: fn(): string; init: fn(); quit: fn(); run: fn(errorc: chan of string, r: ref Reports->Report, opts: list of (int, list of ref Abc->Value), args: list of ref Abc->Value): ref Abc->Value; }; Declares: module { PATH: con "/dis/alphabet/abc/declares.dis"; init: fn(); quit: fn(); declares: fn(a: Alphabet, decls: ref Sh->Cmd, errorc: chan of string, stopc: chan of int): string; }; B e for expressions, .B E for extended expressions, .B F for function information, .B f for constant folding, .B m for modules, .B n for .B nil references, .B P for program counter manipulations, .B r for reference types, old_contrib//root/sys/src/cmd/limbo/module/alphabet/abcstyx.m��������������������������������������� 664 � 0 � 0 � 1447 10066320066 23433�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ABCStyx: module { PATH: con "/dis/alphabet/abcstyx.dis"; Value: adt { c: fn(v: self ref Value): ref Value.C; # cmd s: fn(v: self ref Value): ref Value.S; # string w: fn(v: self ref Value): ref Value.W; # wfd x: fn(v: self ref Value): ref Value.D; # styx typec: fn(v: self ref Value): int; type2s: fn(t: int): string; discard: fn(v: self ref Value); reusable: fn(v: self ref Value): int; pick { S => i: string; C => i: ref Sh->Cmd; W => i: chan of ref Sys->FD; X => i: (chan of ref Styx->Rmsg, chan of ref Styx->Tmsg); } }; init: fn(); }; Styxmodule: module { types: fn(): string; init: fn(); run: fn(errorc: chan of string, r: ref Reports->Report, opts: list of (int, list of ref ABCStyx->Value), args: list of ref ABCStyx->Value): ref ABCStyx->Value; }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/alphabet/abctypes.m�������������������������������������� 664 � 0 � 0 � 1505 10141507350 23560�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# warning: autogenerated code; don't bother to change this, change mktypeset.b or abc.b instead Abctypes: module { PATH: con "/dis/alphabet/abctypes.dis"; Abccvt: adt { values: ref Extvalues->Values[ref Abc->Value]; int2ext: fn(cvt: self ref Abccvt, v: ref Abc->Value): ref Alphabet->Value; ext2int: fn(cvt: self ref Abccvt, ev: ref Alphabet->Value): ref Abc->Value; dup: fn(cvt: self ref Abccvt, ev: ref Alphabet->Value): ref Alphabet->Value; free: fn(cvt: self ref Abccvt, ev: ref Alphabet->Value, used: int); }; proxy: fn(): chan of ref Proxy->Typescmd[ref Alphabet->Value]; proxy0: fn(): ( chan of ref Proxy->Typescmd[ref Alphabet->Value], chan of (string, chan of ref Proxy->Typescmd[ref Abc->Value]), ref Abccvt ); }; Abcsubtypes: module { proxy: fn(): chan of ref Proxy->Typescmd[ref Abc->Value]; }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/alphabet/endpoints.m������������������������������������� 664 � 0 � 0 � 571 10066320066 23736�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Endpoints: module { PATH: con "/dis/alphabet/endpoints.dis"; Endpoint: adt { addr: string; id: string; about: string; text: fn(e: self Endpoint): string; mk: fn(s: string): Endpoint; }; init: fn(); new: fn(net, addr: string, force: int): string; create: fn(addr: string): (ref Sys->FD, Endpoint); open: fn(net: string, ep: Endpoint): (ref Sys->FD, string); }; ���������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/alphabet/extvalues.m������������������������������������� 664 � 0 � 0 � 473 10133454414 23754�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Extvalues: module { PATH: con "/dis/alphabet/extvalues.dis"; Values: adt[V] { lock: chan of int; v: array of (int, V); freeids: list of int; new: fn(): ref Values[V]; add: fn(vals: self ref Values, v: V): int; inc: fn(vals: self ref Values, id: int); del: fn(vals: self ref Values, id: int); }; }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/alphabet/fs.m�������������������������������������������� 664 � 0 � 0 � 3753 10141507350 22365�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# warning: autogenerated code; don't bother to change this, change mktypeset.b or fs.b instead Fs: module { PATH: con "/dis/alphabet/fs.dis"; Value: adt { r: fn(v: self ref Value): ref Value.Vr; # status d: fn(v: self ref Value): ref Value.Vd; # data c: fn(v: self ref Value): ref Value.Vc; # command f: fn(v: self ref Value): ref Value.Vf; # fd s: fn(v: self ref Value): ref Value.Vs; # string m: fn(v: self ref Value): ref Value.Vm; # selector p: fn(v: self ref Value): ref Value.Vp; # gate t: fn(v: self ref Value): ref Value.Vt; # entries x: fn(v: self ref Value): ref Value.Vx; # fs typec: fn(v: self ref Value): int; type2s: fn(t: int): string; free: fn(v: self ref Value, used: int); dup: fn(v: self ref Value): ref Value; pick { Vr => i: chan of string; Vd => i: Datachan; Vc => i: ref Sh->Cmd; Vf => i: chan of ref Sys->FD; Vs => i: string; Vm => i: Cmpchan; Vp => i: Gatechan; Vt => i: Entrychan; Vx => i: Fschan; } }; init: fn(); sendnulldir: fn(c: Fschan): int; copy: fn(src, dst: Fschan): int; Option: adt { opt: int; args: list of ref Value; }; Datachan: adt { d: chan of array of byte; stop: chan of int; }; Entrychan: adt { sync: chan of int; c: chan of Entry; }; Cmpchan: type chan of (ref Sys->Dir, ref Sys->Dir, chan of int); Entry: type (ref Sys->Dir, string, int); Gatequery: type (Entry, chan of int); Gatechan: type chan of Gatequery; Fsdata: adt { dir: ref Sys->Dir; data: array of byte; }; Fschan: type chan of (Fsdata, chan of int); Next, Down, Skip, Quit: con iota; Nilentry: con (nil, nil, 0); }; Fsmodule: module { types: fn(): string; init: fn(); run: fn(ctxt: ref Draw->Context, r: ref Reports->Report, opts: list of Fs->Option, args: list of ref Fs->Value): ref Fs->Value; }; Fsfilter: module { PATH: con "/dis/alphabet/fsfilter.dis"; filter: fn[T](t: T, src, dst: Fs->Fschan) for{ T => query: fn(t: self T, d: ref Sys->Dir, name: string, depth: int): int; }; }; ���������������������old_contrib//root/sys/src/cmd/limbo/module/alphabet/fstypes.m��������������������������������������� 664 � 0 � 0 � 1466 10141507350 23451�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# warning: autogenerated code; don't bother to change this, change mktypeset.b or fs.b instead Fstypes: module { PATH: con "/dis/alphabet/fstypes.dis"; Fscvt: adt { values: ref Extvalues->Values[ref Fs->Value]; int2ext: fn(cvt: self ref Fscvt, v: ref Fs->Value): ref Alphabet->Value; ext2int: fn(cvt: self ref Fscvt, ev: ref Alphabet->Value): ref Fs->Value; dup: fn(cvt: self ref Fscvt, ev: ref Alphabet->Value): ref Alphabet->Value; free: fn(cvt: self ref Fscvt, ev: ref Alphabet->Value, used: int); }; proxy: fn(): chan of ref Proxy->Typescmd[ref Alphabet->Value]; proxy0: fn(): ( chan of ref Proxy->Typescmd[ref Alphabet->Value], chan of (string, chan of ref Proxy->Typescmd[ref Fs->Value]), ref Fscvt ); }; Fssubtypes: module { proxy: fn(): chan of ref Proxy->Typescmd[ref Fs->Value]; }; Vc => i: ref Sh->Cmd; Vr => i: chan of string; Vf => i: chan of ref Sys->FD; Vs => i: string; } }; init: fn(); Abcval: adt { refcount: chan of int; alphabet: Alphabet; }; Tyold_contrib//root/sys/src/cmd/limbo/module/alphabet/grid.m������������������������������������������ 664 � 0 � 0 � 2163 10141507350 22674�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# warning: autogenerated code; don't bother to change this, change mktypeset.b or grid.b instead Grid: module { PATH: con "/dis/alphabet/grid.dis"; Value: adt { b: fn(v: self ref Value): ref Value.Vb; # records e: fn(v: self ref Value): ref Value.Ve; # endpoint w: fn(v: self ref Value): ref Value.Vw; # wfd c: fn(v: self ref Value): ref Value.Vc; # cmd r: fn(v: self ref Value): ref Value.Vr; # status f: fn(v: self ref Value): ref Value.Vf; # fd s: fn(v: self ref Value): ref Value.Vs; # string typec: fn(v: self ref Value): int; type2s: fn(t: int): string; free: fn(v: self ref Value, used: int); dup: fn(v: self ref Value): ref Value; pick { Vb => i: chan of ref Sys->FD; Ve => i: chan of Endpoints->Endpoint; Vw => i: chan of ref Sys->FD; Vc => i: ref Sh->Cmd; Vr => i: chan of string; Vf => i: chan of ref Sys->FD; Vs => i: string; } }; init: fn(); }; Gridmodule: module { types: fn(): string; init: fn(); run: fn(errorc: chan of string, r: ref Reports->Report, opts: list of (int, list of ref Grid->Value), args: list of ref Grid->Value): ref Grid->Value; }; cmd s: fn(v: self ref Value): ref Value.S; # string w: fn(v: self ref Value): ref Value.W; # wfd x: fn(v: self ref Value): ref Value.D; # styx typec: fn(v: self ref Value): int; type2s: fn(t: int): string; discard: fn(v: self ref Value); reusable: fn(v: self ref Value): int; pick { S => i: string; C => i: ref Sh->Cmd; W => i: chan of ref Sys->FD; X => i: (cold_contrib//root/sys/src/cmd/limbo/module/alphabet/gridtypes.m������������������������������������� 664 � 0 � 0 � 1524 10141507350 23761�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# warning: autogenerated code; don't bother to change this, change mktypeset.b or grid.b instead Gridtypes: module { PATH: con "/dis/alphabet/gridtypes.dis"; Gridcvt: adt { values: ref Extvalues->Values[ref Grid->Value]; int2ext: fn(cvt: self ref Gridcvt, v: ref Grid->Value): ref Alphabet->Value; ext2int: fn(cvt: self ref Gridcvt, ev: ref Alphabet->Value): ref Grid->Value; dup: fn(cvt: self ref Gridcvt, ev: ref Alphabet->Value): ref Alphabet->Value; free: fn(cvt: self ref Gridcvt, ev: ref Alphabet->Value, used: int); }; proxy: fn(): chan of ref Proxy->Typescmd[ref Alphabet->Value]; proxy0: fn(): ( chan of ref Proxy->Typescmd[ref Alphabet->Value], chan of (string, chan of ref Proxy->Typescmd[ref Grid->Value]), ref Gridcvt ); }; Gridsubtypes: module { proxy: fn(): chan of ref Proxy->Typescmd[ref Grid->Value]; }; f Alphabet->Value): ref Abc->Value; dup: fn(cvt: self ref Abccvt, ev: ref Alphabet->Value): ref Alphabet->Value; free: fn(cvt: self ref Abccvt, ev: ref Alphabet->Value,old_contrib//root/sys/src/cmd/limbo/module/alphabet/reports.m��������������������������������������� 664 � 0 � 0 � 1146 10141505325 23445�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Reports: module { PATH: con "/dis/alphabet/reports.dis"; Report: adt { startc: chan of (string, chan of string, chan of int); enablec: chan of int; enable: fn(r: self ref Report); start: fn(r: self ref Report, name: string): chan of string; add: fn(r: self ref Report, name: string, errorc: chan of string, stopc: chan of int); }; KILL, PROPAGATE: con 1<<iota; reportproc: fn(errorc: chan of string, stopc: chan of int, reply: chan of ref Report); quit: fn(errorc: chan of string); report: fn(errorc: chan of string, err: string); newpgrp: fn(stopc: chan of int, flags: int): chan of int; }; tring; about: string; text: fn(e: self Endpoint): string; mk: fn(s: string): Endpoint; }; init: fn(); new: fn(net, addr: string, force: int): string; create: fn(addr: string): (ref Sys->FD, Endpoint); open: fn(net: string, ep: Endpoint): (ref Sys->FD, string); }; ���������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/alphabet.m����������������������������������������������� 664 � 0 � 0 � 14703 10141746510 21775�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Alphabet: module { PATH: con "/dis/alphabet/alphabet.dis"; ONDEMAND, CHECK: con 1<<iota; init: fn(); copy: fn(): Alphabet; quit: fn(); loadtypeset: fn(qname: string, c: chan of ref Proxy->Typescmd[ref Value], errorc: chan of string): string; declare: fn(qname: string, sig: string, flags: int): string; undeclare: fn(name: string): string; importmodule: fn(qname: string): string; importtype: fn(qname: string): string; importvalue: fn(v: ref Value, qname: string): (ref Value, string); autoconvert: fn(src, dst: string, transform: ref Sh->Cmd, errorc: chan of string): string; define: fn(name: string, expr: ref Sh->Cmd, errorc: chan of string): string; setautodeclare: fn(on: int); Decltypeset: adt { name: string; alphabet: string; types: array of string; mods: array of (string, string); }; Declarations: adt { typesets: array of Decltypeset; defs: array of (string, string); }; # getdecls: fn(): ref Declarations; # getexprdecls: fn(e: ref Sh->Cmd): ref Declarations; # declcompat: fn(d0, d1: ref Declarations): int; getmodule: fn(name: string): (string, string, ref Sh->Cmd); gettypesets: fn(): list of string; getmodules: fn(): list of string; gettypesetmodules: fn(tsname: string): chan of string; gettypes: fn(typeset: string): list of string; getautoconversions: fn(): list of (string, string, ref Sh->Cmd); typecompat: fn(t0, t1: string): (int, string); show: fn(); mkqname: fn(typeset, name: string): string; canon: fn(qname: string): string; splitqname: fn(qname: string): (string, string); parse: fn(expr: string): (ref Sh->Cmd, string); eval: fn(expr: ref Sh->Cmd, drawctxt: ref Draw->Context, args: list of ref Value): string; eval0: fn(expr: ref Sh->Cmd, dsttype: string, drawctxt: ref Draw->Context, report: ref Reports->Report, errorc: chan of string, args: list of ref Value, vc: chan of ref Value); rewrite: fn(expr: ref Sh->Cmd, dsttype: string, errorc: chan of string): (ref Sh->Cmd, string); Value: adt { free: fn(v: self ref Value, used: int); dup: fn(v: self ref Value): ref Value; gets: fn(v: self ref Value): string; isstring: fn(v: self ref Value): int; type2s: fn(tc: int): string; typec: fn(v: self ref Value): int; typename: fn(v: self ref Value): string; c: fn(v: self ref Value): ref Value.Vc; s: fn(v: self ref Value): ref Value.Vs; r: fn(v: self ref Value): ref Value.Vr; f: fn(v: self ref Value): ref Value.Vf; w: fn(v: self ref Value): ref Value.Vw; d: fn(v: self ref Value): ref Value.Vd; z: fn(v: self ref Value): ref Value.Vz; pick{ Vc => i: ref Sh->Cmd; Vs => i: string; Vr => i: chan of string; Vf or Vw => i: chan of ref Sys->FD; Vd => i: Datachan; Vz => i: Proxyval; # a proxy for the actual value, held by another process } }; Proxyval: adt { typec: int; id: int; }; Datachan: adt { d: chan of array of byte; stop: chan of int; }; }; Mainmodule: module { typesig: fn(): string; init: fn(); quit: fn(); run: fn(ctxt: ref Draw->Context, r: ref Reports->Report, errorc: chan of string, opts: list of (int, list of ref Alphabet->Value), args: list of ref Alphabet->Value): ref Alphabet->Value; }; # evaluate an expression Eval: module { PATH: con "/dis/alphabet/eval.dis"; init: fn(); Context: adt[V, M, Ectxt] for { V => dup: fn(t: self V): V; free: fn(v: self V, used: int); isstring: fn(v: self V): int; gets: fn(t: self V): string; type2s: fn(tc: int): string; typec: fn(t: self V): int; M => find: fn(c: Ectxt, s: string): (M, string); typesig: fn(m: self M): string; run: fn(m: self M, c: Ectxt, errorc: chan of string, opts: list of (int, list of V), args: list of V): V; mks: fn(c: Ectxt, s: string): V; mkc: fn(c: Ectxt, cmd: ref Sh->Cmd): V; typename2c: fn(s: string): int; cvt: fn(c: Ectxt, v: V, tc: int, errorc: chan of string): V; } { eval: fn( expr: ref Sh->Cmd, ctxt: Ectxt, errorc: chan of string, args: list of V ): V; }; cmdusage: fn[V](nil: V, sig: string): string for { V => type2s: fn(tc: int): string; }; usage2sig: fn[V](nil: V, u: string): (string, string) for{ V => typename2c: fn(s: string): int; }; blocksig: fn[M, Ectxt](nil: M, ctxt: Ectxt, c: ref Sh->Cmd): (string, string) for{ M => typename2c: fn(s: string): int; find: fn(c: Ectxt, s: string): (M, string); typesig: fn(m: self M): string; }; typecompat: fn(t0, t1: string): int; splittype: fn(t: string): (int, string, string); }; Extvalues: module { PATH: con "/dis/alphabet/extvalues.dis"; Values: adt[V] { lock: chan of int; v: array of (int, V); freeids: list of int; new: fn(): ref Values[V]; add: fn(vals: self ref Values, v: V): int; inc: fn(vals: self ref Values, id: int); del: fn(vals: self ref Values, id: int); }; }; # generic proxy implementation: Proxy: module { PATH: con "/dis/alphabet/proxy.dis"; # operators on a type system Typescmd: adt[V] { pick { Load => cmd: string; reply: chan of (chan of ref Modulecmd[V], string); Dup => v: V; reply: chan of V; Free => v: V; used: int; reply: chan of int; Alphabet => reply: chan of string; Type2s => tc: int; reply: chan of string; Loadtypes => name: string; reply: chan of (chan of ref Typescmd[V], string); Modules => reply: chan of string; } }; # proxy for a loaded module. Modulecmd: adt[V] { pick { Typesig => reply: chan of string; Run => ctxt: ref Draw->Context; report: ref Reports->Report; errorc: chan of string; # stopc: chan of int; opts: list of (int, list of V); args: list of V; reply: chan of V; } }; proxy: fn[Ctxt,Cvt,M,V,EV](ctxt: Ctxt): ( chan of ref Proxy->Typescmd[EV], chan of (string, chan of ref Proxy->Typescmd[V]) ) for { M => typesig: fn(m: self M): string; run: fn(m: self M, ctxt: ref Draw->Context, r: ref Reports->Report, errorc: chan of string, opts: list of (int, list of V), args: list of V): V; quit: fn(m: self M); Ctxt => loadtypes: fn(ctxt: self Ctxt, name: string): (chan of ref Proxy->Typescmd[V], string); type2s: fn(ctxt: self Ctxt, tc: int): string; alphabet: fn(ctxt: self Ctxt): string; modules: fn(ctxt: self Ctxt, r: chan of string); find: fn(ctxt: self Ctxt, s: string): (M, string); getcvt: fn(ctxt: self Ctxt): Cvt; Cvt => int2ext: fn(cvt: self Cvt, v: V): EV; ext2int: fn(cvt: self Cvt, ev: EV): V; free: fn(cvt: self Cvt, v: EV, used: int); dup: fn(cvt: self Cvt, v: EV): EV; }; }; ef Sh->Cmd; W => i: chan of ref Sys->FD; X => i: (cold_contrib//root/sys/src/cmd/limbo/module/arg.m���������������������������������������������������� 664 � 0 � 0 � 360 7611530761 20707�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Arg : module { PATH: con "/dis/lib/arg.dis"; init: fn(argv: list of string); setusage: fn(usage: string); usage: fn(); opt: fn(): int; arg: fn(): string; earg: fn(): string; progname: fn(): string; argv: fn(): list of string; }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/asn1.m��������������������������������������������������� 664 � 0 � 0 � 4637 7104312250 21017�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ASN1: module { PATH: con "/dis/lib/asn1.dis"; # Tag classes Universal : con 0; Application : con 16r40; Context : con 16r80; Private : con 16rC0; # Universal tags BOOLEAN : con 1; INTEGER : con 2; BIT_STRING : con 3; OCTET_STRING : con 4; NULL : con 5; OBJECT_ID: con 6; ObjectDescriptor : con 7; EXTERNAL : con 8; REAL : con 9; ENUMERATED : con 10; EMBEDDED_PDV : con 11; SEQUENCE : con 16; # also SEQUENCE OF SET : con 17; # also SET OF NumericString : con 18; PrintableString : con 19; TeletexString : con 20; VideotexString : con 21; IA5String : con 22; UTCTime : con 23; GeneralizedTime : con 24; GraphicString : con 25; VisibleString : con 26; GeneralString : con 27; UniversalString : con 28; BMPString : con 30; Elem: adt { tag: Tag; val: ref Value; is_seq: fn(e: self ref Elem) : (int, list of ref Elem); is_set: fn(e: self ref Elem) : (int, list of ref Elem); is_int: fn(e: self ref Elem) : (int, int); is_bigint: fn(e: self ref Elem) : (int, array of byte); is_bitstring: fn(e: self ref Elem) : (int, int, array of byte); is_octetstring: fn(e: self ref Elem) : (int, array of byte); is_oid: fn(e: self ref Elem) : (int, ref Oid); is_string: fn(e: self ref Elem) : (int, string); is_time: fn(e: self ref Elem) : (int, string); tostring: fn(e: self ref Elem) : string; }; Tag: adt { class: int; num: int; constr: int; # ignored by encode() tostring: fn(t: self Tag) : string; }; Value: adt { pick { Bool or Int => v: int; Octets or BigInt or Real or Other => # BigInt: integer too big for limbo int # Real: we don't care to decode these # since they are hardly ever used bytes: array of byte; BitString => # pack into bytes, with perhaps some # unused bits in last byte unusedbits: int; bits: array of byte; Null or EOC => dummy: int; ObjId => id: ref Oid; String => s: string; Seq or Set => l: list of ref Elem; } tostring : fn(v: self ref Value) : string; }; Oid: adt { nums: array of int; tostring: fn(o: self ref Oid) : string; }; init: fn(); decode: fn(a: array of byte) : (string, ref Elem); decode_seq: fn(a: array of byte) : (string, list of ref Elem); decode_value: fn(a: array of byte, kind, constr: int) : (string, ref Value); encode: fn(e: ref Elem) : (string, array of byte); oid_lookup: fn(o: ref Oid, tab: array of Oid) : int; print_elem: fn(e: ref Elem); }; tring): string; importvalue: fn(v: ref Value, qname: string): (ref Value, string); autoconvert:old_contrib//root/sys/src/cmd/limbo/module/attrdb.m������������������������������������������������� 664 � 0 � 0 � 5541 7700327061 21440�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Attrdb: module { PATH: con "/dis/lib/attrdb.dis"; Attr: adt { attr: string; val: string; tag: int; # application-defined data, initially 0 }; Tuples: adt { n: int; pairs: list of ref Attr; hasattr: fn(t: self ref Tuples, attr: string): int; haspair: fn(t: self ref Tuples, attr: string, value: string): int; find: fn(t: self ref Tuples, attr: string): list of ref Attr; findbyattr: fn(t: self ref Tuples, attr: string, value: string, rattr: string): list of ref Attr; }; Dbentry: adt { n: int; lines: list of ref Tuples; find: fn(e: self ref Dbentry, attr: string): list of (ref Tuples, list of ref Attr); findfirst: fn(e: self ref Dbentry, attr: string): string; findpair: fn(e: self ref Dbentry, attr: string, value: string): list of ref Tuples; findbyattr: fn(e: self ref Dbentry, attr: string, value: string, rattr: string): list of (ref Tuples, list of ref Attr); }; Dbptr: adt { dbs: list of ref Dbf; index: ref Attrindex->Index; pick{ Direct => offset: int; Hash => current: int; next: int; } }; Dbf: adt { fd: ref Bufio->Iobuf; name: string; dir: ref Sys->Dir; indices: list of ref Attrindex->Index; lockc: chan of int; open: fn(path: string): ref Dbf; sopen: fn(data: string): ref Dbf; changed: fn(f: self ref Dbf): int; reopen: fn(f: self ref Dbf): int; # for supporting commands: readentry: fn(dbf: self ref Dbf, offset: int, attr: string, value: string, useval: int): (ref Dbentry, int, int); }; Db: adt { dbs: list of ref Dbf; open: fn(path: string): ref Db; sopen: fn(data: string): ref Db; append: fn(db1: self ref Db, db2: ref Db): ref Db; changed: fn(db: self ref Db): int; reopen: fn(db: self ref Db): int; find: fn(db: self ref Db, start: ref Dbptr, attr: string): (ref Dbentry, ref Dbptr); findpair: fn(db: self ref Db, start: ref Dbptr, attr: string, value: string): (ref Dbentry, ref Dbptr); findbyattr: fn(db: self ref Db, start: ref Dbptr, attr: string, value: string, rattr: string): (ref Dbentry, ref Dbptr); }; init: fn(): string; parseentry: fn(s: string, lno: int): (ref Dbentry, int, string); parseline: fn(s: string, lno: int): (ref Tuples, string); }; Attrindex: module { PATH: con "/dis/lib/attrhash.dis"; Index: adt { fd: ref Sys->FD; attr: string; mtime: int; size: int; tab: array of byte; open: fn(dbf: Attrdb->Dbf, attr: string, fd: ref Sys->FD): ref Index; }; init: fn(): string; }; Attrhash: module { PATH: con "/dis/lib/attrhash.dis"; NDBPLEN: con 3; # file pointer length in bytes NDBHLEN: con 4+4; # file header length (mtime[4], length[4]) NDBSPEC: con 1<<23; # flag bit for something special NDBCHAIN: con NDBSPEC; # pointer to collision chain NDBNAP: con NDBSPEC | 1; # not a pointer init: fn(): string; attrindex: fn(): Attrindex; hash: fn(s: string, hlen: int): int; get3, get4: fn(a: array of byte): int; }; fn( expr: ref Sh->Cmd, ctxt: Ectxt, errorc: chan of string, args: list of V ): V; }; cmdusage: fn[V](nil: V, sig: string): string for { V old_contrib//root/sys/src/cmd/limbo/module/auth9.m�������������������������������������������������� 664 � 0 � 0 � 7143 10015761340 21225�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Auth9: module { PATH: con "/dis/lib/auth9.dis"; # # plan 9 authentication # ANAMELEN: con 28; # maximum size of name in previous proto AERRLEN: con 64; # maximum size of errstr in previous proto DOMLEN: con 48; # length of an authentication domain name DESKEYLEN: con 7; # length of a des key for encrypt/decrypt CHALLEN: con 8; # length of a plan9 sk1 challenge NETCHLEN: con 16; # max network challenge length (used in AS protocol) SECRETLEN: con 32; # max length of a secret # encryption numberings (anti-replay) AuthTreq: con 1; # ticket request AuthChal: con 2; # challenge box request AuthPass: con 3; # change password AuthOK: con 4; # fixed length reply follows AuthErr: con 5; # error follows AuthMod: con 6; # modify user AuthApop: con 7; # apop authentication for pop3 AuthOKvar: con 9; # variable length reply follows AuthChap: con 10; # chap authentication for ppp AuthMSchap: con 11; # MS chap authentication for ppp AuthCram: con 12; # CRAM verification for IMAP (RFC2195 & rfc2104) AuthHttp: con 13; # http domain login AuthVNC: con 14; # VNC server login (deprecated) AuthTs: con 64; # ticket encrypted with server's key AuthTc: con 65; # ticket encrypted with client's key AuthAs: con 66; # server generated authenticator AuthAc: con 67; # client generated authenticator AuthTp: con 68; # ticket encrypted with client's key for password change AuthHr: con 69; # http reply Ticketreq: adt { rtype: int; authid: string; # [ANAMELEN] server's encryption id authdom: string; # [DOMLEN] server's authentication domain chal: array of byte; # [CHALLEN] challenge from server hostid: string; # [ANAMELEN] host's encryption id uid: string; # [ANAMELEN] uid of requesting user on host pack: fn(t: self ref Ticketreq): array of byte; unpack: fn(a: array of byte): (int, ref Ticketreq); }; TICKREQLEN: con 3*ANAMELEN+CHALLEN+DOMLEN+1; Ticket: adt { num: int; # replay protection chal: array of byte; # [CHALLEN] server challenge cuid: string; # [ANAMELEN] uid on client suid: string; # [ANAMELEN] uid on server key: array of byte; # [DESKEYLEN] nonce DES key pack: fn(t: self ref Ticket, key: array of byte): array of byte; unpack: fn(a: array of byte, key: array of byte): (int, ref Ticket); }; TICKETLEN: con CHALLEN+2*ANAMELEN+DESKEYLEN+1; Authenticator: adt { num: int; # replay protection chal: array of byte; # [CHALLEN] id: int; # authenticator id, ++'d with each auth pack: fn(f: self ref Authenticator, key: array of byte): array of byte; unpack: fn(a: array of byte, key: array of byte): (int, ref Authenticator); }; AUTHENTLEN: con CHALLEN+4+1; Passwordreq: adt { num: int; old: array of byte; # [ANAMELEN] new: array of byte; # [ANAMELEN] changesecret: int; secret: array of byte; # [SECRETLEN] new secret pack: fn(f: self ref Passwordreq, key: array of byte): array of byte; unpack: fn(a: array of byte, key: array of byte): (int, ref Passwordreq); }; PASSREQLEN: con 2*ANAMELEN+1+1+SECRETLEN; # secure ID and Plan 9 auth key/request/reply encryption netcrypt: fn(key: array of byte, chal: string): string; passtokey: fn(pw: string): array of byte; des56to64: fn(a: array of byte): array of byte; encrypt: fn(key: array of byte, data: array of byte, n: int); decrypt: fn(key: array of byte, data: array of byte, n: int); # dial auth server # authdial(netroot: string, authdom: string): ref Sys->FD; # exchange messages with auth server _asgetticket: fn(fd: ref Sys->FD, tr: ref Ticketreq, key: array of byte): (ref Ticket, array of byte); _asrdresp: fn(fd: ref Sys->FD, n: int): array of byte; init: fn(); }; on 16r40; Context : con 16r80; Private : con 16rC0; # Universal tags BOOLEAN : con 1; INTEGER : con 2; BIT_STRING : con 3; OCTET_STRING : con 4; NULL : con 5; OBJECT_ID: con 6; ObjectDescriptor : con 7; EXTERNAL : con 8; REAL : con 9; ENUMERATED : con 10; EMBEDDED_PDV : con 11; SEQUENCE : con 16; # also SEQUENCE OF SET : con 17; # also SET OF NumericString : con 18; PrintableString : conold_contrib//root/sys/src/cmd/limbo/module/bench.m�������������������������������������������������� 664 � 0 � 0 � 331 6672206215 21213�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Benchmarking Bench: module { PATH: con "$Bench"; FD: adt { fd: int; }; microsec: fn(): big; reset: fn(); read: fn(fd: ref FD, buf: array of byte, n: int): int; disablegc: fn(); enablegc: fn(); };�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/bloomfilter.m�������������������������������������������� 664 � 0 � 0 � 423 7712276332 22457�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bloomfilter: module { PATH: con "/dis/lib/bloomfilter.dis"; init: fn(); # logm is log base 2 of the number of bits in the bloom filter. # k is number of independent hashes of d that are entered into the filter. filter: fn(d: array of byte, logm, k: int): Sets->Set; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/brutus.m������������������������������������������������� 664 � 0 � 0 � 1210 6622405626 21477�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Brutus: module { # Font tags are given as (font*NSIZE + size) Size6, Size8, Size10, Size12, Size16, NSIZE: con iota; Roman, Italic, Bold, Type, NFONT: con iota; NFONTTAG: con NFONT*NSIZE; Example, Caption, List, Listelem, Label, Labelref, Exercise, Heading, Nofill, Author, Title, Index, Indextopic, NTAG: con NFONTTAG + iota; DefFont: con Roman; DefSize: con Size10; TitleFont: con Bold; TitleSize: con Size16; HeadingFont: con Bold; HeadingSize: con Size12; fontname: array of string; sizename: array of string; tagname: array of string; tagconfig: array of string; init: fn(ctxt: ref Draw->Context, args: list of string); }; first: fn(e: self ref Dbentry, attr: string): string; findpair: fn(e: self ref Dbentry, attr: string, value: string): list of ref Tuples; findbyattr: fn(e: self ref Dbentry, attr: string, value: string, rattr: string): list of (ref Tuples, list of ref Attr); }; Dbptr: adt { dbs: list of ref Dbf; index: ref Attrindex->Index; pick{ Direct => offset: int; Hold_contrib//root/sys/src/cmd/limbo/module/brutusext.m���������������������������������������������� 664 � 0 � 0 � 1165 7654000677 22234�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Brutusext: module { # More tags, needed by Cook SGML, Text, Par, Extension, Float, Special: con Brutus->NTAG + iota; # Output formats FLatex, FLatexProc, FLatexBook, FLatexPart, FLatexSlides, FLatexPaper, FHtml: con iota; # Cook element Celem: adt { tag: int; s: string; contents: cyclic ref Celem; parent: cyclic ref Celem; next: cyclic ref Celem; prev: cyclic ref Celem; }; init: fn(sys: Sys, draw: Draw, bufio: Bufio, tk: Tk, tkclient: Tkclient); create: fn(parent: string, t: ref Tk->Toplevel, name, args: string): string; cook: fn(parent: string, fmt: int, args: string) : (ref Celem, string); }; ring, lno: int): (ref Tuples, string); }; Attrindex: module { PATH: con "/dis/lib/attrhash.dis"; Index: adt { fd: ref Sys->FD; attr: string; mtime: int; size: int; tab: array of byte; open: fn(dbf: Attrdb->Dbf, attr: string, fd: ref Sys->FD): ref Index; }; init: fn(): string; }; Attrhash: module { PATH: con "/dis/lib/attrhash.dis"; NDBPLEN: con 3; # file pointer lengthold_contrib//root/sys/src/cmd/limbo/module/bufio.m�������������������������������������������������� 664 � 0 � 0 � 3546 7734566200 21276�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bufio: module { PATH: con "/dis/lib/bufio.dis"; SEEKSTART: con Sys->SEEKSTART; SEEKRELA: con Sys->SEEKRELA; SEEKEND: con Sys->SEEKEND; OREAD: con Sys->OREAD; OWRITE: con Sys->OWRITE; ORDWR: con Sys->ORDWR; EOF: con -1; ERROR: con -2; Iobuf: adt { seek: fn(b: self ref Iobuf, n: big, where: int): big; offset: fn(b: self ref Iobuf): big; read: fn(b: self ref Iobuf, a: array of byte, n: int): int; write: fn(b: self ref Iobuf, a: array of byte, n: int): int; getb: fn(b: self ref Iobuf): int; getc: fn(b: self ref Iobuf): int; gets: fn(b: self ref Iobuf, sep: int): string; gett: fn(b: self ref Iobuf, sep: string): string; ungetb: fn(b: self ref Iobuf): int; ungetc: fn(b: self ref Iobuf): int; putb: fn(b: self ref Iobuf, b: byte): int; putc: fn(b: self ref Iobuf, c: int): int; puts: fn(b: self ref Iobuf, s: string): int; flush: fn(b: self ref Iobuf): int; close: fn(b: self ref Iobuf); setfill: fn(b: self ref Iobuf, f: BufioFill); # Internal variables fd: ref Sys->FD; # the file buffer: array of byte; # the buffer index: int; # read/write pointer in buffer size: int; # characters remaining/written dirty: int; # needs flushing bufpos: big; # position in file of buf[0] filpos: big; # current file pointer lastop: int; # OREAD or OWRITE mode: int; # mode of open }; open: fn(name: string, mode: int): ref Iobuf; create: fn(name: string, mode, perm: int): ref Iobuf; fopen: fn(fd: ref Sys->FD, mode: int): ref Iobuf; sopen: fn(input: string): ref Iobuf; aopen: fn(input: array of byte): ref Iobuf; }; BufioFill: module { fill: fn(b: ref Bufio->Iobuf): int; }; ChanFill: module { PATH: con "/dis/lib/chanfill.dis"; init: fn(data: array of byte, fid: int, wc: Sys->Rwrite, r: ref Sys->FileIO, b: Bufio): ref Bufio->Iobuf; fill: fn(b: ref Bufio->Iobuf): int; }; th client's key for password change AuthHr: con 69; # http reply Ticketreq: adt { rtype: int; authid: string; # [ANAMELEN] server's encryption id old_contrib//root/sys/src/cmd/limbo/module/bundle.m������������������������������������������������� 664 � 0 � 0 � 500 7757166135 21416�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bundle: module { PATH: con "/dis/fs/bundle.dis"; types: fn(): string; init: fn(); run: fn(nil: ref Draw->Context, report: ref Fslib->Report, nil: list of Fslib->Option, args: list of ref Fslib->Value): ref Fslib->Value; bundle: fn(r: ref Fslib->Report, iob: ref Bufio->Iobuf, c: Fslib->Fschan): chan of int; }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/cci.m���������������������������������������������������� 664 � 0 � 0 � 320 6622405626 20672�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������CCI: module { PATH: con "/dis/lib/cci.dis"; # Common Client Interface, for external control of Charon init: fn(smod: String, hctl: chan of string); view: fn(url, ctype: string, data: array of byte); }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/cfg.m���������������������������������������������������� 664 � 0 � 0 � 1050 7642342512 20711�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Cfg : module { PATH : con "/dis/lib/cfg.dis"; Attr : adt { name : string; value : string; }; Tuple : adt { lnum : int; attrs : list of Attr; lookup: fn (t : self ref Tuple, name : string) : string; }; Record : adt { tuples : list of ref Tuple; lookup : fn (r : self ref Record, name : string) : (string, ref Tuple); }; init : fn (path : string) : string; reset: fn(); lookup : fn (name : string) : list of (string, ref Record); getkeys : fn () : list of string; parseline: fn(s: string, lno: int): (ref Tuple, string); }; on "$Bench"; FD: adt { fd: int; }; microsec: fn(): big; reset: fn(); read: fn(fd: ref FD, buf: array of byte, n: int): int; disablegc: fn(); enablegc: fn(); };�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/cfgfile.m������������������������������������������������ 664 � 0 � 0 � 1124 6622405626 21556�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # simple adt that operates on whitespace separated config files # such as /services/webget/config # CfgFile: module { PATH: con "/dis/lib/cfgfile.dis"; ConfigFile: adt { getcfg: fn(me: self ref ConfigFile,field:string):list of string; setcfg: fn(me: self ref ConfigFile,field:string,val:string); delete: fn(me: self ref ConfigFile,field:string); flush: fn(me: self ref ConfigFile): string; # ----- private ------ lines: list of string; file: string; readonly: int; }; init: fn(file:string):ref ConfigFile; verify: fn(defaultpath: string, path: string) :ref Sys->FD; }; ���������������� 664 � 0 � 0 � 1210 6622405626 21477�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/complete.m����������������������������������������������� 664 � 0 � 0 � 703 10550407312 21756�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Complete: module { PATH: con "/dis/lib/complete.dis"; Completion: adt { advance: int; # whether forward progress has been made complete: int; # whether the completion now represents a file or directory str: string; # string to advance, suffixed " " (file) or "/" (directory) nmatch: int; # number of files that matched filename: array of string; # their names }; init: fn(); complete: fn(dir, s: string): (ref Completion, string); }; �������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/convcs.m������������������������������������������������� 664 � 0 � 0 � 1401 7311632475 21450�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright © 2001 Vita Nuova Limited # Btos: module { init: fn(arg: string): string; btos: fn(s: Convcs->State, b: array of byte, nchars: int) : (Convcs->State, string, int); }; Stob: module { init: fn(arg: string): string; stob: fn(s: Convcs->State, str: string): (Convcs->State, array of byte); }; Convcs: module { PATH: con "/dis/lib/convcs/convcs.dis"; CHARSETS: con "/lib/charsets"; BTOS, STOB: con 1 << iota; # enumcs() mode values BOTH: con BTOS | STOB; State: type string; Startstate: con ""; init: fn(csfile: string): string; getbtos: fn(cs: string): (Btos, string); getstob: fn(cs: string): (Stob, string); enumcs: fn(): list of (string, string, int); # (cs, description, mode) aliases: fn(cs : string): (string, list of string); }; string; mtime: int; size: int; tab: array of byte; open: fn(dbf: Attrdb->Dbf, attr: string, fd: ref Sys->FD): ref Index; }; init: fn(): string; }; Attrhash: module { PATH: con "/dis/lib/attrhash.dis"; NDBPLEN: con 3; # file pointer lengthold_contrib//root/sys/src/cmd/limbo/module/crc.m���������������������������������������������������� 664 � 0 � 0 � 1273 7734566035 20742�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Crc: module { PATH: con "/dis/lib/crc.dis"; CRCstate: adt { crc: int; crctab: array of int; reg: int; }; # setup crc table with given polynomial (if 0 default polynomial used) # (the polynomial has an implicit top bit set) # reg is the initial value of the CRC register # (usually 0 but 16rfffffffrf in the CRC32 algorithm for example) init: fn(poly: int, reg: int): ref CRCstate; # calculate crc of first nb bytes in given array of bytes and return its value # may be called repeatedly to calculate crc of a series of arrays of bytes crc : fn(state: ref CRCstate, buf: array of byte, nb: int): int; # reset crc state to its initial value reset: fn(state: ref CRCstate); }; uf): int; ungetc: fn(b: self ref Iobuf): int; putb: fn(b: self ref Iobuf, b: byte): int; putc: fn(b: self ref Iobuf, c: int): int; puts: fn(b: self ref Iobuf, s: string): int; flush: fn(b: self ref Iobuf): int; close: fn(b: self ref Iobuf); setfill: fn(b: self ref Iobuf, f: BufioFill); # Internal vold_contrib//root/sys/src/cmd/limbo/module/css.m���������������������������������������������������� 664 � 0 � 0 � 3321 10245652172 20764�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # CSS parsing module # # CSS2.1 style sheets # # Copyright © 2001, 2005 Vita Nuova Holdings Limited. All rights reserved. # CSS: module { PATH: con "/dis/lib/w3c/css.dis"; Stylesheet: adt { charset: string; imports: list of ref Import; statements: list of ref Statement; }; Import: adt { name: string; media: list of string; }; Statement: adt { pick{ Media => media: list of string; rules: list of ref Statement.Ruleset; Page => pseudo: string; decls: list of ref Decl; Ruleset => selectors: list of Selector; decls: list of ref Decl; } }; Decl: adt { property: string; values: list of ref Value; important: int; }; Selector: type list of (int, Simplesel); # int is combinator from [ >+] Simplesel: type list of ref Select; Select: adt { name: string; pick{ Element or ID or Any or Class or Pseudo => Attrib => op: string; # "=" "~=" "|=" value: ref Value; # optional Ident or String Pseudofn => arg: string; } }; Value: adt { sep: int; # which operator of [ ,/] preceded this value in list pick{ String or Number or Percentage or Url or Unicoderange => value: string; Hexcolour => value: string; # as given rgb: (int, int, int); # converted RGB => args: cyclic list of ref Value; # as given rgb: (int, int, int); # converted Ident => name: string; Unit => value: string; # int or float units: string; # suffix giving units ("cm", "khz", and so on, always lower case) Function => name: string; args: cyclic list of ref Value; } }; init: fn(diag: int); parse: fn(s: string): (ref Stylesheet, string); parsedecl: fn(s: string): (list of ref Decl, string); # unescape: fn(s: string): string; }; ������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/csv.m���������������������������������������������������� 664 � 0 � 0 � 231 10443473341 20743�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������CSV: module { PATH: con "/dis/lib/csv.dis"; init: fn(b: Bufio); getline: fn(fd: ref Bufio->Iobuf): list of string; quote: fn(s: string): string; }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/cvsimages.m���������������������������������������������� 664 � 0 � 0 � 477 7210520233 22114�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Cvsimages: module { PATH: con "/dis/lib/cvsimages.dis"; init: fn(); Cvsimage: adt { new: fn(win: ref Tk->Toplevel, w: string): ref Cvsimage; fix: fn(ci: self ref Cvsimage); config: fn(ci: self ref Cvsimage): int; image: ref Draw->Image; win: ref Tk->Toplevel; w: string; r: Draw->Rect; }; }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/daytime.m������������������������������������������������ 664 � 0 � 0 � 2460 7321070223 21603�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Daytime: module { PATH: con "/dis/lib/daytime.dis"; Tm: adt { sec: int; # seconds (0 to 59) min: int; # minutes (0 to 59) hour: int; # hours (0 to 23) mday: int; # day of the month (1 to 31) mon: int; # month (0 to 11) year: int; # year-1900; 2000AD is 100 wday: int; # day of week (0 to 6, Sunday is 0) yday: int; # day of year (0 to 365) zone: string; # time zone name tzoff: int; # time zone offset (seconds from GMT) }; # now: # return the time in seconds since the epoch # # time: # return the current local time as string # # text: # convert a time structure from local or gmt # into a text string # # filet: # return a string containing the file time # prints mon day hh:mm if the file is < 6 months old # mon day year if > 6 months old # # local: # uses /locale/timezone to convert an epoch time in seconds into # a local time structure # # gmt: # return a time structure for GMT # # tm2epoch: # convert a time structure to an epoch time in seconds # # string2tm: # parse a string representing a date into a time structure now: fn(): int; time: fn(): string; text: fn(tm: ref Tm): string; filet: fn(now, file: int): string; local: fn(tim: int): ref Tm; gmt: fn(tim: int): ref Tm; tm2epoch: fn(tm: ref Tm): int; string2tm: fn(date: string): ref Tm; }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/db.m����������������������������������������������������� 664 � 0 � 0 � 3405 6622405627 20551�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������DB : module { PATH : con "/dis/lib/db.dis"; # Open the connection to the DB server # returns (New handle, "") or (nil, "Error Message") # open: fn(addr, username, password, dbname: string) : (ref DB_Handle, list of string); # # Opens a connection to an Inferno on the database machine, with the # specified level of security. # connect : fn(addr, alg : string) : (ref Sys->FD, string); # # Mounts the file descriptor on dir, then opens the database. # dbopen: fn(fd : ref Sys->FD, username, password, dbname : string) : (ref DB_Handle, list of string); DB_Handle : adt { # # Open another SQL stream for the same connection. # SQLOpen : fn(oldh : self ref DB_Handle) : (int, ref DB_Handle); SQLClose : fn(dbh : self ref DB_Handle) : int; # Execute the SQL command # returns (0, "") or (error code, "Message") # SQL: fn(handle: self ref DB_Handle, command: string) : (int, list of string); # Check the number of columns of last select command # columns: fn(handle: self ref DB_Handle): int; # Fetch the next row of the selection results. # returns current row number, or 0 # nextRow: fn(handle: self ref DB_Handle): int; # Read the data of column[i] of current row # read: fn(handle: self ref DB_Handle, column: int) : (int, array of byte); # Write data to be used for parameter[i] # write: fn(handle: self ref DB_Handle, column: int, fieldval: array of byte) : int; # Title of the column[i] # columnTitle: fn(handle: self ref DB_Handle, column: int) : string; #error message associated with last command # errmsg: fn(handle: self ref DB_Handle): string; datafd : ref Sys->FD; sqlconn:int; sqlstream : int; lock : chan of int; }; }; r�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/dbm.m���������������������������������������������������� 775 � 0 � 0 � 1565 10102463467 20750�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Dbm: module { PATH: con "/dis/lib/dbm.dis"; Datum: type array of byte; Dbf: adt { create: fn(file: string, perm: int): ref Dbf; open: fn(file: string, flags: int): ref Dbf; fetch: fn(db: self ref Dbf, key: Datum): Datum; delete: fn(db: self ref Dbf, key: Datum): int; store: fn(db: self ref Dbf, key: Datum, dat: Datum, replace: int): int; firstkey: fn(db: self ref Dbf): Datum; nextkey: fn(db: self ref Dbf, key: Datum): Datum; flush: fn(db: self ref Dbf); isrdonly: fn(db: self ref Dbf): int; dirf: ref Sys->FD; # directory pagf: ref Sys->FD; # page flags: int; maxbno: int; # last `bno' in page file bitno: int; hmask: int; blkno: int; # current page to read/write pagbno: int; # current page in pagbuf pagbuf: array of byte; # [PBLKSIZ] dirbno: int; # current block in dirbuf dirbuf: array of byte; # [DBLKSIZ] }; init: fn(); }; �������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/debug.m�������������������������������������������������� 664 � 0 � 0 � 5755 10063624364 21277�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Debug: module { PATH: con "/dis/lib/debug.dis"; Terror, Tid, Tadt, Tadtpick, Tarray, Tbig, Tbyte, Tchan, Treal, Tfn, Targ, Tlocal, Tglobal, Tint, Tlist, Tmodule, Tnil, Tnone, Tref, Tstring, Ttuple, Tend, Targs, Tslice, Tpoly: con iota; Pos: adt { file: string; line: int; # line number: origin 1 pos: int; # character within the line: origin 0 }; Src: adt { start: Pos; # range within source files stop: Pos; }; Id: adt { src: ref Src; name: string; offset: int; # start of pc, offset in frame, etc stoppc: int; # limit pc of function t: cyclic ref Type; }; Type: adt { src: ref Src; kind: int; size: int; name: string; # for adts, modules Of: cyclic ref Type; # for lists, arrays, etc. ids: cyclic array of ref Id; # for adts, etc. locals for fns tags: cyclic array of ref Type;# for adts with pick tags text: fn(t: self ref Type, sym: ref Sym): string; getkind: fn(t: self ref Type, sym: ref Sym): int; }; Sym: adt { path: string; name: string; # implements name src: array of ref Src; srcstmt: array of int; adts: array of ref Type; fns: array of ref Id; vars: array of ref Id; srctopc: fn(s: self ref Sym, src: ref Src): int; pctosrc: fn(s: self ref Sym, pc: int): ref Src; }; Module: adt { path: string; # from whence loaded code: int; # address of code start data: int; # address of data comp: int; # compiled to native assembler? sym: ref Sym; addsym: fn(m: self ref Module, sym: ref Sym); stdsym: fn(m: self ref Module); dis: fn(m: self ref Module): string; sbl: fn(m: self ref Module): string; }; StepExp, StepStmt, StepOver, StepOut: con iota; Prog: adt { id: int; heap: ref Sys->FD; # prog heap file ctl: ref Sys->FD; # prog control file dbgctl: ref Sys->FD; # debug file stk: ref Sys->FD; # stack file status: fn(p: self ref Prog): (int, string, string, string); stack: fn(p: self ref Prog): (array of ref Exp, string); step: fn(p: self ref Prog, how: int): string; cont: fn(p: self ref Prog): string; grab: fn(p: self ref Prog): string; start: fn(p: self ref Prog): string; stop: fn(p: self ref Prog): string; unstop: fn(p: self ref Prog): string; kill: fn(p: self ref Prog): string; event: fn(p: self ref Prog): string; setbpt: fn(p: self ref Prog, dis: string, pc: int): string; delbpt: fn(p: self ref Prog, dis: string, pc: int): string; }; Exp: adt { name: string; offset: int; pc: int; m: ref Module; p: ref Prog; # this is private id: ref Id; expand: fn(e: self ref Exp): array of ref Exp; val: fn(e: self ref Exp): (string, int); typename: fn(e: self ref Exp): string; kind: fn(e: self ref Exp): int; src: fn(e: self ref Exp): ref Src; findsym:fn(e: self ref Exp): string; srcstr: fn(e: self ref Exp): string; }; init: fn(): int; sym: fn(sbl: string): (ref Sym, string); prog: fn(pid: int): (ref Prog, string); startprog: fn(dis, dir: string, ctxt: ref Draw->Context, argv: list of string): (ref Prog, string); }; �������������������old_contrib//root/sys/src/cmd/limbo/module/devpointer.m��������������������������������������������� 664 � 0 � 0 � 1332 7654000742 22333�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Devpointer: module { PATH: con "/dis/lib/devpointer.dis"; Size: con 1+4*12; # 'm' plus 4 12-byte decimal integers # merge events that have the same button state. Ptrqueue: adt { last: ref Draw->Pointer; h, t: list of ref Draw->Pointer; put: fn(q: self ref Ptrqueue, s: ref Draw->Pointer); get: fn(q: self ref Ptrqueue): ref Draw->Pointer; peek: fn(q: self ref Ptrqueue): ref Draw->Pointer; nonempty: fn(q: self ref Ptrqueue): int; }; init: fn(); reader: fn(file: string, posn: chan of ref Draw->Pointer, pid: chan of (int, string)); bytes2ptr: fn(b: array of byte): ref Draw->Pointer; ptr2bytes: fn(p: ref Draw->Pointer): array of byte; srv: fn(c: chan of ref Draw->Pointer, f: ref Sys->FileIO); }; nth (0 to 11) year: int; # year-1900; 2000AD is 100 wday: int; # day of week (0 to 6, Sunday is 0) yday: int; # day of year (0 to 365) zone: string; # time zone name tzoff: int; # time zone offset (seconds from GMT) }; # now: # return the time in seconds since the epoch # # timold_contrib//root/sys/src/cmd/limbo/module/dhcp.m��������������������������������������������������� 664 � 0 � 0 � 4152 10367402606 21115�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Dhcpclient: module { PATH: con "/dis/lib/dhcpclient.dis"; Bootconf: adt { ip: string; ipgw: string; ipmask: string; bootf: string; bootip: string; dhcpip: string; siaddr: string; serverid: string; sys: string; dom: string; lease: int; options: array of array of byte; vendor: array of array of byte; new: fn(): ref Bootconf; get: fn(c: self ref Bootconf, n: int): array of byte; getint: fn(c: self ref Bootconf, n: int): int; getip: fn(c: self ref Bootconf, n: int): string; getips: fn(c: self ref Bootconf, n: int): list of string; gets: fn(c: self ref Bootconf, n: int): string; put: fn(c: self ref Bootconf, n: int, a: array of byte); putint: fn(c: self ref Bootconf, n: int, v: int); putips: fn(c: self ref Bootconf, n: int, ips: list of string); puts: fn(c: self ref Bootconf, n: int, s: string); }; Lease: adt { pid: int; configs: chan of (ref Bootconf, string); release: fn(l: self ref Lease); }; init: fn(); tracing: fn(debug: int); bootp: fn(net: string, ctlifc: ref Sys->FD, device: string, init: ref Bootconf): (ref Bootconf, string); dhcp: fn(net: string, ctlifc: ref Sys->FD, device: string, init: ref Bootconf, options: array of int): (ref Bootconf, ref Lease, string); applycfg: fn(net: string, ctlifc: ref Sys->FD, conf: ref Bootconf): string; removecfg: fn(net: string, ctlifc: ref Sys->FD, conf: ref Bootconf): string; # bootp options used here Opad: con 0; Oend: con 255; Omask: con 1; Orouter: con 3; Odnsserver: con 6; Ocookieserver: con 8; Ohostname: con 12; Odomainname: con 15; Ontpserver: con 42; Ovendorinfo: con 43; Onetbiosns: con 44; Osmtpserver: con 69; Opop3server: con 70; Owwwserver: con 72; # dhcp options Oipaddr: con 50; Olease: con 51; Ooverload: con 52; Otype: con 53; Oserverid: con 54; Oparams: con 55; Omessage: con 56; Omaxmsg: con 57; Orenewaltime: con 58; Orebindingtime: con 59; Ovendorclass: con 60; Oclientid: con 61; Otftpserver: con 66; Obootfile: con 67; Ovendor: con (1<<8); OP9fs: con Ovendor|128; # plan 9 file server OP9auth: con Ovendor|129; # plan 9 auth server Infinite: con ~0; # lease }; # returns current row number, or 0 # nextRow: fn(handle: self ref DB_Handle): int; # Read the data of column[i] of current row # read: fn(handle: self ref DB_Handle, column: int) : (int, array of byte); # Write data to be used for parameter[i] # write: fn(handle: self ref DB_Handle, column: int, fieldval: array of byte) : int; # Title of the column[i] # columold_contrib//root/sys/src/cmd/limbo/module/dialog.m������������������������������������������������� 664 � 0 � 0 � 450 7515141063 21371�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Dialog: module { PATH: con "/dis/lib/dialog.dis"; init: fn(): string; prompt: fn(ctxt: ref Draw->Context, parent: ref Draw->Image, ico, title, msg: string, dflt: int, labs: list of string): int; getstring: fn(ctxt: ref Draw->Context, parent: ref Draw->Image, msg: string): string; }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/dict.m��������������������������������������������������� 664 � 0 � 0 � 467 6622405627 21074�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Dictionary: module { PATH: con "/dis/lib/dict.dis"; Dict: adt { entries: list of (string, string); add: fn( d: self ref Dict, e: (string, string) ); delete: fn( d: self ref Dict, k: string ); lookup: fn( d: self ref Dict, k: string ) :string; keys: fn( d: self ref Dict ): list of string; }; };���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/dis.m���������������������������������������������������� 664 � 0 � 0 � 7405 10023323632 20750�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Dis: module { PATH: con "/dis/lib/dis.dis"; XMAGIC: con 819248; SMAGIC: con 923426; MUSTCOMPILE: con 1<<0; DONTCOMPILE: con 1<<1; SHAREMP: con 1<<2; DYNMOD: con 1<<3; HASLDT0: con 1<<4; HASEXCEPT: con 1<<5; HASLDT: con 1<<6; AMP: con 16r00; # Src/Dst op addressing AFP: con 16r01; AIMM: con 16r02; AXXX: con 16r03; AIND: con 16r04; AMASK: con 16r07; ARM: con 16rC0; # Middle op addressing AXNON: con 16r00; AXIMM: con 16r40; AXINF: con 16r80; AXINM: con 16rC0; DEFZ: con 0; DEFB: con 1; # Byte DEFW: con 2; # Word DEFS: con 3; # Utf-string DEFF: con 4; # Real value DEFA: con 5; # Array DIND: con 6; # Set index DAPOP: con 7; # Restore address register DEFL: con 8; # BIG DMAX: con 1<<4; Inst: adt { op: int; addr: int; mid: int; src: int; dst: int; }; Type: adt { size: int; np: int; map: array of byte; }; Data: adt { op: int; # encoded op n: int; # number of elements off: int; # byte offset in data space pick { Zero => # DEFZ Bytes => # DEFB bytes: array of byte; Words => # DEFW words: array of int; String => # DEFS str: string; Reals => # DEFF reals: array of real; Array => # DEFA typex: int; length: int; Aindex => # DIND index: int; Arestore => # DAPOP Bigs => # DEFL bigs: array of big; } }; Link: adt { pc: int; desc: int; sig: int; name: string; }; Import: adt { sig: int; name: string; }; Except: adt { s: string; pc: int; }; Handler: adt { pc1: int; pc2: int; eoff: int; ne: int; t: ref Type; etab: array of ref Except; }; Mod: adt { name: string; srcpath: string; magic: int; rt: int; ssize: int; isize: int; dsize: int; tsize: int; lsize: int; entry: int; entryt: int; inst: array of ref Inst; types: array of ref Type; data: list of ref Data; links: array of ref Link; imports: array of array of ref Import; handlers: array of ref Handler; sign: array of byte; }; INOP, IALT, INBALT, IGOTO, ICALL, IFRAME, ISPAWN, IRUNT, ILOAD, IMCALL, IMSPAWN, IMFRAME, IRET, IJMP, ICASE, IEXIT, INEW, INEWA, INEWCB, INEWCW, INEWCF, INEWCP, INEWCM, INEWCMP, ISEND, IRECV, ICONSB, ICONSW, ICONSP, ICONSF, ICONSM, ICONSMP, IHEADB, IHEADW, IHEADP, IHEADF, IHEADM, IHEADMP, ITAIL, ILEA, IINDX, IMOVP, IMOVM, IMOVMP, IMOVB, IMOVW, IMOVF, ICVTBW, ICVTWB, ICVTFW, ICVTWF, ICVTCA, ICVTAC, ICVTWC, ICVTCW, ICVTFC, ICVTCF, IADDB, IADDW, IADDF, ISUBB, ISUBW, ISUBF, IMULB, IMULW, IMULF, IDIVB, IDIVW, IDIVF, IMODW, IMODB, IANDB, IANDW, IORB, IORW, IXORB, IXORW, ISHLB, ISHLW, ISHRB, ISHRW, IINSC, IINDC, IADDC, ILENC, ILENA, ILENL, IBEQB, IBNEB, IBLTB, IBLEB, IBGTB, IBGEB, IBEQW, IBNEW, IBLTW, IBLEW, IBGTW, IBGEW, IBEQF, IBNEF, IBLTF, IBLEF, IBGTF, IBGEF, IBEQC, IBNEC, IBLTC, IBLEC, IBGTC, IBGEC, ISLICEA, ISLICELA, ISLICEC, IINDW, IINDF, IINDB, INEGF, IMOVL, IADDL, ISUBL, IDIVL, IMODL, IMULL, IANDL, IORL, IXORL, ISHLL, ISHRL, IBNEL, IBLTL, IBLEL, IBGTL, IBGEL, IBEQL, ICVTLF, ICVTFL, ICVTLW, ICVTWL, ICVTLC, ICVTCL, IHEADL, ICONSL, INEWCL, ICASEC, IINDL, IMOVPC, ITCMP, IMNEWZ, ICVTRF, ICVTFR, ICVTWS, ICVTSW, ILSRW, ILSRL, IECLR, INEWZ, INEWAZ, IRAISE, ICASEL, IMULX, IDIVX, ICVTXX, IMULX0, IDIVX0, ICVTXX0, IMULX1, IDIVX1, ICVTXX1, ICVTFX, ICVTXF, IEXPW, IEXPL, IEXPF, ISELF, # add new instructions here MAXDIS: con iota; init: fn(); loadobj: fn(file: string): (ref Mod, string); op2s: fn(op: int): string; inst2s: fn(ins: ref Inst): string; src: fn(file: string): string; }; # # derived by Vita Nuova Limited 1998 from /appl/wm/rt.b and /include/isa.h, both # Copyright © 1996-1999 Lucent Technologies Inc. All rights reserved. # self ref Ptrqueue, s: ref Draw->Pointer); get: fn(q: self ref Ptrqueue): ref Draw->Pointer; peek: fn(q: self ref Ptrqueue): ref Draw->Pointer; nonempty: fn(q: self ref Ptrqueue): int; }; init: fn(); reader: fn(file: string, posn: chan ofold_contrib//root/sys/src/cmd/limbo/module/diskblocks.m��������������������������������������������� 664 � 0 � 0 � 1224 10035760020 22311�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Diskblocks: module { PATH: con "/dis/lib/diskblocks.dis"; Block: adt { addr: big; # address on file n: int; # size in bytes }; Disk: adt { fd: ref Sys->FD; addr: big; # length of temp file free: array of list of ref Block; maxblock: int; gran: int; lock: chan of int; init: fn(fd: ref Sys->FD, gran: int, maxblock: int): ref Disk; new: fn(d: self ref Disk, n: int): ref Block; release: fn(d: self ref Disk, b: ref Block); read: fn(d: self ref Disk, b: ref Block, a: array of byte, n: int): int; write: fn(d: self ref Disk, b: ref Block, a: array of byte, n: int): ref Block; }; init: fn(); tempfile: fn(): ref Sys->FD; }; ip: string; dhcpip: string; siaddr: string; serverid: string; sys: string; dom: string; lease: int; options: array of array of byte; vendor: array of array of byte; new: fn(): ref Bootconf; get: fn(c: self ref Bootconf, n: int): array of byte; getint: fn(c: self ref Bootconf, n: int): int; getip: fn(c: self ref Bootconf, n: int): string;old_contrib//root/sys/src/cmd/limbo/module/disks.m�������������������������������������������������� 664 � 0 � 0 � 2620 10646120706 21310�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # adapted from /sys/include/disk.h on Plan 9: subject to the Lucent Public License 1.02 # Disks: module { PATH: con "/dis/lib/disks.dis"; # disk partition interface Disk: adt { prefix: string; part: string; fd: ref Sys->FD; wfd: ref Sys->FD; ctlfd: ref Sys->FD; rdonly: int; dtype: string; # "file", "sd" or "floppy" secs: big; secsize: int; size: big; offset: big; # within larger disk, perhaps width: int; # of disk size in bytes as decimal string c: int; # geometry: cyl, head, sectors h: int; s: int; chssrc: string; # "part", "disk" or "guess" open: fn(f: string, mode: int, noctl: int): ref Disk; readn: fn(d: self ref Disk, buf: array of byte, n: int): int; }; init: fn(); # PC partition grot PCpart: adt { active: int; # Active or 0 ptype: int; base: big; # base block address: 0 or first extended partition in chain offset: big; # block offset from base to partition size: big; # in sectors extract: fn(a: array of byte, d: ref Disk): PCpart; bytes: fn(p: self PCpart, d: ref Disk): array of byte; }; Toffset: con 446; # offset of partition table in sector TentrySize: con 2+2*3+4+4; # partition table entry size NTentry: con 4; # number of table entries Magic0: con 16r55; Magic1: con 16rAA; Active: con 16r80; # partition is active Type9: con 16r39; # partition type used by Plan 9 and Inferno chstext: fn(p: array of byte): string; }; self ref DB_Handle, column: int, fieldval: array of byte) : int; # Title of the column[i] # columold_contrib//root/sys/src/cmd/limbo/module/dividers.m����������������������������������������������� 664 � 0 � 0 � 1121 10053607717 22003�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Dividers: module { init: fn(); Divider: adt { new: fn(win: ref Tk->Toplevel, w: string, wl: list of string, dir: int): (ref Divider, chan of string); event: fn(d: self ref Divider, e: string); # private from here. win: ref Tk->Toplevel; w: string; state: ref DState; dir: int; # NS or EW widgets: array of ref DWidget; canvsize: Draw->Point; }; EW, NS: con iota; PATH: con "/dis/lib/dividers.dis"; # private from here DWidget: adt { w: string; r: Draw->Rect; size: Draw->Point; }; DState: adt { dragdiv: int; dy: int; maxy, miny: int; }; }; ������������������� 664 � 0 � 0 � 467 6622405627 21074�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/draw.m��������������������������������������������������� 664 � 0 � 0 � 27100 7660457335 21145�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Draw: module { PATH: con "$Draw"; # predefined colors; pass to Display.color Opaque: con int 16rFFFFFFFF; Transparent: con int 16r00000000; # only useful for Display.newimage Black: con int 16r000000FF; White: con int 16rFFFFFFFF; Red: con int 16rFF0000FF; Green: con int 16r00FF00FF; Blue: con int 16r0000FFFF; Cyan: con int 16r00FFFFFF; Magenta: con int 16rFF00FFFF; Yellow: con int 16rFFFF00FF; Grey: con int 16rEEEEEEFF; Paleyellow: con int 16rFFFFAAFF; Darkyellow: con int 16rEEEE9EFF; Darkgreen: con int 16r448844FF; Palegreen: con int 16rAAFFAAFF; Medgreen: con int 16r88CC88FF; Darkblue: con int 16r000055FF; Palebluegreen: con int 16rAAFFFFFF; Paleblue: con int 16r0000BBFF; Bluegreen: con int 16r008888FF; Greygreen: con int 16r55AAAAFF; Palegreygreen: con int 16r9EEEEEFF; Yellowgreen: con int 16r99994CFF; Medblue: con int 16r000099FF; Greyblue: con int 16r005DBBFF; Palegreyblue: con int 16r4993DDFF; Purpleblue: con int 16r8888CCFF; Notacolor: con int 16rFFFFFF00; Nofill: con Notacolor; # end styles for line Endsquare: con 0; Enddisc: con 1; Endarrow: con 2; # flush control Flushoff: con 0; Flushon: con 1; Flushnow: con 2; # image backing store Refbackup: con 0; Refnone: con 1; # compositing operators SinD: con 1<<3; DinS: con 1<<2; SoutD: con 1<<1; DoutS: con 1<<0; S: con SinD|SoutD; SoverD: con SinD|SoutD|DoutS; SatopD: con SinD|DoutS; SxorD: con SoutD|DoutS; D: con DinS|DoutS; DoverS: con DinS|DoutS|SoutD; DatopS: con DinS|SoutD; DxorS: con DoutS|SoutD; Clear: con 0; # Image channels descriptor Chans: adt { desc: int; # descriptor packed into an int # interpret standard channel string mk: fn(s: string): Chans; # standard printable form text: fn(c: self Chans): string; # equality eq: fn(c: self Chans, d: Chans): int; # bits per pixel depth: fn(c: self Chans): int; }; CRed, CGreen, CBlue, CGrey, CAlpha, CMap, CIgnore: con iota; GREY1: con Chans((CGrey<<4) | 1); GREY2: con Chans((CGrey<<4) | 2); GREY4: con Chans((CGrey<<4) | 4); GREY8: con Chans((CGrey<<4) | 8); CMAP8: con Chans((CMap<<4) | 8); RGB15: con Chans(((CIgnore<<4)|1)<<24 | ((CRed<<4)|5)<<16 | ((CGreen<<4)|5)<<8 | ((CBlue<<4)|5)); RGB16: con Chans(((CRed<<4)|5)<<16 | ((CGreen<<4)|6)<<8 | ((CBlue<<4)|5)); RGB24: con Chans(((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8)); RGBA32: con Chans((((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8))<<8 | ((CAlpha<<4)|8)); ARGB32: con Chans(((CAlpha<<4)|8)<<24 | ((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8)); # stupid VGAs XRGB32: con Chans(((CIgnore<<4)|8)<<24 | ((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8)); # stupid VGAs # Coordinate of a pixel on display Point: adt { x: int; y: int; # arithmetic add: fn(p: self Point, q: Point): Point; sub: fn(p: self Point, q: Point): Point; mul: fn(p: self Point, i: int): Point; div: fn(p: self Point, i: int): Point; # equality eq: fn(p: self Point, q: Point): int; # inside rectangle in: fn(p: self Point, r: Rect): int; }; # Rectangle of pixels on the display; min <= max Rect: adt { min: Point; # upper left corner max: Point; # lower right corner # make sure min <= max canon: fn(r: self Rect): Rect; # extent dx: fn(r: self Rect): int; dy: fn(r: self Rect): int; size: fn(r: self Rect): Point; # equality eq: fn(r: self Rect, s: Rect): int; # intersection and clipping Xrect: fn(r: self Rect, s: Rect): int; inrect: fn(r: self Rect, s: Rect): int; clip: fn(r: self Rect, s: Rect): (Rect, int); contains: fn(r: self Rect, p: Point): int; combine: fn(r: self Rect, s: Rect): Rect; # arithmetic addpt: fn(r: self Rect, p: Point): Rect; subpt: fn(r: self Rect, p: Point): Rect; inset: fn(r: self Rect, n: int): Rect; }; # a picture; if made by Screen.newwindow, a window. always attached to a Display Image: adt { # these data are local copies, but repl and clipr # are monitored by the runtime and may be modified as desired. r: Rect; # rectangle in data area, local coords clipr: Rect; # clipping region depth: int; # number of bits per pixel chans: Chans; repl: int; # whether data area replicates to tile the plane display: ref Display; # where Image resides screen: ref Screen; # nil if not window iname: string; # graphics operators drawop: fn(dst: self ref Image, r: Rect, src: ref Image, matte: ref Image, p: Point, op: int); draw: fn(dst: self ref Image, r: Rect, src: ref Image, matte: ref Image, p: Point); gendrawop: fn(dst: self ref Image, r: Rect, src: ref Image, p0: Point, matte: ref Image, p1: Point, op: int); gendraw: fn(dst: self ref Image, r: Rect, src: ref Image, p0: Point, matte: ref Image, p1: Point); lineop: fn(dst: self ref Image, p0,p1: Point, end0,end1,radius: int, src: ref Image, sp: Point, op: int); line: fn(dst: self ref Image, p0,p1: Point, end0,end1,radius: int, src: ref Image, sp: Point); polyop: fn(dst: self ref Image, p: array of Point, end0,end1,radius: int, src: ref Image, sp: Point, op: int); poly: fn(dst: self ref Image, p: array of Point, end0,end1,radius: int, src: ref Image, sp: Point); bezsplineop: fn(dst: self ref Image, p: array of Point, end0,end1,radius: int, src: ref Image, sp: Point, op: int); bezspline: fn(dst: self ref Image, p: array of Point, end0,end1,radius: int, src: ref Image, sp: Point); fillpolyop: fn(dst: self ref Image, p: array of Point, wind: int, src: ref Image, sp: Point, op: int); fillpoly: fn(dst: self ref Image, p: array of Point, wind: int, src: ref Image, sp: Point); fillbezsplineop: fn(dst: self ref Image, p: array of Point, wind: int, src: ref Image, sp: Point, op: int); fillbezspline: fn(dst: self ref Image, p: array of Point, wind: int, src: ref Image, sp: Point); ellipseop: fn(dst: self ref Image, c: Point, a, b, thick: int, src: ref Image, sp: Point, op: int); ellipse: fn(dst: self ref Image, c: Point, a, b, thick: int, src: ref Image, sp: Point); fillellipseop: fn(dst: self ref Image, c: Point, a, b: int, src: ref Image, sp: Point, op: int); fillellipse: fn(dst: self ref Image, c: Point, a, b: int, src: ref Image, sp: Point); arcop: fn(dst: self ref Image, c: Point, a, b, thick: int, src: ref Image, sp: Point, alpha, phi: int, op: int); arc: fn(dst: self ref Image, c: Point, a, b, thick: int, src: ref Image, sp: Point, alpha, phi: int); fillarcop: fn(dst: self ref Image, c: Point, a, b: int, src: ref Image, sp: Point, alpha, phi: int, op: int); fillarc: fn(dst: self ref Image, c: Point, a, b: int, src: ref Image, sp: Point, alpha, phi: int); bezierop: fn(dst: self ref Image, a,b,c,d: Point, end0,end1,radius: int, src: ref Image, sp: Point, op: int); bezier: fn(dst: self ref Image, a,b,c,d: Point, end0,end1,radius: int, src: ref Image, sp: Point); fillbezierop: fn(dst: self ref Image, a,b,c,d: Point, wind:int, src: ref Image, sp: Point, op: int); fillbezier: fn(dst: self ref Image, a,b,c,d: Point, wind:int, src: ref Image, sp: Point); textop: fn(dst: self ref Image, p: Point, src: ref Image, sp: Point, font: ref Font, str: string, op: int): Point; text: fn(dst: self ref Image, p: Point, src: ref Image, sp: Point, font: ref Font, str: string): Point; textbgop: fn(dst: self ref Image, p: Point, src: ref Image, sp: Point, font: ref Font, str: string, bg: ref Image, bgp: Point, op: int): Point; textbg: fn(dst: self ref Image, p: Point, src: ref Image, sp: Point, font: ref Font, str: string, bg: ref Image, bgp: Point): Point; border: fn(dst: self ref Image, r: Rect, i: int, src: ref Image, sp: Point); arrow: fn(a,b,c: int): int; # direct access to pixels readpixels: fn(src: self ref Image, r: Rect, data: array of byte): int; writepixels: fn(dst: self ref Image, r: Rect, data: array of byte): int; # publishing name: fn(src: self ref Image, name: string, in: int): int; # windowing top: fn(win: self ref Image); bottom: fn(win: self ref Image); flush: fn(win: self ref Image, func: int); origin: fn(win: self ref Image, log, scr: Point): int; }; # a frame buffer, holding a connection to /dev/draw Display: adt { image: ref Image; # holds the contents of the display white: ref Image; black: ref Image; opaque: ref Image; transparent: ref Image; # allocate and start refresh slave allocate: fn(dev: string): ref Display; startrefresh: fn(d: self ref Display); # attach to existing Screen publicscreen: fn(d: self ref Display, id: int): ref Screen; getwindow: fn(d: self ref Display, winname: string, screen: ref Screen, image: ref Image, backup: int): (ref Screen, ref Image); # image creation newimage: fn(d: self ref Display, r: Rect, chans: Chans, repl, color: int): ref Image; color: fn(d: self ref Display, color: int): ref Image; colormix: fn(d: self ref Display, c1: int, c2: int): ref Image; rgb: fn(d: self ref Display, r, g, b: int): ref Image; # attach to named Image namedimage: fn(d: self ref Display, name: string): ref Image; # I/O to files open: fn(d: self ref Display, name: string): ref Image; readimage: fn(d: self ref Display, fd: ref Sys->FD): ref Image; writeimage: fn(d: self ref Display, fd: ref Sys->FD, i: ref Image): int; # color map rgb2cmap: fn(d: self ref Display, r, g, b: int): int; cmap2rgb: fn(d: self ref Display, c: int): (int, int, int); cmap2rgba: fn(d: self ref Display, c: int): int; }; # a mapping between characters and pictures; always attached to a Display Font: adt { name: string; # *default* or a file name (this may change) height: int; # interline spacing of font ascent: int; # distance from baseline to top display: ref Display; # where Font resides # read from file or construct from local description open: fn(d: ref Display, name: string): ref Font; build: fn(d: ref Display, name, desc: string): ref Font; # string extents width: fn(f: self ref Font, str: string): int; bbox: fn(f: self ref Font, str: string): Rect; }; # a collection of windows; always attached to a Display Screen: adt { id: int; # for export when public image: ref Image; # root of window tree fill: ref Image; # picture to use when repainting display: ref Display; # where Screen resides # create; see also Display.publicscreen allocate: fn(image, fill: ref Image, public: int): ref Screen; # allocate a new window newwindow: fn(screen: self ref Screen, r: Rect, backing: int, color: int): ref Image; # raise or lower a group of windows top: fn(screen: self ref Screen, wins: array of ref Image); bottom: fn(screen: self ref Screen, wins: array of ref Image); }; # the state of a pointer device, e.g. a mouse or stylus Pointer: adt { buttons: int; # bits 1 2 4 ... represent state of buttons left to right; 1 means pressed xy: Point; # position msec: int; # millisecond time stamp }; # graphics context Context: adt { display: ref Display; # frame buffer on which windows reside screen: ref Screen; # place to make windows (mux only) wm: chan of (string, chan of (string, ref Wmcontext)); # connect to window manager }; # connection to window manager for one or more windows (as Images) Wmcontext: adt { kbd: chan of int; # incoming characters from keyboard ptr: chan of ref Pointer; # incoming stream of mouse positions ctl: chan of string; # commands from wm to application wctl: chan of string; # commands from application to wm images: chan of ref Image; # exchange of images connfd: ref Sys->FD; # connection control ctxt: ref Context; }; # functions that don't fit well in any adt setalpha: fn(c: int, a: int): int; bytesperline: fn(r: Rect, d: int): int; icossin: fn(deg: int): (int, int); icossin2: fn(p: Point): (int, int); }; : adt { desc: int; # descriptor packed into an int # interpret standard channel string mk: fn(s: string): Chans; # standard printable form text: fn(c: self Chans): string; # equality eq: fn(c: self Chans, d: Chans): int; # bits per pixel depth: fn(c: self Chans): int; }; CRed, CGreen, CBlue, CGrey, CAlpha, CMap, CIgnore: con iota; GREY1: con Chans((CGrey<<4) | 1); GREY2: con Chans((CGrey<<4) | 2); GREY4: con Chans((Cold_contrib//root/sys/src/cmd/limbo/module/ecmascript.m��������������������������������������������� 664 � 0 � 0 � 21470 7715251422 22334�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ESHostobj: module { # # extensible interface for adding host objects # # any implementation must obey the rules of the interpreter. # it is an error to return bogus values, and may cause # the interpreter to crash. # # get/put must return/set the value of property in o # # canput and hasproperty return es->true or es->false # # defaultval must return a primitive (non-object) value. # this means it can't return a String object, etc. # # call gets the caller's execution context in ex. # the new this value is passed as an argument, # but no new scopechain is allocated # it returns a reference, which is typically just a value # # construct should make up a new object # get: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string): ref Ecmascript->Val; put: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string, val: ref Ecmascript->Val); canput: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string): ref Ecmascript->Val; hasproperty: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string): ref Ecmascript->Val; delete: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string); defaultval: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, tyhint: int): ref Ecmascript->Val; call: fn(ex: ref Ecmascript->Exec, func, this: ref Ecmascript->Obj, args: array of ref Ecmascript->Val, eval: int): ref Ecmascript->Ref; construct: fn(ex: ref Ecmascript->Exec, func: ref Ecmascript->Obj, args: array of ref Ecmascript->Val): ref Ecmascript->Obj; }; # # calls to init and mkexec do the following # math->FPcontrol(0, Math->INVAL|Math->ZDIV|Math->OVFL|Math->UNFL|Math->INEX); # Ecmascript: module { PATH: con "/dis/lib/ecmascript.dis"; # # an execution context # Exec: adt { # # well known glop # objproto: cyclic ref Obj; funcproto: cyclic ref Obj; strproto: cyclic ref Obj; numproto: cyclic ref Obj; boolproto: cyclic ref Obj; arrayproto: cyclic ref Obj; dateproto: cyclic ref Obj; regexpproto: cyclic ref Obj; errproto: cyclic ref Obj; evlerrproto: cyclic ref Obj; ranerrproto: cyclic ref Obj; referrproto: cyclic ref Obj; synerrproto: cyclic ref Obj; typerrproto: cyclic ref Obj; urierrproto: cyclic ref Obj; interrproto: cyclic ref Obj; global: cyclic ref Obj; this: cyclic ref Obj; scopechain: cyclic list of ref Obj; error: string; errval: cyclic ref Val; # # private, keep out # stack: cyclic array of ref Ref; sp: int; }; # # must be called at the dawn of time # returns error string init: fn(): string; # # initialize a new global execution context # if go is supplied, it's the global object # if not, one is made up automatically # mkexec: fn(go: ref Obj): ref Exec; # # throw a runtime error # msg ends up in ex.error, and an # "ecmascript runtime error" is raised # RUNTIME: con "ecmascript runtime error"; runtime: fn(ex: ref Exec, o: ref Obj, msg: string); # runtime errors EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError, InternalError: ref Obj; # # debug flags: array of 256 indexed by char # # e print ops as they are executed # f abort on an internal error # p print parsed code # r abort on any runtime error # v print value of expression statements # debug: array of int; # # parse and runt the source string # eval: fn(ex: ref Exec, src: string): Completion; Re: type ref Arena; # the fundamental data structure Obj: adt { props: cyclic array of ref Prop; prototype: cyclic ref Obj; # some builtin properties val: cyclic ref Val; call: cyclic ref Call; construct: cyclic ref Call; class: string; host: ESHostobj; # method suite for host objects re: Re; # compiled regexp for RegExp objects }; Call: adt { params: array of string; code: cyclic ref Code; ex: cyclic ref Exec; }; # attributes ReadOnly, DontEnum, DontDelete: con 1 << iota; Prop: adt { attr: int; name: string; val: cyclic ref RefVal; }; # an extra level of indirection, because sometimes properties are aliased RefVal: adt { val: cyclic ref Val; }; # types of js values TUndef, TNull, TBool, TNum, TStr, TObj, TRegExp, NoHint: con iota; Val: adt { ty: int; num: real; str: string; obj: cyclic ref Obj; rev: ref REval; }; # regular expression REval: adt { p: string; f: string; i: int; }; # intermediate result of expression evaluation Ref: adt { isref: int; val: ref Val; base: ref Obj; name: string; # name of property within base }; # completion values of statements CNormal, CBreak, CContinue, CReturn, CThrow: con iota; Completion: adt { kind: int; val: ref Val; lab: string; }; Code: adt { ops: array of byte; # all instructions npc: int; # end of active portion of ops vars: cyclic array of ref Prop; # variables defined in the code ids: array of string; # ids used in the code strs: array of string; # string literal nums: array of real; # numerical literals fexps: cyclic array of ref Obj; # function expressions }; # # stuff for adding host objects # # ecmascript is also a host object; get: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string): ref Ecmascript->Val; put: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string, val: ref Ecmascript->Val); canput: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string): ref Ecmascript->Val; hasproperty: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string): ref Ecmascript->Val; delete: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, property: string); defaultval: fn(ex: ref Ecmascript->Exec, o: ref Ecmascript->Obj, tyhint: int): ref Ecmascript->Val; call: fn(ex: ref Ecmascript->Exec, func, this: ref Ecmascript->Obj, args: array of ref Ecmascript->Val, eval: int): ref Ecmascript->Ref; construct: fn(ex: ref Ecmascript->Exec, func: ref Ecmascript->Obj, args: array of ref Ecmascript->Val): ref Ecmascript->Obj; # # return the named variable from the scope chain sc # bivar: fn(ex: ref Exec, sc: list of ref Obj, s: string): ref Val; # # return the nth argument value, or undefined if too far # biarg: fn(args: array of ref Val, n: int): ref Val; # # make up a new object # most often called as mkobj(ex.objproto, "Object") # mkobj: fn(proto: ref Obj, class: string): ref Obj; # # object installation helpers # Builtin: adt { name: string; val: string; params: array of string; length: int; }; biinst: fn(o: ref Obj, bi: Builtin, proto: ref Obj, h: ESHostobj): ref Obj; biminst: fn(o: ref Obj, bis: array of Builtin, proto: ref Obj, h: ESHostobj); # # instantiate a new variable inside an object # varinstant: fn(in: ref Obj, attr: int, name: string, val: ref RefVal); # # various constructors # objval: fn(o: ref Obj): ref Val; strval: fn(s: string): ref Val; numval: fn(r: real): ref Val; valref: fn(v: ref Val): ref Ref; # # conversion routines defined in section 9 # toPrimitive: fn(ex: ref Exec, v: ref Val, ty: int): ref Val; toBoolean: fn(ex: ref Exec, v: ref Val): ref Val; toNumber: fn(ex: ref Exec, v: ref Val): real; toInteger: fn(ex: ref Exec, v: ref Val): real; toInt32: fn(ex: ref Exec, v: ref Val): int; toUint32: fn(ex: ref Exec, v: ref Val): big; toUint16: fn(ex: ref Exec, v: ref Val): int; toString: fn(ex: ref Exec, v: ref Val): string; toObject: fn(ex: ref Exec, v: ref Val): ref Obj; # # simple coercion routines to force # Boolean, String, and Number values to objects and vice versa # coerceToObj: fn(ex: ref Exec, v: ref Val): ref Val; coerceToVal: fn(v: ref Val): ref Val; # # object/value kind checkers # isstrobj: fn(o: ref Obj): int; isnumobj: fn(o: ref Obj): int; isboolobj: fn(o: ref Obj): int; isdateobj: fn(o: ref Obj): int; isregexpobj: fn(o: ref Obj): int; isarray: fn(o: ref Obj): int; isstr: fn(v: ref Val): int; isnum: fn(v: ref Val): int; isbool: fn(v: ref Val): int; isobj: fn(v: ref Val): int; # # well-known ecmascript primitive values # undefined: ref Val; true: ref Val; false: ref Val; null: ref Val; # regexp data structures refRex: type int; # used instead of ref Rex to avoid circularity Set: adt { # character class neg: int; # 0 or 1 ascii: array of int; # ascii members, bit array unicode: list of (int,int); # non-ascii char ranges subset: cyclic list of ref Set; }; Nstate: adt{ m: int; n: int; }; Rex: adt { # node in parse of regex, or state of fsm kind: int; # kind of node: char or ALT, CAT, etc left: refRex; # left descendant right: refRex; # right descendant, or next state set: ref Set; # character class pno: int; greedy: int; ns: ref Nstate; }; Arena: adt { # free store from which nodes are allocated rex: array of Rex; ptr: refRex; # next available space start: refRex; # root of parse, or start of fsm pno: int; }; }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/emio.m��������������������������������������������������� 664 � 0 � 0 � 10261 6622405627 21133�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # File: emio.m # # This file contains the declaration of the EMIO module. # The EMIO module provides protocol independent access # to an email server. # EMIO : module { # # The init function initializes the EMIO module. # It must be called before any other function in the # module. # init: fn(); # # The open function opens a connection with the email # server. The function requires the email server's # tcp/ip address, a username and a password to make the # connection to the email server. It returns a tuple # (int, string). The int indicates success or failure # (0 = failure, 1 = success). If the function fails, # the int returned is 0, the string returned will indicate # why the function failed. It should be called after the # init function and before any other function in the module. # open: fn(ipaddr : string, username : string, password : string) : (int, string); # # The numberofmessages function indicates how many mail # messages are in the specified users mailbox. It returns # a tuple (int, string). The int indicates the number of # mail messages in the mailbox (-1 = function failed, 0 = # no mail message, 1 = one mail message ...). If the function fails, # the int returned is -1, the string returned will indicate # why the function failed. # numberofmessages: fn() : (int, string); # # This function provides the number of octets in the specified # message number. It returns a tuple (int, string). The int indicates # the number of octets in the mail message. If it is -1, the # function has failed and the string returned will contain the # possible reason. # This function implements the LIST command, but only with an # argument - the message number. messagelength: fn(num : int) : (int, string); # # The messagetext function returns the text of the specified # mail message. The function requires the number of the # mail message to retrieve. It returns a triple # (int, string, list of string). The int indicates success or failure # (0 = failure, 1 = success). If the function fails, # the int returned is 0, the string returned will indicate # why the function failed. If the function succeded the list # of string contains the text for the specified mail message. # messagetext: fn(messagenumber : int) : (int, string, list of string); # # This is similar to messagetext() but returns a string, rather than # a list of string. The string contains the complete text of the mail # message, header and body. Each line of the message is separate by a # DELIMETER (currently set to |&|) fo easier processing. # msgtextstring: fn (num : int) : (int, string, string); # # The deletemessage function markes the specified mail # message as deleted. The function requires the number of # the mail message to delete. It returns a tuple # (int, string). The int indicates success or failure # (0 = failure, 1 = success). If the function fails, # the int returned is 0, the string returned will indicate # why the function failed. # deletemessage: fn(messagenumber : int) : (int, string); # # The reset function unmarks all messages that have been # marked deleted during this session. It returns a tuple # (int, string). The int indicates success or failure # (0 = failure, 1 = success). If the function fails, # the int returned is 0, the string returned will indicate # why the function failed. # reset: fn() : (int, string); # # The close function closes a connection with the email # server. It returns a tuple (int, string). The int # indicates success or failure (0 = failure, 1 = success). # If the function fails, the int returned is 0, the string # returned will indicate why the function failed. # close: fn() : (int, string); }; Re; # compiled regexp for RegExp objects }; Call: adt { params: array of string; code: cyclic ref Code; ex: cyclic ref Exec; }; # attributes ReadOnly, DontEnum, DontDelete: con 1 << iota; Prop: adt { attr: int; name: string; val: cyclic ref RefVal; }; # an extra level of indirection, because sometimold_contrib//root/sys/src/cmd/limbo/module/encoding.m����������������������������������������������� 664 � 0 � 0 � 522 10030336445 21734�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Encoding: module { BASE64PATH: con "/dis/lib/encoding/base64.dis"; BASE32PATH: con "/dis/lib/encoding/base32.dis"; BASE32APATH: con "/dis/lib/encoding/base32a.dis"; BASE16PATH: con "/dis/lib/encoding/base16.dis"; enc: fn(a: array of byte): string; dec: fn(s: string): array of byte; # deca: fn(a: array of byte): array of byte; }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/env.m���������������������������������������������������� 664 � 0 � 0 � 574 7071450245 20733�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Env: module { getenv: fn(var: string): string; # returns nil if var not set setenv: fn(var: string, val: string): int; # returns -1 on failure getall: fn(): list of (string, string); clone: fn(): int; # forks a copy of the environment, returns -1 on failure new: fn(): int; # sets up new empty environment, returns -1 on failure PATH: con "/dis/lib/env.dis"; }; ������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/ether.m�������������������������������������������������� 664 � 0 � 0 � 362 7652213136 21246�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ether: module { PATH: con "/dis/lib/ether.dis"; Eaddrlen: con 6; init: fn(); parse: fn(s: string): array of byte; text: fn(a: array of byte): string; addressof: fn(dev: string): array of byte; eqaddr: fn(a, b: array of byte): int; }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/exception.m���������������������������������������������� 664 � 0 � 0 � 1031 7575070133 22151�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Exception: module{ PATH: con "/dis/lib/exception.dis"; # returns the last exception in the form pc, module, exception # on the process with the given pid (-1 gives current process) # returns (0, nil, nil) if no exception getexc: fn(pid: int): (int, string, string); NOTIFYLEADER, PROPAGATE: con iota; # set the exception mode(NOTIFYLEADER or PROPAGATE) # on the current process # it is assumed that the process is a group leader (see Sys->NEWPGRP) # returns -1 on failure, 0 on success setexcmode: fn(mode: int): int; }; # regexp data structures refRex: type int; # used instead of ref Rex to avoid circularity Set: adt { # character class neg: int; # 0 or 1 ascii: array of int; # ascii members, bit array unicode: list of (int,int); # non-ascii char ranges subset: cyclic list of ref Set; }; Nstate: adt{ m: int; n: int; }; Rex: adt { # node in parse of regex, or state of fsm kind: int; # kind of node: char or ALT, CAT, etc left: refRex; # left descendant right: refold_contrib//root/sys/src/cmd/limbo/module/factotum.m����������������������������������������������� 664 � 0 � 0 � 1777 10160564007 22026�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Factotum: module { PATH: con "/dis/lib/factotum.dis"; # client interface to Plan 9 or Inferno factotum Authinfo: adt { cuid: string; # caller id suid: string; # server id cap: string; # capability (only valid on server side) secret: array of byte; unpack: fn(a: array of byte): (int, ref Authinfo); read: fn(fd: ref Sys->FD): ref Authinfo; }; mount: fn(fd: ref Sys->FD, mnt: string, flags: int, aname: string, keyspec: string): (int, ref Authinfo); # factotum interaction AuthRpcMax: con 4096; init: fn(); rpc: fn(fd: ref Sys->FD, verb: string, a: array of byte): (string, array of byte); proxy: fn(afd: ref Sys->FD, facfd: ref Sys->FD, arg: string): ref Authinfo; genproxy: fn( readc: chan of (array of byte, chan of (int, string)), writec: chan of (array of byte, chan of (int, string)), donec: chan of (ref Authinfo, string), afd: ref Sys->FD, params: string); getuserpasswd: fn(keyspec: string): (string, string); dump: fn(a: array of byte): string; setdebug: fn(i: int); }; uold_contrib//root/sys/src/cmd/limbo/module/ffts.m��������������������������������������������������� 664 � 0 � 0 � 2617 6622405627 21132�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������FFTs: module{ PATH: con "/dis/math/ffts.dis"; ffts: fn(a,b:array of real, ntot,n,nspan,isn:int); }; # multivariate complex fourier transform, computed in place # using mixed-radix fast fourier transform algorithm. # arrays a and b originally hold the real and imaginary # components of the data, and return the real and # imaginary components of the resulting fourier coefficients. # multivariate data is indexed according to the fortran # array element successor function, without limit # on the number of implied multiple subscripts. # the subroutine is called once for each variate. # the calls for a multivariate transform may be in any order. # ntot is the total number of complex data values. # n is the dimension of the current variable. # nspan/n is the spacing of consecutive data values # while indexing the current variable. # the sign of isn determines the sign of the complex # exponential, and the magnitude of isn is normally one. # univariate transform: # ffts(a,b,n,n,n,1) # trivariate transform with a(n1,n2,n3), b(n1,n2,n3): # ffts(a,b,n1*n2*n3,n1,n1,1) # ffts(a,b,n1*n2*n3,n2,n1*n2,1) # ffts(a,b,n1*n2*n3,n3,n1*n2*n3,1) # the data can alternatively be stored in a single vector c # alternating real and imaginary parts. the magnitude of isn changed # to two to give correct indexing increment, and a[0:] and a[1:] used # for a and b failed. If the function succeded the list # of string contains the text for the specified mail message. old_contrib//root/sys/src/cmd/limbo/module/filepat.m������������������������������������������������ 664 � 0 � 0 � 431 6622405627 21564�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Filepat: module { PATH: con "/dis/lib/filepat.dis"; # Turn file name with * ? [] into list of files. Slashes are significant. expand: fn(pat: string): list of string; # See if file name matches pattern; slashes not treated specially. match: fn(pat, name: string): int; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/filter.m������������������������������������������������� 664 � 0 � 0 � 624 10104616210 21427�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Filter: module { DEFLATEPATH: con "/dis/lib/deflate.dis"; INFLATEPATH: con "/dis/lib/inflate.dis"; SLIPPATH: con "/dis/lib/slip.dis"; Rq: adt { pick { Start => pid: int; Fill or Result => buf: array of byte; reply: chan of int; Info => msg: string; Finished => buf: array of byte; Error => e: string; } }; init: fn(); start: fn(param: string): chan of ref Rq; }; ������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/format.m������������������������������������������������� 664 � 0 � 0 � 1540 10315600212 21447�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Format: module { PATH: con "/dis/lib/format.dis"; Fmtspec: adt { name: string; fields: cyclic array of Fmtspec; }; Fmt: adt { kind: int; fields: cyclic array of Fmt; }; Fmtval: adt { val: ref Sexprs->Sexp; recs: cyclic array of array of Fmtval; text: fn(v: self Fmtval): string; }; Fmtfile: adt { spec: array of Fmtspec; descr: array of byte; new: fn(spec: array of Fmtspec): Fmtfile; open: fn(f: self Fmtfile, name: string): ref Bufio->Iobuf; read: fn(f: self Fmtfile, iob: ref Bufio->Iobuf): (array of Fmtval, string); }; init: fn(); spec2se: fn(spec: array of Fmtspec): list of ref Sexprs->Sexp; spec2fmt: fn(spec: array of Fmtspec): array of Fmt; se2fmt: fn(spec: array of Fmtspec, se: ref Sexprs->Sexp): (array of Fmt, string); rec2val: fn(spec: array of Fmtspec, rec: ref Sexprs->Sexp): (array of Fmtval, string); }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/freetype.m����������������������������������������������� 664 � 0 � 0 � 1716 7671130662 22011�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Freetype: module { PATH: con "$Freetype"; Matrix: adt { a, b: int; # 16.16 fixed-point coefficients c, d: int; }; Vector: adt { dx: int; # 26.6 fixed-point deltas dy: int; }; STYLE_ITALIC, STYLE_BOLD: con 1 << iota; Face: adt { nfaces: int; index: int; style: int; # STYLE_xxx height: int; ascent: int; familyname: string; stylename: string; # pts - point size as a 26.6 fixed-point value setcharsize: fn(face: self ref Face, pts, hdpi, vdpi: int): string; settransform: fn(face: self ref Face, m: ref Matrix, v: ref Vector): string; haschar: fn(face: self ref Face, c: int): int; loadglyph: fn(face: self ref Face, c: int): ref Glyph; }; Glyph: adt { top: int; left: int; height: int; width: int; advance: Draw->Point; # 26.6 fixed-point bitmap: array of byte; # (width*height) 8-bit greyscale }; newface: fn(path: string, index: int): ref Face; newmemface: fn(data: array of byte, index: int): ref Face; }; ��������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/fslib.m�������������������������������������������������� 664 � 0 � 0 � 4140 10030370531 21257�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Fslib: module { PATH: con "/dis/lib/fslib.dis"; Value: adt { x: fn(v: self ref Value): ref Value.X; p: fn(v: self ref Value): ref Value.P; s: fn(v: self ref Value): ref Value.S; c: fn(v: self ref Value): ref Value.C; t: fn(v: self ref Value): ref Value.T; v: fn(v: self ref Value): ref Value.V; m: fn(v: self ref Value): ref Value.M; typec: fn(v: self ref Value): int; discard: fn(v: self ref Value); pick { X => i: Fschan; T => i: Entrychan; P => i: Gatechan; C => i: ref Sh->Cmd; S => i: string; V => i: chan of int; # sync channel for void-valued processes M => i: Cmpchan; } }; init: fn(); typecompat: fn(t, act: string): int; sendnulldir: fn(c: Fschan): int; quit: fn(errorc: chan of string); report: fn(errorc: chan of string, err: string); copy: fn(src, dst: Fschan): int; cmdusage: fn(cmd, t: string): string; type2s: fn(t: int): string; opttypes: fn(opt: int, opts: string): (int, string); splittype: fn(t: string): (int, string, string); Report: adt { reportc: chan of string; startc: chan of (string, chan of string); enablec: chan of int; new: fn(): ref Report; enable: fn(r: self ref Report); start: fn(r: self ref Report, name: string): chan of string; }; Option: adt { opt: int; args: list of ref Value; }; Entrychan: adt { sync: chan of int; c: chan of Entry; }; Cmpchan: type chan of (ref Sys->Dir, ref Sys->Dir, chan of int); Entry: type (ref Sys->Dir, string, int); Gatequery: type (Entry, chan of int); Gatechan: type chan of Gatequery; Fsdata: adt { dir: ref Sys->Dir; data: array of byte; }; Fschan: type chan of (Fsdata, chan of int); Next, Down, Skip, Quit: con iota; Nilentry: con (nil, nil, 0); }; Fsmodule: module { types: fn(): string; init: fn(); run: fn(ctxt: ref Draw->Context, r: ref Fslib->Report, opts: list of Fslib->Option, args: list of ref Fslib->Value): ref Fslib->Value; }; Fsfilter: module { PATH: con "/dis/lib/fsfilter.dis"; filter: fn[T](t: T, src, dst: Fslib->Fschan) for{ T => query: fn(t: self T, d: ref Sys->Dir, name: string, depth: int): int; }; }; byte); proxy: fn(afd: ref Sys->FD, facfd: ref Sys->FD, arg: string): ref Authinfo; genproxy: fn( readc: chan of (array of byte, chan of (int, string)), writec: chan of (array of byte, chan of (int, string)), donec: chan of (ref Authinfo, string), afd: ref Sys->FD, params: string); getuserpasswd: fn(keyspec: string): (string, string); dump: fn(a: array of byte): string; setdebug: fn(i: int); }; uold_contrib//root/sys/src/cmd/limbo/module/fsproto.m������������������������������������������������ 664 � 0 � 0 � 551 7715251600 21631�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������FSproto: module { PATH: con "/dis/lib/fsproto.dis"; Direntry: type (string, string, ref Sys->Dir); init: fn(): string; readprotofile: fn(proto: string, root: string, entries: chan of Direntry, warnings: chan of (string, string)): string; readprotostring: fn(proto: string, root: string, entries: chan of Direntry, warnings: chan of (string, string)); }; �������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/gamer.m�������������������������������������������������� 664 � 0 � 0 � 373 6622405627 21240�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Gamer: module { PATH: con "/dis/lib/gamer.dis"; Game: adt { rf, wf: ref Sys->FD; opponent: string; player: int; In: fn(g: self Game) : int; Out: fn(g: self Game, i: int); Exit: fn(g: self Game); }; Join: fn(game: string) : Game; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/gr.m����������������������������������������������������� 664 � 0 � 0 � 2060 6622405627 20570�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GR: module{ PATH: con "/dis/math/gr.dis"; OP: adt{ code, n: int; x, y: array of real; t: string; }; open: fn(ctxt: ref Draw->Context, title: string): ref Plot; Plot: adt{ bye: fn(p: self ref Plot); equalxy:fn(p: self ref Plot); graph: fn(p: self ref Plot, x, y: array of real); paint: fn(p: self ref Plot, xlabel, xunit, ylabel, yunit: string); pen: fn(p: self ref Plot, nib: int); text: fn(p: self ref Plot, justify: int, s: string, x, y: real); op: list of OP; xmin, xmax, ymin, ymax: real; textsize: real; t: ref Tk->Toplevel; # window containing .fc.c canvas titlechan: chan of string; # Wm titlebar canvaschan: chan of string; # button clicks for measurements }; # op code GRAPH: con 1; TEXT: con 2; PEN: con 3; # pen CIRCLE: con 101; CROSS: con 102; SOLID: con 103; DASHED: con 104; INVIS: con 105; REFERENCE: con 106; DOTTED: con 107; # text justify LJUST: con 8r00; CENTER: con 8r01; RJUST: con 8r02; HIGH: con 8r00; MED: con 8r10; BASE: con 8r20; LOW: con 8r30; UP: con 8r100; }; late.dis"; INFLATEPATH: con "/dis/lib/inflate.dis"; SLIPPATH: con "/dis/lib/slip.dis"; Rq: adt { pick { Start => pid: int; Fill or Result => buf: array of byte; reply: chan of int; Info => msg: string; Finished => buf: array of byte; Error => e: string; } }; init: fn(); start: fn(param: string): chan of ref Rq; }; ������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/���������������������������������������������������� 775 � 0 � 0 � 0 11411740046 20736��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/announce.m������������������������������������������ 664 � 0 � 0 � 320 7671631625 22674�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Announce: module { PATH: con "/dis/grid/lib/announce.dis"; init: fn(); announce: fn(): (string, ref Sys->Connection); # find a local address, any port, and return its name and an announced connection. }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/browse.m�������������������������������������������� 664 � 0 � 0 � 3415 7700261514 22404�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Browse: module { PATH: con "/dis/grid/lib/browse.dis"; # panetype SINGLEPANE: con 1; # does not work yet SPLITPANE: con 2; # filetype DIRSONLY: con 3; FILESONLY: con 4; FILESORDIRS: con 5; # selecttype SINGLE: con 1; MULTI: con 2; SELECT: con 1; TOGGLE: con 2; NONE: con 3; opened : list of string; init : fn (top: ref Tk->Toplevel, rlabel, root: string, ptype, ftype, stype: int, pathrd : PathReader); getselectedpath : fn (pane: int): string; refresh : fn (top: ref Tk->Toplevel); gotofile : fn (top: ref Tk->Toplevel, path:string, pnum: int); opendir : fn (top: ref Tk->Toplevel, path, tkpath: string); changepane : fn (top: ref Tk->Toplevel, ptype: int); resizewin : fn (top: ref Tk->Toplevel, width, height: int); selectfile : fn (top: ref Tk->Toplevel, pane, action: int, path, tkpath: string); setscrollr : fn (top: ref Tk->Toplevel); getpnum : fn (tkpath: string): int; pane1see : fn (top: ref Tk->Toplevel); gotopath : fn (top: ref Tk->Toplevel, dir: string, openfinal, pnum: int): string; getpath : fn (top: ref Tk->Toplevel, f: string): string; prevpath : fn (path: string): string; setcentre : fn (top1, top2: ref Tk->Toplevel); addselection : fn (top: ref Tk->Toplevel, file: string, val, args, dups: int, sval, sargs: string): string; delselection : fn (top: ref Tk->Toplevel, n: string): string; newfl : fn (top: ref Tk->Toplevel, rlabel, root: string); setc3frame : fn (top: ref Tk->Toplevel, frame: string); doargs : fn (top: ref Tk->Toplevel, lst: list of string); getselected : fn (top: ref Tk->Toplevel, frame: string): list of (string, string, string); movdiv : fn (top: ref Tk->Toplevel, x: int); dialog : fn (ctxt: ref draw->Context, oldtop: ref Tk->Toplevel, butlist: list of string, title, msg: string): int; getc3frame : fn (): string; }; v: fn(v: self ref Value): ref Value.V; m: fn(v: self ref Value): ref Value.M; typec: fn(v: self ref Value): int; discard: fn(v: self ref Value); pick { X => i: Fschan; T => i: Entrychan; P => i: Gatechan; C => i: rold_contrib//root/sys/src/cmd/limbo/module/grid/browser.m������������������������������������������� 664 � 0 � 0 � 5535 10005243712 22603�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Browser: module { PATH: con "/dis/grid/lib/browser.dis"; DESELECT: con 0; SELECT: con 1; TOGGLE: con 2; OPEN: con 3; CLOSE: con 4; init: fn (); dialog: fn (ctxt: ref draw->Context, oldtop: ref Tk->Toplevel, butlist: list of string, title, msg: string): int; prevpath: fn (path: string): string; setcentre: fn (top1, top2: ref Tk->Toplevel); Browse: adt { new: fn (top: ref Tk->Toplevel, tkchanname, root, rlabel: string, nopanes: int, reader: PathReader): ref Browse; refresh: fn (b: self ref Browse); defaultaction: fn (b: self ref Browse, lst: list of string, f: ref File); getpath: fn (b: self ref Browse, tkpath: string): ref File; opendir: fn (b: self ref Browse, file: File, tkpath: string, action: int): int; newroot: fn (b: self ref Browse, root, rlabel: string); changeview: fn (b: self ref Browse, nopanes: int); selectfile: fn (b: self ref Browse, pane, action: int, file: File, tkpath: string); gotoselectfile: fn (b: self ref Browse, file: File): string; gotopath: fn (b: self ref Browse, dir: File, openfinal: int): (File, string); getselected: fn (b: self ref Browse, pane: int): File; addopened: fn (b: self ref Browse, file: File, add: int); showpath: fn (b: self ref Browse, on: int); resize: fn (b: self ref Browse); top: ref Tk->Toplevel; tkchan: string; bgnorm, bgselect: string; nopanes: int; selected: array of Selected; opened: list of File; root, rlabel: string; reader: PathReader; pane1: File; pane0width: string; width: int; showpathlabel: int; released: int; }; SELECTED: con 0; UNSELECTED: con 1; ALL: con 2; Select: adt { new: fn (top: ref Tk->Toplevel, tkchanname: string): ref Select; addframe: fn (s: self ref Select, fname, title: string); showframe: fn (s: self ref Select, fname: string); delframe: fn (s: self ref Select, fname: string); addselection: fn (s: self ref Select, fname, text: string, lp: list of ref Parameter, allowdups: int): string; delselection: fn (s: self ref Select, fname, tkpath: string); getselection: fn (s: self ref Select, fname: string): list of (string, list of ref Parameter); getselected: fn (s: self ref Select, fname: string): string; select: fn (s: self ref Select, fname, tkpath: string, action: int); defaultaction: fn (s: self ref Select, lst: list of string); resize: fn (s: self ref Select, width, height: int); setscrollr: fn (s: self ref Select, fname: string); top: ref Tk->Toplevel; tkchan: string; currfname, currfid: string; frames: list of ref Frame; }; Frame: adt { name: string; path: string; selected: string; }; Parameter: adt { pick { ArgIn => name, initval: string; ArgOut => name, val: string; IntIn => min, max, initval: int; IntOut => val: int; } }; File: adt { eq: fn (a,b: File): int; path, qid: string; }; Selected: adt { file: File; tkpath: string; }; };�������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/demo/����������������������������������������������� 775 � 0 � 0 � 0 11411740045 21661��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/demo/block.m���������������������������������������� 664 � 0 � 0 � 634 7672061424 23107�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Block : module { PATH: con "/dis/grid/demo/block.dis"; init : fn (pathname: string, ep: Exproc); slave : fn (); writedata : fn (s: string); masterinit : fn (noblocks: int); reader : fn (noblocks: int, chanout: chan of string, sync: chan of int); makefile : fn (block: int, let: string): string; err : fn (s: string); cleanfiles : fn (delpath: string); isin : fn (l: list of string, s: string): int; };����������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/demo/exproc.m��������������������������������������� 664 � 0 � 0 � 350 7672054113 23305�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Exproc : module { getslavedata : fn (lst: list of string); doblock : fn (block: int, bpath: string); readblock : fn (block: int, dir: string, chanout: chan of string): int; finish : fn (waittime: int, tkchan: chan of string); };����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/fbrowse.m������������������������������������������� 664 � 0 � 0 � 434 7703030570 22527�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������FBrowse : module { PATH: con "/dis/grid/lib/fbrowse.dis"; NOTHING: con 0; RUN: con 1; OPEN: con 2; WRITE: con 3; ERROR: con -1; init : fn (ctxt : ref Draw->Context, title, root, currdir: string): string; readpath : fn (dir: Browser->File): (array of ref sys->Dir, int); }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/pathreader.m���������������������������������������� 664 � 0 � 0 � 132 7703030640 23170�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PathReader : module { readpath: fn (dir: Browser->File): (array of ref sys->Dir, int); };��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/readjpg.m������������������������������������������� 664 � 0 � 0 � 4025 7714433370 22523�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Readjpg: module { PATH: con "/dis/grid/readjpg.dis"; ImageSource: adt { width: int; height: int; origw: int; origh: int; i: int; jstate: ref Jpegstate; data: array of byte; }; Jpegstate: adt { # variables in i/o routines sr: int; # shift register, right aligned cnt: int; # # bits in right part of sr Nf: int; comp: array of Framecomp; mode: byte; X,Y: int; qt: array of array of int; # quantization tables dcht: array of ref Huffman; acht: array of ref Huffman; Ns: int; scomp: array of Scancomp; Ss: int; Se: int; Ah: int; Al: int; ri: int; nseg: int; nblock: array of int; # progressive scan dccoeff: array of array of int; accoeff: array of array of array of int; # only need 8 bits plus quantization nacross: int; ndown: int; Hmax: int; Vmax: int; }; Huffman: adt { bits: array of int; size: array of int; code: array of int; val: array of int; mincode: array of int; maxcode: array of int; valptr: array of int; # fast lookup value: array of int; shift: array of int; }; Framecomp: adt # Frame component specifier from SOF marker { C: int; H: int; V: int; Tq: int; }; Scancomp: adt # Frame component specifier from SOF marker { C: int; tdc: int; tac: int; }; # Constants, all preceded by byte 16rFF SOF: con 16rC0; # Start of Frame SOF2: con 16rC2; # Start of Frame; progressive Huffman DHT: con 16rC4; # Define Huffman Tables RST: con 16rD0; # Restart interval termination SOI: con 16rD8; # Start of Image EOI: con 16rD9; # End of Image SOS: con 16rDA; # Start of Scan DQT: con 16rDB; # Define quantization tables DNL: con 16rDC; # Define number of lines DRI: con 16rDD; # Define restart interval APPn: con 16rE0; # Reserved for application segments COM: con 16rFE; # Comment init : fn (disp: ref Draw->Display); fjpg2img : fn (fd: ref sys->FD, cachepath: string, chanin, chanout: chan of string): ref Image; jpg2img : fn (filename, cachepath: string, chanin, chanout: chan of string): ref Image; };�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/regpoll.m������������������������������������������� 664 � 0 � 0 � 236 7712464452 22536�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RegPoll : module { PATH: con "/usr/danny/res/regpoll.dis"; STOPPED, STARTED, ERROR: con iota; init : fn (regaddr: string): (chan of int, chan of int); }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/grid/srvbrowse.m����������������������������������������� 664 � 0 � 0 � 1316 7703226420 23135�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Srvbrowse: module { PATH: con "/dis/grid/lib/srvbrowse.dis"; services : list of ref Registries->Service; init : fn (); refreshservices : fn (filter: list of list of (string, string)); servicepath2Service : fn (path, qid: string): list of ref Registries->Service; servicepath2Dir : fn (path: string, qid: int): (array of ref sys->Dir, int); getresname : fn (srvc: ref Registries->Service): (string, string); getqid : fn (srvc: ref Registries->Service): string; find : fn (filter: list of list of (string, string)): list of ref Registries->Service; addservice: fn (srvc: ref Registries->Service); searchwin: fn (ctxt: ref Draw->Context, chanout: chan of string, filter: list of list of (string, string)); }; val: int; } }; File: adt { eq: fn (a,b: File): int; path, qid: string; }; Selected: adt { file: File; tkpath: string; }; };�������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/hash.m��������������������������������������������������� 664 � 0 � 0 � 1023 6622405627 21101�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hash: module{ PATH: con "/dis/lib/hash.dis"; fun1, fun2: fn(s:string,n:int):int; HashVal: adt{ i: int; r: real; s: string; }; HashNode: adt{ key:string; val:ref HashVal; # insert() can update contents }; HashTable: adt{ a: array of list of HashNode; find: fn(h:self ref HashTable, key:string):ref HashVal; insert: fn(h:self ref HashTable, key:string, val:HashVal); delete: fn(h:self ref HashTable, key:string); all: fn(h:self ref HashTable): list of HashNode; }; new: fn(size:int):ref HashTable; }; ATH: con "/dis/grid/demo/block.dis"; init : fn (pathname: string, ep: Exproc); slave : fn (); writedata : fn (s: string); masterinit : fn (noblocks: int); reader : fn (noblocks: int, chanout: chan of string, sync: chan of int); makefile : fn (block: int, let: string): string; err : fn (s: string); cleanfiles : fn (delpath: string); isin : fn (l: list of string, s: string): int; };����������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/html.m��������������������������������������������������� 664 � 0 � 0 � 2357 6622405627 21135�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������HTML: module { PATH: con "/dis/lib/html.dis"; Lex: adt { tag: int; text: string; # text in Data, attribute text in tag attr: list of Attr; }; Attr: adt { name: string; value: string; }; # sorted in lexical order; used as array indices Notfound, Ta, Taddress, Tapplet, Tarea, Tatt_footer, Tb, Tbase, Tbasefont, Tbig, Tblink, Tblockquote, Tbody, Tbq, Tbr, Tcaption, Tcenter, Tcite, Tcode, Tcol, Tcolgroup, Tdd, Tdfn, Tdir, Tdiv, Tdl, Tdt, Tem, Tfont, Tform, Tframe, Tframeset, Th1, Th2, Th3, Th4, Th5, Th6, Thead, Thr, Thtml, Ti, Timg, Tinput, Tisindex, Titem, Tkbd, Tli, Tlink, Tmap, Tmenu, Tmeta, Tnobr, Tnoframes, Tol, Toption, Tp, Tparam, Tpre, Tq, Tsamp, Tscript, Tselect, Tsmall, Tstrike, Tstrong, Tstyle, Tsub, Tsup, Tt, Ttable, Ttbody, Ttd, Ttextarea, Ttextflow, Ttfoot, Tth, Tthead, Ttitle, Ttr, Ttt, Tu, Tul, Tvar : con iota; RBRA: con 1000; Data: con 2000; Latin1, UTF8: con iota; # charsets lex: fn(b: array of byte, charset: int, keepnls: int): array of ref Lex; attrvalue: fn(attr: list of Attr, name: string): (int, string); globalattr: fn(html: array of ref Lex, tag: int, attr: string): (int, string); isbreak: fn(h: array of ref Lex, i: int): int; lex2string: fn(l: ref Lex): string; }; er->File): (array of ref sys->Dir, int); }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/ida.m���������������������������������������������������� 664 � 0 � 0 � 1114 10402321201 20704�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ida: module { PATH: con "/dis/lib/ida/ida.dis"; Frag: adt { dlen: int; # length of original data m: int; # minimum pieces for reconstruction a: array of int; # encoding array row for this fragment enc: array of int; # encoded data tag: array of byte; # user data, such as SHA1 hash }; init: fn(); fragment: fn(data: array of byte, m: int): ref Frag; consistent: fn(frags: array of ref Frag): array of ref Frag; reconstruct: fn(frags: array of ref Frag): (array of byte, string); }; Idatab: module { PATH: con "/dis/lib/ida/idatab.dis"; init: fn(): array of int; }; ������������������������ 664 � 0 � 0 � 4025 7714433370 22523�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/imagefile.m���������������������������������������������� 664 � 0 � 0 � 2332 7515562633 22107�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RImagefile: module { READGIFPATH: con "/dis/lib/readgif.dis"; READJPGPATH: con "/dis/lib/readjpg.dis"; READXBMPATH: con "/dis/lib/readxbitmap.dis"; READPICPATH: con "/dis/lib/readpicfile.dis"; READPNGPATH: con "/dis/lib/readpng.dis"; Rawimage: adt { r: Draw->Rect; cmap: array of byte; transp: int; # transparency flag (only for nchans=1) trindex: byte; # transparency index nchans: int; chans: array of array of byte; chandesc:int; fields: int; # defined by format }; # chandesc CRGB: con 0; # three channels, no map CY: con 1; # one channel, luminance CRGB1: con 2; # one channel, map present init: fn(bufio: Bufio); read: fn(fd: ref Bufio->Iobuf): (ref Rawimage, string); readmulti: fn(fd: ref Bufio->Iobuf): (array of ref Rawimage, string); }; WImagefile: module { WRITEGIFPATH: con "/dis/lib/writegif.dis"; init: fn(bufio: Bufio); # write: fn(fd: ref Bufio->Iobuf, ref RImagefile->Rawimage): string; writeimage: fn(fd: ref Bufio->Iobuf, image: ref Draw->Image): string; }; Imageremap: module { PATH: con "/dis/lib/imageremap.dis"; init: fn(d: ref Draw->Display); remap: fn(i: ref RImagefile->Rawimage, d: ref Draw->Display, errdiff: int): (ref Draw->Image, string); }; terval APPn: con 16rE0; # Reserved for application segments COM: con 16rFE; # Comment init : fn (disp: ref Draw->Display); fjpg2img : fn (fd: ref sys->FD, cachepath: string, chanin, chanout: chan of string): ref Image; jpg2img : fn (filename, cachepath: string, chanin, chanout: chan of sold_contrib//root/sys/src/cmd/limbo/module/inflate.m������������������������������������������������ 664 � 0 � 0 � 1021 7063725436 21601�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Inflate: module { PATH: con "/dis/lib/inflate.dis"; InflateBlock: con 16r8000; InflateMask: con 16rf0000; InflateEmptyIn, InflateFlushOut, InflateAck, InflateDone, InflateError: con iota + (1 << 16) + 1; # conduit for data streaming between inflate and its producer/consumer InflateIO: adt { ibuf: array of byte; # input buffer [InflateBlock] obuf: array of byte; # output buffer [InflateBlock] c: chan of int; # for inflate <-> server comm. }; init: fn(); reset: fn(): ref InflateIO; inflate: fn(); }; { PATH: con "/usr/danny/res/regpoll.dis"; STOPPED, STARTED, ERROR: con iota; init : fn (regaddr: string): (chan of int, chan of int); }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/ip.m����������������������������������������������������� 664 � 0 � 0 � 5162 10364656432 20616�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IP: module { PATH: con "/dis/lib/ip.dis"; IPaddrlen: con 16; IPv4addrlen: con 4; IPv4off: con 12; IPaddr: adt { a: array of byte; newv6: fn(nil: array of byte): IPaddr; newv4: fn(nil: array of byte): IPaddr; copy: fn(nil: self IPaddr): IPaddr; eq: fn(nil: self IPaddr, v: IPaddr): int; mask: fn(nil: self IPaddr, m: IPaddr): IPaddr; maskn: fn(nil: self IPaddr, m: IPaddr): IPaddr; isv4: fn(nil: self IPaddr): int; ismulticast: fn(nil: self IPaddr): int; isvalid: fn(nil: self IPaddr): int; v4: fn(nil: self IPaddr): array of byte; v6: fn(nil: self IPaddr): array of byte; class: fn(nil: self IPaddr): int; classmask: fn(nil: self IPaddr): IPaddr; parse: fn(s: string): (int, IPaddr); parsemask: fn(s: string): (int, IPaddr); parsecidr: fn(s: string): (int, IPaddr, IPaddr); text: fn(nil: self IPaddr): string; masktext: fn(nil: self IPaddr): string; }; v4bcast, v4allsys, v4allrouter, v4noaddr, noaddr, allbits, selfv6, selfv4: IPaddr; v4prefix: array of byte; Ifcaddr: adt { ip: IPaddr; mask: IPaddr; net: IPaddr; preflt: big; validlt: big; }; Ipifc: adt { index: int; # /net/ipifc/N dev: string; # bound device addrs: list of ref Ifcaddr; sendra: int; # !=0, send router adverts recvra: int; # !=0, receive router adverts mtu: int; pktin: big; # packets in pktout: big; # packets out errin: big; # input errors errout: big; # output errors rp: IPv6rp; # IPv6 route advert params }; IPv6rp: adt { mflag: int; oflag: int; maxraint: int; # max route advert interval minraint: int; # min route advert interval linkmtu: int; reachtime: int; rxmitra: int; ttl: int; routerlt: int; }; Udp4hdrlen: con 2*IPv4addrlen+2*2; OUdphdrlen: con 2*IPaddrlen+2*2; Udphdrlen: con 52; Udpraddr: con 0; Udpladdr: con Udpraddr + IPaddrlen; Udpifcaddr: con Udpladdr + IPaddrlen; Udprport: con Udpifcaddr + IPaddrlen; Udplport: con Udprport + 2; Udphdr: adt { raddr: IPaddr; laddr: IPaddr; ifcaddr: IPaddr; rport: int; lport: int; new: fn(): ref Udphdr; unpack: fn(a: array of byte, n: int): ref Udphdr; pack: fn(h: self ref Udphdr, a: array of byte, n: int); }; init: fn(); readipifc: fn(net: string, index: int): (list of ref Ipifc, string); addressesof: fn(l: list of ref Ipifc, all: int): list of IPaddr; interfaceof: fn(l: list of ref Ipifc, ip: IPaddr): (ref Ipifc, ref Ifcaddr); ownerof: fn(l: list of ref Ipifc, ip: IPaddr): (ref Ipifc, ref Ifcaddr); get2: fn(a: array of byte, o: int): int; put2: fn(a: array of byte, o: int, v: int): int; get4: fn(a: array of byte, o: int): int; put4: fn(a: array of byte, o: int, v: int): int; }; � 0 � 2357 6622405627 21135�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/ipattr.m������������������������������������������������� 664 � 0 � 0 � 1167 7661150146 21467�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IPattr: module { PATH: con "/dis/lib/ipattr.dis"; Netattr: adt { name: string; pairs: list of ref Attrdb->Attr; net: IP->IPaddr; mask: IP->IPaddr; }; init: fn(attrdb: Attrdb, ip: IP); dbattr: fn(s: string): string; findnetattr: fn(db: ref Attrdb->Db, attr: string, val: string, rattr: string): (string, string); findnetattrs: fn(db: ref Attrdb->Db, attr: string, val: string, rattrs: list of string): (list of (IP->IPaddr, list of ref Netattr), string); valueof: fn(l: list of ref Netattr, attr: string): list of string; netvalueof: fn(l: list of ref Netattr, attr: string, ip: IP->IPaddr): list of string; }; , attr: string): (int, string); isbreak: fn(h: array of ref Lex, i: int): int; lex2string: fn(l: ref Lex): string; }; er->File): (array of ref sys->Dir, int); }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/ir.m����������������������������������������������������� 664 � 0 � 0 � 1226 7112216067 20566�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ir: module { PATH: con "/dis/lib/ir.dis"; SIMPATH: con "/dis/lib/irsim.dis"; MPATH: con "/dis/lib/irmpath.dis"; SAGEPATH: con "/dis/lib/irsage.dis"; # # "standard" remote buttons # Zero: con 0; One: con 1; Two: con 2; Three: con 3; Four: con 4; Five: con 5; Six: con 6; Seven: con 7; Eight: con 8; Nine: con 9; ChanUP: con 10; ChanDN: con 11; VolUP: con 12; VolDN: con 13; FF: con 14; Rew: con 15; Up: con 16; Dn: con 17; Select: con 18; Power: con 19; Enter: con 20; Rcl: con 21; Record: con 22; Mute: con 23; # # Control # Error: con 9999; EOF: con -1; init: fn(c, p: chan of int): int; translate: fn(c: int): int; }; 2523�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/itslib.m������������������������������������������������� 664 � 0 � 0 � 631 7573151570 21431�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� Itslib: module { PATH: con "/dis/lib/itslib.dis"; init: fn(): ref Tconfig; S_INFO: con 0; S_WARN: con 1; S_ERROR: con 2; S_FATAL: con 3; S_STIME: con 4; S_ETIME: con 5; ENV_VERBOSITY: con "ITS_VERBOSITY"; ENV_MFD: con "ITS_MFD"; Tconfig: adt { verbosity: int; mfd: ref Sys->FD; report: fn(t: self ref Tconfig, sev: int, verb: int, msg: string); done: fn(t: self ref Tconfig); }; }; �������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/json.m��������������������������������������������������� 664 � 0 � 0 � 2717 10555205536 21157�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JSON: module { PATH: con "/dis/lib/json.dis"; JValue: adt { pick{ Object => mem: cyclic list of (string, ref JValue); Array => a: cyclic array of ref JValue; String => s: string; Int => value: big; # could use IPint? # just use Number (as string) Real => value: real; True or False or Null => } isarray: fn(o: self ref JValue): int; isfalse: fn(o: self ref JValue): int; isint: fn(o: self ref JValue): int; isnull: fn(o: self ref JValue): int; isnumber: fn(o: self ref JValue): int; isobject: fn(o: self ref JValue): int; isreal: fn(o: self ref JValue): int; isstring: fn(o: self ref JValue): int; istrue: fn(o: self ref JValue): int; copy: fn(o: self ref JValue): ref JValue; eq: fn(a: self ref JValue, b: ref JValue): int; get: fn(a: self ref JValue, n: string): ref JValue; set: fn(a: self ref JValue, mem: string, value: ref JValue); text: fn(a: self ref JValue): string; }; init: fn(bufio: Bufio); readjson: fn(buf: ref Bufio->Iobuf): (ref JValue, string); writejson: fn(buf: ref Bufio->Iobuf, val: ref JValue): int; # shorthand? jvarray: fn(a: array of ref JValue): ref JValue.Array; jvbig: fn(b: big): ref JValue.Int; jvfalse: fn(): ref JValue.False; jvint: fn(i: int): ref JValue.Int; jvnull: fn(): ref JValue.Null; jvobject: fn(m: list of (string, ref JValue)): ref JValue.Object; jvreal: fn(r: real): ref JValue.Real; jvstring: fn(s: string): ref JValue.String; jvtrue: fn(): ref JValue.True; }; }; init: fn(); reset: fn(): ref InflateIO; iold_contrib//root/sys/src/cmd/limbo/module/keyboard.m����������������������������������������������� 664 � 0 � 0 � 2164 7035111320 21744�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Keyboard : module { # Inferno Generic Scan Conversions # this file needs to be kept in sync with include/keyboard.h No: con -1; Esc: con 16r1b; Spec: con 16rE000; # Special Function Keys - mapped to Unicode reserved range Shift: con Spec|16r00; # Shifter (Held) Keys View: con Spec|16r10; # View Keys PF: con Spec|16r20; # num pad KF: con Spec|16r40; # function keys LShift: con Shift|0; RShift: con Shift|1; LCtrl: con Shift|2; RCtrl: con Shift|3; Caps: con Shift|4; Num: con Shift|5; Meta: con Shift|6; LAlt: con Shift|7; RAlt: con Shift|8; NShifts: con 9; # total number of shift keys Home: con View|0; End: con View|1; Up: con View|2; Down: con View|3; Left: con View|4; Right: con View|5; Pgup: con View|6; Pgdown: con View|7; BackTab: con View|8; Scroll: con Spec|16r62; Ins: con Spec|16r63; Del: con Spec|16r64; Print: con Spec|16r65; Pause: con Spec|16r66; Middle: con Spec|16r67; Break: con Spec|16r66; SysRq: con Spec|16r69; PwrOn: con Spec|16r6c; PwrOff: con Spec|16r6d; PwrLow: con Spec|16r6e; Latin: con Spec|16r6f; APP: con Spec|16r200; # for application use (ALT keys) }; Paddr): int; classmask: fn(nil: self IPaddr): IPaddr; parse: fn(s: string): (int, IPaddr); parsemask: fn(s: string): (int, IPaddr); parsecidr: fn(s: string): (int, IPaddr, IPaddr); text: fn(nil: self IPaddr): string; masktext: fn(nil: self IPaddr): string; }; v4bcast, v4allsys, v4allrouter, v4noaddr, noaddr, allbits, selfv6, selfv4: IPaddr; v4prefix: array of byte; Ifcaddr:old_contrib//root/sys/src/cmd/limbo/module/keyring.m������������������������������������������������ 664 � 0 � 0 � 16040 10404053132 21652�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # security routines implemented in C # Keyring: module { PATH: con "$Keyring"; # infinite precision integers IPint: adt { x: int; # dummy for C compiler for runt.h # conversions iptob64: fn(i: self ref IPint): string; b64toip: fn(str: string): ref IPint; iptobytes: fn(i: self ref IPint): array of byte; iptobebytes: fn(i: self ref IPint): array of byte; bytestoip: fn(buf: array of byte): ref IPint; bebytestoip: fn(mag: array of byte): ref IPint; inttoip: fn(i: int): ref IPint; iptoint: fn(i: self ref IPint): int; iptostr: fn(i: self ref IPint, base: int): string; strtoip: fn(str: string, base: int): ref IPint; # create a random large integer using the accelerated generator random: fn(minbits, maxbits: int): ref IPint; # operations bits: fn(i: self ref IPint): int; expmod: fn(base: self ref IPint, exp, mod: ref IPint): ref IPint; invert: fn(base: self ref IPint, mod: ref IPint): ref IPint; add: fn(i1: self ref IPint, i2: ref IPint): ref IPint; sub: fn(i1: self ref IPint, i2: ref IPint): ref IPint; neg: fn(i: self ref IPint): ref IPint; mul: fn(i1: self ref IPint, i2: ref IPint): ref IPint; div: fn(i1: self ref IPint, i2: ref IPint): (ref IPint, ref IPint); eq: fn(i1: self ref IPint, i2: ref IPint): int; cmp: fn(i1: self ref IPint, i2: ref IPint): int; copy: fn(i: self ref IPint): ref IPint; # shifts shl: fn(i: self ref IPint, n: int): ref IPint; shr: fn(i: self ref IPint, n: int): ref IPint; # bitwise and: fn(i1: self ref IPint, i2: ref IPint): ref IPint; ori: fn(i1: self ref IPint, i2: ref IPint): ref IPint; xor: fn(i1: self ref IPint, i2: ref IPint): ref IPint; not: fn(i1: self ref IPint): ref IPint; }; # signature algorithm SigAlg: adt { name: string; # C function pointers are hidden }; # generic public key PK: adt { sa: ref SigAlg; # signature algorithm owner: string; # owner's name # key and system parameters are hidden }; # generic secret key SK: adt { sa: ref SigAlg; # signature algorithm owner: string; # owner's name # key and system parameters are hidden }; # generic certificate Certificate: adt { sa: ref SigAlg; # signature algorithm ha: string; # hash algorithm signer: string; # name of signer exp: int; # expiration date # actual signature is hidden }; # state held while creating digests DigestState: adt { x: int; # dummy for C compiler for runt.h # all the state is hidden copy: fn(d: self ref DigestState): ref DigestState; }; # expanded AES key + state for chaining AESstate: adt { x: int; # dummy for C compiler for runt.h # all the state is hidden }; # expanded DES key + state for chaining DESstate: adt { x: int; # dummy for C compiler for runt.h # all the state is hidden }; # expanded IDEA key + state for chaining IDEAstate: adt { x: int; # dummy for C compiler for runt.h # all the state is hidden }; # expanded RC4 key + encryption state RC4state: adt { x: int; # dummy for C compiler for runt.h # all the state is hidden }; # authentication info Authinfo: adt { mysk: ref SK; # my private key mypk: ref PK; # my public key cert: ref Certificate; # signature of my public key spk: ref PK; # signers public key alpha: ref IPint; # diffie helman parameters p: ref IPint; }; # convert types to byte strings certtostr: fn (c: ref Certificate): string; pktostr: fn (pk: ref PK): string; sktostr: fn (sk: ref SK): string; # parse byte strings into types strtocert: fn (s: string): ref Certificate; strtopk: fn (s: string): ref PK; strtosk: fn (s: string): ref SK; # convert types to attr/value pairs certtoattr: fn (c: ref Certificate): string; pktoattr: fn (pk: ref PK): string; sktoattr: fn (sk: ref SK): string; # parse a/v pairs into types # attrtocert: fn (s: string): ref Certificate; # attrtopk: fn (s: string): ref PK; # attrtosk: fn (s: string): ref SK; # create and verify signatures sign: fn (sk: ref SK, exp: int, state: ref DigestState, ha: string): ref Certificate; verify: fn (pk: ref PK, cert: ref Certificate, state: ref DigestState): int; signm: fn (sk: ref SK, m: ref IPint, ha: string): ref Certificate; verifym: fn (pk: ref PK, cert: ref Certificate, m: ref IPint): int; # generate keys genSK: fn (algname, owner: string, length: int): ref SK; genSKfromPK: fn (pk: ref PK, owner: string): ref SK; sktopk: fn (sk: ref SK): ref PK; # digests sha1: fn(buf: array of byte, n: int, digest: array of byte, state: ref DigestState): ref DigestState; md4: fn(buf: array of byte, n: int, digest: array of byte, state: ref DigestState): ref DigestState; md5: fn(buf: array of byte, n: int, digest: array of byte, state: ref DigestState): ref DigestState; hmac_sha1: fn(data: array of byte, n: int, key: array of byte, digest: array of byte, state: ref DigestState): ref DigestState; hmac_md5: fn(data: array of byte, n: int, key: array of byte, digest: array of byte, state: ref DigestState): ref DigestState; # encryption interfaces Encrypt: con 0; Decrypt: con 1; AESbsize: con 16; aessetup: fn(key: array of byte, ivec: array of byte): ref AESstate; aescbc: fn(state: ref AESstate, buf: array of byte, n: int, direction: int); DESbsize: con 8; dessetup: fn(key: array of byte, ivec: array of byte): ref DESstate; desecb: fn(state: ref DESstate, buf: array of byte, n: int, direction: int); descbc: fn(state: ref DESstate, buf: array of byte, n: int, direction: int); IDEAbsize: con 8; ideasetup: fn(key: array of byte, ivec: array of byte): ref IDEAstate; ideaecb: fn(state: ref IDEAstate, buf: array of byte, n: int, direction: int); ideacbc: fn(state: ref IDEAstate, buf: array of byte, n: int, direction: int); rc4setup: fn(seed: array of byte): ref RC4state; rc4: fn(state: ref RC4state, buf: array of byte, n: int); rc4skip: fn(state: ref RC4state, n: int); rc4back: fn(state: ref RC4state, n: int); # create an alpha and p for diffie helman exchanges dhparams: fn(nbits: int): (ref IPint, ref IPint); # comm link authentication is symmetric auth: fn(fd: ref Sys->FD, info: ref Authinfo, setid: int): (string, array of byte); # auth io readauthinfo: fn(filename: string): ref Authinfo; writeauthinfo: fn(filename: string, info: ref Authinfo): int; # message io on a delimited connection (ssl for example) # messages > 4096 bytes are truncated # errors > 64 bytes are truncated # getstring and getbytearray return (result, error). getstring: fn(fd: ref Sys->FD): (string, string); putstring: fn(fd: ref Sys->FD, s: string): int; getbytearray: fn(fd: ref Sys->FD): (array of byte, string); putbytearray: fn(fd: ref Sys->FD, a: array of byte, n: int): int; puterror: fn(fd: ref Sys->FD, s: string): int; # to send and receive messages when ssl isn't pushed getmsg: fn(fd: ref Sys->FD): array of byte; sendmsg: fn(fd: ref Sys->FD, buf: array of byte, n: int): int; senderrmsg: fn(fd: ref Sys->FD, s: string): int; # algorithms DEScbc: con 0; DESecb: con 1; SHA1: con 2; MD5: con 3; MD4: con 4; IDEAcbc: con 5; IDEAecb: con 6; SHA1dlen: con 20; MD5dlen: con 16; MD4dlen: con 16; }; fio->Iobuf, val: ref JValue): int; # shorthand? jvarray: fn(a: array of ref JValue): ref JValue.Array; jvbig: fn(b: big): ref JValue.Int; jvfalse: fn(): ref JValue.False; jvint: fn(i: int): ref JValue.Int; jvnull: fn(): ref JValue.Null; jvobject: fn(m: list of (string, ref JValue)): ref JValue.Object; jvreal: fn(r: real): ref JValue.Real; jvstring: fn(s: string): ref JValue.String; jvtrue: fn(): ref JValue.True; }; }; init: fn(); reset: fn(): ref InflateIO; iold_contrib//root/sys/src/cmd/limbo/module/keyset.m������������������������������������������������� 664 � 0 � 0 � 351 7672064065 21450�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Keyset: module { PATH: con "/dis/lib/keyset.dis"; init: fn(): string; pkhash: fn(pk: string): string; keysforsigner: fn(signername: string, spk: string, user: string, dir: string): (list of (string, string, string), string); }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/libc.m��������������������������������������������������� 664 � 0 � 0 � 1240 7531202272 21057�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Libc: module { PATH: con "/dis/lib/libc.dis"; isalnum: fn(c: int): int; isalpha: fn(c: int): int; isascii: fn(c: int): int; iscntrl: fn(c: int): int; isdigit: fn(c: int): int; isgraph: fn(c: int): int; islower: fn(c: int): int; isprint: fn(c: int): int; ispunct: fn(c: int): int; isspace: fn(c: int): int; isupper: fn(c: int): int; isxdigit: fn(c: int): int; tolower: fn(c: int): int; toupper: fn(c: int): int; toascii: fn(c: int): int; strchr: fn(s: string, n: int): int; strrchr: fn(s: string, n: int): int; strncmp: fn(s1: string, s2: string, n: int): int; abs: fn(n: int): int; min: fn(m: int, n: int): int; max: fn(m: int, n: int): int; }; �������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/libc0.m�������������������������������������������������� 664 � 0 � 0 � 2373 7510074227 21153�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Libc0: module { PATH: con "/dis/lib/libc0.dis"; isalnum: fn(c: int): int; isalpha: fn(c: int): int; isascii: fn(c: int): int; iscntrl: fn(c: int): int; isdigit: fn(c: int): int; isgraph: fn(c: int): int; islower: fn(c: int): int; isprint: fn(c: int): int; ispunct: fn(c: int): int; isspace: fn(c: int): int; isupper: fn(c: int): int; isxdigit: fn(c: int): int; tolower: fn(c: int): int; toupper: fn(c: int): int; toascii: fn(c: int): int; strlen: fn(s: array of byte): int; strcmp: fn(s1: array of byte, s2: array of byte): int; strcpy: fn(s1: array of byte, s2: array of byte): array of byte; strcat: fn(s1: array of byte, s2: array of byte): array of byte; strncmp: fn(s1: array of byte, s2: array of byte, n: int): int; strncpy: fn(s1: array of byte, s2: array of byte, n: int): array of byte; strncat: fn(s1: array of byte, s2: array of byte, n: int): array of byte; strdup: fn(s: array of byte): array of byte; strchr: fn(s: array of byte, n: int): array of byte; strrchr: fn(s: array of byte, n: int): array of byte; abs: fn(n: int): int; min: fn(m: int, n: int): int; max: fn(m: int, n: int): int; ls2aab: fn(argl: list of string): array of array of byte; s2ab: fn(s: string): array of byte; ab2s: fn(a: array of byte): string; }; ction pointers are hidden }; # generic public key PK: adt { sa: ref SigAlg; # signature algorithm owner: string; # owner's name # key and system parameters are hidden }; # generic secret key SK: adt { sa: ref SigAlg; # signature algorithm old_contrib//root/sys/src/cmd/limbo/module/linalg.m������������������������������������������������� 664 � 0 � 0 � 1761 6622405627 21435�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# The convention used here for storing matrices is the same commonly # used for scientific programming in C, namely linearizing in Fortran order. # Let A be an m by n matrix. We represent this by # a: array of real; # m, n, lda: int; # where the variable lda ("leading dimension of a") is used so that a # succession of matrix problems of varying sizes can be created without # wholesale copying of data. The element of A in the i-th row and j-th column # is stored in a[i+lda*j], where 0<=i<m and 0<=j<n. This 0-origin indexing # is used everywhere, and in particular in permutation vectors. LinAlg: module{ PATH: con "/dis/math/linalg.dis"; Vector: type array of real; Matrix: adt{ m, L, n: int; # rows, column stride, columns a: Vector; # data, stored A[i,j] = a[i+L*j] }; dgefa: fn(a:array of real, lda, n:int, ipvt:array of int): int; dgesl: fn(a:array of real, lda, n:int, ipvt:array of int, b:array of real, job:int); printmat: fn(label:string, a:array of real, lda, m, n:int); }; Certificate; sold_contrib//root/sys/src/cmd/limbo/module/lists.m�������������������������������������������������� 664 � 0 � 0 � 1632 10655631052 21334�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Lists: module { PATH: con "/dis/lib/lists.dis"; map: fn[T](f: ref fn(x: T): T, l: list of T): list of T; allsat: fn[T](p: ref fn(x: T): int, l: list of T): int; anysat: fn[T](p: ref fn(x: T): int, l: list of T): int; filter: fn[T](p: ref fn(x: T): int, l: list of T): list of T; partition: fn[T](p: ref fn(x: T): int, l: list of T): (list of T, list of T); append: fn[T](l: list of T, x: T): list of T; concat: fn[T](l: list of T, l2: list of T): list of T; combine: fn[T](l: list of T, l2: list of T): list of T; reverse: fn[T](l: list of T): list of T; last: fn[T](l: list of T): T; delete: fn[T](x: T, l: list of T): list of T for { T => eq: fn(a, b: T): int; }; pair: fn[T1, T2](l1: list of T1, l2: list of T2): list of (T1, T2); unpair: fn[T1, T2](l: list of (T1, T2)): (list of T1, list of T2); ismember: fn[T](x: T, l: list of T): int for { T => eq: fn(a, b: T): int; }; }; #sort? #join #split DigestState): ref DigestState; # encryption interfaces Encrypt: con 0; Decrypt: con 1; AESbsizold_contrib//root/sys/src/cmd/limbo/module/loader.m������������������������������������������������� 664 � 0 � 0 � 1366 6622405627 21436�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # External loader interface # Nilmod: module { }; Loader: module { PATH: con "$Loader"; Inst: adt { op: byte; addr: byte; src: int; mid: int; dst: int; }; Typedesc: adt { size: int; map: array of byte; }; Link: adt { name: string; sig: int; pc: int; tdesc: int; }; Niladt: adt { }; ifetch: fn(mp: Nilmod): array of Inst; tdesc: fn(mp: Nilmod): array of Typedesc; newmod: fn(name: string, ss, nlink: int, inst: array of Inst, data: ref Niladt): Nilmod; tnew: fn(mp: Nilmod, size: int, map: array of byte): int; link: fn(mp: Nilmod): array of Link; ext: fn(mp: Nilmod, idx, pc: int, tdesc: int): int; dnew: fn(size: int, map: array of byte): ref Niladt; compile: fn(mp: Nilmod, flag: int): int; }; ) # messages > 4096 bytes are truncated # errors > 64 bytes are truncated # getstring and getbytearray return (result, error). getstring: fn(fd: ref Sys->FD): (string, string); putstring: fn(fd: ref Sys->FD, s: string): int; getbytearray: fn(fd: ref Sys->FD)old_contrib//root/sys/src/cmd/limbo/module/lock.m��������������������������������������������������� 664 � 0 � 0 � 325 7661112170 21062�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Lock: module { PATH: con "/dis/lib/lock.dis"; Semaphore: adt { c: chan of int; obtain: fn(nil: self ref Semaphore); release: fn(nil: self ref Semaphore); new: fn(): ref Semaphore; }; init: fn(); }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/man.m���������������������������������������������������� 664 � 0 � 0 � 1505 10553206706 20751�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Parseman: module { PATH: con "/dis/lib/parseman.dis"; Metrics: adt { pagew: int; dpi: int; em: int; # size in dots en: int; # size in dots V: int; # font height in dots indent: int; ssindent: int; }; Text: adt { font: int; attr: int; text: string; heading: int; # heading level link: string; }; # Text fonts and attributes FONT_ROMAN, FONT_ITALIC, FONT_BOLD: con iota; ATTR_SMALL, ATTR_LAST: con 1 << iota; init: fn(): string; parseman: fn[T](fd: ref Sys->FD, metrics: Metrics, ql: int, t: T, setline: chan of list of (int, Text)) for{ T => textwidth: fn(t: self T, text: Text): int; }; }; Man: module { PATH: con "/dis/lib/man.dis"; loadsections: fn(sections: list of string): string; getfiles: fn(sections: list of string , keys: list of string): list of (int, string, string); }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/math/���������������������������������������������������� 775 � 0 � 0 � 0 11411740051 20736��5����������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/math/geodesy.m������������������������������������������� 664 � 0 � 0 � 3434 10202670105 22556�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Geodesy: module { PATH: con "/dis/math/geodesy.dis"; # easting, northing in metres Eano: adt{ e: real; n: real; }; # latitude, longitude in radians Lalo: adt{ la: real; lo: real; }; # datums # WGS84 and ITRS2000 effectively the same OSGB36, Ireland65, ED50, WGS84, ITRS2000, ETRS89: con iota; # transverse Mercator projections Natgrid, IrishNatgrid, UTMEur, UTM: con iota; # call first # d specifies the datum (default WGS84) # t specifies the transverse Mercator projection (default Natgrid) # z specifies the UTM zone if relevant (default 30) # calls format below init: fn(d: int, t: int, z: int); # alters the current datum, transverse Mercator projection and UTM zone # use a negative value to leave unaltered format: fn(d: int, t: int, z: int); # OS string to (easting, northing) and back # formats XYen, XYeenn, XYeeennn, XYeeeennnn, XYeeeeennnnn or # formats eenn, eeennn, eeeennnn, eeeeennnnn, eeeeeennnnnn os2en: fn(s: string): (int, Eano); # returns (0, ...) if bad string format en2os: fn(en: Eano): string; # latitude/longitude string to (latitude, longitude) and back # format latitude longitude # formats deg[N|S], deg:min[N|S], deg:min:sec[N|S] for latitude # formats deg[E|W], deg:min[E|W], deg:min:sec[E|W] for longitude str2lalo: fn(s: string): (int, Lalo); # returns (0, ...) if bad string format lalo2str: fn(lalo: Lalo): string; # general string to (easting, northing) # OS grid or latitude/longitude format as above str2en: fn(s: string): (int, Eano); # returns (0, ...) if bad string format # (easting, northing) to (latitude, longitude) and back en2lalo: fn(en: Eano): Lalo; lalo2en: fn(lalo: Lalo): Eano; # approximate transformations between any of OSGB36, WGS84, ITRS2000, ETRS89 datum2datum: fn(lalo: Lalo, f: int, t: int): Lalo; }; # generic public key PK: adt { sa: ref SigAlg; # signature algorithm owner: string; # owner's name # key and system parameters are hidden }; # generic secret key SK: adt { sa: ref SigAlg; # signature algorithm old_contrib//root/sys/src/cmd/limbo/module/math/polyfill.m������������������������������������������ 664 � 0 � 0 � 626 7552563210 22725�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Polyfill: module { PATH: con "/dis/math/polyfill.dis"; Zstate: adt{ r: Draw->Rect; zbuf0, zbuf1: array of int; xlen: int; ylen: int; xylen: int; }; init: fn(); initzbuf: fn(r: Draw->Rect): ref Zstate; clearzbuf: fn(s: ref Zstate); setzbuf: fn(s: ref Zstate, zd: int); fillpoly: fn(d: ref Image, v: array of Point, w: int, s: ref Image, p: Point, zstate: ref Zstate, dc, dx, dy: int); };����������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/math/polyhedra.m����������������������������������������� 664 � 0 � 0 � 1215 7645506655 23112�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Polyhedra: module { PATH: con "/dis/math/polyhedra.dis"; Vector: adt{ x, y, z: real; }; Polyhedron: adt{ name, dname: string; indx, V, E, F, concave, anti, allf, adj: int; v, f: array of Vector; fv, vf: array of array of int; offset: big; prv, nxt: cyclic ref Polyhedron; inc: real; }; # read in details of all polyhedra in the given file scanpolyhedra: fn(f: string): (int, ref Polyhedron, ref Bufio->Iobuf); # read in the coordinates of all polyhedra getpolyhedra: fn(p: ref Polyhedron, b: ref Bufio->Iobuf); # read in the coordinates of the given polyhedron getpolyhedron: fn(p: ref Polyhedron, b: ref Bufio->Iobuf); }; t, l: list of T): int; anysat: fn[T](p: ref fn(x: T): int, l: list of T): int; filter: fn[T](p: ref fn(x: T): int, l: list of T): list of T; partition: fn[T](p: ref fn(x: T): int, l: list of T): (list of T, list of T); append: fn[T](l: list of T, x: T): list of T; concat: fn[T](l: list of T, l2: list of T): list of T; combine: fn[T](l: list of T, l2: list of T):old_contrib//root/sys/src/cmd/limbo/module/math.m��������������������������������������������������� 664 � 0 � 0 � 5473 7403654567 21133�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Math: module { PATH: con "$Math"; Infinity: con 1e400; NaN: con 0./0.; MachEps: con 2.2204460492503131e-16; Pi: con 3.14159265358979323846; Degree: con Pi/180.; INVAL: con (1<<0); ZDIV: con (1<<1); OVFL: con (1<<2); UNFL: con (1<<3); INEX: con (1<<4); RND_NR: con (0<<8); RND_NINF: con (1<<8); RND_PINF: con (2<<8); RND_Z: con (3<<8); RND_MASK: con (3<<8); acos: fn(x: real): real; # arccos(x) in [0,pi] acosh: fn(x: real): real; asin: fn(x: real): real; # arcsin(x) in [-pi/2,pi/2] asinh: fn(x: real): real; atan: fn(x: real): real; # arctan(x) in [-pi/2,pi/2] atan2: fn(y, x: real): real; # arctan(y/x) in [-pi,pi] atanh: fn(x: real): real; cbrt: fn(x: real): real; ceil: fn(x: real): real; copysign: fn(x, s: real): real; cos: fn(x: real): real; cosh: fn(x: real): real; dot: fn(x, y: array of real): real; erf: fn(x: real): real; erfc: fn(x: real): real; exp: fn(x: real): real; expm1: fn(x: real): real; fabs: fn(x: real): real; fdim, fmin, fmax: fn(x, y: real): real; finite: fn(x: real): int; floor: fn(x: real): real; fmod: fn(x, y: real): real; gemm: fn(transa, transb: int, # upper case N or T m, n, k: int, alpha: real, a: array of real, lda: int, b: array of real, ldb: int, beta: real, c: array of real, ldc: int); getFPcontrol, getFPstatus: fn(): int; FPcontrol, FPstatus: fn(r, mask: int): int; hypot: fn(x, y: real): real; iamax: fn(x: array of real): int; ilogb: fn(x: real): int; isnan: fn(x: real): int; j0: fn(x: real): real; j1: fn(x: real): real; jn: fn(n: int, x: real): real; lgamma: fn(x: real): (int,real); log: fn(x: real): real; log10: fn(x: real): real; log1p: fn(x: real): real; modf: fn(x: real): (int,real); nextafter: fn(x, y: real): real; norm1, norm2: fn(x: array of real): real; pow: fn(x, y: real): real; pow10: fn(p: int): real; remainder: fn(x, p: real): real; rint: fn(x: real): real; scalbn: fn(x: real, n: int): real; sin: fn(x: real): real; sinh: fn(x: real): real; sort: fn(x: array of real, pi: array of int); sqrt: fn(x: real): real; tan: fn(x: real): real; tanh: fn(x: real): real; y0: fn(x: real): real; y1: fn(x: real): real; yn: fn(n: int, x: real): real; import_int: fn(b: array of byte, x: array of int); import_real32: fn(b: array of byte, x: array of real); import_real: fn(b: array of byte, x: array of real); export_int: fn(b: array of byte, x: array of int); export_real32: fn(b: array of byte, x: array of real); export_real: fn(b: array of byte, x: array of real); # undocumented, of specialized interest only DEPRECATED bits32real: fn(b: int): real; # IEEE 32-bit format to real bits64real: fn(b: big): real; # IEEE 64-bit format to real realbits32: fn(x: real): int; # real to IEEE 32-bit format realbits64: fn(x: real): big; # real to IEEE 64-bit format }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/memfs.m�������������������������������������������������� 664 � 0 � 0 � 166 7056511011 21237�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MemFS : module { PATH : con "/dis/lib/memfs.dis"; init : fn() : string; newfs : fn (maxsz : int) : ref Sys->FD; }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/mpeg.m��������������������������������������������������� 664 � 0 � 0 � 516 7113525440 21064�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # This module has a primitive interface to the # mpeg device driver # Mpeg: module { PATH: con "/dis/lib/mpeg.dis"; play: fn(d: ref Draw->Display, w: ref Image, dopaint: int, r: Draw->Rect, file: string, notify: chan of string): string; ctl: fn(msg: string): int; keycolor: fn(d: ref Draw->Display): ref Draw->Image; }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/multistyx.m���������������������������������������������� 664 � 0 � 0 � 424 7252174677 22234�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Multistyx: module { PATH: con "/dis/lib/multistyx.dis"; init: fn(): Styxlib; srv: fn(addr, mntpath: string, doauth: int, algs: list of string): (chan of (int, ref Styxlib->Styxserver, string), chan of (int, ref Styxlib->Styxserver, ref Styxlib->Tmsg), string); }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/muxclient.m���������������������������������������������� 664 � 0 � 0 � 1547 7515141123 22167�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Muxclient: module { # From appl to mux AMexit: con 10; # application is exiting AMstartir: con 11; # application is ready to receive IR events AMstartkbd: con 12; # application is ready to receive keyboard characters AMstartptr: con 13; # application is ready to receive mouse events AMnewpin: con 14; # application needs a PIN # From mux to appl MAtop: con 20; # application should make all its windows visible Context: adt { screen: ref Screen; # place to make windows display: ref Display; # frame buffer on which windows reside cir: chan of int; # incoming events from IR remote ckbd: chan of int; # incoming characters from keyboard cptr: chan of ref Pointer; # incoming stream of mouse positions ctoappl: chan of int; # commands from mux to application ctomux: chan of int; # commands from application to mux }; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/names.m�������������������������������������������������� 664 � 0 � 0 � 633 10110064365 21252�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Names: module { PATH: con "/dis/lib/names.dis"; cleanname: fn(name: string): string; dirname: fn(name: string): string; basename: fn(name: string, suffix: string): string; elements: fn(name: string): list of string; isprefix: fn(a: string, b: string): int; pathname: fn(els: list of string): string; rooted: fn(root: string, name: string): string; relative: fn(name: string, root: string): string; }; �����������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/newns.m�������������������������������������������������� 664 � 0 � 0 � 235 6622405627 21274�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Newns: module { PATH: con "/dis/lib/newns.dis"; # # Build a new namespace from a description file # newns: fn(user: string, nsfile: string): string; }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/palm.m��������������������������������������������������� 664 � 0 � 0 � 14175 7617463151 21144�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Palm: module { # # basic Palm data types # PATH: con "/dis/lib/palm.dis"; DBInfo: adt { name: string; attr: int; dtype: string; # database type (byte[4]) version: int; # defined by application creator: string; # creating application (byte[4]) ctime: int; mtime: int; btime: int; # last backup modno: int; # modification number: set to zero uidseed: int; # unique record ID seed (unused, set to zero) # the following is used by the database access protocol index: int; new: fn(name: string, attr: int, dtype: string, version: int, creator: string): ref DBInfo; }; # file attributes: Fresource: con 1<<0; # file is .prc not .pdb Fronly: con 1<<1; # read only Fappinfodirty: con 1<<2; Fbackup: con 1<<3; # no conduit exists Foverwrite: con 1<<4; # overwrite older copy if present Freset: con 1<<5; # reset after installation Fprivate: con 1<<6; # don't allow copy of this to be beamed Fstream: con 1<<7; # file is an array of bytes, not a database # extended (misc) attributes for Desklink->ReadDBList Fnosync: con (1<<7)<<16; Frambased: con (1<<6)<<16; Noindex: con 16rFFFF; # unknown index Record: adt { id: int; # unique record ID (24 bits) attr: int; # record attributes cat: int; # category data: array of byte; new: fn(id: int, attr: int, cat: int, size: int): ref Record; }; # Record.attr values: Rdelete: con 16r80; # delete next sync Rdirty: con 16r40; # record modified Rinuse: con 16r20; # record in use Rsecret: con 16r10; # record is secret Rarchive: con 16r08; # archive next sync Rmcat: con 16r0F; # mask for category field in Palmdb->Entry.attrs Resource: adt { name: int; # byte[4]: resource name or type id: int; # resource ID (16 bits) data: array of byte; new: fn(name: int, id: int, size: int): ref Resource; }; # common form of category data in appinfo Categories: adt { renamed: int; # which categories have been renamed labels: array of string; # 16 category names uids: array of int; # corresponding unique IDs lastuid: int; # last unique ID assigned appdata: array of byte; # remaining data is application-specific new: fn(labels: array of string): ref Categories; unpack: fn(a: array of byte): ref Categories; pack: fn(c: self ref Categories): array of byte; mkidmap: fn(c: self ref Categories): array of int; }; Doc: adt { m: Palmdb; file: ref Palmdb->PDB; version: int; length: int; # uncompressed nrec: int; # text records only recsize: int; # uncompressed position: int; sizes: array of int; # sizes of uncompressed records open: fn(m: Palmdb, file: ref Palmdb->PDB): (ref Doc, string); read: fn(nil: self ref Doc, i: int): (string, string); iscompressed: fn(nil: self ref Doc): int; unpacktext: fn(d: self ref Doc, a: array of byte): (string, string); textlength: fn(d: self ref Doc, a: array of byte): int; }; init: fn(): string; # name mapping filename: fn(s: string): string; dbname: fn(s: string): string; # convert between resource/application ID and string id2s: fn(id: int): string; s2id: fn(s: string): int; # time conversion pilot2epoch: fn(t: int): int; epoch2pilot: fn(t: int): int; # Latin-1 to string conversion gets: fn(a: array of byte): string; puts: fn(a: array of byte, s: string); # big-endian conversion get2: fn(a: array of byte): int; get3: fn(a: array of byte): int; get4: fn(a: array of byte): int; put2: fn(a: array of byte, v: int); put3: fn(a: array of byte, v: int); put4: fn(a: array of byte, v: int); # argument wrapping for Desklink and CMP 2.x ArgIDbase: con 16r20; # first argument ID argsize: fn(args: array of (int, array of byte)): int; packargs: fn(out: array of byte, args: array of (int, array of byte)): array of byte; unpackargs: fn(argc: int, reply: array of byte): (array of (int, array of byte), string); }; Palmdb: module { PATH: con "/dis/lib/palmdb.dis"; DB: adt { x: int; # instance index, used internally mode: int; attr: int; # essential database attributes open: fn(nil: string, mode: int): (ref DB, string); create: fn(nil: string, mode: int, perm: int, nil: ref Palm->DBInfo): (ref DB, string); close: fn(nil: self ref DB): string; stat: fn(nil: self ref DB): ref Palm->DBInfo; wstat: fn(nil: self ref DB, nil: ref Palm->DBInfo, flags: int); rdappinfo: fn(nil: self ref DB): (array of byte, string); wrappinfo: fn(nil: self ref DB, nil: array of byte): string; rdsortinfo: fn(nil: self ref DB): (array of int, string); wrsortinfo: fn(nil: self ref DB, nil: array of int): string; readidlist: fn(nil: self ref DB, sort: int): array of int; nentries: fn(nil: self ref DB): int; resetsyncflags: fn(nil: self ref DB): string; records: fn(nil: self ref DB): ref PDB; resources: fn(nil: self ref DB): ref PRC; }; # database files (.pdb, .doc, and most others) PDB: adt { db: ref DB; read: fn(nil: self ref PDB, index: int): ref Palm->Record; readid: fn(nil: self ref PDB, id: int): (ref Palm->Record, int); resetnext: fn(nil: self ref PDB): int; readnextmod: fn(nil: self ref PDB): (ref Palm->Record, int); # DLP 1.1 functions: # readnextincat(nil: self ref DB, cat: int): (ref Palm->Record, string); # readnextmodincat(nil: self ref DB, cat: int): (ref Palm->Record, string); write: fn(nil: self ref PDB, r: ref Palm->Record): string; truncate: fn(nil: self ref PDB): string; delete: fn(nil: self ref PDB, id: int): string; deletecat: fn(nil: self ref PDB, cat: int): string; purge: fn(nil: self ref PDB): string; movecat: fn(nil: self ref PDB, old: int, new: int): string; }; # resource files (.prc) PRC: adt { db: ref DB; # read by index, or by type & id read: fn(nil: self ref PRC, index: int): ref Palm->Resource; readtype: fn(nil: self ref PRC, name: int, id: int): (ref Palm->Resource, int); # write by type and id only (desklink) write: fn(nil: self ref PRC, r: ref Palm->Resource): string; truncate: fn(nil: self ref PRC): string; delete: fn(nil: self ref PRC, name: int, id: int): string; }; # open modes (not the same as Sys->) OREAD: con 16r80; OWRITE: con 16r40; ORDWR: con OREAD|OWRITE; OEXCL: con 16r20; OSECRET: con 16r10; init: fn(m: Palm): string; }; 1547 7515141123 22167�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/palmfile.m����������������������������������������������� 664 � 0 � 0 � 7651 7600363227 21760�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Palmfile: module { PATH: con "/dis/lib/palmfile.dis"; DBInfo: adt { name: string; attr: int; dtype: string; # database type (byte[4]) version: int; # defined by application creator: string; # creating application (byte[4]) ctime: int; mtime: int; btime: int; # last backup modno: int; # modification number: set to zero uidseed: int; # unique record ID seed (unused, set to zero) # used internally and by the database access protocol appinfo: int; # AppInfo offset sortinfo: int; # SortInfo offset # the following are used by the database access protocol index: int; more: int; new: fn(name: string, attr: int, dtype: string, version: int, creator: string): ref DBInfo; }; # file attributes: Fresource: con 1<<0; # file is .prc not .pdb Fronly: con 1<<1; # read only Fappinfodirty: con 1<<2; Fbackup: con 1<<3; # no conduit exists Foverwrite: con 1<<4; # overwrite older copy if present Freset: con 1<<5; # reset after installation Fprivate: con 1<<6; # don't allow copy of this to be beamed Record: adt { id: int; # resource: ID; data: unique record ID index: int; name: int; # byte[4]: resource record only attr: int; # data record only cat: int; # category data: array of byte; # new: fn(size: int): ref Record; }; Entry: adt { id: int; # resource: id; record: unique ID offset: int; size: int; name: int; # resource entry only attr: int; # record entry only }; # record attributes: Rdelete: con 16r80; # delete next sync Rdirty: con 16r40; # record modified Rinuse: con 16r20; # record in use Rsecret: con 16r10; # record is secret Rarchive: con 16r08; # archive next sync Rmcat: con 16r0F; # mask for category field in Entry.attrs # common form of category data in appinfo Categories: adt { renamed: int; # which categories have been renamed labels: array of string; # 16 category names uids: array of int; # corresponding unique IDs lastuid: int; # last unique ID assigned appdata: array of byte; # remaining data is application-specific new: fn(labels: array of string): ref Categories; unpack: fn(a: array of byte): ref Categories; pack: fn(c: self ref Categories): array of byte; mkidmap: fn(c: self ref Categories): array of int; }; Pfile: adt { fname: string; f: ref Bufio->Iobuf; mode: int; info: ref DBInfo; appinfo: array of byte; sortinfo: array of int; uidseed: int; entries: array of ref Entry; open: fn(nil: string, mode: int): (ref Pfile, string); # create: fn(nil: string, mode: int, perm: int, nil: ref DBInfo): ref Pfile; close: fn(nil: self ref Pfile): int; stat: fn(nil: self ref Pfile): ref DBInfo; # wstat: fn(nil: self ref Pfile, nil: ref DBInfo); read: fn(nil: self ref Pfile, index: int): (ref Record, string); # readid: fn(nil: self ref Pfile, nil: int): (ref Record, string); # append: fn(nil: self ref Pfile, r: ref Record): int; # setappinfo: fn(nil: self ref Pfile, nil: array of byte); # setsortinfo: fn(nil: self ref Pfile, nil: array of int); }; Doc: adt { file: ref Pfile; version: int; length: int; # uncompressed nrec: int; # text records only recsize: int; # uncompressed position: int; sizes: array of int; # sizes of uncompressed records open: fn(file: ref Pfile): (ref Doc, string); read: fn(nil: self ref Doc, i: int): (string, string); iscompressed: fn(nil: self ref Doc): int; unpacktext: fn(d: self ref Doc, a: array of byte): (string, string); textlength: fn(d: self ref Doc, a: array of byte): int; }; init: fn(): string; # name mapping filename: fn(s: string): string; dbname: fn(s: string): string; # Latin-1 to string conversion gets: fn(a: array of byte): string; puts: fn(a: array of byte, s: string); # big-endian conversion get2: fn(a: array of byte): int; get3: fn(a: array of byte): int; get4: fn(a: array of byte): int; put2: fn(a: array of byte, v: int); put3: fn(a: array of byte, v: int); put4: fn(a: array of byte, v: int); }; med Fstream: con 1<<7; # file is an array of bytes, not a database # extended (misold_contrib//root/sys/src/cmd/limbo/module/pkcs.m��������������������������������������������������� 664 � 0 � 0 � 10513 6760542062 21140�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Public-Key Cryptography Standards (PKCS) # # Ref: http://www.rsa.com # RFC1423 # PKCS: module { PATH: con "/dis/lib/crypt/pkcs.dis"; init: fn(): string; # PKCS Object Identifiers objIdTab : array of ASN1->Oid; id_pkcs, id_pkcs_1, id_pkcs_rsaEncryption, id_pkcs_md2WithRSAEncryption, id_pkcs_md4WithRSAEncryption, id_pkcs_md5WithRSAEncryption, id_pkcs_3, id_pkcs_dhKeyAgreement, id_pkcs_5, id_pkcs_pbeWithMD2AndDESCBC, id_pkcs_pbeWithMD5AndDESCBC, id_pkcs_7, id_pkcs_data, id_pkcs_singnedData, id_pkcs_envelopedData, id_pkcs_signedAndEnvelopedData, id_pkcs_digestData, id_pkcs_encryptedData, id_pkcs_9, id_pkcs_emailAddress, id_pkcs_unstructuredName, id_pkcs_contentType, id_pkcs_messageDigest, id_pkcs_signingTime, id_pkcs_countersignature, id_pkcs_challengePassword, id_pkcs_unstructuredAddress, id_pkcs_extCertAttrs, id_algorithm_shaWithDSS : con iota; # PKCS1 RSAParams: adt { modulus : ref Keyring->IPint; exponent : ref Keyring->IPint; }; RSAKey: adt { modulus : ref Keyring->IPint; modlen : int; exponent : ref Keyring->IPint; bits: fn(k: self ref RSAKey): int; #tostring: fn(k: self ref RSAKey): string; }; MD2_WithRSAEncryption : con 0; MD5_WithRSAEncryption : con 1; rsa_encrypt: fn(data: array of byte, key: ref RSAKey, blocktype: int): (string, array of byte); rsa_decrypt: fn(data: array of byte, key: ref RSAKey, public: int): (string, array of byte); rsa_sign: fn(data: array of byte, sk: ref RSAKey, algid: int): (string, array of byte); rsa_verify: fn(data, signature: array of byte, pk: ref RSAKey, algid: int): int; decode_rsapubkey: fn(a: array of byte): (string, ref RSAKey); # Note: # DSS included here is only for completeness. DSSParams: adt { p : ref Keyring->IPint; q : ref Keyring->IPint; alpha : ref Keyring->IPint; }; DSSPublicKey: adt { params : ref DSSParams; y : ref Keyring->IPint; }; DSSPrivateKey: adt { params : ref DSSParams; x : ref Keyring->IPint; }; generateDSSKeyPair: fn(strength: int): (ref DSSPublicKey, ref DSSPrivateKey); dss_sign: fn(a: array of byte, sk: ref DSSPrivateKey): (string, array of byte); dss_verify: fn(a, signa: array of byte, pk: ref DSSPublicKey): int; decode_dsspubkey: fn(a: array of byte): (string, ref DSSPublicKey); # PKCS3 DHParams: adt { prime : ref Keyring->IPint; # prime (p) base : ref Keyring->IPint; # generator (alpha) privateValueLength : int; }; DHPublicKey: adt { param : ref DHParams; pk : ref Keyring->IPint; }; DHPrivateKey: adt { param : ref DHParams; pk : ref Keyring->IPint; sk : ref Keyring->IPint; }; generateDHParams: fn(primelen: int): ref DHParams; setupDHAgreement: fn(dh: ref DHParams): (ref DHPrivateKey, ref DHPublicKey); computeDHAgreedKey: fn(dh: ref DHParams, mysk, upk: ref Keyring->IPint): array of byte; decode_dhpubkey: fn(a: array of byte): (string, ref DHPublicKey); # PKCS5 PBEParams: adt { salt : array of byte; # [8] iterationCount : int; }; PBE_MD2_DESCBC : con 0; PBE_MD5_DESCBC : con 1; generateDESKey: fn(pw: array of byte, param: ref PBEParams, alg: int) : (ref Keyring->DESstate, array of byte, array of byte); pbe_encrypt: fn(state: ref Keyring->DESstate, b: array of byte): array of byte; pbe_decrypt: fn(state: ref Keyring->DESstate, eb: array of byte): array of byte; # PKCS6 ExtCertInfo: adt { version : int; cert : array of byte; # der encoded x509 Certificate attrs : list of array of byte; # attribute as array of byte }; # PKCS7 # See module X509 # PKCS8 PrivateKeyInfo: adt { # as SEQUENCE version : int; # should be 0 privateKeyAlgorithm : ref AlgIdentifier; privateKey : array of byte; # octet string attrs : list of array of byte; # [0] IMPLICIT Attributes OPTIONAL encode: fn(p: self ref PrivateKeyInfo): (string, array of byte); decode: fn(a: array of byte): (string, ref PrivateKeyInfo); }; EncryptedPrivateKeyInfo: adt { # as SEQUENCE encryptionAlgorithm : ref AlgIdentifier; encryptedData : array of byte; # octet string encode: fn(ep: self ref EncryptedPrivateKeyInfo): (string, array of byte); decode: fn(a: array of byte): (string, ref EncryptedPrivateKeyInfo); }; AlgIdentifier: adt { # TODO: move this to ASN1 oid : ref ASN1->Oid; parameter : array of byte; }; # PKCS10 # See module X509 }; ource): string; truncate: fn(nil: self ref PRC): string; delete: fn(nil: self ref PRC, name: int, id: int): string; }; # open modes (not the same as Sys->) OREAD: con 16r8old_contrib//root/sys/src/cmd/limbo/module/plumbmsg.m����������������������������������������������� 664 � 0 � 0 � 1477 6622405627 22021�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Plumbmsg: module { PATH: con "/dis/lib/plumbmsg.dis"; # Message format: # source application\n # destination application\n # working directory\n # type\n # properties\n # nbytes\n # n bytes Msg: adt { src: string; dst: string; dir: string; kind: string; attr: string; data: array of byte; # used by applications send: fn(msg: self ref Msg): int; recv: fn(): ref Msg; # used by plumb and send, recv pack: fn(msg: self ref Msg): array of byte; unpack: fn(b: array of byte): ref Msg; }; Attr: adt { name: string; val: string; }; init: fn(doinput: int, rcvport: string, maxdata: int): int; shutdown: fn(); string2attrs: fn(s: string): list of ref Attr; attrs2string: fn(l: list of ref Attr): string; lookup: fn(attrs: list of ref Attr, name: string): (int, string); }; ion number: set to zero uidseed: int; # unique record ID seed (unused, set to zero) # used internally and by the database access protocol appinfo: int; # AppInfo offset sortinfo: int; old_contrib//root/sys/src/cmd/limbo/module/pop3.m��������������������������������������������������� 664 � 0 � 0 � 2373 7715251470 21047�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pop3 protocol independent access to an email server. Pop3: module { PATH: con "/dis/lib/pop3.dis"; # all functions return status (-ve when error) # open a connection with the pop3 server # requires the email server's name or address or nil if a default server is to be used # returns (status, errror string) open: fn(user, password, server: string) : (int, string); # stat the user's mailbox # returns (status, error string, no. messages, total no. bytes) stat: fn(): (int, string, int, int); # list the user's mailbox # returns (status, error string, list of (message no., bytes in message)) msglist: fn(): (int, string, list of (int, int)); # list as above but return (status, error string, list of message nos.) msgnolist: fn(): (int, string, list of int); # top of a message given it's no. # returns (status, error string, message top) top: fn(m: int) : (int, string, string); # full text of a message given it's no. # returns (status, error string, message) get: fn(m: int) : (int, string, string); # delete a message given it's no. # returns (status, error string) delete: fn(m: int) : (int, string); # close the connection # returns (status, error string) close: fn(): (int, string); }; ing; f: ref Bufio->Iobuf; mode: int; info: ref DBInfo; appinfo: array of byte; sortinfo: array of int; uidseed: int; entries: array of ref Entry; open: fn(nil: string, mode: int): (ref Pfile, string); # create: fn(nil: string, mode: int, perold_contrib//root/sys/src/cmd/limbo/module/popup.m�������������������������������������������������� 664 � 0 � 0 � 1047 7654001022 21312�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pop-up menus. # use choicebuttons instead - it's difficult to get these right. Popup: module { PATH: con "/dis/lib/popup.dis"; init: fn(); # mkbutton: fn(win: ref Tk->Toplevel, w: string, a: array of string, n: int): chan of string; # changebutton: fn(win: ref Tk->Toplevel, w: string, a: array of string, n: int); # event: fn(win: ref Tk->Toplevel, e: string, a: array of string): int; # add: fn(a: array of string, s: string): (array of string, int); post: fn(win: ref Tk->Toplevel, p: Draw->Point, a: array of string, n: int): chan of int; }; ; dbname: fn(s: string): string; # Latin-1 to string conversion gets: fn(a: array of byte): string; puts: fn(a: array of byte, s: string); # big-endian conversion get2: fn(a: array of byte): int; get3: fn(a: array of byte): int; get4: fn(a: array of byte): int; put2: fn(a: array of byte, v: int); put3: fn(a: array of byte, v: int); put4: fn(a: array of byte, v: int); }; med Fstream: con 1<<7; # file is an array of bytes, not a database # extended (misold_contrib//root/sys/src/cmd/limbo/module/powerman.m����������������������������������������������� 664 � 0 � 0 � 260 7373001616 21762�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Powerman: module { PATH: con "/dis/lib/powerman.dis"; init: fn(file: string, cmd: chan of string): int; ack: fn(cmd: string); ctl: fn(cmd: string): string; stop: fn(); }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/prefab.m������������������������������������������������� 664 � 0 � 0 � 7456 6622405627 21435�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Prefab: module { PATH: con "$Prefab"; # types of Elements EIcon: con 0; EText: con 1; ETitle: con 2; EHorizontal: con 3; EVertical: con 4; ESeparator: con 5; # first arg to Element.adjust: size of elements Adjpack: con 10; # leave alone, pack tightly Adjequal: con 11; # make equal Adjfill: con 12; # make equal, filling available space # second arg: position of element within space Adjleft: con 20; Adjup: con 20; Adjcenter: con 21; Adjright: con 22; Adjdown: con 22; # default fonts and colors for objects Style: adt { titlefont: ref Draw->Font; textfont: ref Draw->Font; elemcolor: ref Draw->Image; edgecolor: ref Draw->Image; titlecolor: ref Draw->Image; textcolor: ref Draw->Image; highlightcolor: ref Draw->Image; }; # drawing environment for objects Environ: adt { screen: ref Draw->Screen; style: ref Style; }; # operand for layout operators; set either (font, color, text) or (icon, mask) Layout: adt { font: ref Draw->Font; color: ref Draw->Image; text: string; icon: ref Draw->Image; mask: ref Draw->Image; tag: string; }; # graphical objects in the interface, recursively defined for making lists Element: adt { # part of Ell elements kind: int; # type: EIcon, EText, etc. r: Draw->Rect; # rectangle on screen environ: ref Environ; # graphics screen, style tag: string; # identifier for selection # different fields defined for different kinds of Elements kids: list of ref Element; # children of EHorizontal, EVertical str: string; # text in an EText element mask: ref Draw->Image; # part of Eicon, ESeparator image: ref Draw->Image; # part of Eicon, ESeparator, EText, Etitle font: ref Draw->Font; # part of EText, Etitle # constructors icon: fn(env: ref Environ, r: Draw->Rect, icon, mask: ref Draw->Image): ref Element; text: fn(env: ref Environ, text: string, r: Draw->Rect, kind: int): ref Element; layout: fn(env: ref Environ, lay: list of Layout, r: Draw->Rect, kind: int): ref Element; elist: fn(env: ref Environ, elem: ref Element, kind: int): ref Element; separator: fn(env: ref Environ, r: Draw->Rect, icon, mask: ref Draw->Image): ref Element; # editing and geometry append: fn(elist: self ref Element, elem: ref Element): int; adjust: fn(elem: self ref Element, equal: int, dir: int); clip: fn(elem: self ref Element, r: Draw->Rect); scroll: fn(elem: self ref Element, d: Draw->Point); translate: fn(elem: self ref Element, d: Draw->Point); show: fn(elist: self ref Element, elem: ref Element): int; }; # connects an element to a window for display Compound: adt { image: ref Draw->Image; # window on which contents are drawn environ: ref Environ; # graphics screen, style r: Draw->Rect; # rectangle on screen title: ref Element; # above the line (may be nil) contents: ref Element; # below the line # constructors iconbox: fn(env: ref Environ, p: Draw->Point, title: string, icon, mask: ref Draw->Image): ref Compound; textbox: fn(env: ref Environ, r: Draw->Rect, title, text: string): ref Compound; layoutbox:fn(env: ref Environ, r: Draw->Rect, title: string, lay: list of Layout): ref Compound; box: fn(env: ref Environ, p: Draw->Point, title, elist: ref Element): ref Compound; # display draw: fn(comp: self ref Compound); redraw: fn(comp: self ref Compound, r: Draw->Rect); scroll: fn(comp: self ref Compound, elem: ref Element, d: Draw->Point); show: fn(comp: self ref Compound, elem: ref Element): int; # support for using EHorizontal and EVertical as menus select: fn(comp: self ref Compound, elem: ref Element, i: int, c: chan of int): (int, int, ref Element); tagselect: fn(comp: self ref Compound, elem: ref Element, i: int, c: chan of int): (int, int, ref Element); highlight: fn(comp: self ref Compound, elem: ref Element, on: int); }; }; o�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/print.m�������������������������������������������������� 664 � 0 � 0 � 3423 7430754171 21317�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Print: module { PATH: con "/dis/lib/print/print.dis"; CONFIG_PATH: con "/lib/print/"; init: fn(): int; set_printfd: fn(fd: ref Sys->FD); print_image: fn(p: ref Printer, display: ref Draw->Display, im: ref Draw->Image, pcwidth: int, cancel: chan of int): int; print_textfd: fn(p: ref Printer, fd: ref Sys->FD, ps: real, pr: int, wrap: int): int; get_defprinter: fn(): ref Printer; set_defprinter: fn(p: ref Printer); get_size: fn(p: ref Printer): (int, int, int); # dpi, xpixels, ypixels get_printers: fn(): list of ref Printer; get_papers: fn(): list of ref Paper; save_settings: fn(): int; # Printer types Ptype: adt { name: string; desc: string; modes: list of ref Pmode; driver: string; hpmapfile: string; }; # Paper sizes Paper: adt { name: string; hpcode: string; width_inches: real; height_inches: real; }; # Print modes Pmode: adt { name: string; desc: string; resx: int; resy: int; blackdepth: int; coldepth: int; blackresmult: int; }; # Print options Popt: adt { name: string; mode: ref Pmode; paper: ref Paper; orientation: int; duplex: int; }; # Printer instance PORTRAIT: con 0; LANDSCAPE: con 1; DUPLEX_OFF: con 0; DUPLEX_LONG: con 1; DUPLEX_SHORT: con 2; Printer: adt { name: string; ptype: ref Ptype; device: string; popt: ref Popt; pdriver: Pdriver; }; }; Pdriver: module { PATHPREFIX: con "/dis/lib/print/"; DATAPREFIX: con "/lib/print/"; init: fn(debug: int); sendimage: fn(p: ref Print->Printer, tfd: ref Sys->FD, display: ref Draw->Display, im: ref Draw->Image, width: int, lmargin: int, cancel: chan of int): int; sendtextfd: fn(p: ref Print->Printer, pfd, tfd: ref Sys->FD, ps: real, pr: int, wrap: int): int; printable_pixels: fn(p: ref Print->Printer): (int, int); }; string, list of int); # top of a message given it's no. # returns (status, error string, message top) top: fn(m: int) : (int, string, string); # full text of a message given it's no. # returns (status, error string, message) get:old_contrib//root/sys/src/cmd/limbo/module/profile.m������������������������������������������������ 664 � 0 � 0 � 3021 7574065357 21627�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Profile: module { PATH: con "/dis/lib/profile.dis"; Range: adt{ l: int; u: int; f: int; n: cyclic ref Range; }; Funprof: adt{ name: string; # file: string; line: int; count: int; counte: int; }; Modprof: adt{ name: string; path: string; srcpath: string; rawtab: array of (int, int); linetab: array of int; rngtab: array of ref Range; funtab: array of Funprof; total: int; totals: array of int; coverage: int; }; Prof: adt{ mods: list of Modprof; total: int; totals: array of int; }; Coverage: type list of (string, int, list of (list of (int, int, int), string)); # constants to or into second arg of show() MODULE: con 1; # give stats for each module FUNCTION: con 2; # give stats for each function LINE: con 4; # give stats for each line VERBOSE: con 8; # full stats FULLHDR: con 16; # file:lineno: on each line of output FREQUENCY: con 32; # show frequency rather than coverage init: fn(): int; lasterror: fn(): string; profile: fn(m: string): int; sample: fn(i: int): int; start: fn(): int; stop: fn(): int; stats: fn() : Prof; show: fn(p: Prof, v: int): int; end: fn(): int; # coverage profiling specific functions cpstart: fn(pid: int): int; cpstats: fn(rec: int, v: int): Prof; cpfstats: fn(v: int): Prof; cpshow: fn(p: Prof, v: int): int; coverage: fn(p: Prof, v: int): Coverage; # memory profiling specific functions MAIN: con 1; HEAP: con 2; IMAGE: con 4; memstart: fn(mem: int): int; memstats: fn(): Prof; memshow: fn(p: Prof, v: int): int; }; /sys/src/cmd/limbo/module/powerman.m����������������������������������������������� 664 � 0 � 0 � 260 7373001616 21762�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/pslib.m�������������������������������������������������� 664 � 0 � 0 � 232 7072371560 21246�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pslib : module { PATH: con "/dis/lib/pslib.dis"; init: fn(bufio: Bufio); writeimage: fn(ioutb: ref Bufio->Iobuf, im: ref Draw->Image, dpi: int); }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/quicktime.m���������������������������������������������� 664 � 0 � 0 � 2420 6622405627 22153�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Apple QuickTime File Format # QuickTime: module { PATH: con "/dis/lib/quicktime.dis"; DEFBUF: con 8192; AtomHDR: con 8; Tkhdr: adt { version: int; creation: int; modtime: int; trackid: int; timescale: int; duration: int; timeoff: int; priority: int; layer: int; altgrp: int; volume: int; matrix: array of int; width: int; height: int; }; MvhdrSIZE: con 100; Mvhdr: adt { version: int; create: int; modtime: int; timescale: int; duration: int; rate: int; vol: int; r1: int; r2: int; matrix: array of int; r3: int; r4: int; pvtime: int; posttime: int; seltime: int; seldurat: int; curtime: int; nxttkid: int; }; # QuickTime descriptor QD: adt { fd: ref sys->FD; # descriptor of QuickTime file buf: array of byte; # buffer nbyte: int; # bytes remaining ptr: int; # buffer pointer mvhdr: ref Mvhdr; # movie header desctiptor readn: fn(r: self ref QD, b: array of byte, l: int): int; skip: fn(r: self ref QD, size: int): int; skipatom: fn(r: self ref QD, size: int): int; atomhdr: fn(r: self ref QD): (string, int); mvhd: fn(r: self ref QD, l: int): string; trak: fn(r: self ref QD, l: int): string; }; init: fn(); open: fn(file: string): (ref QD, string); }; Draw->Rect, icon, mask: ref Draw->Image): ref Element; text: fn(env: ref Environ, text: string, r: Draw->Rect, kind: int): ref Element; layout: fn(env: ref Environ, lay: list of Layout, r: Draw->Rect, kind: int): ref Element; elist: old_contrib//root/sys/src/cmd/limbo/module/rand.m��������������������������������������������������� 664 � 0 � 0 � 220 7063472256 21062�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Rand: module { PATH: con "/dis/lib/rand.dis"; init: fn(seed: int); rand: fn(modulus: int): int; bigrand: fn(modulus: big): big; }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/readdir.m������������������������������������������������ 664 � 0 � 0 � 1107 7667426000 21571�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Readdir: module { PATH: con "/dis/lib/readdir.dis"; # sortkey is one of NAME, ATIME, MTIME, SIZE, or NONE # possibly with DESCENDING or'd in NAME, ATIME, MTIME, SIZE, NONE: con iota; DESCENDING: con (1<<5); init: fn(path: string, sortkey: int): (array of ref Sys->Dir, int); readall: fn(fd: ref Sys->FD, sortkey: int): (array of ref Sys->Dir, int); sortdir:fn(a: array of ref Sys->Dir, key: int): (array of ref Sys->Dir, int); # COMPACT can be or'd into sortkey to preserve only the first # (by depth) of a group of duplicate names in a union COMPACT: con (1<<4); }; ����������������������������� 664 � 0 � 0 � 3423 7430754171 21317�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/regex.m�������������������������������������������������� 664 � 0 � 0 � 2123 7116716626 21275�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Regex: module { PATH: con "/dis/lib/regex.dis"; # normally imported identifiers Re: type ref Arena; compile: fn(nil:string,nil:int): (Re, string); execute: fn(nil:Re, nil:string): array of (int, int); executese: fn(nil:Re, nil:string, se: (int, int), bol: int, eol: int): array of (int, int); # internal identifiers, not normally imported ALT, CAT, DOT, SET, HAT, DOL, NUL, PCLO, CLO, OPT, LPN, RPN : con (1<<16)+iota; refRex : type int; # used instead of ref Rex to avoid circularity Set: adt { # character class neg: int; # 0 or 1 ascii : array of int; # ascii members, bit array unicode : list of (int,int); # non-ascii char ranges }; Rex: adt { # node in parse of regex, or state of fsm kind : int; # kind of node: char or ALT, CAT, etc left : refRex; # left descendant right : refRex; # right descendant, or next state set : ref Set; # character class pno : int; }; Arena: adt { # free store from which nodes are allocated rex : array of Rex; ptr : refRex; # next available space start : refRex; # root of parse, or start of fsm pno : int; }; }; int, cancel: chan of int): int; sendtextfd: fn(p: ref Print->Printer, pfd, tfd: ref Sys->FD, ps: real, pr: int, wrap: int): int; printable_pixels: fn(p: ref Print->Printer): (int, int); }; string, list of int); # top of a message given it's no. # returns (status, error string, message top) top: fn(m: int) : (int, string, string); # full text of a message given it's no. # returns (status, error string, message) get:old_contrib//root/sys/src/cmd/limbo/module/regexutils.m��������������������������������������������� 664 � 0 � 0 � 727 6760542062 22341�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� include "regex.m"; regex: Regex; RegexUtils: module { PATH: con "/dis/lib/regexutils.dis"; init: fn(); match: fn(pattern: Regex->Re, s: string): string; match_mult: fn(pattern: Regex->Re, s: string): array of (int, int); sub: fn(text, pattern, new: string): string; sub_re: fn(text: string, pattern: Regex->Re, new: string): string; subg: fn(text, pattern, new: string): string; subg_re: fn(text: string, pattern: Regex->Re, new: string): string; }; �����������������������������������������old_contrib//root/sys/src/cmd/limbo/module/registries.m��������������������������������������������� 664 � 0 � 0 � 2344 7672343122 22342�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Registries: module { PATH: con "/dis/lib/registries.dis"; init: fn(); Attributes: adt { attrs: list of (string, string); get: fn(a: self ref Attributes, attr: string): string; set: fn(a: self ref Attributes, attr, val: string); new: fn(attrs: list of (string, string)): ref Attributes; }; Attached: adt { fd: ref Sys->FD; signerpkhash: string; localuser: string; remoteuser: string; }; Service: adt { addr: string; # dial this to connect to the service. attrs: ref Attributes; # information about the nature of the service. attach: fn(s: self ref Service, user: string, keydir: string): ref Attached; }; Registered: adt { addr: string; reg: ref Registry; fd: ref Sys->FD; }; Registry: adt { dir: string; indexfd: ref Sys->FD; new: fn(dir: string): ref Registry; connect: fn(svc: ref Service, user: string, keydir: string): ref Registry; services: fn(r: self ref Registry): (list of ref Service, string); find: fn(r: self ref Registry, a: list of (string, string)): (list of ref Service, string); register: fn(r: self ref Registry, addr: string, attrs: ref Attributes, persist: int): (ref Registered, string); unregister: fn(r: self ref Registry, addr: string): string; }; }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/rfc822.m������������������������������������������������� 664 � 0 � 0 � 3545 10442077464 21216�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RFC822: module { PATH: con "/dis/lib/rfc822.dis"; init: fn(b: Bufio); # TO DO: multipart ... # token values reserved to represent a word and a quoted string Word, QString: con 1+iota; Maxrequest: con 16*1024; # more than enough for anything sensible Rfclex: adt { fd: ref Bufio->Iobuf; # open on a single line wordval: string; # text if Word or QString tok: int; # last token seen eof: int; # end of file (ignore subsequent ungetc) seen: list of (int, string); # pushback mk: fn(a: array of byte): ref Rfclex; getc: fn(p: self ref Rfclex): int; ungetc: fn(p: self ref Rfclex); lex: fn(p: self ref Rfclex): int; unlex: fn(p: self ref Rfclex); skipws: fn(p: self ref Rfclex): int; line: fn(p: self ref Rfclex): string; }; readheaders: fn(fd: ref Bufio->Iobuf, limit: int): array of (string, array of byte); parseparams: fn(ps: ref Rfclex): list of (string, string); parsecontent: fn(ps: ref Rfclex, multipart: int, head: list of ref Content): list of ref Content; mimefields: fn(ps: ref Rfclex): list of (string, list of (string, string)); # TO DO: parse addresses quotable: fn(s: string): int; quote: fn(s: string): string; # convert an epoch time into http-formatted text sec2date: fn(secs: int): string; # convert a date in http text format to seconds from epoch date2sec: fn(s: string): int; # current time now: fn(): int; # current time as a string time: fn(): string; # # mime-related things # Content: adt{ generic: string; specific: string; params: list of (string, string); mk: fn(generic: string, specific: string, params: list of (string, string)): ref Content; check: fn(c: self ref Content, oks: list of ref Content): int; text: fn(c: self ref Content): string; }; suffixclass: fn(name: string): (ref Content, ref Content); dataclass: fn(a: array of byte): (ref Content, ref Content); }; text: string, r: Draw->Rect, kind: int): ref Element; layout: fn(env: ref Environ, lay: list of Layout, r: Draw->Rect, kind: int): ref Element; elist: old_contrib//root/sys/src/cmd/limbo/module/riff.m��������������������������������������������������� 664 � 0 � 0 � 3657 6622405627 21123�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Microsoft Resource Interchange File Format # with AVI support # Riff: module { PATH: con "/dis/lib/riff.dis"; DEFBUF: con 8192; BI_RGB: con 0; BI_RLE8: con 1; BI_RLE4: con 2; BI_BITFEILD: con 3; RGB: adt { r: int; g: int; b: int; }; Binfosize: con 10*4; Bitmapinfo: adt # Windows bitmap info structure { width: int; # width in pixels height: int; # height in pixels planes: int; # planes of output device (must be 1) bitcount: int; # bits per pixel compression: int; # coding BI_RGB... or IV32 for indeo sizeimage: int; # size in bytes of image xpelpermeter: int; # resolution in pixels per meter ypelpermeter: int; clrused: int; # colors used clrimportant: int; # how fixed is the map cmap: array of RGB; # color map }; AVImainhdr: con 14*4; AVIhdr: adt { usecperframe: int; bytesec: int; flag: int; frames: int; initframes: int; streams: int; bufsize: int; width: int; height: int; }; AVIstreamhdr: con 2*4 + 10*4; AVIstream: adt { # Stream Header information stype: string; handler: string; flags: int; priority: int; initframes: int; scale: int; rate: int; start: int; length: int; bufsize: int; quality: int; samplesz: int; # Stream Format information (decoder specific) fmt: array of byte; binfo: ref Bitmapinfo; fmt2binfo: fn(a: self ref AVIstream): string; }; # Riff descriptor RD: adt { fd: ref sys->FD; # descriptor of RIFF file buf: array of byte; # buffer nbyte: int; # bytes remaining ptr: int; # buffer pointer gethdr: fn(r: self ref RD): (string, int); readn: fn(r: self ref RD, b: array of byte, l: int): int; check4: fn(r: self ref RD, code: string): string; avihdr: fn(r: self ref RD): (ref AVIhdr, string); streaminfo: fn(r: self ref RD): (ref AVIstream, string); skip: fn(r: self ref RD, size: int): int; }; init: fn(); open: fn(file: string): (ref RD, string); }; ���������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/runt.m��������������������������������������������������� 664 � 0 � 0 � 305 10177720217 21143�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������implement nothing; include "sys.m"; include "draw.m"; include "prefab.m"; include "tk.m"; include "math.m"; include "keyring.m"; include "loader.m"; # include "readimage.m"; include "freetype.m"; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/scoretable.m��������������������������������������������� 664 � 0 � 0 � 525 7110301115 22243�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# only used by tetris currently. this interface will change. Scoretable: module { PATH: con "/dis/lib/scoretable.dis"; Score: adt { user: string; score: int; other: string; }; init: fn(port: int, user, name: string, scorefile: string): (int, string); setscore: fn(score: int, other: string): int; scores: fn(): list of Score; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/scsiio.m������������������������������������������������� 664 � 0 � 0 � 1151 10307775364 21474�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # adapted from /sys/include/disk.h on Plan 9: subject to the Lucent Public License 1.02 # ScsiIO: module { PATH: con "/dis/lib/scsiio.dis"; # SCSI interface Scsi: adt { lock: chan of int; inquire: string; rawfd: ref Sys->FD; nchange: int; changetime: int; open: fn(f: string): ref Scsi; rawcmd: fn(s: self ref Scsi, c: array of byte, d: array of byte, io: int): int; cmd: fn(s: self ref Scsi, c: array of byte, d: array of byte, io: int): int; ready: fn(s: self ref Scsi): int; }; Sread, Swrite, Snone: con iota; scsierror: fn(asc: int, ascq: int): string; init: fn(verbose: int); }; 4 � 0 � 0 � 2344 7672343122 22342�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/secstore.m����������������������������������������������� 664 � 0 � 0 � 2251 10377601317 22025�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Secstore: module { PATH: con "/dis/lib/secstore.dis"; Maxfilesize: con 128*1024; # default Maxmsg: con 4096; init: fn(); privacy: fn(): int; cansecstore: fn(addr: string, user: string): int; mkseckey: fn(pass: string): array of byte; connect: fn(addr: string, user: string, pwhash: array of byte): (ref Sys->Connection, string, string); dial: fn(addr: string): ref Sys->Connection; auth: fn(conn: ref Sys->Connection, user: string, pwhash: array of byte): (string, string); sendpin: fn(conn: ref Sys->Connection, pin: string): int; files: fn(conn: ref Sys->Connection): list of (string, int, string, string, array of byte); getfile: fn(conn: ref Sys->Connection, filename: string, maxsize: int): array of byte; remove: fn(conn: ref Sys->Connection, filename: string): int; # putfile: fn(conn: ref Sys->Connection, filename: string, data: array of byte,): int; bye: fn(conn: ref Sys->Connection); mkfilekey: fn(pass: string): array of byte; decrypt: fn(a: array of byte, key: array of byte): array of byte; # encrypt: fn(a: array of byte, key: array of byte): array of byte; erasekey: fn(a: array of byte); lines: fn(file: array of byte): list of array of byte; }; ����������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/security.m����������������������������������������������� 664 � 0 � 0 � 2355 10030534106 22035�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # security routines implemented in limbo # Virgil: module { PATH: con "/dis/lib/virgil.dis"; virgil: fn(args: list of string): string; }; Random: module { PATH: con "/dis/lib/random.dis"; ReallyRandom: con 0; NotQuiteRandom: con 1; randomint: fn(which: int): int; randombuf: fn(which, n: int): array of byte; }; # # secure socket layer emulator # SSL: module { PATH: con "/dis/lib/ssl.dis"; connect: fn(fd: ref Sys->FD): (string, ref Sys->Connection); secret: fn(c: ref Sys->Connection, secretin, secretout: array of byte): string; }; # # Encrypted Key Exchange protocol # Login: module { PATH: con "/dis/lib/login.dis"; login: fn(id, password, dest: string): (string, ref Keyring->Authinfo); }; # # Station To Station protocol # Auth: module { PATH: con "/dis/lib/auth.dis"; init: fn(): string; server: fn(algs: list of string, ai: ref Keyring->Authinfo, fd: ref Sys->FD, setid: int): (ref Sys->FD, string); client: fn(alg: string, ai: ref Keyring->Authinfo, fd: ref Sys->FD): (ref Sys->FD, string); auth: fn(ai: ref Keyring->Authinfo, keyspec: string, alg: string, dfd: ref Sys->FD): (ref Sys->FD, ref Keyring->Authinfo, string); keyfile: fn(keyspec: string): string; key: fn(keyspec: string): ref Keyring->Authinfo; }; ixclass: fn(name: string): (ref Content, ref Content); dataclass: fn(a: array of byte): (ref Content, ref Content); }; text: string, r: Draw->Rect, kind: int): ref Element; layout: fn(env: ref Environ, lay: list of Layout, r: Draw->Rect, kind: int): ref Element; elist: old_contrib//root/sys/src/cmd/limbo/module/selectfile.m��������������������������������������������� 664 � 0 � 0 � 542 10211652640 22266�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Selectfile: module { PATH: con "/dis/lib/selectfile.dis"; init: fn(): string; filename: fn(ctxt: ref Draw->Context, parent: ref Draw->Image, title: string, pat: list of string, dir: string): string; # select: fn(top: ref Tk->Toplevel, w: string, # root, dir: string, # pats: list of string, action: string): chan of (int, string); }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/sets.m��������������������������������������������������� 664 � 0 � 0 � 1477 7712032646 21147�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sets: module { A: con 2r1010; B: con 2r1100; PATH: con "/dis/lib/sets.dis"; init: fn(); set: fn(): Set; str2set: fn(str: string): Set; bytes2set: fn(d: array of byte): Set; Set: adt { m: int; a: array of int; X: fn(s1: self Set, o: int, s2: Set): Set; add: fn(s: self Set, n: int): Set; addlist: fn(s: self Set, ns: list of int): Set; # dellist: fn(s: self Set, ns: list of int): Set; del: fn(s: self Set, n: int): Set; invert: fn(s: self Set): Set; eq: fn(s1: self Set, s2: Set): int; holds: fn(s: self Set, n: int): int; isempty: fn(s: self Set): int; msb: fn(s: self Set): int; limit: fn(s: self Set): int; str: fn(s: self Set): string; bytes: fn(s: self Set, n: int): array of byte; debugstr: fn(s: self Set): string; }; All: con Set(~0, nil); None: con Set(0, nil); }; ); skip: fn(r: self ref RD, size: int): int; }; init: fn(); open: fn(file: string): (ref RD, string); }; ���������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/sets32.m������������������������������������������������� 664 � 0 � 0 � 1446 7712027651 21310�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sets: module { A: con 2r1010; B: con 2r1100; PATH: con "/dis/lib/sets32.dis"; init: fn(); set: fn(): Set; str2set: fn(str: string): Set; bytes2set: fn(d: array of byte): Set; Set: adt { s: int; X: fn(s1: self Set, o: int, s2: Set): Set; add: fn(s: self Set, n: int): Set; addlist: fn(s: self Set, ns: list of int): Set; # dellist: fn(s: self Set, ns: list of int): Set; del: fn(s: self Set, n: int): Set; invert: fn(s: self Set): Set; eq: fn(s1: self Set, s2: Set): int; holds: fn(s: self Set, n: int): int; isempty: fn(s: self Set): int; msb: fn(s: self Set): int; limit: fn(s: self Set): int; str: fn(s: self Set): string; bytes: fn(s: self Set, lim: int): array of byte; debugstr: fn(s: self Set): string; }; All: con Set(~0); None: con Set(0); }; ���pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/sexprs.m������������������������������������������������� 664 � 0 � 0 � 2004 10205407502 21504�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sexprs: module { PATH: con "/dis/lib/sexprs.dis"; Sexp: adt { pick { String => s: string; hint: string; Binary => data: array of byte; hint: string; List => l: cyclic list of ref Sexp; } read: fn[T](b: T): (ref Sexp, string) for { T => getb: fn(nil: self T): int; ungetb: fn(nil: self T): int; offset: fn(nil: self T): big; }; parse: fn(s: string): (ref Sexp, string, string); unpack: fn(a: array of byte): (ref Sexp, array of byte, string); text: fn(e: self ref Sexp): string; packedsize: fn(e: self ref Sexp): int; pack: fn(e: self ref Sexp): array of byte; b64text: fn(e: self ref Sexp): string; islist: fn(e: self ref Sexp): int; els: fn(e: self ref Sexp): list of ref Sexp; op: fn(e: self ref Sexp): string; args: fn(e: self ref Sexp): list of ref Sexp; eq: fn(e: self ref Sexp, t: ref Sexp): int; copy: fn(e: self ref Sexp): ref Sexp; asdata: fn(e: self ref Sexp): array of byte; astext: fn(e: self ref Sexp): string; }; init: fn(); }; Swrite, Snone: con iota; scsierror: fn(asc: int, ascq: int): string; init: fn(verbose: int); }; 4 � 0 � 0 � 2344 7672343122 22342�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/sh.m����������������������������������������������������� 664 � 0 � 0 � 6672 10054421256 20615�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Command: module { PATH: con "/dis/sh.dis"; init: fn(ctxt: ref Draw->Context, argv: list of string); }; Sh: module { PATH: con "/dis/sh.dis"; initialise: fn(); init: fn(ctxt: ref Draw->Context, argv: list of string); system: fn(drawctxt: ref Draw->Context, cmd: string): string; run: fn(drawctxt: ref Draw->Context, argv: list of string): string; parse: fn(s: string): (ref Cmd, string); cmd2string: fn(c: ref Cmd): string; Context: adt { new: fn(drawcontext: ref Draw->Context): ref Context; get: fn(c: self ref Context, name: string): list of ref Listnode; set: fn(c: self ref Context, name: string, val: list of ref Listnode); setlocal: fn(c: self ref Context, name: string, val: list of ref Listnode); envlist: fn(c: self ref Context): list of (string, list of ref Listnode); push: fn(c: self ref Context); pop: fn(c: self ref Context); copy: fn(c: self ref Context, copyenv: int): ref Context; run: fn(c: self ref Context, args: list of ref Listnode, last: int): string; addmodule: fn(c: self ref Context, name: string, mod: Shellbuiltin); addbuiltin: fn(c: self ref Context, name: string, mod: Shellbuiltin); removebuiltin: fn(c: self ref Context, name: string, mod: Shellbuiltin); addsbuiltin: fn(c: self ref Context, name: string, mod: Shellbuiltin); removesbuiltin: fn(c: self ref Context, name: string, mod: Shellbuiltin); fail: fn(c: self ref Context, ename, msg: string); options: fn(c: self ref Context): int; setoptions: fn(c: self ref Context, flags, on: int): int; INTERACTIVE, VERBOSE, EXECPRINT, ERROREXIT: con 1 << iota; env: ref Environment; waitfd: ref Sys->FD; drawcontext: ref Draw->Context; keepfds: list of int; }; list2stringlist: fn(nl: list of ref Listnode): list of string; stringlist2list: fn(sl: list of string): list of ref Listnode; quoted: fn(val: list of ref Listnode, quoteblocks: int): string; initbuiltin: fn(c: ref Context, sh: Sh): string; whatis: fn(nil: ref Sh->Context, nil: Sh, nil: string, nil: int): string; runbuiltin: fn(c: ref Context, sh: Sh, cmd: list of ref Listnode, last: int): string; runsbuiltin: fn(c: ref Context, sh: Sh, cmd: list of ref Listnode): list of ref Listnode; getself: fn(): Shellbuiltin; Cmd: type Node; Node: adt { ntype: int; left, right: ref Node; word: string; redir: ref Redir; }; Redir: adt { rtype: int; fd1, fd2: int; }; Var: adt { name: string; val: list of ref Listnode; flags: int; CHANGED, NOEXPORT: con (1 << iota); }; Environment: adt { sbuiltins: ref Builtins; builtins: ref Builtins; bmods: list of (string, Shellbuiltin); localenv: ref Localenv; }; Localenv: adt { vars: array of list of ref Var; pushed: ref Localenv; flags: int; }; Listnode: adt { cmd: ref Node; word: string; }; Builtins: adt { ba: array of (string, list of Shellbuiltin); n: int; }; # node types n_BLOCK, n_VAR, n_BQ, n_BQ2, n_REDIR, n_DUP, n_LIST, n_SEQ, n_CONCAT, n_PIPE, n_ADJ, n_WORD, n_NOWAIT, n_SQUASH, n_COUNT, n_ASSIGN, n_LOCAL: con iota; GLOB: con 1; }; Shellbuiltin: module { initbuiltin: fn(c: ref Sh->Context, sh: Sh): string; runbuiltin: fn(c: ref Sh->Context, sh: Sh, cmd: list of ref Sh->Listnode, last: int): string; runsbuiltin: fn(c: ref Sh->Context, sh: Sh, cmd: list of ref Sh->Listnode): list of ref Sh->Listnode; BUILTIN, SBUILTIN, OTHER: con iota; whatis: fn(c: ref Sh->Context, sh: Sh, name: string, wtype: int): string; getself: fn(): Shellbuiltin; }; lay: list of Layout, r: Draw->Rect, kind: int): ref Element; elist: old_contrib//root/sys/src/cmd/limbo/module/smtp.m��������������������������������������������������� 664 � 0 � 0 � 1301 7034672357 21144�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# smtp protocol independent access to an email server. Smtp : module { PATH : con "/dis/lib/smtp.dis"; # all functions return status (-ve when error) # open a connection with the email server # requires the email server's name or address or nil if a default server is to be used # returns (status, errror string) open: fn(server : string) : (int, string); # send mail - returns (status, error string) sendmail: fn(fromwho: string, towho: list of string, cc : list of string, msg: list of string) : (int, string); # close the connection - returns (status, error string) close: fn() : (int, string); }; ����������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/sort.m��������������������������������������������������� 664 � 0 � 0 � 216 10013022505 21123�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Sort: module { PATH: con "/dis/lib/sort.dis"; sort: fn[S, T](s: S, a: array of T) for{ S => gt: fn(s: self S, x, y: T): int; }; }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/spki.m��������������������������������������������������� 664 � 0 � 0 � 13451 10671231425 21164�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Rawsexprs: module { PATH: con "rawsexprs.dis"; Sexp: adt { pick { String => s: string; hint: string; Binary => data: array of byte; hint: string; List => l: cyclic list of ref Sexp; } unpack: fn(a: array of byte): (ref Sexp, array of byte, string); text: fn(e: self ref Sexp): string; packedsize: fn(e: self ref Sexp): int; pack: fn(e: self ref Sexp): array of byte; }; init: fn(); }; SPKI: module { PATH: con "/dis/lib/spki/spki.dis"; Hash: adt { alg: string; hash: array of byte; sexp: fn(h: self ref Hash): ref Sexprs->Sexp; text: fn(h: self ref Hash): string; eq: fn(h1: self ref Hash, h2: ref Hash): int; }; Key: adt { pk: ref Keyring->PK; # either pk/sk or hash might be nil sk: ref Keyring->SK; nbits: int; halg: string; # basic signature hash algorithm henc: string; # pre-signature encoding hash: list of ref Hash; hashed: fn(k: self ref Key, alg: string): array of byte; hashexp: fn(k: self ref Key, alg: string): ref Hash; ishash: fn(k: self ref Key): int; public: fn(k: self ref Key): ref Key; sigalg: fn(k: self ref Key): string; text: fn(k: self ref Key): string; sexp: fn(k: self ref Key): ref Sexprs->Sexp; eq: fn(k1: self ref Key, k2: ref Key): int; }; Name: adt { principal: ref Key; names: list of string; isprincipal: fn(n: self ref Name): int; local: fn(n: self ref Name): ref Name; islocal: fn(n: self ref Name): int; isprefix: fn(n1: self ref Name, n2: ref Name): int; text: fn(n: self ref Name): string; sexp: fn(n: self ref Name): ref Sexprs->Sexp; eq: fn(n1: self ref Name, n2: ref Name): int; }; Cert: adt { e: ref Sexprs->Sexp; # S-expression, if originally parsed issuer: ref Name; subject: ref Subject; valid: ref Valid; pick { A or KH or O => # auth, keyholder or object delegate: int; tag: ref Sexprs->Sexp; N => # name } text: fn(c: self ref Cert): string; sexp: fn(c: self ref Cert): ref Sexprs->Sexp; }; # the pick might move to a more general `Principal' structure, # allowing compound and quoting principals Subject: adt { pick{ P => key: ref Key; N => name: ref Name; O => hash: ref Hash; KH => holder: ref Name; T => k, n: int; subs: cyclic list of ref Subject; } eq: fn(s1: self ref Subject, s2: ref Subject): int; principal: fn(s: self ref Subject): ref Key; text: fn(s: self ref Subject): string; sexp: fn(s: self ref Subject): ref Sexprs->Sexp; }; Principal: adt[T] { pick{ N => name: ref Name; Q => quoter: T; quotes: cyclic ref Principal; } }; Signature: adt { hash: ref Hash; key: ref Key; # find by hash if necessary sa: string; # alg[-[encoding-]hash] sig: list of (string, array of byte); algs: fn(s: self ref Signature): (string, string, string); sexp: fn(s: self ref Signature): ref Sexprs->Sexp; text: fn(s: self ref Signature): string; }; Seqel: adt { pick{ C => c: ref Cert; K => k: ref Key; O => op: string; args: list of ref Sexprs->Sexp; S => sig: ref Signature; RV => # <reval> ok: list of (string, string); onetime: array of byte; valid: ref Valid; CRL => bad: list of (string, string); valid: ref Valid; Delta => hash: string; bad: list of (string, string); valid: ref Valid; E => exp: ref Sexprs->Sexp; } sexp: fn(se: self ref Seqel): ref Sexprs->Sexp; text: fn(se: self ref Seqel): string; }; Valid: adt { notbefore: string; notafter: string; intersect: fn(a: self Valid, b: Valid): (int, Valid); text: fn(a: self Valid): string; sexp: fn(a: self Valid): ref Sexprs->Sexp; }; Toplev: adt { pick { C => v: ref Cert; Sig => v: ref Signature; K => v: ref Key; Seq => v: list of ref Seqel; } sexp: fn(t: self ref Toplev): ref Sexprs->Sexp; text: fn(t: self ref Toplev): string; }; init: fn(); # parse structures parse: fn(s: ref Sexprs->Sexp): (ref Toplev, string); parseseq: fn(s: ref Sexprs->Sexp): list of ref Seqel; parsecert: fn(s: ref Sexprs->Sexp): ref Cert; parsesig: fn(s: ref Sexprs->Sexp): ref Signature; parsename: fn(s: ref Sexprs->Sexp): ref Name; parsekey: fn(s: ref Sexprs->Sexp): ref Key; parsehash: fn(s: ref Sexprs->Sexp): ref Hash; parsecompound: fn(s: ref Sexprs->Sexp): ref Name; parsevalid: fn(s: ref Sexprs->Sexp): ref Valid; # signature checking checksig: fn(c: ref Cert, sig: ref Signature): string; sig2icert: fn(sig: ref Signature, signer: string, exp: int): ref Keyring->Certificate; # signature making signcert: fn(c: ref Cert, sigalg: string, key: ref Key): (ref Signature, string); signbytes: fn(a: array of byte, sigalg: string, key: ref Key): (ref Signature, string); # tags maketag: fn(e: ref Sexprs->Sexp): ref Sexprs->Sexp; tagintersect: fn(t1: ref Sexprs->Sexp, t2: ref Sexprs->Sexp): ref Sexprs->Sexp; tagimplies: fn(t1: ref Sexprs->Sexp, t2: ref Sexprs->Sexp): int; # hash canonical s-expression hashbytes: fn(a: array of byte, alg: string): array of byte; hashexp: fn(e: ref Sexprs->Sexp, alg: string): array of byte; # convert between date and time strings and Inferno form date2epoch: fn(s: string): int; # YYYY-MM-DD_HH:MM:SS epoch2date: fn(t: int): string; time2secs: fn(s: string): int; # HH:MM:SS secs2time: fn(t: int): string; # misc sigalgs: fn(algs: string): (string, string, string); # debugging dump: fn(s: string, a: array of byte); }; Proofs: module { Proof: adt { n: int; parse: fn(s: string): ref Proof; sexp: fn(p: self ref Proof): ref Sexprs->Sexp; text: fn(p: self ref Proof): string; }; init: fn(): string; }; Verifier: module { PATH: con "/dis/lib/spki/verifier.dis"; Speaksfor: adt { subject: ref SPKI->Subject; name: ref SPKI->Name; regarding: ref Sexprs->Sexp; valid: ref SPKI->Valid; }; init: fn(); verify: fn(seq: list of ref SPKI->Seqel): (ref Speaksfor, list of ref SPKI->Seqel, string); }; redir: ref Redir; }; Redir: adt { rtype: int; fd1, fd2: int; }; Var: adt { name: string; val: list of ref Listnode; flags: int; CHANGED, NOEXPORT: con (1 << iota); }; Environment: adt { sbuiltiold_contrib//root/sys/src/cmd/limbo/module/srv.m���������������������������������������������������� 664 � 0 � 0 � 526 7662151726 20762�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Srv: module { PATH: con "$Srv"; # some hosted, never native # # IP network database lookups # # iph2a: host name to ip addrs # ipa2h: ip addr to host aliases # ipn2p: service name to port # iph2a: fn(host: string): list of string; ipa2h: fn(addr: string): list of string; ipn2p: fn(net, service: string): string; init: fn(); }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/srvrunt.b������������������������������������������������ 664 � 0 � 0 � 45 6622405630 21623�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������implement nothing; include "srv.m"; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/ssl3.m��������������������������������������������������� 664 � 0 � 0 � 11363 7533633237 21074�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # ssl 3.0 protocol # SSL3: module { PATH: con "/dis/lib/crypt/ssl3.dis"; init: fn(): string; # SSL cipher suites NULL_WITH_NULL_NULL, RSA_WITH_NULL_MD5, RSA_WITH_NULL_SHA, RSA_EXPORT_WITH_RC4_40_MD5, RSA_WITH_RC4_128_MD5, RSA_WITH_RC4_128_SHA, RSA_EXPORT_WITH_RC2_CBC_40_MD5, RSA_WITH_IDEA_CBC_SHA, RSA_EXPORT_WITH_DES40_CBC_SHA, RSA_WITH_DES_CBC_SHA, RSA_WITH_3DES_EDE_CBC_SHA, DH_DSS_EXPORT_WITH_DES40_CBC_SHA, DH_DSS_WITH_DES_CBC_SHA, DH_DSS_WITH_3DES_EDE_CBC_SHA, DH_RSA_EXPORT_WITH_DES40_CBC_SHA, DH_RSA_WITH_DES_CBC_SHA, DH_RSA_WITH_3DES_EDE_CBC_SHA, DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, DHE_DSS_WITH_DES_CBC_SHA, DHE_DSS_WITH_3DES_EDE_CBC_SHA, DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, DHE_RSA_WITH_DES_CBC_SHA, DHE_RSA_WITH_3DES_EDE_CBC_SHA, DH_anon_EXPORT_WITH_RC4_40_MD5, DH_anon_WITH_RC4_128_MD5, DH_anon_EXPORT_WITH_DES40_CBC_SHA, DH_anon_WITH_DES_CBC_SHA, DH_anon_WITH_3DES_EDE_CBC_SHA, FORTEZZA_KEA_WITH_NULL_SHA, FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA, FORTEZZA_KEA_WITH_RC4_128_SHA : con iota; Authinfo: adt { suites: array of byte; # [2] x comprs: array of byte; # [1] x sk: ref PrivateKey; # for user certs root_type: int; # root type of certs certs: list of array of byte; # x509 cert chain types: array of byte; # acceptable cert types dns: list of array of byte; # acceptable cert authorities }; PrivateKey: adt { pick { RSA => sk : ref PKCS->RSAKey; DSS => sk : ref PKCS->DSSPrivateKey; DH => sk : ref PKCS->DHPrivateKey; } }; Record: adt { content_type : int; version : array of byte; # [2] data : array of byte; }; # key exchange algorithms KeyExAlg: adt { pick { NULL => DH => params : ref PKCS->DHParams; sk : ref PKCS->DHPrivateKey; peer_params : ref PKCS->DHParams; peer_pk : ref PKCS->DHPublicKey; exch_pk : ref PKCS->DHPublicKey; RSA => sk : ref PKCS->RSAKey; # for RSA key exchange export_key : ref PKCS->RSAKey; # server RSA temp key peer_pk : ref PKCS->RSAKey; # temp key from server FORTEZZA_KEA => # not supported yet } }; SigAlg: adt { pick { anon => RSA => sk : ref PKCS->RSAKey; # for sign peer_pk : ref PKCS->RSAKey; # for verify from peer cert DSS => sk : ref PKCS->DSSPrivateKey; # for sign peer_pk : ref PKCS->DSSPublicKey; # for verify from peer cert FORTEZZA_KEA => # not supported yet } }; CipherSpec: adt { is_exportable : int; bulk_cipher_algorithm : int; cipher_type : int; key_material : int; IV_size : int; mac_algorithm : int; hash_size : int; }; # record format queue RecordQueue: adt { macState : ref MacState; cipherState : ref CipherState; length : int; sequence_numbers : array of int; data : list of ref Record; fragment : int; b, e : int; new: fn(): ref RecordQueue; read: fn(q: self ref RecordQueue, ctx: ref Context, fd: ref Sys->FD): string; write: fn(q: self ref RecordQueue, ctx: ref Context, fd: ref Sys->FD, r: ref Record): string; calcmac: fn(q: self ref RecordQueue, ctx: ref Context, cntype: int, a: array of byte, ofs, n: int) : array of byte; }; MacState: adt { hash_size : int; pick { null => md5 => ds : array of ref Keyring->DigestState; sha => ds : array of ref Keyring->DigestState; } }; CipherState: adt { block_size : int; pick { null => rc4 => es : ref Keyring->RC4state; descbc => es : ref Keyring->DESstate; ideacbc => es : ref Keyring->IDEAstate; } }; # context for processing both v2 and v3 protocols. Context: adt { c : ref Sys->Connection; session : ref SSLsession->Session; sel_keyx : ref KeyExAlg; sel_sign : ref SigAlg; sel_ciph : ref CipherSpec; sel_cmpr : int; local_info : ref Authinfo; client_random : array of byte; # [32] server_random : array of byte; # [32] sha_state : ref Keyring->DigestState; md5_state : ref Keyring->DigestState; cw_mac : array of byte; sw_mac : array of byte; cw_key : array of byte; sw_key : array of byte; cw_IV : array of byte; sw_IV : array of byte; in_queue : ref RecordQueue; out_queue : ref RecordQueue; status : int; state : int; new: fn(): ref Context; client: fn(ctx: self ref Context, fd: ref Sys->FD, peer: string, ver: int, info: ref Authinfo): (string, int); server: fn(ctx: self ref Context, fd: ref Sys->FD, info: ref Authinfo, client_auth: int): string; use_devssl: fn(ctx: self ref Context); set_version: fn(ctx: self ref Context, vers: int): string; connect: fn(ctx: self ref Context, fd: ref Sys->FD): string; read: fn(ctx: self ref Context, a: array of byte, n: int): int; write: fn(ctx: self ref Context, a: array of byte, n: int): int; }; }; ; E => exp: ref Sexprs->Sexp; } sexp: fn(se: self ref Seqel): ref Sexprs->Sexp; text: fn(se: self ref Seqel): string; }; Valid: adt { notbefore: string; notafter: string; intersect: fn(a: self Valid, b: Valid): (int, Valid); text: fn(a: self Valold_contrib//root/sys/src/cmd/limbo/module/sslsession.m��������������������������������������������� 664 � 0 � 0 � 1243 6760542062 22365�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SSLsession: module { PATH: con "/dis/lib/crypt/sslsession.dis"; Session: adt { session_id : array of byte; # [32] peer : string; connection_time : int; version : array of byte; # [2] suite : array of byte; # [2] compression : byte; master_secret : array of byte; # [48] peer_certs : list of array of byte; new: fn(peer: string, time: int, ver: array of byte): ref Session; duplicate: fn(s: self ref Session): ref Session; }; init: fn(): string; add_session: fn(s: ref Session); get_session_byid: fn(session_id: array of byte): ref Session; get_session_byname: fn(peer: string): ref Session; set_timeout: fn(t: int); }; xprs->Sexp; tagintersect: fn(t1: ref Sexprs->Sexp, t2: ref Sexprs->Sexp): ref Sexprs->Sexp; tagimplies: fn(t1: ref Sexprs->Sexp, t2: ref Sexprs->Sexp): int; # hash canonical s-expression hashbytes: fn(a: array of byte, alg: string): array of byte; hashexp: fn(e: ref Sexprs->Sexp, alg: string): array of byte; # convert between date and timeold_contrib//root/sys/src/cmd/limbo/module/string.m������������������������������������������������� 664 � 0 � 0 � 2577 10670017107 21511�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������String: module { PATH: con "/dis/lib/string.dis"; # the second arg of the following is a character class # e.g., "a-zA-Z", or "^ \t\n" # (ranges indicated by - except in first position; # ^ is first position means "not in" the following class) # splitl splits just before first char in class; (s, "") if no split # splitr splits just after last char in class; ("", s) if no split # drop removes maximal prefix in class # take returns maximal prefix in class splitl: fn(s, cl: string): (string, string); splitr: fn(s, cl: string): (string, string); drop: fn(s, cl: string): string; take: fn(s, cl: string): string; in: fn(c: int, cl: string): int; # in these, the second string is a string to match, not a class splitstrl: fn(s, t: string): (string, string); splitstrr: fn(s, t: string): (string, string); # is first arg a prefix of second? prefix: fn(pre, s: string): int; tolower: fn(s: string): string; toupper: fn(s: string): string; # string to int returning value, remainder toint: fn(s: string, base: int): (int, string); tobig: fn(s: string, base: int): (big, string); toreal: fn(s: string, base: int): (real, string); # append s to end of l append: fn(s: string, l: list of string): list of string; quoted: fn(argv: list of string): string; quotedc: fn(argv: list of string, cl: string): string; unquoted: fn(args: string): list of string; }; ���������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/strinttab.m���������������������������������������������� 664 � 0 � 0 � 620 6622405630 22144�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������StringIntTab: module { PATH: con "/dis/lib/strinttab.dis"; StringInt: adt{ key: string; val: int; }; # Binary search of t (which must be sorted) for key. # Returns (found, val). lookup: fn(t: array of StringInt, key: string) : (int, int); # Linear search of t for first pair with given val. # Returns key (nil if no match). revlookup: fn(t: array of StringInt, val: int) : string; }; ����������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/strokes.m������������������������������������������������ 664 � 0 � 0 � 6547 7345626623 21674�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Li-Yeung character recognition # Strokes: module { PATH: con "/dis/lib/strokes/strokes.dis"; Penpoint: adt { x, y: int; chaincode: int; }; Stroke: adt { npts: int; pts: array of Penpoint; xrange, yrange: int; new: fn(n: int): ref Stroke; copy: fn(nil: self ref Stroke): ref Stroke; trim: fn(nil: self ref Stroke, n: int); bbox: fn(nil: self ref Stroke): (int, int, int, int); scaleup: fn(nil: self ref Stroke): int; translate: fn(nil: self ref Stroke, minx: int, miny: int, scalex: int, scaley: int); center: fn(nil: self ref Stroke); regions: fn(nil: self ref Stroke): ref Region; dominant: fn(nil: self ref Stroke): ref Stroke; interpolate: fn(points: self ref Stroke): ref Stroke; length: fn(nil: self ref Stroke): int; pathlen: fn(nil: self ref Stroke, first: int, last: int): int; contourangles: fn(nil: self ref Stroke, regions: ref Region): array of int; filter: fn(nil: self ref Stroke): ref Stroke; }; # ordered list of regions Region: adt { rtype: int; start: int; end: int; next: cyclic ref Region; }; # region types Rconvex, Rconcave, Rplain, Rpseudo: con iota; Classifier: adt { nclasses: int; # number of symbols in class examples: array of list of ref Stroke; # optional training examples cnames: array of string; # the class names canonex: array of ref Stroke; # optional canonical versions of the strokes dompts: array of ref Stroke; # dominant points match: fn(nil: self ref Classifier, stroke: ref Stroke): (int, string); }; init: fn(); preprocess_stroke: fn(nil: ref Stroke); score_stroke: fn(a: ref Stroke, b: ref Stroke): (int, int); compute_similarity: fn(a: ref Stroke, b: ref Stroke): int; compute_distance: fn(a: ref Stroke, b: ref Stroke): int; compute_chain_code: fn(nil: ref Stroke); compute_unit_chain_code: fn(pts: ref Stroke); regiontype: fn(ang: int): int; sqrt: fn(n: int): int; likeatan: fn(top: int, bot: int): int; quadr: fn(t: int): int; printpoints: fn(fd: ref Sys->FD, nil: ref Stroke, sep: string); MAXDIST: con 16r7FFFFFFF; }; Readstrokes: module { PATH: con "/dis/lib/strokes/readstrokes.dis"; init: fn(nil: Strokes); read_classifier: fn(file: string, build: int, needex: int): (string, ref Strokes->Classifier); read_digest: fn(fd: ref Sys->FD): (string, array of string, array of ref Strokes->Stroke); read_examples: fn(fd: ref Sys->FD): (string, array of string, array of list of ref Strokes->Stroke); }; Writestrokes: module { PATH: con "/dis/lib/strokes/writestrokes.dis"; init: fn(nil: Strokes); write_digest: fn(fd: ref Sys->FD, nil: array of string, nil: array of ref Strokes->Stroke): string; write_examples: fn(fd: ref Sys->FD, nil: array of string, nil: array of list of ref Strokes->Stroke): string; }; Buildstrokes: module { PATH: con "/dis/lib/strokes/buildstrokes.dis"; init: fn(nil: Strokes); canonical_example: fn(n: int, cnames: array of string, nil: array of list of ref Strokes->Stroke): (string, array of ref Strokes->Stroke, array of ref Strokes->Stroke); canonical_stroke: fn(points: ref Strokes->Stroke): ref Strokes->Stroke; compute_equipoints: fn(nil: ref Strokes->Stroke): ref Strokes->Stroke; }; # special characters and gestures # in digits.cl: BNASRPUVWX # in punc.cl: TFGHIJK # in letters.cl: ABNPRSUVWX # L caps lock # N num lock # P ctrl (Unix), punc shift (orig) # S shift # A space # B backspace # R return # . puncshift => rc4 => es : ref Keyring->RC4state; descbc => es : ref Keyring->DESstate; ideacbc => es : ref Keyring->IDEAstate; } }; # contold_contrib//root/sys/src/cmd/limbo/module/styx.m��������������������������������������������������� 664 � 0 � 0 � 7405 10037525101 21200�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Styx: module { PATH: con "/dis/lib/styx.dis"; PATHV1: con "/dis/lib/styx1.dis"; VERSION: con "9P2000"; MAXWELEM: con 16; NOTAG: con 16rFFFF; NOFID: con int ~0; # 32 bits in this version of Styx BIT8SZ: con 1; BIT16SZ: con 2; BIT32SZ: con 4; BIT64SZ: con 8; QIDSZ: con BIT8SZ+BIT32SZ+BIT64SZ; STATFIXLEN: con BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+BIT64SZ; # amount of fixed length data in a stat buffer IOHDRSZ: con 24; # room for Twrite/Rread header MAXFDATA: con 8192; # `reasonable' iounit MAXRPC: con IOHDRSZ+MAXFDATA; # usable default for fversion and iounit Tversion, # 100 Rversion, Tauth, # 102 Rauth, Tattach, # 104 Rattach, Terror, # 106, illegal Rerror, Tflush, #108 Rflush, Twalk, # 110 Rwalk, Topen, # 112 Ropen, Tcreate, # 114 Rcreate, Tread, # 116 Rread, Twrite, # 118 Rwrite, Tclunk, # 120 Rclunk, Tremove, # 122 Rremove, Tstat, # 124 Rstat, Twstat, #126 Rwstat, Tmax: con 100+iota; ERRMAX: con 128; OREAD: con 0; # open for read OWRITE: con 1; # write ORDWR: con 2; # read and write OEXEC: con 3; # execute, == read but check execute permission OTRUNC: con 16; # or'ed in (except for exec), truncate file first ORCLOSE: con 64; # or'ed in, remove on close # mode bits in Dir.mode used by the protocol DMDIR: con int 1<<31; # mode bit for directory DMAPPEND: con int 1<<30; # mode bit for append-only files DMEXCL: con int 1<<29; # mode bit for exclusive use files DMAUTH: con int 1<<27; # mode bit for authentication files # Qid.qtype QTDIR: con 16r80; QTAPPEND: con 16r40; QTEXCL: con 16r20; QTAUTH: con 16r08; QTFILE: con 16r00; Tmsg: adt { tag: int; pick { Readerror => error: string; # tag is unused in this case Version => msize: int; version: string; Auth => afid: int; uname, aname: string; Attach => fid, afid: int; uname, aname: string; Flush => oldtag: int; Walk => fid, newfid: int; names: array of string; Open => fid, mode: int; Create => fid: int; name: string; perm, mode: int; Read => fid: int; offset: big; count: int; Write => fid: int; offset: big; data: array of byte; Clunk or Stat or Remove => fid: int; Wstat => fid: int; stat: Sys->Dir; } read: fn(fd: ref Sys->FD, msize: int): ref Tmsg; unpack: fn(a: array of byte): (int, ref Tmsg); pack: fn(nil: self ref Tmsg): array of byte; packedsize: fn(nil: self ref Tmsg): int; text: fn(nil: self ref Tmsg): string; mtype: fn(nil: self ref Tmsg): int; }; Rmsg: adt { tag: int; pick { Readerror => error: string; # tag is unused in this case Version => msize: int; version: string; Auth => aqid: Sys->Qid; Attach => qid: Sys->Qid; Flush => Error => ename: string; Clunk or Remove or Wstat => Walk => qids: array of Sys->Qid; Create or Open => qid: Sys->Qid; iounit: int; Read => data: array of byte; Write => count: int; Stat => stat: Sys->Dir; } read: fn(fd: ref Sys->FD, msize: int): ref Rmsg; unpack: fn(a: array of byte): (int, ref Rmsg); pack: fn(nil: self ref Rmsg): array of byte; packedsize: fn(nil: self ref Rmsg): int; text: fn(nil: self ref Rmsg): string; mtype: fn(nil: self ref Rmsg): int; }; init: fn(); readmsg: fn(fd: ref Sys->FD, msize: int): (array of byte, string); istmsg: fn(f: array of byte): int; compatible: fn(t: ref Tmsg.Version, msize: int, version: string): (int, string); packdirsize: fn(d: Sys->Dir): int; packdir: fn(d: Sys->Dir): array of byte; unpackdir: fn(f: array of byte): (int, Sys->Dir); dir2text: fn(d: Sys->Dir): string; qid2text: fn(q: Sys->Qid): string; utflen: fn(s: string): int; # temporary undocumented compatibility function write: fn(fd: ref Sys->FD, a: array of byte, n: int): int; }; ring, string); splitstrr: fn(s, t: string): (string, string); # is first arg a prefix of second? prefix: fn(pre, s: string): int; tolower: fn(s: string): string; toupper: fn(s: string): string; # string to int returning value, remainder toiold_contrib//root/sys/src/cmd/limbo/module/styxconv.m����������������������������������������������� 664 � 0 � 0 � 276 7701023723 22034�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Styxconv: module { PATH: con "/dis/lib/styxconv/styxconv.dis"; # call first init: fn(); # spawn and synchronize styxconv: fn(in: ref Sys->FD, out: ref Sys->FD, sync: chan of int); }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/styxlib.m������������������������������������������������ 664 � 0 � 0 � 5411 7544363771 21670�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # deprecated: use styxservers(2) instead # Styxlib: module { PATH: con "/dis/lib/styxlib.dis"; Chan: adt { fid: int; qid: Sys->Qid; open: int; mode: int; uname: string; path: string; data: array of byte; isdir: fn(c: self ref Chan): int; }; Dirtab: adt { name: string; qid: Sys->Qid; length: big; perm: int; }; Styxserver: adt { fd: ref Sys->FD; chans: array of list of ref Chan; uname: string; msize: int; new: fn(fd: ref Sys->FD): (chan of ref Styx->Tmsg, ref Styxserver); reply: fn(srv: self ref Styxserver, m: ref Styx->Rmsg): int; fidtochan: fn(srv: self ref Styxserver, fid: int): ref Chan; newchan: fn(srv: self ref Styxserver, fid: int): ref Chan; chanfree: fn(srv: self ref Styxserver, c: ref Chan); chanlist: fn(srv: self ref Styxserver): list of ref Chan; clone: fn(srv: self ref Styxserver, c: ref Chan, fid: int): ref Chan; devversion: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Version): int; devauth: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Auth); devattach: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Attach): ref Chan; devflush: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Flush); devwalk: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Walk, gen: Dirgenmod, tab: array of Dirtab): ref Chan; devclunk: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Clunk): ref Chan; devstat: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Stat, gen: Dirgenmod, tab: array of Dirtab); devdirread: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Read, gen: Dirgenmod, tab: array of Dirtab); devopen: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Open, gen: Dirgenmod, tab: array of Dirtab): ref Chan; devremove: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Remove): ref Chan; }; init: fn(s: Styx): string; readbytes: fn(m: ref Styx->Tmsg.Read, d: array of byte): ref Styx->Rmsg.Read; readnum: fn(m: ref Styx->Tmsg.Read, val, size: int): ref Styx->Rmsg.Read; readstr: fn(m: ref Styx->Tmsg.Read, d: string): ref Styx->Rmsg.Read; openok: fn(omode, perm: int, uname, funame, fgname: string): int; openmode: fn(o: int): int; devdir: fn(c: ref Chan, qid: Sys->Qid, n: string, length: big, user: string, perm: int): Sys->Dir; dirgenmodule: fn(): Dirgenmod; dirgen: fn(srv: ref Styxserver, c: ref Chan, tab: array of Dirtab, i: int): (int, Sys->Dir); Einuse : con "fid already in use"; Ebadfid : con "bad fid"; Eopen : con "fid already opened"; Enotfound : con "file does not exist"; Enotdir : con "not a directory"; Eperm : con "permission denied"; Ebadarg : con "bad argument"; Eexists : con "file already exists"; }; Dirgenmod: module { dirgen: fn(srv: ref Styxlib->Styxserver, c: ref Styxlib->Chan, tab: array of Styxlib->Dirtab, i: int): (int, Sys->Dir); }; array of string, array of ref Strokes->Stroke); read_examples: fn(fd: ref Sys->FD): (string, array of string, array of list of ref Strokes->Stroke); }; Writestrokes: module { PATH: con "/dis/lib/strokes/writestrokes.dis"; init: fn(nil: Strokold_contrib//root/sys/src/cmd/limbo/module/styxpersist.m�������������������������������������������� 664 � 0 � 0 � 247 10034322666 22577�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Styxpersist: module { PATH: con "/dis/lib/styxpersist.dis"; init: fn(clientfd: ref Sys->FD, usefac: int, keyspec: string): (chan of chan of ref Sys->FD, string); }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/styxservers.m�������������������������������������������� 664 � 0 � 0 � 11344 10016663276 22644�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Styxservers: module { PATH: con "/dis/lib/styxservers.dis"; Fid: adt { fid: int; # client's fid path: big; # file's 64-bit unique path qtype: int; # file's qid type (eg, Sys->QTDIR if directory) isopen: int; # non-zero if file is open mode: int; # if open, the open mode doffset: (int, int); # (internal) cache of directory offset uname: string; # user name from original attach param: string; # attach aname from original attach data: array of byte; # application data clone: fn(f: self ref Fid, nf: ref Fid): ref Fid; open: fn(f: self ref Fid, mode: int, qid: Sys->Qid); walk: fn(f: self ref Fid, qid: Sys->Qid); }; Navigator: adt { c: chan of ref Navop; reply: chan of (ref Sys->Dir, string); new: fn(c: chan of ref Navop): ref Navigator; stat: fn(t: self ref Navigator, q: big): (ref Sys->Dir, string); walk: fn(t: self ref Navigator, parentq: big, name: string): (ref Sys->Dir, string); readdir: fn(t: self ref Navigator, q: big, offset, count: int): array of ref Sys->Dir; }; Navop: adt { reply: chan of (ref Sys->Dir, string); # channel for reply path: big; # file or directory path pick { Stat => Walk => name: string; Readdir => offset: int; # index (origin 0) of first directory entry to return count: int; # number of directory entries requested } }; Styxserver: adt { fd: ref Sys->FD; # file server end of connection fids: array of list of ref Fid; # hash table of fids fidlock: chan of int; t: ref Navigator; # name space navigator for this server rootpath: big; # Qid.path of root of its name space msize: int; # negotiated Styx message size replychan: chan of ref Styx->Rmsg; new: fn(fd: ref Sys->FD, t: ref Navigator, rootpath: big): (chan of ref Styx->Tmsg, ref Styxserver); reply: fn(srv: self ref Styxserver, m: ref Styx->Rmsg): int; replydirect: fn(srv: self ref Styxserver, m: ref Styx->Rmsg): int; # protocol operations attach: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Attach): ref Fid; clunk: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Clunk): ref Fid; walk: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Walk): ref Fid; open: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Open): ref Fid; read: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Read): ref Fid; remove: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Remove): ref Fid; stat: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Stat); default: fn(srv: self ref Styxserver, gm: ref Styx->Tmsg); # check validity but don't reply cancreate: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Create): (ref Fid, int, ref Sys->Dir, string); canopen: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Open): (ref Fid, int, ref Sys->Dir, string); canremove: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Remove): (ref Fid, big, string); canread: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Read): (ref Fid, string); canwrite: fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Write): (ref Fid, string); # fid management getfid: fn(srv: self ref Styxserver, fid: int): ref Fid; newfid: fn(srv: self ref Styxserver, fid: int): ref Fid; delfid: fn(srv: self ref Styxserver, c: ref Fid); allfids: fn(srv: self ref Styxserver): list of ref Fid; iounit: fn(srv: self ref Styxserver): int; }; init: fn(styx: Styx); traceset: fn(on: int); readbytes: fn(m: ref Styx->Tmsg.Read, d: array of byte): ref Styx->Rmsg.Read; readstr: fn(m: ref Styx->Tmsg.Read, s: string): ref Styx->Rmsg.Read; openok: fn(uname: string, omode, perm: int, fuid, fgid: string): int; openmode: fn(o: int): int; Einuse: con "fid already in use"; Ebadfid: con "bad fid"; Eopen: con "fid already opened"; Enotfound: con "file does not exist"; Enotdir: con "not a directory"; Eperm: con "permission denied"; Ebadarg: con "bad argument"; Eexists: con "file already exists"; Emode: con "open/create -- unknown mode"; Eoffset: con "read/write -- bad offset"; Ecount: con "read/write -- count negative or exceeds msgsize"; Enotopen: con "read/write -- on non open fid"; Eaccess: con "read/write -- not open in suitable mode"; Ename: con "bad character in file name"; Edot: con ". and .. are illegal names"; }; Nametree: module { PATH: con "/dis/lib/nametree.dis"; Tree: adt { c: chan of ref Treeop; reply: chan of string; quit: fn(t: self ref Tree); create: fn(t: self ref Tree, parent: big, d: Sys->Dir): string; wstat: fn(t: self ref Tree, path: big, d: Sys->Dir): string; remove: fn(t: self ref Tree, path: big): string; getpath: fn(t: self ref Tree, path: big): string; }; Treeop: adt { reply: chan of string; q: big; pick { Create or Wstat => d: Sys->Dir; Remove => Getpath => } }; init: fn(); start: fn(): (ref Tree, chan of ref Styxservers->Navop); }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/sys.m���������������������������������������������������� 664 � 0 � 0 � 7600 10646114474 21021�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� SELF: con "$self"; # Language support for loading my instance Sys: module { PATH: con "$Sys"; Maxint: con 2147483647; # Unique file identifier for file objects Qid: adt { path: big; vers: int; qtype: int; }; QTDIR: con 16r80; QTAPPEND: con 16r40; QTEXCL: con 16r20; QTAUTH: con 16r08; QTTMP: con 16r04; QTFILE: con 0; # Return from stat and directory read Dir: adt { name: string; uid: string; gid: string; muid: string; qid: Qid; mode: int; atime: int; mtime: int; length: big; dtype: int; dev: int; }; nulldir: con Dir(nil, nil, nil, nil, (~big 0, ~0, ~0), ~0, ~0, ~0, ~big 0, ~0, ~0); zerodir: con Dir(nil, nil, nil, nil, (big 0, 0, 0), 0, 0, 0, big 0, 0, 0); # File descriptor # FD: adt { fd: int; }; # Network connection returned by dial # Connection: adt { dfd: ref FD; cfd: ref FD; dir: string; }; # File IO structures returned from file2chan # read: (offset, bytes, fid, chan) # write: (offset, data, fid, chan) # Rread: type chan of (array of byte, string); Rwrite: type chan of (int, string); FileIO: adt { read: chan of (int, int, int, Rread); write: chan of (int, array of byte, int, Rwrite); }; # Maximum read which will be completed atomically; # also the optimum block size # ATOMICIO: con 8192; SEEKSTART: con 0; SEEKRELA: con 1; SEEKEND: con 2; NAMEMAX: con 256; ERRMAX: con 128; WAITLEN: con ERRMAX+64; OREAD: con 0; OWRITE: con 1; ORDWR: con 2; OTRUNC: con 16; ORCLOSE: con 64; OEXCL: con 16r1000; DMDIR: con int 1<<31; DMAPPEND: con int 1<<30; DMEXCL: con int 1<<29; DMAUTH: con int 1<<27; DMTMP: con int 1<<26; MREPL: con 0; MBEFORE: con 1; MAFTER: con 2; MCREATE: con 4; MCACHE: con 16; NEWFD: con (1<<0); FORKFD: con (1<<1); NEWNS: con (1<<2); FORKNS: con (1<<3); NEWPGRP: con (1<<4); NODEVS: con (1<<5); NEWENV: con (1<<6); FORKENV: con (1<<7); EXPWAIT: con 0; EXPASYNC: con 1; UTFmax: con 3; UTFerror: con 16r80; announce: fn(addr: string): (int, Connection); aprint: fn(s: string, *): array of byte; bind: fn(s, on: string, flags: int): int; byte2char: fn(buf: array of byte, n: int): (int, int, int); char2byte: fn(c: int, buf: array of byte, n: int): int; chdir: fn(path: string): int; create: fn(s: string, mode, perm: int): ref FD; dial: fn(addr, local: string): (int, Connection); dirread: fn(fd: ref FD): (int, array of Dir); dup: fn(old, new: int): int; export: fn(c: ref FD, dir: string, flag: int): int; fauth: fn(fd: ref FD, aname: string): ref FD; fd2path: fn(fd: ref FD): string; fildes: fn(fd: int): ref FD; file2chan: fn(dir, file: string): ref FileIO; fprint: fn(fd: ref FD, s: string, *): int; fstat: fn(fd: ref FD): (int, Dir); fversion: fn(fd: ref FD, msize: int, version: string): (int, string); fwstat: fn(fd: ref FD, d: Dir): int; iounit: fn(fd: ref FD): int; listen: fn(c: Connection): (int, Connection); millisec: fn(): int; mount: fn(fd: ref FD, afd: ref FD, on: string, flags: int, spec: string): int; open: fn(s: string, mode: int): ref FD; pctl: fn(flags: int, movefd: list of int): int; pipe: fn(fds: array of ref FD): int; print: fn(s: string, *): int; pread: fn(fd: ref FD, buf: array of byte, n: int, off: big): int; pwrite: fn(fd: ref FD, buf: array of byte, n: int, off: big): int; read: fn(fd: ref FD, buf: array of byte, n: int): int; readn: fn(fd: ref FD, buf: array of byte, n: int): int; remove: fn(s: string): int; seek: fn(fd: ref FD, off: big, start: int): big; sleep: fn(period: int): int; sprint: fn(s: string, *): string; stat: fn(s: string): (int, Dir); stream: fn(src, dst: ref FD, bufsiz: int): int; tokenize: fn(s, delim: string): (int, list of string); unmount: fn(s1: string, s2: string): int; utfbytes: fn(buf: array of byte, n: int): int; werrstr: fn(s: string): int; write: fn(fd: ref FD, buf: array of byte, n: int): int; wstat: fn(s: string, d: Dir): int; }; ��������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/tables.m������������������������������������������������� 664 � 0 � 0 � 1154 10133455145 21445�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tables: module { PATH: con "/dis/lib/tables.dis"; Table: adt[T] { items: array of list of (int, T); nilval: T; new: fn(nslots: int, nilval: T): ref Table[T]; add: fn(t: self ref Table, id: int, x: T): int; del: fn(t: self ref Table, id: int): int; find: fn(t: self ref Table, id: int): T; }; Strhash: adt[T] { items: array of list of (string, T); nilval: T; new: fn(nslots: int, nilval: T): ref Strhash[T]; add: fn(t: self ref Strhash, id: string, x: T); del: fn(t: self ref Strhash, id: string); find: fn(t: self ref Strhash, id: string): T; }; hash: fn(s: string, n: int): int; }; self ref Fid, qid: Sys->Qid); }; Navigator: adt { c: chan of ref Navop; reply: chan of (ref Sys->Dir, string); new: fn(c: chan of ref Navop): ref Navigator; stat: fn(t: self ref Navigator, q: big): (ref Sys->Dir, string); walk: fn(t: self ref Navigator, parentq: big, name: string): (ref Sys->Dir, string); readdir: fn(t: self ref Navigator, q: big, offset, count: int): array of ref old_contrib//root/sys/src/cmd/limbo/module/tabs.m��������������������������������������������������� 664 � 0 � 0 � 460 7515141053 21063�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tabs: module { PATH: con "/dis/lib/tabs.dis"; init: fn(); mktabs: fn(t: ref Tk->Toplevel, dot: string, tabs: array of (string, string), dflt: int): chan of string; tabsctl: fn(t: ref Tk->Toplevel, dot: string, tabs: array of (string, string), id: int, s: string): int; }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/tcllib.m������������������������������������������������� 664 � 0 � 0 � 211 6622405630 21377�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TclLib : module { exec : fn(tcl : ref Tcl_Core->TclData,argv : array of string) : (int,string); about : fn() : array of string; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/tftp.m��������������������������������������������������� 664 � 0 � 0 � 223 7662365613 21121�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tftp: module { PATH: con "/dis/lib/tftp.dis"; init: fn(progress: int); receive: fn(host: string, filename: string, fd: ref Sys->FD): string; }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/timers.m������������������������������������������������� 664 � 0 � 0 � 355 7713726260 21451�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Timers: module { PATH: con "/dis/lib/timers.dis"; Sec: con 1000; Timer: adt { dt: int; timeout: chan of int; start: fn(msec: int): ref Timer; stop: fn(t: self ref Timer); }; init: fn(gran: int): int; shutdown: fn(); }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/titlebar.m����������������������������������������������� 664 � 0 � 0 � 647 7667663023 21765�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Titlebar: module{ PATH: con "/dis/lib/titlebar.dis"; Resize, Hide, Help, OK, Popup, Plain: con 1 << iota; Appl: con Resize | Hide; init: fn(); new: fn(top: ref Tk->Toplevel, buts: int): chan of string; minsize: fn(top: ref Tk->Toplevel): Draw->Point; title: fn(top: ref Tk->Toplevel): string; settitle: fn(top: ref Tk->Toplevel, title: string): string; sendctl: fn(top: ref Tk->Toplevel, c: string); }; �����������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/tk.m����������������������������������������������������� 664 � 0 � 0 � 1523 7654001042 20566�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tk: module { PATH: con "$Tk"; Toplevel: adt { display: ref Draw->Display; wreq: chan of string; image: ref Draw->Image; ctxt: ref Draw->Wmcontext; # placeholder, not used by tk screenr: Draw->Rect; # writable }; Border, Required, Local: con 1<<iota; rect: fn(t: ref Toplevel, name: string, flags: int): Draw->Rect; toplevel: fn(d: ref Draw->Display, arg: string): ref Toplevel; namechan: fn(t: ref Toplevel, c: chan of string, n: string): string; cmd: fn(t: ref Toplevel, arg: string): string; pointer: fn(t: ref Toplevel, p: Draw->Pointer); keyboard: fn(t: ref Toplevel, key: int); putimage: fn(t: ref Toplevel, name: string, i, m: ref Draw->Image): string; getimage: fn(t: ref Toplevel, name: string): (ref Draw->Image, ref Draw->Image, string); quote: fn(s: string): string; color: fn(col: string): int; }; EWENV: con (1<<6); FORKENV: con (1<<7); EXPWAIT: con 0; EXPASYNC: con 1; UTFmax: con 3; UTFerror: con 16r80; announce: fn(addr: string): (int, Connection); aprinold_contrib//root/sys/src/cmd/limbo/module/tkclient.m����������������������������������������������� 664 � 0 � 0 � 1276 7654001130 21770�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Tkclient: module { PATH: con "/dis/lib/tkclient.dis"; Resize, Hide, Help, OK, Popup, # XXX is this useful? Plain: con 1 << iota; Appl: con Resize | Hide; init: fn(); makedrawcontext: fn(): ref Draw->Context; toplevel: fn(ctxt: ref Draw->Context, topconfig: string, title: string, buts: int): (ref Tk->Toplevel, chan of string); onscreen: fn(top: ref Tk->Toplevel, how: string); startinput: fn(top: ref Tk->Toplevel, devs: list of string); wmctl: fn(top: ref Tk->Toplevel, request: string): string; settitle: fn(top: ref Tk->Toplevel, name: string): string; handler: fn(top: ref Tk->Toplevel, stop: chan of int); snarfput: fn(buf: string); snarfget: fn(): string; }; ff: big): int; pwrite: fn(fd: ref FD, buf: array of byte, n: int, off: big): int; read: fn(fd: ref FD, buf: array of byte, n: int): int; readn: fn(fd: ref FD, buf: array of byte, n: int): int; remove: fn(s: string): int; seek: fn(fd: ref FD, off: big, start: int): big; sleep: fn(period: int): int; sprint: fnold_contrib//root/sys/src/cmd/limbo/module/translate.m���������������������������������������������� 664 � 0 � 0 � 1231 7035356317 22154�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright © 2000 Vita Nuova Limited # Translate: module { PATH: con "/dis/lib/translate.dis"; Dict: adt { texts: array of list of ref Phrase; notes: array of list of ref Phrase; new: fn(): ref Dict; add: fn(d: self ref Dict, file: string): string; xlate: fn(d: self ref Dict, nil: string): string; xlaten: fn(d: self ref Dict, nil: string, note: string): string; }; Phrase: adt { key: string; text: string; # nil for a note hash: int; n: int; note: int; }; init: fn(); opendict: fn(file: string): (ref Dict, string); opendicts: fn(files: list of string): (ref Dict, string); mkdictname: fn(locale, app: string): string; }; ref Table[T]; add: fn(t: self ref Table, id: int, x: T): int; del: fn(t: self ref Table, id: int): int; find: fn(t: self ref Table, id: int): T; }; Strhash: adt[T] { items: array of list of (string, T); nilval: T; new: fn(nslots: int, nilval: T): ref Strhash[T]; add: fn(t: self ref Strhash, id: string, x: T); del: fn(t: self ref Strhaold_contrib//root/sys/src/cmd/limbo/module/ubfa.m��������������������������������������������������� 664 � 0 � 0 � 3243 10375061161 21110�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������UBFa: module { PATH: con "/dis/lib/ubfa.dis"; UValue: adt { pick{ Atom => name: string; Int => value: int; # should have big as well? String => s: string; Binary => a: array of byte; Tuple => a: cyclic array of ref UValue; # tree List => l: cyclic list of ref UValue; # tree Tag => name: string; o: cyclic ref UValue; } isatom: fn(o: self ref UValue): int; isstring: fn(o: self ref UValue): int; isint: fn(o: self ref UValue): int; istuple: fn(o: self ref UValue): int; isop: fn(o: self ref UValue, op: string, arity: int): int; islist: fn(o: self ref UValue): int; isbinary: fn(o: self ref UValue): int; istag: fn(o: self ref UValue): int; text: fn(o: self ref UValue): string; eq: fn(o: self ref UValue, v: ref UValue): int; op: fn(o: self ref UValue, arity: int): string; args: fn(o: self ref UValue, arity: int): array of ref UValue; els: fn(o: self ref UValue): list of ref UValue; val: fn(o: self ref UValue): int; binary: fn(o: self ref UValue): array of byte; objtag: fn(o: self ref UValue): string; obj: fn(o: self ref UValue): ref UValue; }; init: fn(bufio: Bufio); readubf: fn(input: ref Iobuf): (ref UValue, string); writeubf: fn(out: ref Iobuf, obj: ref UValue): int; uniq: fn(s: string): string; # shorthand uvatom: fn(s: string): ref UValue.Atom; uvint: fn(i: int): ref UValue.Int; uvbig: fn(i: big): ref UValue.Int; uvstring: fn(s: string): ref UValue.String; uvbinary: fn(a: array of byte): ref UValue.Binary; uvtuple: fn(a: array of ref UValue): ref UValue.Tuple; uvlist: fn(l: list of ref UValue): ref UValue.List; uvtag: fn(name: string, o: ref UValue): ref UValue.Tag; }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/unbundle.m����������������������������������������������� 664 � 0 � 0 � 467 7757172420 21767�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Unbundle: module { PATH: con "/dis/fs/bundle.dis"; types: fn(): string; init: fn(); run: fn(nil: ref Draw->Context, report: ref Report, nil: list of Option, args: list of ref Value): ref Value; unbundle: fn(r: ref Fslib->Report, iob: ref Bufio->Iobuf, seekable: int, blocksize: int): Fslib->Fschan; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/uris.m��������������������������������������������������� 664 � 0 � 0 � 2042 10434576542 21163�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������URIs: module { PATH: con "/dis/lib/w3c/uris.dis"; # URI Generic Syntax (RFC 3986) # # scheme://authority/path?query#fragment # URI: adt { scheme: string; userinfo: string; # authority, part I host: string; # authority, part II port: string; # authority, part III path: string; # starts with / if path-abempty or path-absolute query: string; # includes ? if not nil fragment: string; # includes # if not nil parse: fn(s: string): ref URI; text: fn(u: self ref URI): string; authority: fn(u: self ref URI): string; addbase: fn(u: self ref URI, base: ref URI): ref URI; copy: fn(u: self ref URI): ref URI; hasauthority: fn(u: self ref URI): int; isabsolute: fn(u: self ref URI): int; nodots: fn(u: self ref URI): ref URI; pathonly: fn(u: self ref URI): ref URI; userpw: fn(u: self ref URI): (string, string); # ``deprecated format'' eq: fn(u: self ref URI, v: ref URI): int; eqf: fn(u: self ref URI, v: ref URI): int; }; init: fn(); dec: fn(s: string): string; enc: fn(s: string, safe: string): string; }; /lib/titlebar.dis"; Resize, Hide, Help, OK, Popup, Plain: con 1 << iota; Appl: con Resize | Hide; init: fn(); new: fn(top: ref Tk->Toplevel, buts: int): chan of string; minsize: fn(top: ref Tk->Toplevel): Draw->Point; title: fn(top: ref Tk->Toplevel): string; settitle: fn(top: ref Tk->Toplevel, title: string): string; sendctl: fn(top: ref Tk->Toplevel, c: string); }; �����������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/url.m���������������������������������������������������� 664 � 0 � 0 � 1467 7142540522 20764�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Url: module { PATH : con "/dis/lib/url.dis"; # scheme ids NOSCHEME, HTTP, HTTPS, FTP, FILE, GOPHER, MAILTO, NEWS, NNTP, TELNET, WAIS, PROSPERO, JAVASCRIPT, UNKNOWN: con iota; # general url syntax: # <scheme>://<user>:<passwd>@<host>:<port>/<path>?<query>#<fragment> # # relative urls might omit some prefix of the above ParsedUrl: adt { scheme: int; utf8: int; # strings not in us-ascii user: string; passwd: string; host: string; port: string; pstart: string; # what precedes <path>: either "/" or "" path: string; query: string; frag: string; makeabsolute: fn(url: self ref ParsedUrl, base: ref ParsedUrl); tostring: fn(url: self ref ParsedUrl) : string; }; schemes: array of string; init: fn(); # call before anything else makeurl: fn(s: string) : ref ParsedUrl; }; : fn(col: string): int; }; EWENV: con (1<<6); FORKENV: con (1<<7); EXPWAIT: con 0; EXPASYNC: con 1; UTFmax: con 3; UTFerror: con 16r80; announce: fn(addr: string): (int, Connection); aprinold_contrib//root/sys/src/cmd/limbo/module/usb.m���������������������������������������������������� 664 � 0 � 0 � 6421 10307257130 20763�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Usb: module { PATH: con "/dis/lib/usb/usb.dis"; DATABASEPATH: con "/lib/usbdb"; RH2D: con 0<<7; RD2H: con 1<<7; Rstandard: con 0<<5; Rclass: con 1<<5; Rvendor: con 2<<5; Rdevice: con 0; Rinterface: con 1; Rendpt: con 2; Rother: con 3; GET_STATUS: con 0; CLEAR_FEATURE: con 1; SET_FEATURE: con 3; SET_ADDRESS: con 5; GET_DESCRIPTOR: con 6; SET_DESCRIPTOR: con 7; GET_CONFIGURATION: con 8; SET_CONFIGURATION: con 9; GET_INTERFACE: con 10; SET_INTERFACE: con 11; SYNCH_FRAME: con 12; DEVICE: con 1; CONFIGURATION: con 2; STRING: con 3; INTERFACE: con 4; ENDPOINT: con 5; HID: con 16r21; REPORT: con 16r22; PHYSICAL: con 16r23; HUB: con 16r29; CL_AUDIO: con 1; CL_COMMS: con 2; CL_HID: con 3; CL_PRINTER: con 7; CL_MASS: con 8; CL_HUB: con 9; CL_DATA: con 10; DDEVLEN: con 18; DCONFLEN: con 9; DINTERLEN: con 9; DENDPLEN: con 7; DHUBLEN: con 9; DHIDLEN: con 9; PORT_CONNECTION: con 0; PORT_ENABLE: con 1; PORT_SUSPEND: con 2; PORT_OVER_CURRENT: con 3; PORT_RESET: con 4; PORT_POWER: con 8; PORT_LOW_SPEED: con 9; Endpt: adt { addr: int; d2h: int; attr: int; etype: int; isotype: int; maxpkt: int; interval: int; }; Econtrol, Eiso, Ebulk, Eintr: con iota; # Endpt.etype Eunknown, Easync, Eadapt, Esync: con iota; # Endpt.isotype NendPt: con 16; Device: adt { usbmajor, usbminor, relmajor, relminor: int; class, subclass, proto, maxpkt0, vid, did, nconf: int; }; AltInterface: adt { id: int; class, subclass, proto: int; ep: array of ref Endpt; }; Interface: adt { altiface: list of ref AltInterface; }; Configuration: adt { id: int; attr: int; powerma: int; iface: array of Interface; }; init: fn(); get2: fn(b: array of byte): int; put2: fn(buf: array of byte, v: int); get4: fn(b: array of byte): int; put4: fn(buf: array of byte, v: int); bigget2: fn(b: array of byte): int; bigput2: fn(buf: array of byte, v: int); bigget4: fn(b: array of byte): int; bigput4: fn(buf: array of byte, v: int); memset: fn(b: array of byte, v: int); strtol: fn(s: string, base: int): (int, string); sclass: fn(class, subclass, proto: int): string; get_descriptor: fn(fd: ref Sys->FD, rtyp: int, dtyp: int, dindex: int, langid: int, buf: array of byte): int; get_standard_descriptor: fn(fd: ref Sys->FD, dtyp: int, index: int, buf: array of byte): int; get_class_descriptor: fn(fd: ref Sys->FD, dtyp: int, index: int, buf: array of byte): int; get_vendor_descriptor: fn(fd: ref Sys->FD, dtyp: int, index: int, buf: array of byte): int; get_status: fn(fd: ref Sys->FD, port: int): int; set_address: fn(fd: ref Sys->FD, address: int): int; set_configuration: fn(fd: ref Sys->FD, n: int): int; setclear_feature: fn(fd: ref Sys->FD, rtyp: int, value: int, index: int, on: int): int; setup: fn(setupfd: ref Sys->FD, typ, req, value, index: int, outbuf: array of byte, inbuf: array of byte): int; get_parsed_configuration_descriptor: fn(fd: ref Sys->FD, n: int): ref Configuration; get_parsed_device_descriptor: fn(fd: ref Sys->FD): ref Device; dump_configuration: fn(fd: ref Sys->FD, conf: ref Configuration); }; UsbDriver: module { MOUSEPATH: con "/appl/cmd/usb/usbmouse.dis"; init: fn(usb: Usb, setupfd, ctlfd: ref Sys->FD, dev: ref Usb->Device, conf: array of ref Usb->Configuration, path: string): int; shutdown: fn(); }; l: cyclic list of ref UValue; # tree Tag => name: string; o: cyclic ref UValue; } isatom: fn(o: self ref UValue): int; isstring: fn(o: self ref UValue): int; isint: fn(o: self ref UValue): int; istuple: fn(o: self ref Uold_contrib//root/sys/src/cmd/limbo/module/vac.m���������������������������������������������������� 664 � 0 � 0 � 11261 10634242727 20772�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Vac: module { PATH: con "/dis/lib/vac.dis"; init: fn(); dflag: int; # taken from venti.m, merge back later # some of this needs to be removed from venti.m since it does not belong there # mode bits Modeperm: con 8r777; Modesticky, Modesetuid, Modesetgid, Modeappend, Modeexcl, Modesymlink, Modedir, Modehidden, Modesystem, Modearchive, Modetemp, Modesnapshot, Modedev, Modenamedpipe: con 1<<(9+iota); Entrysize: con 40; Rootsize: con 300; Metablocksize: con 12; Metaentrysize: con 4; Dsize: con 8*1024; Entryactive: con (1<<0); # entry is in use Entrydir: con (1<<1); # a directory Entrydepthshift: con 2; # shift for pointer depth Entrydepthmask: con (16r7<<2); # mask for pointer depth Entrylocal: con (1<<5); # used for local storage: should not be set for venti blocks Root: adt { version: int; name: string; rtype: string; score: Venti->Score; # to a Dir block blocksize: int; # maximum block size prev: ref Venti->Score; # last root block new: fn(name, rtype: string, score: Venti->Score, blocksize: int, prev: ref Venti->Score): ref Root; unpack: fn(d: array of byte): ref Root; pack: fn(r: self ref Root): array of byte; }; Entry: adt { gen: int; # generation number (XXX should be unsigned) psize: int; # pointer block size dsize: int; # data block size depth: int; # unpacked from flags flags: int; size: big; # (XXX should be unsigned) score: Venti->Score; new: fn(psize, dsize, flags: int, size: big, score: Venti->Score): ref Entry; pack: fn(e: self ref Entry): array of byte; unpack: fn(d: array of byte): ref Entry; }; Direntry: adt { version: int; elem: string; entry, gen: int; mentry, mgen: int; qid: big; uid, gid, mid: string; mtime, mcount, ctime, atime, mode, emode: int; new: fn(): ref Direntry; mk: fn(d: Sys->Dir): ref Direntry; mkdir: fn(de: self ref Direntry): ref Sys->Dir; pack: fn(de: self ref Direntry): array of byte; unpack: fn(d: array of byte): ref Direntry; }; Metablock: adt { size, free, maxindex, nindex: int; new: fn(): ref Metablock; pack: fn(mb: self ref Metablock, d: array of byte); unpack: fn(d: array of byte): ref Metablock; }; Metaentry: adt { offset, size: int; pack: fn(me: self ref Metaentry, d: array of byte); unpack: fn(d: array of byte, i: int): ref Metaentry; }; # single block Page: adt { d: array of byte; o: int; new: fn(dsize: int): ref Page; add: fn(p: self ref Page, s: Venti->Score); full: fn(p: self ref Page): int; data: fn(p: self ref Page): array of byte; }; # hash tree file File: adt { p: array of ref Page; dtype, dsize: int; size: big; s: ref Venti->Session; new: fn(s: ref Venti->Session, dtype, dsize: int): ref File; write: fn(f: self ref File, d: array of byte): int; finish: fn(f: self ref File): ref Entry; }; # for writing venti directories Sink: adt { f: ref File; d: array of byte; nd, ne: int; new: fn(s: ref Venti->Session, dsize: int): ref Sink; add: fn(m: self ref Sink, e: ref Entry): int; finish: fn(m: self ref Sink): ref Entry; }; Mentry: adt { elem: string; me: ref Metaentry; cmp: fn(a, b: ref Mentry): int; }; # for writing directory entries (meta blocks, meta entries, direntries) MSink: adt { f: ref File; de: array of byte; nde: int; l: list of ref Mentry; new: fn(s: ref Venti->Session, dsize: int): ref MSink; add: fn(m: self ref MSink, de: ref Direntry): int; finish: fn(m: self ref MSink): ref Entry; }; # for reading pages from a hash tree referenced by an entry Source: adt { session: ref Venti->Session; e: ref Entry; new: fn(s: ref Venti->Session, e: ref Entry): ref Source; get: fn(s: self ref Source, i: big, d: array of byte): int; }; # for reading from a hash tree while keeping offset Vacfile: adt { s: ref Source; o: big; mk: fn(s: ref Source): ref Vacfile; new: fn(session: ref Venti->Session, e: ref Entry): ref Vacfile; read: fn(v: self ref Vacfile, d: array of byte, n: int): int; seek: fn(v: self ref Vacfile, offset: big): big; pread: fn(v: self ref Vacfile, d: array of byte, n: int, offset: big): int; }; # for listing contents of a vac directory and walking to path elements Vacdir: adt { vf: ref Vacfile; ms: ref Source; p: big; i: int; mk: fn(vf: ref Vacfile, ms: ref Source): ref Vacdir; new: fn(session: ref Venti->Session, e, me: ref Entry): ref Vacdir; walk: fn(v: self ref Vacdir, elem: string): ref Direntry; open: fn(v: self ref Vacdir, de: ref Direntry): (ref Entry, ref Entry); readdir: fn(v: self ref Vacdir): (int, ref Direntry); rewind: fn(v: self ref Vacdir); }; vdroot: fn(session: ref Venti->Session, score: Venti->Score): (ref Vacdir, ref Direntry, string); }; ta; # general url syntax: # <scheme>://<user>:<passwd>@<host>:<port>/<path>?<query>#<fragment> # # relative urls might omit some prefix of the above ParsedUrl: adt { scheme: int; utf8: int; # strings not in us-ascii user: string; passwd: string; host: string; port: string; pstart: string; # what precedes old_contrib//root/sys/src/cmd/limbo/module/venti.m�������������������������������������������������� 664 � 0 � 0 � 6317 7720740065 21314�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Venti: module { PATH: con "/dis/lib/venti.dis"; Scoresize: con 20; Maxstringsize: con 1000; Authsize: con 1024; # size of auth group - in bits - must be multiple of 8 Maxfragsize: con 9*1024; Cryptostrengthnone, Cryptostrengthauth, Cryptostrengthweak, Cryptostrengthstrong: con iota; Cryptonone, CryptoSSL3, CryptoTLS1, Cryptomax: con iota; Codecnone, Codecdeflate, CodecThwack, Codecmax: con iota; Terror, # not used Rerror, Tping, Rping, Thello, Rhello, Tgoodbye, Rgoodbye, # not used Tauth0, Rauth0, Tauth1, Rauth1, Tread, Rread, Twrite, Rwrite, Tsync, Rsync, Tmax: con iota; # versions Version01, Version02: con iota + 1; # Lump Types Errtype, # illegal Roottype, Dirtype, Pointertype0, Pointertype1, Pointertype2, Pointertype3, Pointertype4, Pointertype5, Pointertype6, Pointertype7, # not used Pointertype8, # not used Pointertype9, # not used Datatype, Maxtype: con iota; # Dir Entry flags Entryactive: con (1<<0); # entry is in use Entrydir: con (1<<1); # a directory Entrydepthshift: con 2; # shift for pointer depth Entrydepthmask: con (16r7<<2); # mask for pointer depth Entrylocal: con (1<<5); # used for local storage: should not be set for venti blocks Maxlumpsize: con 56 * 1024; Pointerdepth: con 7; Entrysize: con 40; Rootsize: con 300; Rootversion: con 2; Maxfilesize: con (big 1 << 48) - big 1; Vmsg: adt { istmsg: int; tid: int; pick { Thello => version: string; uid: string; cryptostrength: int; cryptos: array of byte; codecs: array of byte; Rhello => sid: string; crypto: int; codec: int; Tping => Rping => Tread => score: Score; etype: int; n: int; Rread => data: array of byte; Twrite => etype: int; data: array of byte; Rwrite => score: Score; Tsync => Rsync => Tgoodbye => Rerror => e: string; } read: fn(fd: ref Sys->FD): (ref Vmsg, string); unpack: fn(a: array of byte): (int, ref Vmsg); pack: fn(nil: self ref Vmsg): array of byte; packedsize: fn(nil: self ref Vmsg): int; text: fn(nil: self ref Vmsg): string; }; Root: adt { version: int; name: string; rtype: string; score: Venti->Score; # to a Dir block blocksize: int; # maximum block size prev: Venti->Score; # last root block }; Entry: adt { gen: int; # generation number (XXX should be unsigned) psize: int; # pointer block size dsize: int; # data block size depth: int; # unpacked from flags flags: int; size: big; # (XXX should be unsigned) score: Venti->Score; }; Score: adt { a: array of byte; eq: fn(a: self Score, b: Score): int; text: fn(a: self Score): string; parse: fn(s: string): (int, Score); zero: fn(): Score; }; Session: adt { fd: ref Sys->FD; version: string; new: fn(fd: ref Sys->FD): ref Session; read: fn(s: self ref Session, score: Venti->Score, etype: int, maxn: int): array of byte; write: fn(s: self ref Session, etype: int, buf: array of byte): (int, Venti->Score); sync: fn(s: self ref Session): int; rpc: fn(s: self ref Session, m: ref Vmsg): (ref Vmsg, string); }; unpackentry: fn(d: array of byte): ref Entry; unpackroot: fn(d: array of byte): ref Root; init: fn(); }; index: int, on: int): int; setup: fn(setupfd: ref Sys->FD, typ, req, value, index: int, outbuf: array of byte, inbuf: array of byte): int; get_parsed_configuration_descriptor: fn(fd: ref Sys->FD, n: int): ref Configuration; get_parsed_device_descriptor: fn(fd: ref Sys->FD): ref Device; dump_configurold_contrib//root/sys/src/cmd/limbo/module/volume.m������������������������������������������������� 664 � 0 � 0 � 1342 6622405630 21463�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Volumectl: module { PATH: con "/dis/lib/volume.dis"; # Volumectl should be spawned as a separate process from # any process that desires volume control. The parameters # are a ref Context that provides volumectl with access to # the display, a chan of int through which volumectl receives # Ir->Enter, Ir->VolUP, or Ir->VolDN commands (others are # ignored), and a string that names the specific volume to # be controlled (typically "audio out"). # Volumectl exits upon receiving Ir->Enter. # It displays a volume control slider when receiving either # Ir->VolUP or Ir->VolDN. The slider automatically disappears # after a period of inactivity. volumectl: fn(ctxt: ref Draw->Context, ch: chan of int, device: string); }; 7; Modesticky, Modesetuid, Modesetgid, Modeappend, Modeexcl, Modesymlink, Modedir, Modehidden, Modesystem, Modearchive, Modetemp, Modesnapshot, Modedev, Modenamedpipe: con 1<<(9+iota); Entrysize: con 40; Rootsize: con 300; Metablocksize: con 12; Metaentrysize: con 4;old_contrib//root/sys/src/cmd/limbo/module/wait.m��������������������������������������������������� 664 � 0 � 0 � 353 7663503155 21110�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Wait: module { PATH: con "/dis/lib/wait.dis"; init: fn(); read: fn(fd: ref Sys->FD): (int, string, string); monitor: fn(fd: ref Sys->FD): (int, chan of (int, string, string)); parse: fn(status: string): (int, string, string); }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/watchvars.m���������������������������������������������� 664 � 0 � 0 � 547 7763032725 22154�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Watchvars: module { PATH: con "/dis/lib/watchvars.dis"; Watchvar: adt[T] { c: chan of (T, chan of T); new: fn(v: T): Watchvar[T]; get: fn(e: self Watchvar[T]): T; set: fn(e: self Watchvar[T], v: T); wait: fn(e: self Watchvar[T]): T; waitc: fn(e: self Watchvar[T]): (T, chan of T); waited: fn(e: self Watchvar[T], ic: chan of T, v: T); }; }; ���������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/webget.m������������������������������������������������� 664 � 0 � 0 � 226 6622405630 21411�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Webget: module { PATH: con "/dis/svc/webget/webget.dis"; init: fn(ctxt: ref Draw->Context, argv: list of string); start: fn(ctl: chan of int); }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/winplace.m����������������������������������������������� 664 � 0 � 0 � 364 10053607737 21766�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Winplace: module { PATH: con "/dis/lib/winplace.dis"; init: fn(); place: fn(wins: list of Draw->Rect, scr, lastrect: Draw->Rect, minsize: Draw->Point): Draw->Rect; find: fn(wins: list of Draw->Rect, scr: Draw->Rect): list of Draw->Rect; }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/wmclient.m����������������������������������������������� 664 � 0 � 0 � 2571 10374352144 22023�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Wmclient: module { PATH: con "/dis/lib/wmclient.dis"; Resize, Hide, Help, OK, Popup, Plain: con 1 << iota; Appl: con Resize | Hide; init: fn(); makedrawcontext: fn(): ref Draw->Context; window: fn(ctxt: ref Draw->Context, title: string, buts: int): ref Window; snarfput: fn(buf: string); snarfget: fn(): string; cursorspec: fn(img: ref Draw->Image): string; Window: adt{ display: ref Draw->Display; r: Draw->Rect; # full rectangle of window, including titlebar. image: ref Draw->Image; displayr: Draw->Rect; ctxt: ref Draw->Wmcontext; bd: int; focused: int; ctl: chan of string; # private from here: titlebar: ref Tk->Toplevel; # XXX i wish this didn't have to be visible to the application... tbsize: Draw->Point; # size requested by titlebar. tbrect: Draw->Rect; screen: ref Draw->Screen; buttons: int; ptrfocus: int; saved: Draw->Point; # saved origin before task startinput: fn(w: self ref Window, devs: list of string); wmctl: fn(w: self ref Window, request: string): string; settitle: fn(w: self ref Window, name: string): string; reshape: fn(w: self ref Window, r: Draw->Rect); onscreen: fn(w: self ref Window, how: string); screenr: fn(w: self ref Window, sr: Draw->Rect): Draw->Rect; imager: fn(w: self ref Window, ir: Draw->Rect): Draw->Rect; pointer: fn(w: self ref Window, p: Draw->Pointer): int; }; }; used Pointertype9, # not used Datatype, Maxtype: con iota; # Dir Entry flags Entryactive: con (1<<0); # entry is in use Enold_contrib//root/sys/src/cmd/limbo/module/wmlib.m�������������������������������������������������� 664 � 0 � 0 � 1626 7700567310 21275�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Wmlib: module { PATH: con "/dis/lib/wmlib.dis"; init: fn(); makedrawcontext: fn(): ref Draw->Context; importdrawcontext: fn(devdraw, mntwm: string): (ref Draw->Context, string); connect: fn(ctxt: ref Draw->Context): ref Draw->Wmcontext; reshape: fn(w: ref Draw->Wmcontext, name: string, r: Draw->Rect, i: ref Draw->Image, how: string): ref Draw->Image; startinput: fn(w: ref Draw->Wmcontext, devs: list of string): string; # could be part of connect? wmctl: fn(w: ref Draw->Wmcontext, request: string): (string, ref Draw->Image, string); # wmtoken: fn(w: ref Draw->Wmcontext): string; snarfput: fn(buf: string); snarfget: fn(): string; # XXX these don't really belong here, but where should they go? splitqword: fn(s: string, e: int): ((int, int), int); qslice: fn(s: string, r: (int, int)): string; qword: fn(s: string, e: int): (string, int); s2r: fn(s: string, e: int): (Draw->Rect, int); }; ze dsize: int; # data block size depth: int; # unpacked from flags flags: int; size: big; # (Xold_contrib//root/sys/src/cmd/limbo/module/wmsrv.m�������������������������������������������������� 664 � 0 � 0 � 2600 10374352143 21347�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Wmsrv: module{ PATH: con "/dis/lib/wmsrv.dis"; init: fn(): (chan of (string, chan of (string, ref Draw->Wmcontext)), chan of (ref Client, chan of string), chan of (ref Client, array of byte, Sys->Rwrite)); find: fn(p: Draw->Point): ref Client; top: fn(): ref Client; Window: adt { tag: string; r: Rect; img: ref Draw->Image; }; Client: adt { kbd: chan of int; ptr: chan of ref Draw->Pointer; ctl: chan of string; stop: chan of int; flags: int; # general purpose. cursor: string; # hack. wins: list of ref Window; znext: cyclic ref Client; # private: images: chan of (ref Draw->Point, ref Draw->Image, chan of int); id: int; # index into clients array fid: int; token: int; wmctxt: ref Draw->Wmcontext; window: fn(c: self ref Client, tag: string): ref Window; contains: fn(c: self ref Client, p: Draw->Point): int; image: fn(c: self ref Client, tag: string): ref Draw->Image; setimage: fn(c: self ref Client, tag: string, i: ref Draw->Image): int; # only in response to some msgs. setorigin: fn(c: self ref Client, tag: string, o: Draw->Point): int; # only in response to some msgs. top: fn(c: self ref Client); # bring to top. bottom: fn(c: self ref Client); # send to bottom. hide: fn(w: self ref Client); # move offscreen. unhide: fn(w: self ref Client); # move onscreen. remove: fn(w: self ref Client); }; }; ��������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/workdir.m������������������������������������������������ 664 � 0 � 0 � 163 6622405630 21615�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Workdir: module { PATH: con "/dis/lib/workdir.dis"; # Return current working directory init: fn(): string; }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/x509.m��������������������������������������������������� 664 � 0 � 0 � 22366 6703102400 20677�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # X.509 v3 by ITU-T Recommendation (11/93) & PKCS7 & PKCS10 # X509: module { PATH: con "/dis/lib/crypt/x509.dis"; init: fn(): string; ## x509 (id_at) and x509 extention v3 (id_ce) Object Identifiers objIdTab : array of ASN1->Oid; id_at, id_at_commonName, id_at_countryName, id_at_localityName, id_at_stateOrProvinceName, id_at_organizationName, id_at_organizationalUnitName, id_at_userPassword, id_at_userCertificate, id_at_cAcertificate, id_at_authorityRevocationList, id_at_certificateRevocationList, id_at_crossCertificatePair, id_at_supportedAlgorithms, id_at_deltaRevocationList, id_ce, id_ce_subjectDirectoryAttributes, id_ce_subjectKeyIdentifier, id_ce_keyUsage, id_ce_privateKeyUsage, id_ce_subjectAltName, id_ce_issuerAltName, id_ce_basicConstraints, id_ce_cRLNumber, id_ce_reasonCode, id_ce_instructionCode, id_ce_invalidityDate, id_ce_deltaCRLIndicator, id_ce_issuingDistributionPoint, id_ce_certificateIssuer, id_ce_nameConstraints, id_ce_cRLDistributionPoint, id_ce_certificatePolicies, id_ce_policyMapping, id_ce_authorityKeyIdentifier, id_ce_policyConstraints, id_mr, id_mr_certificateExactMatch, id_mr_certificateMatch, id_mr_certificatePairExactMatch, id_mr_certificatePairMatch, id_mr_certificateListExactMatch, id_mr_certificateListMatch, id_mr_algorithmidentifierMatch : con iota; ## Signed (as Public Key, CRL, Attribute Certificates and CertificationRequest) Signed: adt { tobe_signed : array of byte; alg : ref AlgIdentifier; signature : array of byte; # BIT STRING, DER encoding decode: fn(a: array of byte): (string, ref Signed); encode: fn(s: self ref Signed): (string, array of byte); sign: fn(s: self ref Signed, sk: ref PrivateKey, hash: int): (string, array of byte); verify: fn(s: self ref Signed, pk: ref PublicKey, hash: int): int; tostring: fn(s: self ref Signed): string; }; ## Certificate Path verify_certchain: fn(cs: list of array of byte): (int, string); verify_certpath: fn(cp: list of (ref Signed, ref Certificate)): (int, string); ## TBS (Public Key) Certificate Certificate: adt { version : int; # v1(0; default) or v2(1) or v3(2) serial_number : ref Keyring->IPint; sig : ref AlgIdentifier; issuer : ref Name; validity : ref Validity; subject : ref Name; subject_pkinfo : ref SubjectPKInfo; # OPTIONAL for v2 and v3; must be in order issuer_uid : array of byte; # v2 subject_uid : array of byte; # v2 or v3 exts : list of ref Extension; # v3 decode: fn(a: array of byte): (string, ref Certificate); encode: fn(c: self ref Certificate): (string, array of byte); tostring: fn(c: self ref Certificate): string; is_expired: fn(c: self ref Certificate, date: int): int; }; AlgIdentifier: adt { oid : ref ASN1->Oid; parameter : array of byte; tostring: fn(a: self ref AlgIdentifier): string; }; Name: adt { rd_names : list of ref RDName; equal: fn(a: self ref Name, b: ref Name): int; tostring: fn(n: self ref Name): string; }; RDName: adt { avas : list of ref AVA; equal: fn(a: self ref RDName, b: ref RDName): int; tostring: fn(r: self ref RDName): string; }; AVA: adt { oid : ref ASN1->Oid; value : string; equal: fn(a: self ref AVA, b: ref AVA): int; tostring: fn(a: self ref AVA): string; }; Validity: adt { not_before : int; not_after : int; tostring: fn(v: self ref Validity, format: string): string; }; SubjectPKInfo: adt { alg_id : ref AlgIdentifier; subject_pk : array of byte; # BIT STRING getPublicKey: fn(c: self ref SubjectPKInfo): (string, int, ref PublicKey); tostring: fn(c: self ref SubjectPKInfo): string; }; Extension: adt{ oid : ref ASN1->Oid; critical : int; # default false value : array of byte; tostring: fn(e: self ref Extension): string; }; PublicKey: adt { pick { RSA => pk : ref PKCS->RSAKey; DSS => pk : ref PKCS->DSSPublicKey; DH => pk : ref PKCS->DHPublicKey; } }; PrivateKey: adt { pick { RSA => sk : ref PKCS->RSAKey; DSS => sk : ref PKCS->DSSPrivateKey; DH => sk : ref PKCS->DHPrivateKey; } }; ## Certificate Revocation List CRL: adt { version : int; # OPTIONAL; v2 sig : ref AlgIdentifier; issuer : ref Name; this_update : int; next_update : int; # OPTIONAL revoked_certs : list of ref RevokedCert; # OPTIONAL exts : list of ref Extension; # OPTIONAL decode: fn(a: array of byte): (string, ref CRL); encode: fn(c: self ref CRL): (string, array of byte); tostring: fn(c: self ref CRL): string; is_revoked: fn(c: self ref CRL, sn: ref Keyring->IPint): int; }; RevokedCert: adt { user_cert : ref Keyring->IPint; # serial_number revoc_date : int; # OPTIONAL exts : list of ref Extension; # OPTIONAL; CRL entry extensions tostring: fn(rc: self ref RevokedCert): string; }; ## Certificate Extensions # get critical extensions cr_exts: fn(es: list of ref Extension): list of ref Extension; # get non-critical extensions noncr_exts: fn(es: list of ref Extension): list of ref Extension; # decode a list of extensions parse_exts: fn(es: list of ref Extension): (string, list of ref ExtClass); # extension classes ExtClass: adt { pick { AuthorityKeyIdentifier => id : array of byte; # OCTET STRING issuer : ref GeneralName; serial_number : ref Keyring->IPint; SubjectKeyIdentifier => id : array of byte; # OCTET STRING BasicConstraints => depth : int; # certificate path constraints KeyUsage => usage : int; PrivateKeyUsage => period : ref Validity; PolicyMapping => # (issuer, subject) domain policy pairs pairs : list of (ref ASN1->Oid, ref ASN1->Oid); CertificatePolicies => policies : list of ref PolicyInfo; IssuerAltName => alias : list of ref GeneralName; SubjectAltName => alias : list of ref GeneralName; NameConstraints => permitted : list of ref GSubtree; excluded : list of ref GSubtree; PolicyConstraints => require : int; inhibit : int; CRLNumber => curr : int; ReasonCode => code : int; InstructionCode => oid : ref ASN1->Oid; # hold instruction code field InvalidityDate => date : int; CRLDistributionPoint => ps : list of ref DistrPoint; IssuingDistributionPoint => name : ref DistrPointName; only_usercerts : int; # DEFAULT FALSE only_cacerts : int; # DEFAULT FALSE only_reasons : int; indirect_crl : int; # DEFAULT FALSE CertificateIssuer => names : list of ref GeneralName; DeltaCRLIndicator => number : ref Keyring->IPint; SubjectDirectoryAttributes => attrs : list of ref Attribute; UnknownType => ext : ref Extension; } decode: fn(ext: ref Extension): (string, ref ExtClass); encode: fn(et: self ref ExtClass, critical: int): ref Extension; tostring: fn(et: self ref ExtClass): string; }; # key usage KeyUsage_DigitalSignature, KeyUsage_NonRepudiation, KeyUsage_KeyEncipherment, KeyUsage_DataEncipherment, KeyUsage_KeyAgreement, KeyUsage_KeyCertSign, KeyUsage_CRLSign, KeyUsage_EncipherOnly, KeyUsage_DecipherOnly : con iota << 1; # CRL reason Reason_Unspecified, Reason_KeyCompromise, Reason_CACompromise, Reason_AffiliationChanged, Reason_Superseded, Reason_CessationOfOperation, Reason_CertificateHold, Reason_RemoveFromCRL : con iota << 1; # General Name GeneralName: adt { pick { otherName or # [0] rfc822Name or # [1] dNSName or # [2] x400Address or # [3] uniformResourceIdentifier => # [6] str : string; iPAddress => # [7] ip : array of byte; registeredID => # [8] oid : ref ASN1->Oid; ediPartyName => # [5] nameAssigner : ref Name; # [0] partyName : ref Name; # [1] directoryName => # [4] dir : ref Name; } tostring: fn(g: self ref GeneralName): string; }; # security policies PolicyInfo: adt { oid : ref ASN1->Oid; qualifiers : list of ref PolicyQualifier; tostring: fn(pi: self ref PolicyInfo): string; }; PolicyQualifier: adt { oid : ref ASN1->Oid; value : array of byte; # OCTET STRING; OPTIONAL tostring: fn(pq: self ref PolicyQualifier): string; }; GSubtree: adt { base : ref GeneralName; min : int; max : int; tostring: fn(gs: self ref GSubtree): string; }; # crl distribution point # with known reason code # Unused [0], KeyCompromise [1], CACompromise [2], AffilationChanged [3], # Superseded [4], CessationOfOperation [5], CertificateHold [6] DistrPoint: adt{ name : ref DistrPointName; reasons : int; issuer : list of ref GeneralName; tostring: fn(dp: self ref DistrPoint): string; }; DistrPointName: adt { full_name : list of ref GeneralName; rdname : list of ref RDName; }; Attribute: adt { id : ASN1->Oid; value : array of byte; }; }; #X509Attribute: module { # # ## Attribute Certificate # # AttrCert: adt { # version : int; # default v1 # base_certid : ref IssuerSerial; # [0] # subject_name : list of ref GeneralName; # [1] # issuer : list of ref GeneralName; # serial_number : ref IPint; # validity : ref Validity; # attrs : list of ref Attribute; # issuer_uid : array of byte; # OPTIONAL # exts : list of ref Extension; # OPTIONAL # }; # # IssuerSerial: adt { # issuer : list of ref GeneralName; # serial : ref IPint; # issuer_uid : array of byte; # OPTIONAL # }; #}; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������old_contrib//root/sys/src/cmd/limbo/module/xml.m���������������������������������������������������� 664 � 0 � 0 � 3147 10540245420 20772�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Xml: module { PATH: con "/dis/lib/xml.dis"; Item: adt { fileoffset: int; pick { Tag => name: string; attrs: Attributes; Text => ch: string; ws1, ws2: int; Process => target: string; data: string; Doctype => name: string; public: int; params: list of string; Stylesheet => attrs: Attributes; Error => loc: Locator; msg: string; } }; Locator: adt { line: int; systemid: string; publicid: string; }; Attribute: adt { name: string; value: string; }; Attributes: adt { attrs: list of Attribute; all: fn(a: self Attributes): list of Attribute; get: fn(a: self Attributes, name: string): string; }; Mark: adt { estack: list of string; line: int; offset: int; readdepth: int; str: fn(m: self ref Mark): string; }; Parser: adt { in: ref Bufio->Iobuf; eof: int; lastnl: int; estack: list of string; loc: Locator; warning: chan of (Locator, string); errormsg: string; actdepth: int; readdepth: int; fileoffset: int; preelem: string; ispre: int; next: fn(p: self ref Parser): ref Item; up: fn(p: self ref Parser); down: fn(p: self ref Parser); mark: fn(p: self ref Parser): ref Mark; atmark: fn(p: self ref Parser, m: ref Mark): int; goto: fn(p: self ref Parser, m: ref Mark); str2mark: fn(p: self ref Parser, s: string): ref Mark; }; init: fn(): string; open: fn(f: string, warning: chan of (Locator, string), preelem: string): (ref Parser, string); fopen: fn(f: ref Bufio->Iobuf, srcname: string, warning: chan of (Locator, string), preelem: string): (ref Parser, string); }; ); encode: fn(s: self ref Signed): (string, array of byte); sign: fn(s: self ref Signed, sk: ref PrivateKey, hash: int): (string, array of byte); verify: fn(s: self ref Signed, pk: ref PublicKey, hash: int): int; tostring: fn(s: self ref Signed): string; }; ## Certificate Path verify_certchain: fn(cs: list of array of byte): (int, string); verify_certpath: fn(cp: list of (ref Signed, ref Certold_contrib//root/sys/src/cmd/limbo/module/xpointers.m���������������������������������������������� 664 � 0 � 0 � 2424 10256513234 22227�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������pietro�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Xpointers: module { PATH: con "/dis/lib/w3c/xpointers.dis"; One, Ole, Oge, Omul, Odiv, Omod, Oand, Oor, Oneg, Onodetype, Onametest, Ofilter, Opath: con 'A'+iota; # axis types Aancestor, Aancestor_or_self, Aattribute, Achild, Adescendant, Adescendant_or_self, Afollowing, Afollowing_sibling, Anamespace, Aparent, Apreceding, Apreceding_sibling, Aself: con iota; Xstep: adt { axis: int; # Aancestor, ... (above) op: int; # Onametest or Onodetype ns: string; name: string; arg: string; # optional parameter to processing-instruction preds: cyclic list of ref Xpath; text: fn(nil: self ref Xstep): string; axisname: fn(i: int): string; }; Xpath: adt { pick{ E => op: int; l, r: cyclic ref Xpath; Fn => ns: string; name: string; args: cyclic list of ref Xpath; Var => ns: string; name: string; Path => abs: int; steps: list of ref Xstep; Int => val: big; Real => val: real; Str => s: string; } text: fn(nil: self ref Xpath): string; }; init: fn(); framework: fn(s: string): (string, list of (string, string, string), string); # predefined schemes element: fn(s: string): (string, list of int, string); xmlns: fn(s: string): (string, string, string); xpointer: fn(s: string): (ref Xpath, string); }; self ref Extension): string; }; PublicKey: adt { pick { RSA => pk : ref PKCS->RSAKey; DSS => pk : ref PKCS->DSSPublicKey; DH => pk : ref PKCS->DHPublicKey; } }; PrivateKey: adt { pick { RSA => sk : rold_contrib//shape.c�������������������������������������������������������������������������������� 664 � 0 � 0 � 573421 11411736623 13131�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������sys��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#line 1 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 27 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/include/ape/stdio.h" #pragma lib "/$M/lib/ape/libap.a" #line 8 "/sys/include/ape/stdio.h" #line 1 "/386/include/ape/stdarg.h" typedef char *va_list; #line 8 "/386/include/ape/stdarg.h" #line 9 "/sys/include/ape/stdio.h" #line 1 "/sys/include/ape/stddef.h" typedef long ptrdiff_t; typedef unsigned long size_t; typedef unsigned short wchar_t; #line 10 "/sys/include/ape/stdio.h" #line 1 "/sys/include/ape/sys/types.h" #pragma lib "/$M/lib/ape/libap.a" typedef unsigned short ino_t; typedef unsigned short dev_t; typedef long long off_t; typedef unsigned short mode_t; typedef short uid_t; typedef short gid_t; typedef short nlink_t; typedef int pid_t; typedef long ssize_t; typedef long time_t; typedef char * caddr_t; typedef struct fd_set { long fds_bits[3]; } fd_set; #line 11 "/sys/include/ape/stdio.h" #line 31 "/sys/include/ape/stdio.h" typedef struct{ int fd; char flags; char state; char *buf; char *rp; char *wp; char *lp; size_t bufl; char unbuf[1]; }FILE; typedef long long fpos_t; #line 53 "/sys/include/ape/stdio.h" extern int remove(const char *); extern int rename(const char *, const char *); extern FILE *tmpfile(void); extern char *tmpnam(char *); extern int fclose(FILE *); extern int fflush(FILE *); extern FILE *fopen(const char *, const char *); extern FILE *freopen(const char *, const char *, FILE *); extern void setbuf(FILE *, char *); extern int setvbuf(FILE *, char *, int, size_t); extern int fprintf(FILE *, const char *, ...); extern int fscanf(FILE *, const char *, ...); extern int printf(const char *, ...); extern int scanf(const char *, ...); extern int sprintf(char *, const char *, ...); extern int snprintf(char *, size_t, const char *, ...); extern int sscanf(const char *, const char *, ...); extern int vfprintf(FILE *, const char *, va_list); extern int vprintf(const char *, va_list); extern int vsprintf(char *, const char *, va_list); extern int vsnprintf(char *, size_t, const char *, va_list); extern int vfscanf(FILE *, const char *, va_list); extern int fgetc(FILE *); extern char *fgets(char *, int, FILE *); extern int fputc(int, FILE *); extern int fputs(const char *, FILE *); extern int getc(FILE *); extern int _IO_getc(FILE *f); extern int getchar(void); extern char *gets(char *); extern int putc(int, FILE *); extern int _IO_putc(int, FILE *); extern int putchar(int); extern int puts(const char *); extern int ungetc(int, FILE *); extern size_t fread(void *, size_t, size_t, FILE *); extern size_t fwrite(const void *, size_t, size_t, FILE *); extern int fgetpos(FILE *, fpos_t *); extern int fseek(FILE *, long, int); extern int fseeko(FILE *, off_t, int); extern int fsetpos(FILE *, const fpos_t *); extern long ftell(FILE *); extern off_t ftello(FILE *); extern void rewind(FILE *); extern void clearerr(FILE *); extern int feof(FILE *); extern int ferror(FILE *); extern void perror(const char *); extern FILE _IO_stream[90]; extern int fileno(FILE *); extern FILE* fdopen(int, const char*); extern char *ctermid(char *); #pragma lib "/$M/lib/ape/libbsd.a" extern FILE *popen(char *, char *); extern int pclose(FILE *); #line 32 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 4 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 57 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 67 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" typedef unsigned long XID; typedef unsigned long Mask; typedef unsigned long Atom; typedef unsigned long VisualID; typedef unsigned long Time; typedef XID Window; typedef XID Drawable; typedef XID Font; typedef XID Pixmap; typedef XID Cursor; typedef XID Colormap; typedef XID GContext; typedef XID KeySym; typedef unsigned char KeyCode; #line 96 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 101 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 106 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 127 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 130 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 161 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 225 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 238 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 325 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 345 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 359 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 458 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 539 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 568 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 579 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 589 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 605 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 615 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 645 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 665 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 679 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 33 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 4 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 25 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 58 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 88 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 100 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" typedef long INT32; typedef short INT16; typedef signed char INT8; typedef unsigned long CARD32; typedef unsigned short CARD16; typedef unsigned char CARD8; typedef CARD32 BITS32; typedef CARD16 BITS16; typedef CARD8 BYTE; typedef CARD8 BOOL; #line 154 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 78 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 52 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 58 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 88 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 100 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 154 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" typedef struct _xSegment { INT16 x1, y1, x2, y2; } xSegment; typedef struct _xPoint { INT16 x, y; } xPoint; typedef struct _xRectangle { INT16 x, y; CARD16 width, height; } xRectangle; typedef struct _xArc { INT16 x, y; CARD16 width, height; INT16 angle1, angle2; } xArc; #line 79 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 85 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef CARD16 KeyButMask; #line 270 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { CARD8 byteOrder; BYTE pad; CARD16 majorVersion, minorVersion; CARD16 nbytesAuthProto; CARD16 nbytesAuthString; CARD16 pad2; } xConnClientPrefix; typedef struct { BOOL success; BYTE lengthReason; CARD16 majorVersion, minorVersion; CARD16 length; } xConnSetupPrefix; typedef struct { CARD32 release; CARD32 ridBase, ridMask; CARD32 motionBufferSize; CARD16 nbytesVendor; CARD16 maxRequestSize; CARD8 numRoots; CARD8 numFormats; CARD8 imageByteOrder; CARD8 bitmapBitOrder; CARD8 bitmapScanlineUnit, bitmapScanlinePad; CARD8 minKeyCode, maxKeyCode; CARD32 pad2; } xConnSetup; typedef struct { CARD8 depth; CARD8 bitsPerPixel; CARD8 scanLinePad; CARD8 pad1; CARD32 pad2; } xPixmapFormat; typedef struct { CARD8 depth; CARD8 pad1; CARD16 nVisuals; CARD32 pad2; } xDepth; typedef struct { CARD32 visualID; CARD8 class; CARD8 bitsPerRGB; CARD16 colormapEntries; CARD32 redMask, greenMask, blueMask; CARD32 pad; } xVisualType; typedef struct { CARD32 windowId; CARD32 defaultColormap; CARD32 whitePixel, blackPixel; CARD32 currentInputMask; CARD16 pixWidth, pixHeight; CARD16 mmWidth, mmHeight; CARD16 minInstalledMaps, maxInstalledMaps; CARD32 rootVisualID; CARD8 backingStore; BOOL saveUnders; CARD8 rootDepth; CARD8 nDepths; } xWindowRoot; #line 356 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { CARD32 time; INT16 x, y; } xTimecoord; typedef struct { CARD8 family; BYTE pad; CARD16 length; } xHostEntry; typedef struct { INT16 leftSideBearing, rightSideBearing, characterWidth, ascent, descent; CARD16 attributes; } xCharInfo; typedef struct { CARD32 name; CARD32 value; } xFontProp; #line 387 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { CARD8 len; #line 390 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" INT8 delta; } xTextElt; typedef struct { CARD32 pixel; CARD16 red, green, blue; CARD8 flags; CARD8 pad; } xColorItem; typedef struct { CARD16 red, green, blue, pad; } xrgb; typedef CARD8 KEYCODE; #line 413 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 418 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { BYTE type; BYTE data1; CARD16 sequenceNumber; CARD32 length; CARD32 data00; CARD32 data01; CARD32 data02; CARD32 data03; CARD32 data04; CARD32 data05; } xGenericReply; typedef struct { BYTE type; CARD8 backingStore; CARD16 sequenceNumber; CARD32 length; CARD32 visualID; CARD16 class; CARD8 bitGravity; CARD8 winGravity; CARD32 backingBitPlanes; CARD32 backingPixel; BOOL saveUnder; BOOL mapInstalled; CARD8 mapState; BOOL override; CARD32 colormap; CARD32 allEventMasks; CARD32 yourEventMask; CARD16 doNotPropagateMask; CARD16 pad; } xGetWindowAttributesReply; typedef struct { BYTE type; CARD8 depth; CARD16 sequenceNumber; CARD32 length; CARD32 root; INT16 x, y; CARD16 width, height; CARD16 borderWidth; CARD16 pad1; CARD32 pad2; CARD32 pad3; } xGetGeometryReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD32 root, parent; CARD16 nChildren; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; } xQueryTreeReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD32 atom; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xInternAtomReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nameLength; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xGetAtomNameReply; typedef struct { BYTE type; CARD8 format; CARD16 sequenceNumber; CARD32 length; CARD32 propertyType; CARD32 bytesAfter; CARD32 nItems; CARD32 pad1; CARD32 pad2; CARD32 pad3; } xGetPropertyReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nProperties; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xListPropertiesReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD32 owner; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xGetSelectionOwnerReply; typedef struct { BYTE type; BYTE status; CARD16 sequenceNumber; CARD32 length; CARD32 pad1; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xGrabPointerReply; typedef xGrabPointerReply xGrabKeyboardReply; typedef struct { BYTE type; BOOL sameScreen; CARD16 sequenceNumber; CARD32 length; CARD32 root, child; INT16 rootX, rootY, winX, winY; CARD16 mask; CARD16 pad1; CARD32 pad; } xQueryPointerReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD32 nEvents; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xGetMotionEventsReply; typedef struct { BYTE type; BOOL sameScreen; CARD16 sequenceNumber; CARD32 length; CARD32 child; INT16 dstX, dstY; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; } xTranslateCoordsReply; typedef struct { BYTE type; CARD8 revertTo; CARD16 sequenceNumber; CARD32 length; CARD32 focus; CARD32 pad1; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; } xGetInputFocusReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; BYTE map[32]; } xQueryKeymapReply; typedef struct _xQueryFontReply { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; xCharInfo minBounds; CARD32 walign1; xCharInfo maxBounds; CARD32 walign2; CARD16 minCharOrByte2, maxCharOrByte2; CARD16 defaultChar; CARD16 nFontProps; CARD8 drawDirection; CARD8 minByte1, maxByte1; BOOL allCharsExist; INT16 fontAscent, fontDescent; CARD32 nCharInfos; } xQueryFontReply; typedef struct { BYTE type; CARD8 drawDirection; CARD16 sequenceNumber; CARD32 length; INT16 fontAscent, fontDescent; INT16 overallAscent, overallDescent; INT32 overallWidth, overallLeft, overallRight; CARD32 pad; } xQueryTextExtentsReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nFonts; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xListFontsReply; typedef struct { BYTE type; CARD8 nameLength; CARD16 sequenceNumber; CARD32 length; xCharInfo minBounds; CARD32 walign1; xCharInfo maxBounds; CARD32 walign2; CARD16 minCharOrByte2, maxCharOrByte2; CARD16 defaultChar; CARD16 nFontProps; CARD8 drawDirection; CARD8 minByte1, maxByte1; BOOL allCharsExist; INT16 fontAscent, fontDescent; CARD32 nReplies; } xListFontsWithInfoReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nPaths; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xGetFontPathReply; typedef struct { BYTE type; CARD8 depth; CARD16 sequenceNumber; CARD32 length; CARD32 visual; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xGetImageReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nColormaps; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xListInstalledColormapsReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 red, green, blue; CARD16 pad2; CARD32 pixel; CARD32 pad3; CARD32 pad4; CARD32 pad5; } xAllocColorReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD32 pixel; CARD16 exactRed, exactGreen, exactBlue; CARD16 screenRed, screenGreen, screenBlue; CARD32 pad2; CARD32 pad3; } xAllocNamedColorReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nPixels, nMasks; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xAllocColorCellsReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nPixels; CARD16 pad2; CARD32 redMask, greenMask, blueMask; CARD32 pad3; CARD32 pad4; } xAllocColorPlanesReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 nColors; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xQueryColorsReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 exactRed, exactGreen, exactBlue; CARD16 screenRed, screenGreen, screenBlue; CARD32 pad3; CARD32 pad4; CARD32 pad5; } xLookupColorReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 width, height; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xQueryBestSizeReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; BOOL present; CARD8 major_opcode; CARD8 first_event; CARD8 first_error; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xQueryExtensionReply; typedef struct { BYTE type; CARD8 nExtensions; CARD16 sequenceNumber; CARD32 length; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xListExtensionsReply; typedef struct { BYTE type; CARD8 success; CARD16 sequenceNumber; CARD32 length; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xSetMappingReply; typedef xSetMappingReply xSetPointerMappingReply; typedef xSetMappingReply xSetModifierMappingReply; typedef struct { BYTE type; CARD8 nElts; CARD16 sequenceNumber; CARD32 length; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xGetPointerMappingReply; typedef struct { BYTE type; CARD8 keySymsPerKeyCode; CARD16 sequenceNumber; CARD32 length; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xGetKeyboardMappingReply; typedef struct { BYTE type; CARD8 numKeyPerModifier; CARD16 sequenceNumber; CARD32 length; CARD32 pad1; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xGetModifierMappingReply; typedef struct { BYTE type; BOOL globalAutoRepeat; CARD16 sequenceNumber; CARD32 length; CARD32 ledMask; CARD8 keyClickPercent, bellPercent; CARD16 bellPitch, bellDuration; CARD16 pad; BYTE map[32]; } xGetKeyboardControlReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 accelNumerator, accelDenominator; CARD16 threshold; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xGetPointerControlReply; typedef struct { BYTE type; BYTE pad1; CARD16 sequenceNumber; CARD32 length; CARD16 timeout, interval; BOOL preferBlanking; BOOL allowExposures; CARD16 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xGetScreenSaverReply; typedef struct { BYTE type; BOOL enabled; CARD16 sequenceNumber; CARD32 length; CARD16 nHosts; CARD16 pad1; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xListHostsReply; #line 979 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { BYTE type; BYTE errorCode; CARD16 sequenceNumber; CARD32 resourceID; CARD16 minorCode; CARD8 majorCode; BYTE pad1; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; CARD32 pad7; } xError; #line 999 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1003 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct _xEvent { union { struct { BYTE type; BYTE detail; CARD16 sequenceNumber; } u; struct { CARD32 pad00; CARD32 time; CARD32 root, event, child; INT16 rootX, rootY, eventX, eventY; KeyButMask state; BOOL sameScreen; BYTE pad1; } keyButtonPointer; struct { CARD32 pad00; CARD32 time; CARD32 root, event, child; INT16 rootX, rootY, eventX, eventY; KeyButMask state; BYTE mode; BYTE flags; } enterLeave; struct { CARD32 pad00; CARD32 window; BYTE mode; BYTE pad1, pad2, pad3; } focus; struct { CARD32 pad00; CARD32 window; CARD16 x, y, width, height; CARD16 count; CARD16 pad2; } expose; struct { CARD32 pad00; CARD32 drawable; CARD16 x, y, width, height; CARD16 minorEvent; CARD16 count; BYTE majorEvent; BYTE pad1, pad2, pad3; } graphicsExposure; struct { CARD32 pad00; CARD32 drawable; CARD16 minorEvent; BYTE majorEvent; BYTE bpad; } noExposure; struct { CARD32 pad00; CARD32 window; CARD8 state; BYTE pad1, pad2, pad3; } visibility; struct { CARD32 pad00; CARD32 parent, window; INT16 x, y; CARD16 width, height, borderWidth; BOOL override; BYTE bpad; } createNotify; #line 1082 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" struct { CARD32 pad00; CARD32 event, window; } destroyNotify; struct { CARD32 pad00; CARD32 event, window; BOOL fromConfigure; BYTE pad1, pad2, pad3; } unmapNotify; struct { CARD32 pad00; CARD32 event, window; BOOL override; BYTE pad1, pad2, pad3; } mapNotify; struct { CARD32 pad00; CARD32 parent, window; } mapRequest; struct { CARD32 pad00; CARD32 event, window, parent; INT16 x, y; BOOL override; BYTE pad1, pad2, pad3; } reparent; struct { CARD32 pad00; CARD32 event, window, aboveSibling; INT16 x, y; CARD16 width, height, borderWidth; BOOL override; BYTE bpad; } configureNotify; struct { CARD32 pad00; CARD32 parent, window, sibling; INT16 x, y; CARD16 width, height, borderWidth; CARD16 valueMask; CARD32 pad1; } configureRequest; struct { CARD32 pad00; CARD32 event, window; INT16 x, y; CARD32 pad1, pad2, pad3, pad4; } gravity; struct { CARD32 pad00; CARD32 window; CARD16 width, height; } resizeRequest; struct { #line 1139 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" CARD32 pad00; CARD32 event, window, parent; BYTE place; BYTE pad1, pad2, pad3; } circulate; struct { CARD32 pad00; CARD32 window; CARD32 atom; CARD32 time; BYTE state; BYTE pad1; CARD16 pad2; } property; struct { CARD32 pad00; CARD32 time; CARD32 window; CARD32 atom; } selectionClear; struct { CARD32 pad00; CARD32 time; CARD32 owner, requestor; CARD32 selection, target, property; } selectionRequest; struct { CARD32 pad00; CARD32 time; CARD32 requestor; CARD32 selection, target, property; } selectionNotify; struct { CARD32 pad00; CARD32 window; CARD32 colormap; BOOL new; BYTE state; BYTE pad1, pad2; } colormap; struct { CARD32 pad00; CARD8 request; CARD8 firstKeyCode; CARD8 count; BYTE pad1; } mappingNotify; struct { CARD32 pad00; CARD32 window; union { struct { CARD32 type; INT32 longs0; INT32 longs1; INT32 longs2; INT32 longs3; INT32 longs4; } l; struct { CARD32 type; INT16 shorts0; INT16 shorts1; INT16 shorts2; INT16 shorts3; INT16 shorts4; INT16 shorts5; INT16 shorts6; INT16 shorts7; INT16 shorts8; INT16 shorts9; } s; struct { CARD32 type; INT8 bytes[20]; } b; } u; } clientMessage; } u; } xEvent; #line 1227 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { BYTE type; BYTE map[31]; } xKeymapEvent; #line 1241 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef union { xGenericReply generic; xGetGeometryReply geom; xQueryTreeReply tree; xInternAtomReply atom; xGetAtomNameReply atomName; xGetPropertyReply property; xListPropertiesReply listProperties; xGetSelectionOwnerReply selection; xGrabPointerReply grabPointer; xGrabKeyboardReply grabKeyboard; xQueryPointerReply pointer; xGetMotionEventsReply motionEvents; xTranslateCoordsReply coords; xGetInputFocusReply inputFocus; xQueryTextExtentsReply textExtents; xListFontsReply fonts; xGetFontPathReply fontPath; xGetImageReply image; xListInstalledColormapsReply colormaps; xAllocColorReply allocColor; xAllocNamedColorReply allocNamedColor; xAllocColorCellsReply colorCells; xAllocColorPlanesReply colorPlanes; xQueryColorsReply colors; xLookupColorReply lookupColor; xQueryBestSizeReply bestSize; xQueryExtensionReply extension; xListExtensionsReply extensions; xSetModifierMappingReply setModifierMapping; xGetModifierMappingReply getModifierMapping; xSetPointerMappingReply setPointerMapping; xGetKeyboardMappingReply getKeyboardMapping; xGetPointerMappingReply getPointerMapping; xGetPointerControlReply pointerControl; xGetScreenSaverReply screenSaver; xListHostsReply hosts; xError error; xEvent event; } xReply; #line 1294 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { CARD8 reqType; CARD8 data; CARD16 length; #line 1303 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" } xReq; #line 1308 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1311 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 id; } xResourceReq; typedef struct { CARD8 reqType; CARD8 depth; CARD16 length; CARD32 wid, parent; INT16 x, y; CARD16 width, height, borderWidth; CARD16 class; CARD32 visual; CARD32 mask; } xCreateWindowReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 window; CARD32 valueMask; } xChangeWindowAttributesReq; typedef struct { CARD8 reqType; BYTE mode; CARD16 length; CARD32 window; } xChangeSaveSetReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 window, parent; INT16 x, y; } xReparentWindowReq; typedef struct { CARD8 reqType; CARD8 pad; CARD16 length; CARD32 window; CARD16 mask; CARD16 pad2; } xConfigureWindowReq; typedef struct { CARD8 reqType; CARD8 direction; CARD16 length; CARD32 window; } xCirculateWindowReq; typedef struct { CARD8 reqType; BOOL onlyIfExists; CARD16 length; CARD16 nbytes; CARD16 pad; } xInternAtomReq; typedef struct { CARD8 reqType; CARD8 mode; CARD16 length; CARD32 window; CARD32 property, type; CARD8 format; BYTE pad[3]; CARD32 nUnits; } xChangePropertyReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 window; CARD32 property; } xDeletePropertyReq; typedef struct { CARD8 reqType; BOOL delete; CARD16 length; CARD32 window; CARD32 property, type; CARD32 longOffset; CARD32 longLength; } xGetPropertyReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 window; CARD32 selection; CARD32 time; } xSetSelectionOwnerReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 requestor; CARD32 selection, target, property; CARD32 time; } xConvertSelectionReq; typedef struct { CARD8 reqType; BOOL propagate; CARD16 length; CARD32 destination; CARD32 eventMask; xEvent event; } xSendEventReq; typedef struct { CARD8 reqType; BOOL ownerEvents; CARD16 length; CARD32 grabWindow; CARD16 eventMask; BYTE pointerMode, keyboardMode; CARD32 confineTo; CARD32 cursor; CARD32 time; } xGrabPointerReq; typedef struct { CARD8 reqType; BOOL ownerEvents; CARD16 length; CARD32 grabWindow; CARD16 eventMask; BYTE pointerMode, keyboardMode; CARD32 confineTo; CARD32 cursor; CARD8 button; BYTE pad; CARD16 modifiers; } xGrabButtonReq; typedef struct { CARD8 reqType; CARD8 button; CARD16 length; CARD32 grabWindow; CARD16 modifiers; CARD16 pad; } xUngrabButtonReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cursor; CARD32 time; CARD16 eventMask; CARD16 pad2; } xChangeActivePointerGrabReq; typedef struct { CARD8 reqType; BOOL ownerEvents; CARD16 length; CARD32 grabWindow; CARD32 time; BYTE pointerMode, keyboardMode; CARD16 pad; } xGrabKeyboardReq; typedef struct { CARD8 reqType; BOOL ownerEvents; CARD16 length; CARD32 grabWindow; CARD16 modifiers; CARD8 key; BYTE pointerMode, keyboardMode; BYTE pad1, pad2, pad3; } xGrabKeyReq; typedef struct { CARD8 reqType; CARD8 key; CARD16 length; CARD32 grabWindow; CARD16 modifiers; CARD16 pad; } xUngrabKeyReq; typedef struct { CARD8 reqType; CARD8 mode; CARD16 length; CARD32 time; } xAllowEventsReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 window; CARD32 start, stop; } xGetMotionEventsReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 srcWid, dstWid; INT16 srcX, srcY; } xTranslateCoordsReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 srcWid, dstWid; INT16 srcX, srcY; CARD16 srcWidth, srcHeight; INT16 dstX, dstY; } xWarpPointerReq; typedef struct { CARD8 reqType; CARD8 revertTo; CARD16 length; CARD32 focus; CARD32 time; } xSetInputFocusReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 fid; CARD16 nbytes; BYTE pad1, pad2; } xOpenFontReq; typedef struct { CARD8 reqType; BOOL oddLength; CARD16 length; CARD32 fid; } xQueryTextExtentsReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD16 maxNames; CARD16 nbytes; } xListFontsReq; typedef xListFontsReq xListFontsWithInfoReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD16 nFonts; BYTE pad1, pad2; } xSetFontPathReq; typedef struct { CARD8 reqType; CARD8 depth; CARD16 length; CARD32 pid; CARD32 drawable; CARD16 width, height; } xCreatePixmapReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 gc; CARD32 drawable; CARD32 mask; } xCreateGCReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 gc; CARD32 mask; } xChangeGCReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 srcGC, dstGC; CARD32 mask; } xCopyGCReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 gc; CARD16 dashOffset; CARD16 nDashes; } xSetDashesReq; typedef struct { CARD8 reqType; BYTE ordering; CARD16 length; CARD32 gc; INT16 xOrigin, yOrigin; } xSetClipRectanglesReq; typedef struct { CARD8 reqType; BOOL exposures; CARD16 length; CARD32 window; INT16 x, y; CARD16 width, height; } xClearAreaReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 srcDrawable, dstDrawable; CARD32 gc; INT16 srcX, srcY, dstX, dstY; CARD16 width, height; } xCopyAreaReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 srcDrawable, dstDrawable; CARD32 gc; INT16 srcX, srcY, dstX, dstY; CARD16 width, height; CARD32 bitPlane; } xCopyPlaneReq; typedef struct { CARD8 reqType; BYTE coordMode; CARD16 length; CARD32 drawable; CARD32 gc; } xPolyPointReq; typedef xPolyPointReq xPolyLineReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 drawable; CARD32 gc; } xPolySegmentReq; typedef xPolySegmentReq xPolyArcReq; typedef xPolySegmentReq xPolyRectangleReq; typedef xPolySegmentReq xPolyFillRectangleReq; typedef xPolySegmentReq xPolyFillArcReq; typedef struct _FillPolyReq { CARD8 reqType; BYTE pad; CARD16 length; CARD32 drawable; CARD32 gc; BYTE shape; BYTE coordMode; CARD16 pad1; } xFillPolyReq; typedef struct _PutImageReq { CARD8 reqType; CARD8 format; CARD16 length; CARD32 drawable; CARD32 gc; CARD16 width, height; INT16 dstX, dstY; CARD8 leftPad; CARD8 depth; CARD16 pad; } xPutImageReq; typedef struct { CARD8 reqType; CARD8 format; CARD16 length; CARD32 drawable; INT16 x, y; CARD16 width, height; CARD32 planeMask; } xGetImageReq; typedef struct { CARD8 reqType; CARD8 pad; CARD16 length; CARD32 drawable; CARD32 gc; INT16 x, y; } xPolyTextReq; typedef xPolyTextReq xPolyText8Req; typedef xPolyTextReq xPolyText16Req; typedef struct { CARD8 reqType; BYTE nChars; CARD16 length; CARD32 drawable; CARD32 gc; INT16 x, y; } xImageTextReq; typedef xImageTextReq xImageText8Req; typedef xImageTextReq xImageText16Req; typedef struct { CARD8 reqType; BYTE alloc; CARD16 length; CARD32 mid; CARD32 window; CARD32 visual; } xCreateColormapReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 mid; CARD32 srcCmap; } xCopyColormapAndFreeReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cmap; CARD16 red, green, blue; CARD16 pad2; } xAllocColorReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cmap; CARD16 nbytes; BYTE pad1, pad2; } xAllocNamedColorReq; typedef struct { CARD8 reqType; BOOL contiguous; CARD16 length; CARD32 cmap; CARD16 colors, planes; } xAllocColorCellsReq; typedef struct { CARD8 reqType; BOOL contiguous; CARD16 length; CARD32 cmap; CARD16 colors, red, green, blue; } xAllocColorPlanesReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cmap; CARD32 planeMask; } xFreeColorsReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cmap; } xStoreColorsReq; typedef struct { CARD8 reqType; CARD8 flags; CARD16 length; CARD32 cmap; CARD32 pixel; CARD16 nbytes; BYTE pad1, pad2; } xStoreNamedColorReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cmap; } xQueryColorsReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cmap; CARD16 nbytes; BYTE pad1, pad2; } xLookupColorReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cid; CARD32 source, mask; CARD16 foreRed, foreGreen, foreBlue; CARD16 backRed, backGreen, backBlue; CARD16 x, y; } xCreateCursorReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cid; CARD32 source, mask; CARD16 sourceChar, maskChar; CARD16 foreRed, foreGreen, foreBlue; CARD16 backRed, backGreen, backBlue; } xCreateGlyphCursorReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 cursor; CARD16 foreRed, foreGreen, foreBlue; CARD16 backRed, backGreen, backBlue; } xRecolorCursorReq; typedef struct { CARD8 reqType; CARD8 class; CARD16 length; CARD32 drawable; CARD16 width, height; } xQueryBestSizeReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD16 nbytes; BYTE pad1, pad2; } xQueryExtensionReq; typedef struct { CARD8 reqType; CARD8 numKeyPerModifier; CARD16 length; } xSetModifierMappingReq; typedef struct { CARD8 reqType; CARD8 nElts; CARD16 length; } xSetPointerMappingReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD8 firstKeyCode; CARD8 count; CARD16 pad1; } xGetKeyboardMappingReq; typedef struct { CARD8 reqType; CARD8 keyCodes; CARD16 length; CARD8 firstKeyCode; CARD8 keySymsPerKeyCode; CARD16 pad1; } xChangeKeyboardMappingReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 mask; } xChangeKeyboardControlReq; typedef struct { CARD8 reqType; INT8 percent; CARD16 length; } xBellReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; INT16 accelNum, accelDenum; INT16 threshold; BOOL doAccel, doThresh; } xChangePointerControlReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; INT16 timeout, interval; BYTE preferBlank, allowExpose; CARD16 pad2; } xSetScreenSaverReq; typedef struct { CARD8 reqType; BYTE mode; CARD16 length; CARD8 hostFamily; BYTE pad; CARD16 hostLength; } xChangeHostsReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; } xListHostsReq; typedef struct { CARD8 reqType; BYTE mode; CARD16 length; } xChangeModeReq; typedef xChangeModeReq xSetAccessControlReq; typedef xChangeModeReq xSetCloseDownModeReq; typedef xChangeModeReq xForceScreenSaverReq; typedef struct { CARD8 reqType; BYTE pad; CARD16 length; CARD32 window; CARD16 nAtoms; INT16 nPositions; } xRotatePropertiesReq; #line 34 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" extern unsigned long globalSerialNumber; extern unsigned long serverGeneration; #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xosdefs.h" #line 29 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xosdefs.h" #line 41 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xosdefs.h" #line 81 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncproto.h" #line 28 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncproto.h" #line 82 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 58 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 88 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 100 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 154 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 4 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 57 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 67 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 96 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 101 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 106 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 127 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 130 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 161 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 225 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 238 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 325 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 345 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 359 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 458 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 539 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 568 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 579 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 589 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 605 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 615 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 645 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 665 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 679 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" typedef void *pointer; typedef int Bool; typedef unsigned long PIXEL; typedef unsigned long ATOM; typedef struct _Font *FontPtr; typedef struct _Client *ClientPtr; #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" typedef pointer FID; typedef struct _FontPathRec *FontPathPtr; typedef struct _NewClientRec *NewClientPtr; #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 112 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 118 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 1 "/sys/include/ape/string.h" #pragma lib "/$M/lib/ape/libap.a" #line 1 "/sys/include/ape/stddef.h" #line 6 "/sys/include/ape/string.h" extern void *memcpy(void *, const void *, size_t); extern void *memmove(void *, const void *, size_t); extern char *strcpy(char *, const char *); extern char *strncpy(char *, const char *, size_t); extern char *strcat(char *, const char *); extern char *strncat(char *, const char *, size_t); extern int memcmp(const void *, const void *, size_t); extern int strcmp(const char *, const char *); extern int strcoll(const char *, const char *); extern int strncmp(const char *, const char *, size_t); extern size_t strxfrm(char *, const char *, size_t); extern void *memchr(const void *, int, size_t); extern char *strchr(const char *, int); extern size_t strcspn(const char *, const char *); extern char *strpbrk(const char *, const char *); extern char *strrchr(const char *, int); extern size_t strspn(const char *, const char *); extern char *strstr(const char *, const char *); extern char *strtok(char *, const char *); extern void *memset(void *, int, size_t); extern char *strerror(int); extern size_t strlen(const char *); #line 1 "/sys/include/ape/bsd.h" #pragma src "/sys/src/ape/lib/bsd" #pragma lib "/$M/lib/ape/libbsd.a" extern void bcopy(void*, void*, size_t); extern int bcmp(void*, void*, size_t); extern void bzero(void*, size_t); extern int ffs(unsigned int); extern void bhappy(void*); extern int rresvport(int*); extern int rcmd(char**, int, char*, char*, char*, int*); extern char* strdup(char*); extern int strcasecmp(char*, char*); extern int putenv(char*); extern int strncasecmp(char*, char*,int); extern void* memccpy(void*, void*, int, size_t); extern int getopt(int, char**, char*); extern int opterr; extern int optind; extern int optopt; extern char *optarg; extern char *mktemp(char *); extern char *sys_errlist[]; extern int sys_nerr; #line 36 "/sys/include/ape/string.h" #line 141 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" extern int WaitForSomething( int* ); extern int ReadRequestFromClient( ClientPtr ); extern Bool InsertFakeRequest( ClientPtr , char* , int ); extern int ResetCurrentRequest( ClientPtr ); extern void FlushAllOutput( void ); extern void FlushIfCriticalOutputPending( void ); extern void SetCriticalOutputPending( void ); extern int WriteToClient( ClientPtr , int , char* ); extern void ResetOsBuffers( void ); extern void CreateWellKnownSockets( void ); extern void ResetWellKnownSockets( void ); extern char *ClientAuthorized( ClientPtr , unsigned int , char* , unsigned int , char* ); extern Bool EstablishNewConnections( ClientPtr , pointer ); extern void CheckConnections( void ); extern void CloseDownConnection( ClientPtr ); extern int AddEnabledDevice( int ); extern int RemoveEnabledDevice( int ); extern int OnlyListenToOneClient( ClientPtr ); extern int ListenToAllClients( void ); extern int IgnoreClient( ClientPtr ); extern int AttendClient( ClientPtr ); extern int MakeClientGrabImpervious( ClientPtr ); extern int MakeClientGrabPervious( ClientPtr ); extern void Error( char* ); extern CARD32 GetTimeInMillis( void ); extern int AdjustWaitForDelay( pointer , unsigned long ); typedef struct _OsTimerRec *OsTimerPtr; typedef CARD32 (*OsTimerCallback)( OsTimerPtr , CARD32 , pointer ); extern void TimerInit( void ); extern Bool TimerForce( OsTimerPtr ); extern OsTimerPtr TimerSet( OsTimerPtr , int , CARD32 , OsTimerCallback , pointer ); extern void TimerCheck( void ); extern void TimerFree( OsTimerPtr ); extern void AutoResetServer( int ); extern void GiveUp( int ); extern void UseMsg( void ); extern void ProcessCommandLine( int , char* [] ); extern unsigned long *Xalloc( unsigned long ); extern unsigned long *XNFalloc( unsigned long ); extern unsigned long *Xcalloc( unsigned long ); extern unsigned long *Xrealloc( pointer , unsigned long ); extern unsigned long *XNFrealloc( pointer , unsigned long ); extern void Xfree( pointer ); extern int OsInitAllocator( void ); typedef void (*OsSigHandlerPtr)( int ); extern OsSigHandlerPtr OsSignal( int , OsSigHandlerPtr ); extern void AuditF( char* , ... ); extern void FatalError( char* , ... ); extern void ErrorF( char* , ... ); extern int OsLookupColor( int , char * , unsigned , unsigned short * , unsigned short * , unsigned short * ); extern void OsInit( void ); extern void OsVendorInit( void ); extern int OsInitColors( void ); extern int AddHost( ClientPtr , int , unsigned , pointer ); extern Bool ForEachHostInFamily ( int , Bool (* )(), pointer ); extern int RemoveHost( ClientPtr , int , unsigned , pointer ); extern int GetHosts( pointer * , int * , int * , BOOL * ); typedef struct sockaddr * sockaddrPtr; extern int InvalidHost( sockaddrPtr , int ); extern int ChangeAccessControl( ClientPtr , int ); extern void AddLocalHosts( void ); extern void ResetHosts( char *display ); extern void EnableLocalHost( void ); extern void DisableLocalHost( void ); extern void AccessUsingXdmcp( void ); extern void DefineSelf( int ); extern void AugmentSelf( pointer , int ); extern void InitAuthorization( char * ); extern int LoadAuthorization( void ); extern void RegisterAuthorizations( void ); extern XID CheckAuthorization( unsigned int , char * , unsigned int , char * , ClientPtr , char ** ); extern void ResetAuthorization( void ); extern int AddAuthorization( unsigned int , char * , unsigned int , char * ); extern void ExpandCommandLine( int * , char *** ); extern int ddxProcessArgument( int , char * [], int ); #line 128 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncs.h" #line 29 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncs.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xosdefs.h" #line 29 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xosdefs.h" #line 41 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xosdefs.h" #line 34 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncs.h" #line 1 "/sys/include/ape/string.h" #line 44 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncs.h" #line 129 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" extern void SwapLongs( CARD32 *list, unsigned long count ); extern void SwapShorts( short *list, unsigned long count ); extern int MakePredeclaredAtoms( void ); extern int Ones( unsigned long ); typedef struct _xPoint *DDXPointPtr; typedef struct _Box *BoxPtr; typedef struct _xEvent *xEventPtr; typedef struct _xRectangle *xRectanglePtr; typedef struct _GrabRec *GrabPtr; #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" typedef struct _CharInfo *CharInfoPtr; #line 35 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 112 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 118 "/sys/src/X11/programs/Xserver/Xext/../include/os.h" #line 36 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/region.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/region.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 52 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" typedef xPoint DDXPointRec; typedef struct _Box { short x1, y1, x2, y2; } BoxRec; typedef union _DevUnion { pointer ptr; long val; unsigned long uval; pointer (*fptr)(); } DevUnion; #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 65 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" typedef struct _RegData { long size; long numRects; } RegDataRec, *RegDataPtr; typedef struct _Region { BoxRec extents; RegDataPtr data; } RegionRec, *RegionPtr; extern BoxRec miEmptyBox; extern RegDataRec miEmptyData; #line 85 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 95 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 98 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 101 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 104 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 107 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 110 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 113 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 116 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 119 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 122 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 125 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 128 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 131 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 134 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 140 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 143 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 146 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 149 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 152 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 157 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 160 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 163 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 166 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 172 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 175 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 178 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 181 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 184 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 187 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 190 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 193 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 196 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 201 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 204 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 207 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 210 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 216 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 239 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 251 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 254 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 262 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 265 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" extern RegionPtr miRegionCreate( BoxPtr , int ); extern void miRegionInit( RegionPtr , BoxPtr , int ); extern void miRegionDestroy( RegionPtr ); extern void miRegionUninit( RegionPtr ); extern Bool miRegionCopy( RegionPtr , RegionPtr ); extern Bool miIntersect( RegionPtr , RegionPtr , RegionPtr ); extern Bool miUnion( RegionPtr , RegionPtr , RegionPtr ); extern Bool miRegionAppend( RegionPtr , RegionPtr ); extern Bool miRegionValidate( RegionPtr , Bool * ); extern RegionPtr miRectsToRegion( int , xRectanglePtr , int ); extern Bool miSubtract( RegionPtr , RegionPtr , RegionPtr ); extern Bool miInverse( RegionPtr , RegionPtr , BoxPtr ); extern int miRectIn( RegionPtr , BoxPtr ); extern void miTranslateRegion( RegionPtr , int , int ); extern void miRegionReset( RegionPtr , BoxPtr ); extern Bool miPointInRegion( RegionPtr , int , int , BoxPtr ); extern Bool miRegionNotEmpty( RegionPtr ); extern void miRegionEmpty( RegionPtr ); extern BoxPtr miRegionExtents( RegionPtr ); #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/region.h" #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" typedef struct _PixmapFormat *PixmapFormatPtr; typedef struct _Visual *VisualPtr; typedef struct _Depth *DepthPtr; typedef struct _Screen *ScreenPtr; extern void ResetScreenPrivates( void ); extern int AllocateScreenPrivateIndex( void ); extern void ResetWindowPrivates( void ); extern int AllocateWindowPrivateIndex( void ); extern Bool AllocateWindowPrivate( ScreenPtr , int , unsigned ); extern void ResetGCPrivates( void ); extern int AllocateGCPrivateIndex( void ); extern Bool AllocateGCPrivate( ScreenPtr , int , unsigned ); extern int AddScreen( Bool (* )( int , ScreenPtr , int , char ** ), int , char** ); #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" typedef struct _BackingStore *BackingStorePtr; typedef struct _Window *WindowPtr; typedef int (*VisitWindowProcPtr)( WindowPtr , pointer ); extern int TraverseTree( WindowPtr , VisitWindowProcPtr , pointer ); extern int WalkTree( ScreenPtr , VisitWindowProcPtr , pointer ); extern WindowPtr AllocateWindow( ScreenPtr ); extern Bool CreateRootWindow( ScreenPtr ); extern void InitRootWindow( WindowPtr ); extern void ClippedRegionFromBox( WindowPtr , RegionPtr , int , int , int , int ); extern WindowPtr RealChildHead( WindowPtr ); extern WindowPtr CreateWindow( Window , WindowPtr , int , int , unsigned int , unsigned int , unsigned int , unsigned int , Mask , XID* , int , ClientPtr , VisualID , int* ); extern int DeleteWindow( pointer , XID ); extern void DestroySubwindows( WindowPtr , ClientPtr ); extern int ChangeWindowAttributes( WindowPtr , Mask , XID* , ClientPtr ); extern void GetWindowAttributes( WindowPtr , ClientPtr ); extern RegionPtr CreateUnclippedWinSize( WindowPtr ); extern void GravityTranslate( int , int , int , int , int , int , unsigned , int* , int* ); extern int ConfigureWindow( WindowPtr , Mask , XID* , ClientPtr ); extern int CirculateWindow( WindowPtr , int , ClientPtr ); extern int ReparentWindow( WindowPtr , WindowPtr , int , int , ClientPtr ); extern int MapWindow( WindowPtr , ClientPtr ); extern void MapSubwindows( WindowPtr , ClientPtr ); extern int UnmapWindow( WindowPtr , Bool ); extern void UnmapSubwindows( WindowPtr ); extern void HandleSaveSet( ClientPtr ); extern Bool VisibleBoundingBoxFromPoint( WindowPtr , int , int , BoxPtr ); extern Bool PointInWindowIsVisible( WindowPtr , int , int ); extern RegionPtr NotClippedByChildren( WindowPtr ); extern void SendVisibilityNotify( WindowPtr ); extern void SaveScreens( int , int ); extern WindowPtr FindWindowWithOptional( WindowPtr ); extern void CheckWindowOptionalNeed( WindowPtr ); extern Bool MakeWindowOptional( WindowPtr ); extern void DisposeWindowOptional( WindowPtr ); extern WindowPtr MoveWindowInStack( WindowPtr , WindowPtr ); void SetWinSize( WindowPtr ); void SetBorderSize( WindowPtr ); void ResizeChildrenWinSize( WindowPtr , int , int , int , int ); #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" typedef struct _Drawable *DrawablePtr; typedef struct _Pixmap *PixmapPtr; typedef union _PixUnion { PixmapPtr pixmap; unsigned long pixel; } PixUnion; #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 80 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 86 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" extern PixmapPtr GetScratchPixmapHeader( ScreenPtr , int , int , int , int , int , pointer ); extern void FreeScratchPixmapHeader( PixmapPtr ); extern Bool CreateScratchPixmapsForScreen( int ); extern void FreeScratchPixmapsForScreen( int ); extern PixmapPtr AllocatePixmap( ScreenPtr , int ); #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" typedef struct _Drawable { unsigned char type; unsigned char class; unsigned char depth; unsigned char bitsPerPixel; unsigned long id; short x; short y; unsigned short width; unsigned short height; ScreenPtr pScreen; unsigned long serialNumber; } DrawableRec; #line 73 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" typedef struct _Pixmap { DrawableRec drawable; int refcnt; int devKind; DevUnion devPrivate; } PixmapRec; #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 65 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 85 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 95 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 98 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 101 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 104 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 107 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 110 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 113 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 116 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 119 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 122 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 125 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 128 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 131 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 134 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 140 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 143 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 146 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 149 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 152 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 157 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 160 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 163 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 166 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 172 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 175 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 178 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 181 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 184 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 187 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 190 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 193 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 196 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 201 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 204 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 207 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 210 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 216 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 239 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 251 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 254 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 262 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 265 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" typedef struct _Cursor *CursorPtr; typedef struct _CursorMetric *CursorMetricPtr; extern CursorPtr rootCursor; extern int FreeCursor( pointer , XID ); extern CursorPtr AllocCursor( unsigned char* , unsigned char* , CursorMetricPtr , unsigned , unsigned , unsigned , unsigned , unsigned , unsigned ); extern int AllocGlyphCursor( Font , unsigned int , Font , unsigned int , unsigned , unsigned , unsigned , unsigned , unsigned , unsigned , CursorPtr* , ClientPtr ); extern CursorPtr CreateRootCursor( char* , unsigned int ); extern int ServerBitsFromGlyph( FontPtr , unsigned int , register CursorMetricPtr , unsigned char ** ); extern Bool CursorMetricsFromGlyph( FontPtr , unsigned , CursorMetricPtr ); extern void CheckCursorConfinement( WindowPtr ); extern void NewCurrentScreen( ScreenPtr , int , int ); extern Bool PointerConfinedToScreen( void ); extern void GetSpritePosition( int * , int * ); #line 57 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/property.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/property.h" typedef struct _Property *PropertyPtr; extern int ChangeWindowProperty( WindowPtr , Atom , Atom , int , int , unsigned long , pointer , Bool ); extern int DeleteProperty( WindowPtr , Atom ); extern void DeleteAllWindowProperties( WindowPtr ); #line 58 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 52 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" typedef unsigned long RESTYPE; #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" typedef int (*DeleteType)( pointer , XID ); extern RESTYPE CreateNewResourceType( DeleteType ); extern RESTYPE CreateNewResourceClass( void ); extern Bool InitClientResources( ClientPtr ); extern XID FakeClientID( int ); extern Bool AddResource( XID , RESTYPE , pointer ); extern void FreeResource( XID , RESTYPE ); extern void FreeResourceByType( XID , RESTYPE , Bool ); extern Bool ChangeResourceValue( XID , RESTYPE , pointer ); extern void FreeClientNeverRetainResources( ClientPtr ); extern void FreeClientResources( ClientPtr ); extern void FreeAllResources( void ); extern Bool LegalNewID( XID , ClientPtr ); extern pointer LookupIDByType( XID , RESTYPE ); extern pointer LookupIDByClass( XID , RESTYPE ); extern void GetXIDRange( int , Bool , XID * , XID * ); extern unsigned int GetXIDList( ClientPtr , unsigned int , XID * ); #line 59 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 4 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 57 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 67 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 96 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 101 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 106 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 127 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 130 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 161 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 225 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 238 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 325 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 345 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 359 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 458 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 539 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 568 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 579 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 589 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 605 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 615 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 645 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 665 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 679 "/sys/src/X11/programs/Xserver/Xext/../../../X11/X.h" #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 4 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 25 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 85 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 270 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 356 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 387 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 390 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 413 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 418 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 979 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 999 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1003 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1082 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1139 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1227 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1241 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1294 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1303 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1308 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1311 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 57 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 80 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 86 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 58 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" typedef struct _GCInterest *GCInterestPtr; typedef struct _GC *GCPtr; typedef struct _GCOps *GCOpsPtr; extern void ValidateGC( DrawablePtr , GCPtr ); extern int ChangeGC( GCPtr , BITS32 , XID* ); extern int DoChangeGC( GCPtr , BITS32 , XID* , int ); extern GCPtr CreateGC( DrawablePtr , BITS32 , XID* , int* ); extern int CopyGC( GCPtr , GCPtr , BITS32 ); extern int FreeGC( pointer , XID ); extern void SetGCMask( GCPtr , Mask , Mask ); extern GCPtr CreateScratchGC( ScreenPtr , unsigned ); extern void FreeGCperDepth( int ); extern Bool CreateGCperDepth( int ); extern Bool CreateDefaultStipple( int ); extern void FreeDefaultStipple( int ); extern int SetDashes( GCPtr , unsigned , unsigned , unsigned char* ); extern int VerifyRectOrder( int , xRectangle* , int ); extern int SetClipRects( GCPtr , int , int , int , xRectangle* , int ); extern GCPtr GetScratchGC( unsigned , ScreenPtr ); extern void FreeScratchGC( GCPtr ); #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 63 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 68 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 72 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 87 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 90 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 105 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 118 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 129 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 151 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 157 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 162 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" typedef struct _TimeStamp *TimeStampPtr; typedef struct _WorkQueue *WorkQueuePtr; extern ClientPtr requestingClient; extern ClientPtr *clients; extern ClientPtr serverClient; extern int currentMaxClients; extern long *checkForInput[2]; extern void SetInputCheck( long* , long* ); extern void CloseDownClient( ClientPtr ); extern void UpdateCurrentTime( void ); extern void UpdateCurrentTimeIf( void ); extern void InitSelections( void ); extern void FlushClientCaches( XID ); extern int dixDestroyPixmap( pointer , XID ); extern void CloseDownRetainedResources( void ); extern void InitClient( ClientPtr , int , pointer ); extern ClientPtr NextAvailableClient( pointer ); extern void SendErrorToClient( ClientPtr , unsigned int , unsigned int , XID , int ); extern void DeleteWindowFromAnySelections( WindowPtr ); extern void MarkClientException( ClientPtr ); extern void CopyISOLatin1Lowered( unsigned char * , unsigned char * , int ); extern WindowPtr LookupWindow( XID , ClientPtr ); extern pointer LookupDrawable( XID , ClientPtr ); extern ClientPtr LookupClient( XID ); extern void NoopDDA( void *, ... ); extern int AlterSaveSetForClient( ClientPtr , WindowPtr , unsigned ); extern void DeleteWindowFromAnySaveSet( WindowPtr ); extern void BlockHandler( pointer , pointer ); extern void WakeupHandler( int , pointer ); typedef struct timeval ** OSTimePtr; typedef void (* BlockHandlerProcPtr)( pointer , OSTimePtr , pointer ); typedef void (* WakeupHandlerProcPtr)( pointer , int , pointer ); extern Bool RegisterBlockAndWakeupHandlers( BlockHandlerProcPtr , WakeupHandlerProcPtr , pointer ); extern void RemoveBlockAndWakeupHandlers( BlockHandlerProcPtr , WakeupHandlerProcPtr , pointer ); extern void InitBlockAndWakeupHandlers( void ); extern void ProcessWorkQueue( void ); extern Bool QueueWorkProc( Bool (* )(), ClientPtr , pointer ); extern Bool ClientSleep( ClientPtr , Bool (* )(), pointer ); extern Bool ClientSignal( ClientPtr ); extern void ClientWakeup( ClientPtr ); extern Bool ClientIsAsleep( ClientPtr ); extern Atom MakeAtom( char * , unsigned , Bool ); extern Bool ValidAtom( Atom ); extern char *NameForAtom( Atom ); extern void AtomError( void ); extern void FreeAllAtoms( void ); extern void InitAtoms( void ); extern int DeliverEvents( WindowPtr , xEventPtr , int , WindowPtr ); extern void WriteEventsToClient( ClientPtr , int , xEventPtr ); extern int TryClientEvents( ClientPtr , xEventPtr , int , Mask , Mask , GrabPtr ); extern int EventSelectForWindow( WindowPtr , ClientPtr , Mask ); extern int EventSuppressForWindow( WindowPtr , ClientPtr , Mask , Bool * ); extern int MaybeDeliverEventsToClient( WindowPtr , xEventPtr , int , Mask , ClientPtr ); extern void WindowsRestructured( void ); extern void ResetClientPrivates( void ); extern int AllocateClientPrivateIndex( void ); extern Bool AllocateClientPrivate( int , unsigned ); #line 549 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" typedef struct _CallbackList *CallbackListPtr; typedef void (*CallbackProcPtr) ( CallbackListPtr *, pointer, pointer ); typedef Bool (*AddCallbackProcPtr) ( CallbackListPtr *, CallbackProcPtr, pointer ); typedef Bool (*DeleteCallbackProcPtr) ( CallbackListPtr *, CallbackProcPtr, pointer ); typedef void (*CallCallbacksProcPtr) ( CallbackListPtr *, pointer ); typedef void (*DeleteCallbackListProcPtr) ( CallbackListPtr * ); typedef struct _CallbackProcs { AddCallbackProcPtr AddCallback; DeleteCallbackProcPtr DeleteCallback; CallCallbacksProcPtr CallCallbacks; DeleteCallbackListProcPtr DeleteCallbackList; } CallbackFuncsRec, *CallbackFuncsPtr; extern Bool CreateCallbackList( CallbackListPtr * , CallbackFuncsPtr ); extern Bool AddCallback( CallbackListPtr * , CallbackProcPtr , pointer ); extern Bool DeleteCallback( CallbackListPtr * , CallbackProcPtr , pointer ); extern void CallCallbacks( CallbackListPtr * , pointer ); extern void DeleteCallbackList( CallbackListPtr * ); extern void InitCallbackManager( void ); #line 634 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" extern CallbackListPtr ServerGrabCallback; typedef enum {SERVER_GRABBED, SERVER_UNGRABBED, CLIENT_PERVIOUS, CLIENT_IMPERVIOUS } ServerGrabState; typedef struct { ClientPtr client; ServerGrabState grabstate; } ServerGrabInfoRec; #line 648 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" extern CallbackListPtr EventCallback; typedef struct { ClientPtr client; struct _xEvent *events; int count; } EventInfoRec; #line 60 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 61 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 52 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 62 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/opaque.h" #line 31 "/sys/src/X11/programs/Xserver/Xext/../include/opaque.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 58 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 88 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 100 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 154 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 36 "/sys/src/X11/programs/Xserver/Xext/../include/opaque.h" extern char *defaultFontPath; extern char *defaultTextFont; extern char *defaultCursorFont; extern char *rgbPath; extern int MaxClients; extern char isItTimeToYield; extern char dispatchException; extern CARD32 TimeOutValue; extern CARD32 ScreenSaverTime; extern CARD32 ScreenSaverInterval; extern int ScreenSaverBlanking; extern int ScreenSaverAllowExposures; extern int argcGlobal; extern char **argvGlobal; #line 63 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 71 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 74 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" typedef struct _WindowOpt { VisualID visual; CursorPtr cursor; Colormap colormap; Mask dontPropagateMask; Mask otherEventMasks; struct _OtherClients *otherClients; struct _GrabRec *passiveGrabs; PropertyPtr userProps; unsigned long backingBitPlanes; unsigned long backingPixel; RegionPtr boundingShape; RegionPtr clipShape; } WindowOptRec, *WindowOptPtr; typedef struct _Window { DrawableRec drawable; WindowPtr parent; WindowPtr nextSib; WindowPtr prevSib; WindowPtr firstChild; WindowPtr lastChild; RegionRec clipList; RegionRec borderClip; union _Validate *valdata; RegionRec winSize; RegionRec borderSize; DDXPointRec origin; unsigned short borderWidth; unsigned short deliverableEvents; Mask eventMask; PixUnion background; PixUnion border; pointer backStorage; WindowOptPtr optional; unsigned backgroundState:2; unsigned borderIsPixel:1; unsigned cursorIsNone:1; unsigned backingStore:2; unsigned saveUnder:1; unsigned DIXsaveUnder:1; unsigned bitGravity:4; unsigned winGravity:4; unsigned overrideRedirect:1; unsigned visibility:2; unsigned mapped:1; unsigned realized:1; unsigned viewable:1; unsigned dontPropagate:3; unsigned forcedBS:1; DevUnion *devPrivates; } WindowRec; #line 140 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" extern Mask DontPropagateMasks[]; #line 146 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 149 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" typedef struct _ScreenSaverStuff { WindowPtr pWindow; XID wid; char blanked; Bool (*ExternalScreenSaver)( ScreenPtr , int , Bool ); } ScreenSaverStuffRec, *ScreenSaverStuffPtr; extern int screenIsSaved; extern ScreenSaverStuffRec savedScreenInfo[3]; #line 208 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 212 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" #line 215 "/sys/src/X11/programs/Xserver/Xext/../include/windowstr.h" extern int numSaveUndersViewable; extern int deltaSaveUndersViewable; #line 37 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/region.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/region.h" #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 80 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 86 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 57 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/colormap.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/colormap.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 4 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 25 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 85 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 270 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 356 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 387 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 390 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 413 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 418 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 979 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 999 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1003 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1082 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1139 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1227 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1241 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1294 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1303 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1308 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1311 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/colormap.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/colormap.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/colormap.h" #line 70 "/sys/src/X11/programs/Xserver/Xext/../include/colormap.h" typedef CARD32 Pixel; typedef struct _CMEntry *EntryPtr; typedef struct _ColormapRec *ColormapPtr; typedef struct _colorResource *colorResourcePtr; extern int CreateColormap( Colormap , ScreenPtr , VisualPtr , ColormapPtr* , int , int ); extern int FreeColormap( pointer , XID ); extern int TellLostMap( WindowPtr , pointer ); extern int TellGainedMap( WindowPtr , pointer ); extern int CopyColormapAndFree( Colormap , ColormapPtr , int ); extern int AllocColor( ColormapPtr , unsigned short* , unsigned short* , unsigned short* , Pixel* , int ); extern void FakeAllocColor( ColormapPtr , xColorItem * ); extern void FakeFreeColor( ColormapPtr , Pixel ); typedef int (*ColorCompareProcPtr)( EntryPtr , xrgb * ); extern int FindColor( ColormapPtr , EntryPtr , int , xrgb* , Pixel* , int , int , ColorCompareProcPtr ); extern int QueryColors( ColormapPtr , int , Pixel* , xrgb* ); extern int FreeClientPixels( pointer , XID ); extern int AllocColorCells( int , ColormapPtr , int , int , Bool , Pixel* , Pixel* ); extern int AllocColorPlanes( int , ColormapPtr , int , int , int , int , Bool , Pixel* , Pixel* , Pixel* , Pixel* ); extern int FreeColors( ColormapPtr , int , int , Pixel* , Pixel ); extern int StoreColors( ColormapPtr , int , xColorItem* ); extern int IsMapInstalled( Colormap , WindowPtr ); #line 58 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 59 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/validate.h" #line 28 "/sys/src/X11/programs/Xserver/Xext/../include/validate.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 33 "/sys/src/X11/programs/Xserver/Xext/../include/validate.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 65 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 85 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 95 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 98 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 101 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 104 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 107 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 110 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 113 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 116 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 119 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 122 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 125 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 128 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 131 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 134 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 140 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 143 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 146 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 149 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 152 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 157 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 160 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 163 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 166 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 172 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 175 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 178 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 181 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 184 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 187 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 190 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 193 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 196 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 201 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 204 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 207 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 210 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 216 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 239 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 251 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 254 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 262 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 265 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 34 "/sys/src/X11/programs/Xserver/Xext/../include/validate.h" typedef enum { VTOther, VTStack, VTMove, VTUnmap, VTMap } VTKind; typedef union _Validate *ValidatePtr; #line 60 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/window.h" #line 61 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 4 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 25 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 85 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 270 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 356 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 387 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 390 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 413 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 418 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 979 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 999 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1003 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1082 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1139 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1227 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1241 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1294 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1303 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1308 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 1311 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xproto.h" #line 62 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 63 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 68 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 72 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 87 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 90 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 105 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 118 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 129 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 151 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 157 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 162 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 549 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 634 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 648 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 63 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" typedef struct _PixmapFormat { unsigned char depth; unsigned char bitsPerPixel; unsigned char scanlinePad; } PixmapFormatRec; typedef struct _Visual { VisualID vid; short class; short bitsPerRGBValue; short ColormapEntries; short nplanes; #line 78 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" unsigned long redMask, greenMask, blueMask; int offsetRed, offsetGreen, offsetBlue; } VisualRec; typedef struct _Depth { unsigned char depth; short numVids; VisualID *vids; } DepthRec; #line 94 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" typedef Bool (* CloseScreenProcPtr)( int , ScreenPtr ); typedef void (* QueryBestSizeProcPtr)( int , unsigned short * , unsigned short * , ScreenPtr ); typedef Bool (* SaveScreenProcPtr)( ScreenPtr , int ); typedef void (* GetImageProcPtr)( DrawablePtr , int , int , int , int , unsigned int , unsigned long , char * ); typedef void (* GetSpansProcPtr)( DrawablePtr , int , DDXPointPtr , int* , int , char * ); typedef void (* PointerNonInterestBoxProcPtr)( ScreenPtr , BoxPtr ); typedef void (* SourceValidateProcPtr)( DrawablePtr , int , int , int , int ); typedef Bool (* CreateWindowProcPtr)( WindowPtr ); typedef Bool (* DestroyWindowProcPtr)( WindowPtr ); typedef Bool (* PositionWindowProcPtr)( WindowPtr , int , int ); typedef Bool (* ChangeWindowAttributesProcPtr)( WindowPtr , unsigned long ); typedef Bool (* RealizeWindowProcPtr)( WindowPtr ); typedef Bool (* UnrealizeWindowProcPtr)( WindowPtr ); typedef int (* ValidateTreeProcPtr)( WindowPtr , WindowPtr , VTKind ); typedef void (* PostValidateTreeProcPtr)( WindowPtr , WindowPtr , VTKind ); typedef void (* WindowExposuresProcPtr)( WindowPtr , RegionPtr , RegionPtr ); typedef void (* PaintWindowBackgroundProcPtr)( WindowPtr , RegionPtr , int ); typedef void (* PaintWindowBorderProcPtr)( WindowPtr , RegionPtr , int ); typedef void (* CopyWindowProcPtr)( WindowPtr , DDXPointRec , RegionPtr ); typedef void (* ClearToBackgroundProcPtr)( WindowPtr , int , int , int , int , Bool ); typedef void (* ClipNotifyProcPtr)( WindowPtr , int , int ); typedef PixmapPtr (* CreatePixmapProcPtr)( ScreenPtr , int , int , int ); typedef Bool (* DestroyPixmapProcPtr)( PixmapPtr ); typedef void (* SaveDoomedAreasProcPtr)( WindowPtr , RegionPtr , int , int ); typedef RegionPtr (* RestoreAreasProcPtr)( WindowPtr , RegionPtr ); typedef void (* ExposeCopyProcPtr)( WindowPtr , DrawablePtr , GCPtr , RegionPtr , int , int , int , int , unsigned long ); typedef RegionPtr (* TranslateBackingStoreProcPtr)( WindowPtr , int , int , RegionPtr , int , int ); typedef RegionPtr (* ClearBackingStoreProcPtr)( WindowPtr , int , int , int , int , Bool ); typedef void (* DrawGuaranteeProcPtr)( WindowPtr , GCPtr , int ); typedef Bool (* RealizeFontProcPtr)( ScreenPtr , FontPtr ); typedef Bool (* UnrealizeFontProcPtr)( ScreenPtr , FontPtr ); typedef void (* ConstrainCursorProcPtr)( ScreenPtr , BoxPtr ); typedef void (* CursorLimitsProcPtr)( ScreenPtr , CursorPtr , BoxPtr , BoxPtr ); typedef Bool (* DisplayCursorProcPtr)( ScreenPtr , CursorPtr ); typedef Bool (* RealizeCursorProcPtr)( ScreenPtr , CursorPtr ); typedef Bool (* UnrealizeCursorProcPtr)( ScreenPtr , CursorPtr ); typedef void (* RecolorCursorProcPtr)( ScreenPtr , CursorPtr , Bool ); typedef Bool (* SetCursorPositionProcPtr)( ScreenPtr , int , int , Bool ); typedef Bool (* CreateGCProcPtr)( GCPtr ); typedef Bool (* CreateColormapProcPtr)( ColormapPtr ); typedef void (* DestroyColormapProcPtr)( ColormapPtr ); typedef void (* InstallColormapProcPtr)( ColormapPtr ); typedef void (* UninstallColormapProcPtr)( ColormapPtr ); typedef int (* ListInstalledColormapsProcPtr) ( ScreenPtr , XID* ); typedef void (* StoreColorsProcPtr)( ColormapPtr , int , xColorItem * ); typedef void (* ResolveColorProcPtr)( unsigned short* , unsigned short* , unsigned short* , VisualPtr ); typedef RegionPtr (* RegionCreateProcPtr)( BoxPtr , int ); typedef void (* RegionInitProcPtr)( RegionPtr , BoxPtr , int ); typedef Bool (* RegionCopyProcPtr)( RegionPtr , RegionPtr ); typedef void (* RegionDestroyProcPtr)( RegionPtr ); typedef void (* RegionUninitProcPtr)( RegionPtr ); typedef Bool (* IntersectProcPtr)( RegionPtr , RegionPtr , RegionPtr ); typedef Bool (* UnionProcPtr)( RegionPtr , RegionPtr , RegionPtr ); typedef Bool (* SubtractProcPtr)( RegionPtr , RegionPtr , RegionPtr ); typedef Bool (* InverseProcPtr)( RegionPtr , RegionPtr , BoxPtr ); typedef void (* RegionResetProcPtr)( RegionPtr , BoxPtr ); typedef void (* TranslateRegionProcPtr)( RegionPtr , int , int ); typedef int (* RectInProcPtr)( RegionPtr , BoxPtr ); typedef Bool (* PointInRegionProcPtr)( RegionPtr , int , int , BoxPtr ); typedef Bool (* RegionNotEmptyProcPtr)( RegionPtr ); typedef void (* RegionEmptyProcPtr)( RegionPtr ); typedef BoxPtr (* RegionExtentsProcPtr)( RegionPtr ); typedef Bool (* RegionAppendProcPtr)( RegionPtr , RegionPtr ); typedef Bool (* RegionValidateProcPtr)( RegionPtr , Bool* ); typedef RegionPtr (* BitmapToRegionProcPtr)( PixmapPtr ); typedef RegionPtr (* RectsToRegionProcPtr)( int , xRectangle* , int ); typedef void (* SendGraphicsExposeProcPtr)( ClientPtr , RegionPtr , XID , int , int ); typedef void (* ScreenBlockHandlerProcPtr)( int , pointer , struct timeval ** , pointer ); typedef void (* ScreenWakeupHandlerProcPtr)( int , pointer , unsigned long , pointer ); typedef Bool (* CreateScreenResourcesProcPtr)( ScreenPtr ); typedef Bool (* ModifyPixmapHeaderProcPtr)( PixmapPtr , int , int , int , int , int , pointer ); typedef void (* MarkWindowProcPtr)( WindowPtr ); typedef Bool (* MarkOverlappedWindowsProcPtr)( WindowPtr , WindowPtr , WindowPtr * ); typedef Bool (* ChangeSaveUnderProcPtr)( WindowPtr , WindowPtr ); typedef void (* PostChangeSaveUnderProcPtr)( WindowPtr , WindowPtr ); typedef void (* MoveWindowProcPtr)( WindowPtr , int , int , WindowPtr , VTKind ); typedef void (* ResizeWindowProcPtr)( WindowPtr , int , int , unsigned int , unsigned int , WindowPtr ); typedef WindowPtr (* GetLayerWindowProcPtr)( WindowPtr ); typedef void (* HandleExposuresProcPtr)( WindowPtr ); typedef void (* ReparentWindowProcPtr)( WindowPtr , WindowPtr ); typedef void (* SetShapeProcPtr)( WindowPtr ); typedef void (* ChangeBorderWidthProcPtr)( WindowPtr , unsigned int ); typedef void (* MarkUnrealizedWindowProcPtr)( WindowPtr , WindowPtr , Bool ); typedef struct _Screen { int myNum; ATOM id; short width, height; short mmWidth, mmHeight; short numDepths; unsigned char rootDepth; DepthPtr allowedDepths; unsigned long rootVisual; unsigned long defColormap; short minInstalledCmaps, maxInstalledCmaps; char backingStoreSupport, saveUnderSupport; unsigned long whitePixel, blackPixel; unsigned long rgf; GCPtr GCperDepth[8 +1]; #line 764 "/sys/src/X11/programs/Xserver/Xext/../include/scrnintstr.h" PixmapPtr PixmapPerDepth[1]; pointer devPrivate; short numVisuals; VisualPtr visuals; int WindowPrivateLen; unsigned *WindowPrivateSizes; unsigned totalWindowSize; int GCPrivateLen; unsigned *GCPrivateSizes; unsigned totalGCSize; CloseScreenProcPtr CloseScreen; QueryBestSizeProcPtr QueryBestSize; SaveScreenProcPtr SaveScreen; GetImageProcPtr GetImage; GetSpansProcPtr GetSpans; PointerNonInterestBoxProcPtr PointerNonInterestBox; SourceValidateProcPtr SourceValidate; CreateWindowProcPtr CreateWindow; DestroyWindowProcPtr DestroyWindow; PositionWindowProcPtr PositionWindow; ChangeWindowAttributesProcPtr ChangeWindowAttributes; RealizeWindowProcPtr RealizeWindow; UnrealizeWindowProcPtr UnrealizeWindow; ValidateTreeProcPtr ValidateTree; PostValidateTreeProcPtr PostValidateTree; WindowExposuresProcPtr WindowExposures; PaintWindowBackgroundProcPtr PaintWindowBackground; PaintWindowBorderProcPtr PaintWindowBorder; CopyWindowProcPtr CopyWindow; ClearToBackgroundProcPtr ClearToBackground; ClipNotifyProcPtr ClipNotify; CreatePixmapProcPtr CreatePixmap; DestroyPixmapProcPtr DestroyPixmap; SaveDoomedAreasProcPtr SaveDoomedAreas; RestoreAreasProcPtr RestoreAreas; ExposeCopyProcPtr ExposeCopy; TranslateBackingStoreProcPtr TranslateBackingStore; ClearBackingStoreProcPtr ClearBackingStore; DrawGuaranteeProcPtr DrawGuarantee; RealizeFontProcPtr RealizeFont; UnrealizeFontProcPtr UnrealizeFont; ConstrainCursorProcPtr ConstrainCursor; CursorLimitsProcPtr CursorLimits; DisplayCursorProcPtr DisplayCursor; RealizeCursorProcPtr RealizeCursor; UnrealizeCursorProcPtr UnrealizeCursor; RecolorCursorProcPtr RecolorCursor; SetCursorPositionProcPtr SetCursorPosition; CreateGCProcPtr CreateGC; CreateColormapProcPtr CreateColormap; DestroyColormapProcPtr DestroyColormap; InstallColormapProcPtr InstallColormap; UninstallColormapProcPtr UninstallColormap; ListInstalledColormapsProcPtr ListInstalledColormaps; StoreColorsProcPtr StoreColors; ResolveColorProcPtr ResolveColor; RegionCreateProcPtr RegionCreate; RegionInitProcPtr RegionInit; RegionCopyProcPtr RegionCopy; RegionDestroyProcPtr RegionDestroy; RegionUninitProcPtr RegionUninit; IntersectProcPtr Intersect; UnionProcPtr Union; SubtractProcPtr Subtract; InverseProcPtr Inverse; RegionResetProcPtr RegionReset; TranslateRegionProcPtr TranslateRegion; RectInProcPtr RectIn; PointInRegionProcPtr PointInRegion; RegionNotEmptyProcPtr RegionNotEmpty; RegionEmptyProcPtr RegionEmpty; RegionExtentsProcPtr RegionExtents; RegionAppendProcPtr RegionAppend; RegionValidateProcPtr RegionValidate; BitmapToRegionProcPtr BitmapToRegion; RectsToRegionProcPtr RectsToRegion; SendGraphicsExposeProcPtr SendGraphicsExpose; ScreenBlockHandlerProcPtr BlockHandler; ScreenWakeupHandlerProcPtr WakeupHandler; pointer blockData; pointer wakeupData; DevUnion *devPrivates; CreateScreenResourcesProcPtr CreateScreenResources; ModifyPixmapHeaderProcPtr ModifyPixmapHeader; PixmapPtr pScratchPixmap; MarkWindowProcPtr MarkWindow; MarkOverlappedWindowsProcPtr MarkOverlappedWindows; ChangeSaveUnderProcPtr ChangeSaveUnder; PostChangeSaveUnderProcPtr PostChangeSaveUnder; MoveWindowProcPtr MoveWindow; ResizeWindowProcPtr ResizeWindow; GetLayerWindowProcPtr GetLayerWindow; HandleExposuresProcPtr HandleExposures; ReparentWindowProcPtr ReparentWindow; SetShapeProcPtr SetShape; ChangeBorderWidthProcPtr ChangeBorderWidth; MarkUnrealizedWindowProcPtr MarkUnrealizedWindow; } ScreenRec; typedef struct _ScreenInfo { int imageByteOrder; int bitmapScanlineUnit; int bitmapScanlinePad; int bitmapBitOrder; int numPixmapFormats; PixmapFormatRec formats[8]; int arraySize; int numScreens; ScreenPtr screens[3]; } ScreenInfo; extern ScreenInfo screenInfo; extern void InitOutput( ScreenInfo * , int , char ** ); #line 38 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" #line 73 "/sys/src/X11/programs/Xserver/Xext/../include/pixmapstr.h" #line 39 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 147 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 179 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 185 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 191 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 200 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 206 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 218 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 255 "/sys/src/X11/programs/Xserver/Xext/../include/misc.h" #line 53 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/extension.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/extension.h" #line 92 "/sys/src/X11/programs/Xserver/Xext/../include/extension.h" extern unsigned short StandardMinorOpcode( ClientPtr ); extern unsigned short MinorOpcodeOfRequest( ClientPtr ); extern void InitExtensions( int argc, char **argv ); extern void CloseDownExtensions( void ); #line 55 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" typedef struct _ExtensionEntry { int index; void (* CloseDown)( struct _ExtensionEntry * ); char *name; int base; int eventBase; int eventLast; int errorBase; int errorLast; int num_aliases; char **aliases; pointer extPrivate; unsigned short (* MinorOpcode)( ClientPtr ); } ExtensionEntry; #line 86 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" extern void (* EventSwapVector[128]) (); typedef void (* ExtensionLookupProc)( ); typedef struct _ProcEntry { char *name; ExtensionLookupProc proc; } ProcEntryRec, *ProcEntryPtr; typedef struct _ScreenProcEntry { int num; ProcEntryPtr procList; } ScreenProcEntry; #line 102 "/sys/src/X11/programs/Xserver/Xext/../include/extnsionst.h" extern ExtensionEntry *AddExtension( char* , int , int , int (* )( ClientPtr ), int (* )( ClientPtr ), void (* )( ExtensionEntry * ), unsigned short (* )( ClientPtr ) ); extern Bool AddExtensionAlias( char* , ExtensionEntry * ); extern ExtensionLookupProc LookupProc( char* , GCPtr ); extern Bool RegisterProc( char* , GCPtr , ExtensionLookupProc ); extern Bool RegisterScreenProc( char* , ScreenPtr , ExtensionLookupProc ); #line 40 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 23 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 63 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 68 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 72 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 87 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 90 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 105 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 118 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 129 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 151 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 157 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 162 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 549 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 634 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 648 "/sys/src/X11/programs/Xserver/Xext/../include/dix.h" #line 29 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 30 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/cursor.h" #line 31 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 32 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 80 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 86 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 33 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 58 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 88 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 100 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 154 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 182 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 188 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xmd.h" #line 34 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" #line 39 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" typedef struct _TimeStamp { CARD32 months; CARD32 milliseconds; } TimeStamp; extern CallbackListPtr ClientStateCallback; typedef enum {ClientStateInitial, ClientStateAuthenticating, ClientStateRunning, ClientStateRetained, ClientStateGone} ClientState; typedef struct _Client { int index; Mask clientAsMask; pointer requestBuffer; pointer osPrivate; Bool swapped; void (*pSwapReplyFunc) ( ClientPtr , int , void * ); XID errorValue; int sequence; int closeDownMode; int clientGone; int noClientException; #line 76 "/sys/src/X11/programs/Xserver/Xext/../include/dixstruct.h" DrawablePtr lastDrawable; Drawable lastDrawableID; GCPtr lastGC; GContext lastGCID; pointer *saveSet; int numSaved; pointer screenPrivate[3]; int (**requestVector) ( ClientPtr ); CARD32 req_len; Bool big_requests; int priority; ClientState clientState; DevUnion *devPrivates; } ClientRec; typedef struct _WorkQueue { struct _WorkQueue *next; Bool (*function) ( ClientPtr , pointer ); ClientPtr client; pointer closure; } WorkQueueRec; extern TimeStamp currentTime; extern TimeStamp lastDeviceEventTime; extern int CompareTimeStamps( TimeStamp , TimeStamp ); extern TimeStamp ClientTimeToServerTime( CARD32 ); typedef struct _CallbackRec { CallbackProcPtr proc; pointer data; Bool deleted; struct _CallbackRec *next; } CallbackRec, *CallbackPtr; typedef struct _CallbackList { CallbackFuncsRec funcs; int inCallback; Bool deleted; int numDeleted; CallbackPtr list; } CallbackListRec; #line 41 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 69 "/sys/src/X11/programs/Xserver/Xext/../include/resource.h" #line 42 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/opaque.h" #line 31 "/sys/src/X11/programs/Xserver/Xext/../include/opaque.h" #line 43 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../include/extensions/shapestr.h" #line 27 "/sys/src/X11/programs/Xserver/Xext/../../../include/extensions/shapestr.h" #line 37 "/sys/src/X11/programs/Xserver/Xext/../../../include/extensions/shapestr.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../include/extensions/shape.h" #line 27 "/sys/src/X11/programs/Xserver/Xext/../../../include/extensions/shape.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncproto.h" #line 28 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xfuncproto.h" #line 34 "/sys/src/X11/programs/Xserver/Xext/../../../include/extensions/shape.h" #line 39 "/sys/src/X11/programs/Xserver/Xext/../../../include/extensions/shapestr.h" typedef struct _ShapeQueryVersion { CARD8 reqType; CARD8 shapeReqType; CARD16 length; } xShapeQueryVersionReq; typedef struct { BYTE type; CARD8 unused; CARD16 sequenceNumber; CARD32 length; CARD16 majorVersion; CARD16 minorVersion; CARD32 pad0; CARD32 pad1; CARD32 pad2; CARD32 pad3; CARD32 pad4; } xShapeQueryVersionReply; typedef struct _ShapeRectangles { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD8 op; CARD8 destKind; CARD8 ordering; CARD8 pad0; CARD32 dest; INT16 xOff; INT16 yOff; } xShapeRectanglesReq; typedef struct _ShapeMask { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD8 op; CARD8 destKind; CARD16 junk; CARD32 dest; INT16 xOff; INT16 yOff; CARD32 src; } xShapeMaskReq; typedef struct _ShapeCombine { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD8 op; CARD8 destKind; CARD8 srcKind; CARD8 junk; CARD32 dest; INT16 xOff; INT16 yOff; CARD32 src; } xShapeCombineReq; typedef struct _ShapeOffset { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD8 destKind; CARD8 junk1; CARD16 junk2; CARD32 dest; INT16 xOff; INT16 yOff; } xShapeOffsetReq; typedef struct _ShapeQueryExtents { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD32 window; } xShapeQueryExtentsReq; typedef struct { BYTE type; CARD8 unused; CARD16 sequenceNumber; CARD32 length; CARD8 boundingShaped; CARD8 clipShaped; CARD16 unused1; INT16 xBoundingShape; INT16 yBoundingShape; CARD16 widthBoundingShape; CARD16 heightBoundingShape; INT16 xClipShape; INT16 yClipShape; CARD16 widthClipShape; CARD16 heightClipShape; CARD32 pad1; } xShapeQueryExtentsReply; typedef struct _ShapeSelectInput { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD32 window; BYTE enable; BYTE pad1; CARD16 pad2; } xShapeSelectInputReq; typedef struct _ShapeNotify { BYTE type; BYTE kind; CARD16 sequenceNumber; CARD32 window; INT16 x; INT16 y; CARD16 width; CARD16 height; CARD32 time; BYTE shaped; BYTE pad0; CARD16 pad1; CARD32 pad2; CARD32 pad3; } xShapeNotifyEvent; typedef struct _ShapeInputSelected { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD32 window; } xShapeInputSelectedReq; typedef struct { BYTE type; CARD8 enabled; CARD16 sequenceNumber; CARD32 length; CARD32 pad1; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; CARD32 pad6; } xShapeInputSelectedReply; typedef struct _ShapeGetRectangles { CARD8 reqType; CARD8 shapeReqType; CARD16 length; CARD32 window; CARD8 kind; CARD8 junk1; CARD16 junk2; } xShapeGetRectanglesReq; typedef struct { BYTE type; CARD8 ordering; CARD16 sequenceNumber; CARD32 length; CARD32 nrects; CARD32 pad1; CARD32 pad2; CARD32 pad3; CARD32 pad4; CARD32 pad5; } xShapeGetRectanglesReply; #line 45 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 65 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 85 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 95 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 98 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 101 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 104 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 107 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 110 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 113 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 116 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 119 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 122 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 125 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 128 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 131 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 134 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 137 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 140 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 143 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 146 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 149 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 152 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 157 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 160 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 163 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 166 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 169 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 172 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 175 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 178 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 181 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 184 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 187 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 190 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 193 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 196 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 201 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 204 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 207 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 210 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 213 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 216 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 239 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 244 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 251 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 254 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 262 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 265 "/sys/src/X11/programs/Xserver/Xext/../include/regionstr.h" #line 46 "/sys/src/X11/programs/Xserver/Xext/_shape.c" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 48 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 84 "/sys/src/X11/programs/Xserver/Xext/../include/gc.h" #line 54 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/miscstruct.h" #line 56 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/region.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/region.h" #line 57 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 77 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 80 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 83 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 86 "/sys/src/X11/programs/Xserver/Xext/../include/pixmap.h" #line 58 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 49 "/sys/src/X11/programs/Xserver/Xext/../include/screenint.h" #line 59 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 1 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 52 "/sys/src/X11/programs/Xserver/Xext/../../../X11/Xprotostr.h" #line 60 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" #line 64 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" typedef struct _GCFuncs { void (* ValidateGC)( GCPtr , unsigned long , DrawablePtr ); void (* ChangeGC)( GCPtr , unsigned long ); void (* CopyGC)( GCPtr , unsigned long , GCPtr ); void (* DestroyGC)( GCPtr ); void (* ChangeClip)( GCPtr , int , pointer , int ); void (* DestroyClip)( GCPtr ); void (* CopyClip)( GCPtr , GCPtr ); DevUnion devPrivate; } GCFuncs; #line 122 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" typedef struct _GCOps { void (* FillSpans)( DrawablePtr , GCPtr , int , DDXPointPtr , int * , int ); void (* SetSpans)( DrawablePtr , GCPtr , char * , DDXPointPtr , int * , int , int ); void (* PutImage)( DrawablePtr , GCPtr , int , int , int , int , int , int , int , char * ); RegionPtr (* CopyArea)( DrawablePtr , DrawablePtr , GCPtr , int , int , int , int , int , int ); RegionPtr (* CopyPlane)( DrawablePtr , DrawablePtr , GCPtr , int , int , int , int , int , int , unsigned long ); void (* PolyPoint)( DrawablePtr , GCPtr , int , int , DDXPointPtr ); void (* Polylines)( DrawablePtr , GCPtr , int , int , DDXPointPtr ); void (* PolySegment)( DrawablePtr , GCPtr , int , xSegment * ); void (* PolyRectangle)( DrawablePtr , GCPtr , int , xRectangle * ); void (* PolyArc)( DrawablePtr , GCPtr , int , xArc * ); void (* FillPolygon)( DrawablePtr , GCPtr , int , int , int , DDXPointPtr ); void (* PolyFillRect)( DrawablePtr , GCPtr , int , xRectangle * ); void (* PolyFillArc)( DrawablePtr , GCPtr , int , xArc * ); int (* PolyText8)( DrawablePtr , GCPtr , int , int , int , char * ); int (* PolyText16)( DrawablePtr , GCPtr , int , int , int , unsigned short * ); void (* ImageText8)( DrawablePtr , GCPtr , int , int , int , char * ); void (* ImageText16)( DrawablePtr , GCPtr , int , int , int , unsigned short * ); void (* ImageGlyphBlt)( DrawablePtr , GCPtr , int , int , unsigned int , CharInfoPtr * , pointer ); void (* PolyGlyphBlt)( DrawablePtr , GCPtr , int , int , unsigned int , CharInfoPtr * , pointer ); void (* PushPixels)( GCPtr , PixmapPtr , DrawablePtr , int , int , int , int ); DevUnion devPrivate; } GCOps; #line 356 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" typedef struct _GC { ScreenPtr pScreen; unsigned char depth; unsigned char alu; unsigned short lineWidth; unsigned short dashOffset; unsigned short numInDashList; unsigned char *dash; unsigned int lineStyle : 2; unsigned int capStyle : 2; unsigned int joinStyle : 2; unsigned int fillStyle : 2; unsigned int fillRule : 1; unsigned int arcMode : 1; unsigned int subWindowMode : 1; unsigned int graphicsExposures : 1; unsigned int clientClipType : 2; unsigned int miTranslate:1; unsigned int tileIsPixel:1; unsigned int unused:16; unsigned long planemask; unsigned long fgPixel; unsigned long bgPixel; #line 383 "/sys/src/X11/programs/Xserver/Xext/../include/gcstruct.h" PixUnion tile; PixmapPtr stipple; DDXPointRec patOrg; struct _Font *font; DDXPointRec clipOrg; DDXPointRec lastWinOrg; pointer clientClip; unsigned long stateChanges; unsigned long serialNumber; GCFuncs *funcs; GCOps *ops; DevUnion *devPrivates; } GC; #line 47 "/sys/src/X11/programs/Xserver/Xext/_shape.c" static int ShapeFreeClient(), ShapeFreeEvents(); static void SendShapeNotify(); static int ProcShapeDispatch(), SProcShapeDispatch(); static void ShapeResetProc(), SShapeNotifyEvent(); static unsigned char ShapeReqCode = 0; static int ShapeEventBase = 0; static RESTYPE ClientType, EventType; #line 64 "/sys/src/X11/programs/Xserver/Xext/_shape.c" typedef struct _ShapeEvent *ShapeEventPtr; typedef struct _ShapeEvent { ShapeEventPtr next; ClientPtr client; WindowPtr window; XID clientResource; } ShapeEventRec; #line 81 "/sys/src/X11/programs/Xserver/Xext/_shape.c" void ShapeExtensionInit() { ExtensionEntry *extEntry, *AddExtension(); ClientType = CreateNewResourceType(ShapeFreeClient); EventType = CreateNewResourceType(ShapeFreeEvents); if (ClientType && EventType && (extEntry = AddExtension("SHAPE",(0 + 1), 0, ProcShapeDispatch, SProcShapeDispatch, ShapeResetProc, StandardMinorOpcode))) { ShapeReqCode = (unsigned char)extEntry->base; ShapeEventBase = extEntry->eventBase; EventSwapVector[ShapeEventBase] = SShapeNotifyEvent; } } static void ShapeResetProc (extEntry) ExtensionEntry *extEntry; { } static RegionOperate (client, pWin, kind, destRgnp, srcRgn, op, xoff, yoff, create) ClientPtr client; WindowPtr pWin; int kind; RegionPtr *destRgnp, srcRgn; int op; int xoff, yoff; RegionPtr (*create)(); { ScreenPtr pScreen = pWin->drawable.pScreen; if (srcRgn && (xoff || yoff)) miTranslateRegion(srcRgn,xoff,yoff); if (!pWin->parent) { if (srcRgn) miRegionDestroy(srcRgn); return 0; } switch (op) { case 0 : if (*destRgnp) miRegionDestroy(*destRgnp); *destRgnp = srcRgn; srcRgn = 0; break; case 1 : if (*destRgnp) miUnion(*destRgnp,*destRgnp,srcRgn); break; case 2 : if (*destRgnp) miIntersect(*destRgnp,*destRgnp,srcRgn); else { *destRgnp = srcRgn; srcRgn = 0; } break; case 3 : if (!*destRgnp) *destRgnp = (*create)(pWin); miSubtract(*destRgnp,*destRgnp,srcRgn); break; case 4 : if (!*destRgnp) *destRgnp = miRegionCreate((BoxPtr) 0,0); else miSubtract(*destRgnp,srcRgn,*destRgnp); break; default: client->errorValue = op; return 2; } if (srcRgn) miRegionDestroy(srcRgn); (*pScreen->SetShape) (pWin); SendShapeNotify (pWin, kind); return 0; } static RegionPtr CreateBoundingShape (pWin) WindowPtr pWin; { BoxRec extents; extents.x1 = -((int) (pWin)->borderWidth); extents.y1 = -((int) (pWin)->borderWidth); extents.x2 = pWin->drawable.width +((int) (pWin)->borderWidth); extents.y2 = pWin->drawable.height +((int) (pWin)->borderWidth); return miRegionCreate(&extents,1); } static RegionPtr CreateClipShape (pWin) WindowPtr pWin; { BoxRec extents; extents.x1 = 0; extents.y1 = 0; extents.x2 = pWin->drawable.width; extents.y2 = pWin->drawable.height; return miRegionCreate(&extents,1); } static int ProcShapeQueryVersion (client) register ClientPtr client; { register xShapeQueryVersionReq *stuff = (xShapeQueryVersionReq *)client->requestBuffer; xShapeQueryVersionReply rep; register int n; if ((sizeof(xShapeQueryVersionReq) >> 2) != client->req_len) return(16); rep.type = 1; rep.length = 0; rep.sequenceNumber = client->sequence; rep.majorVersion = 1; rep.minorVersion = 0; if (client->swapped) { {n = ((char *) (&rep.sequenceNumber))[0]; ((char *) (&rep.sequenceNumber))[0] = ((char *) (&rep.sequenceNumber))[1]; ((char *) (&rep.sequenceNumber))[1] = n; }; {n = ((char *) (&rep.length))[0]; ((char *) (&rep.length))[0] = ((char *) (&rep.length))[3]; ((char *) (&rep.length))[3] = n;n = ((char *) (&rep.length))[1]; ((char *) (&rep.length))[1] = ((char *) (&rep.length))[2]; ((char *) (&rep.length))[2] = n; }; {n = ((char *) (&rep.majorVersion))[0]; ((char *) (&rep.majorVersion))[0] = ((char *) (&rep.majorVersion))[1]; ((char *) (&rep.majorVersion))[1] = n; }; {n = ((char *) (&rep.minorVersion))[0]; ((char *) (&rep.minorVersion))[0] = ((char *) (&rep.minorVersion))[1]; ((char *) (&rep.minorVersion))[1] = n; }; } WriteToClient(client, sizeof (xShapeQueryVersionReply), (char *)&rep); return (client->noClientException); } #line 222 "/sys/src/X11/programs/Xserver/Xext/_shape.c" static int ProcShapeRectangles (client) register ClientPtr client; { WindowPtr pWin; ScreenPtr pScreen; register xShapeRectanglesReq *stuff = (xShapeRectanglesReq *)client->requestBuffer; xRectangle *prects; int nrects, ctype; RegionPtr srcRgn; RegionPtr *destRgn; RegionPtr (*createDefault)(); int destBounding; if ((sizeof(xShapeRectanglesReq) >> 2) > client->req_len ) return(16); UpdateCurrentTime(); pWin = LookupWindow (stuff->dest, client); if (!pWin) return 3; switch (stuff->destKind) { case 0 : destBounding = 1; createDefault = CreateBoundingShape; break; case 1 : destBounding = 0; createDefault = CreateClipShape; break; default: client->errorValue = stuff->destKind; return 2; } if ((stuff->ordering != 0) && (stuff->ordering != 1) && (stuff->ordering != 2) && (stuff->ordering != 3)) { client->errorValue = stuff->ordering; return 2; } pScreen = pWin->drawable.pScreen; nrects = ((stuff->length << 2) - sizeof(xShapeRectanglesReq)); if (nrects & 4) return 16; nrects >>= 3; prects = (xRectangle *) &stuff[1]; ctype = VerifyRectOrder(nrects, prects, (int)stuff->ordering); if (ctype < 0) return 8; srcRgn = miRectsToRegion(nrects,prects,ctype); if (!pWin->optional) MakeWindowOptional (pWin); if (destBounding) destRgn = &pWin->optional->boundingShape; else destRgn = &pWin->optional->clipShape; return RegionOperate (client, pWin, (int)stuff->destKind, destRgn, srcRgn, (int)stuff->op, stuff->xOff, stuff->yOff, createDefault); } #line 287 "/sys/src/X11/programs/Xserver/Xext/_shape.c" static int ProcShapeMask (client) register ClientPtr client; { WindowPtr pWin; ScreenPtr pScreen; register xShapeMaskReq *stuff = (xShapeMaskReq *)client->requestBuffer; RegionPtr srcRgn; RegionPtr *destRgn; PixmapPtr pPixmap; RegionPtr (*createDefault)(); int destBounding; if ((sizeof(xShapeMaskReq) >> 2) != client->req_len) return(16); UpdateCurrentTime(); pWin = LookupWindow (stuff->dest, client); if (!pWin) return 3; switch (stuff->destKind) { case 0 : destBounding = 1; createDefault = CreateBoundingShape; break; case 1 : destBounding = 0; createDefault = CreateClipShape; break; default: client->errorValue = stuff->destKind; return 2; } pScreen = pWin->drawable.pScreen; if (stuff->src == 0L) srcRgn = 0; else { pPixmap = (PixmapPtr) LookupIDByType(stuff->src,((RESTYPE)2|((RESTYPE)1<<31)|((RESTYPE)1<<30))); if (!pPixmap) return 4; if (pPixmap->drawable.pScreen != pScreen || pPixmap->drawable.depth != 1) return 8; srcRgn =(*(pScreen)->BitmapToRegion)(pPixmap); if (!srcRgn) return 11; } if (!pWin->optional) MakeWindowOptional (pWin); if (destBounding) destRgn = &pWin->optional->boundingShape; else destRgn = &pWin->optional->clipShape; return RegionOperate (client, pWin, (int)stuff->destKind, destRgn, srcRgn, (int)stuff->op, stuff->xOff, stuff->yOff, createDefault); } #line 349 "/sys/src/X11/programs/Xserver/Xext/_shape.c" static int ProcShapeCombine (client) register ClientPtr client; { WindowPtr pSrcWin, pDestWin; ScreenPtr pScreen; register xShapeCombineReq *stuff = (xShapeCombineReq *)client->requestBuffer; RegionPtr srcRgn; RegionPtr *destRgn; RegionPtr (*createDefault)(); RegionPtr (*createSrc)(); RegionPtr tmp; int destBounding; if ((sizeof(xShapeCombineReq) >> 2) != client->req_len) return(16); UpdateCurrentTime(); pDestWin = LookupWindow (stuff->dest, client); if (!pDestWin) return 3; if (!pDestWin->optional) MakeWindowOptional (pDestWin); switch (stuff->destKind) { case 0 : destBounding = 1; createDefault = CreateBoundingShape; break; case 1 : destBounding = 0; createDefault = CreateClipShape; break; default: client->errorValue = stuff->destKind; return 2; } pScreen = pDestWin->drawable.pScreen; pSrcWin = LookupWindow (stuff->src, client); if (!pSrcWin) return 3; switch (stuff->srcKind) { case 0 : srcRgn =((pSrcWin)->optional ? pSrcWin ->optional-> boundingShape :((void*)0)); createSrc = CreateBoundingShape; break; case 1 : srcRgn =((pSrcWin)->optional ? pSrcWin ->optional-> clipShape :((void*)0)); createSrc = CreateClipShape; break; default: client->errorValue = stuff->srcKind; return 2; } if (pSrcWin->drawable.pScreen != pScreen) { return 8; } if (srcRgn) { tmp = miRegionCreate((BoxPtr) 0,0); miRegionCopy(tmp,srcRgn); srcRgn = tmp; } else srcRgn = (*createSrc) (pSrcWin); if (!pDestWin->optional) MakeWindowOptional (pDestWin); if (destBounding) destRgn = &pDestWin->optional->boundingShape; else destRgn = &pDestWin->optional->clipShape; return RegionOperate (client, pDestWin, (int)stuff->destKind, destRgn, srcRgn, (int)stuff->op, stuff->xOff, stuff->yOff, createDefault); } #line 429 "/sys/src/X11/programs/Xserver/Xext/_shape.c" static int ProcShapeOffset (client) register ClientPtr client; { WindowPtr pWin; ScreenPtr pScreen; register xShapeOffsetReq *stuff = (xShapeOffsetReq *)client->requestBuffer; RegionPtr srcRgn; if ((sizeof(xShapeOffsetReq) >> 2) != client->req_len) return(16); UpdateCurrentTime(); pWin = LookupWindow (stuff->dest, client); if (!pWin) return 3; switch (stuff->destKind) { case 0 : srcRgn =((pWin)->optional ? pWin ->optional-> boundingShape :((void*)0)); break; case 1 : srcRgn =((pWin)->optional ? pWin ->optional-> clipShape :((void*)0)); break; default: client->errorValue = stuff->destKind; return 2; } pScreen = pWin->drawable.pScreen; if (srcRgn) { miTranslateRegion(srcRgn,stuff->xOff,stuff->yOff); (*pScreen->SetShape) (pWin); } SendShapeNotify (pWin, (int)stuff->destKind); return 0; } static int ProcShapeQueryExtents (client) register ClientPtr client; { register xShapeQueryExtentsReq *stuff = (xShapeQueryExtentsReq *)client->requestBuffer; WindowPtr pWin; xShapeQueryExtentsReply rep; BoxRec extents; register int n; if ((sizeof(xShapeQueryExtentsReq) >> 2) != client->req_len) return(16); pWin = LookupWindow (stuff->window, client); if (!pWin) return 3; rep.type = 1; rep.length = 0; rep.sequenceNumber = client->sequence; rep.boundingShaped = (((pWin)->optional ? pWin ->optional-> boundingShape :((void*)0)) != 0); rep.clipShaped = (((pWin)->optional ? pWin ->optional-> clipShape :((void*)0)) != 0); if (((pWin)->optional ? pWin ->optional-> boundingShape :((void*)0))) { extents = * &(((pWin)->optional ? pWin ->optional-> boundingShape :((RegionPtr)0)))->extents; } else { extents.x1 = -((int) (pWin)->borderWidth); extents.y1 = -((int) (pWin)->borderWidth); extents.x2 = pWin->drawable.width +((int) (pWin)->borderWidth); extents.y2 = pWin->drawable.height +((int) (pWin)->borderWidth); } rep.xBoundingShape = extents.x1; rep.yBoundingShape = extents.y1; rep.widthBoundingShape = extents.x2 - extents.x1; rep.heightBoundingShape = extents.y2 - extents.y1; if (((pWin)->optional ? pWin ->optional-> clipShape :((void*)0))) { extents = * &(((pWin)->optional ? pWin ->optional-> clipShape :((RegionPtr)0)))->extents; } else { extents.x1 = 0; extents.y1 = 0; extents.x2 = pWin->drawable.width; extents.y2 = pWin->drawable.height; } rep.xClipShape = extents.x1; rep.yClipShape = extents.y1; rep.widthClipShape = extents.x2 - extents.x1; rep.heightClipShape = extents.y2 - extents.y1; if (client->swapped) { {n = ((char *) (&rep.sequenceNumber))[0]; ((char *) (&rep.sequenceNumber))[0] = ((char *) (&rep.sequenceNumber))[1]; ((char *) (&rep.sequenceNumber))[1] = n; }; {n = ((char *) (&rep.length))[0]; ((char *) (&rep.length))[0] = ((char *) (&rep.length))[3]; ((char *) (&rep.length))[3] = n;n = ((char *) (&rep.length))[1]; ((char *) (&rep.length))[1] = ((char *) (&rep.length))[2]; ((char *) (&rep.length))[2] = n; }; {n = ((char *) (&rep.xBoundingShape))[0]; ((char *) (&rep.xBoundingShape))[0] = ((char *) (&rep.xBoundingShape))[1]; ((char *) (&rep.xBoundingShape))[1] = n; }; {n = ((char *) (&rep.yBoundingShape))[0]; ((char *) (&rep.yBoundingShape))[0] = ((char *) (&rep.yBoundingShape))[1]; ((char *) (&rep.yBoundingShape))[1] = n; }; {n = ((char *) (&rep.widthBoundingShape))[0]; ((char *) (&rep.widthBoundingShape))[0] = ((char *) (&rep.widthBoundingShape))[1]; ((char *) (&rep.widthBoundingShape))[1] = n; }; {n = ((char *) (&rep.heightBoundingShape))[0]; ((char *) (&rep.heightBoundingShape))[0] = ((char *) (&rep.heightBoundingShape))[1]; ((char *) (&rep.heightBoundingShape))[1] = n; }; {n = ((char *) (&rep.xClipShape))[0]; ((char *) (&rep.xClipShape))[0] = ((char *) (&rep.xClipShape))[1]; ((char *) (&rep.xClipShape))[1] = n; }; {n = ((char *) (&rep.yClipShape))[0]; ((char *) (&rep.yClipShape))[0] = ((char *) (&rep.yClipShape))[1]; ((char *) (&rep.yClipShape))[1] = n; }; {n = ((char *) (&rep.widthClipShape))[0]; ((char *) (&rep.widthClipShape))[0] = ((char *) (&rep.widthClipShape))[1]; ((char *) (&rep.widthClipShape))[1] = n; }; {n = ((char *) (&rep.heightClipShape))[0]; ((char *) (&rep.heightClipShape))[0] = ((char *) (&rep.heightClipShape))[1]; ((char *) (&rep.heightClipShape))[1] = n; }; } WriteToClient(client, sizeof (xShapeQueryExtentsReply), (char *)&rep); return (client->noClientException); } static int ShapeFreeClient (data, id) pointer data; XID id; { ShapeEventPtr pShapeEvent; WindowPtr pWin; ShapeEventPtr *pHead, pCur, pPrev; pShapeEvent = (ShapeEventPtr) data; pWin = pShapeEvent->window; pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, EventType); if (pHead) { pPrev = 0; for (pCur = *pHead; pCur && pCur != pShapeEvent; pCur=pCur->next) pPrev = pCur; if (pCur) { if (pPrev) pPrev->next = pShapeEvent->next; else *pHead = pShapeEvent->next; } } Xfree((pointer)((pointer) pShapeEvent)); } static int ShapeFreeEvents (data, id) pointer data; XID id; { ShapeEventPtr *pHead, pCur, pNext; pHead = (ShapeEventPtr *) data; for (pCur = *pHead; pCur; pCur = pNext) { pNext = pCur->next; FreeResource (pCur->clientResource, ClientType); Xfree((pointer)((pointer) pCur)); } Xfree((pointer)((pointer) pHead)); } static int ProcShapeSelectInput (client) register ClientPtr client; { register xShapeSelectInputReq *stuff = (xShapeSelectInputReq *)client->requestBuffer; WindowPtr pWin; ShapeEventPtr pShapeEvent, pNewShapeEvent, *pHead; XID clientResource; if ((sizeof(xShapeSelectInputReq) >> 2) != client->req_len) return(16); pWin = LookupWindow (stuff->window, client); if (!pWin) return 3; pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, EventType); switch (stuff->enable) { case 1 : if (pHead) { for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { if (pShapeEvent->client == client) return 0; } } pNewShapeEvent = (ShapeEventPtr) Xalloc((unsigned long)(sizeof (ShapeEventRec))); if (!pNewShapeEvent) return 11; pNewShapeEvent->next = 0; pNewShapeEvent->client = client; pNewShapeEvent->window = pWin; #line 609 "/sys/src/X11/programs/Xserver/Xext/_shape.c" clientResource = FakeClientID (client->index); pNewShapeEvent->clientResource = clientResource; if (!AddResource (clientResource, ClientType, (pointer)pNewShapeEvent)) return 11; #line 619 "/sys/src/X11/programs/Xserver/Xext/_shape.c" if (!pHead) { pHead = (ShapeEventPtr *)Xalloc((unsigned long)(sizeof (ShapeEventPtr))); if (!pHead || !AddResource (pWin->drawable.id, EventType, (pointer)pHead)) { FreeResource (clientResource,((RESTYPE)0)); return 11; } *pHead = 0; } pNewShapeEvent->next = *pHead; *pHead = pNewShapeEvent; break; case 0 : if (pHead) { pNewShapeEvent = 0; for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { if (pShapeEvent->client == client) break; pNewShapeEvent = pShapeEvent; } if (pShapeEvent) { FreeResource (pShapeEvent->clientResource, ClientType); if (pNewShapeEvent) pNewShapeEvent->next = pShapeEvent->next; else *pHead = pShapeEvent->next; Xfree((pointer)(pShapeEvent)); } } break; default: client->errorValue = stuff->enable; return 2; } return 0; } #line 662 "/sys/src/X11/programs/Xserver/Xext/_shape.c" static void SendShapeNotify (pWin, which) WindowPtr pWin; int which; { ShapeEventPtr *pHead, pShapeEvent; ClientPtr client; xShapeNotifyEvent se; BoxRec extents; RegionPtr region; BYTE shaped; pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, EventType); if (!pHead) return; if (which == 0) { region =((pWin)->optional ? pWin ->optional-> boundingShape :((void*)0)); if (region) { extents = * &(region)->extents; shaped = 1; } else { extents.x1 = -((int) (pWin)->borderWidth); extents.y1 = -((int) (pWin)->borderWidth); extents.x2 = pWin->drawable.width +((int) (pWin)->borderWidth); extents.y2 = pWin->drawable.height +((int) (pWin)->borderWidth); shaped = 0; } } else { region =((pWin)->optional ? pWin ->optional-> clipShape :((void*)0)); if (region) { extents = * &(region)->extents; shaped = 1; } else { extents.x1 = 0; extents.y1 = 0; extents.x2 = pWin->drawable.width; extents.y2 = pWin->drawable.height; shaped = 0; } } for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { client = pShapeEvent->client; if (client == serverClient || client->clientGone) continue; se.type = 0 + ShapeEventBase; se.kind = which; se.window = pWin->drawable.id; se.sequenceNumber = client->sequence; se.x = extents.x1; se.y = extents.y1; se.width = extents.x2 - extents.x1; se.height = extents.y2 - extents.y1; se.time = currentTime.milliseconds; se.shaped = shaped; WriteEventsToClient (client, 1, (xEvent *) &se); } } static int ProcShapeInputSelected (client) register ClientPtr client; { register xShapeInputSelectedReq *stuff = (xShapeInputSelectedReq *)client->requestBuffer; WindowPtr pWin; ShapeEventPtr pShapeEvent, *pHead; int enabled; xShapeInputSelectedReply rep; register int n; if ((sizeof(xShapeInputSelectedReq) >> 2) != client->req_len) return(16); pWin = LookupWindow (stuff->window, client); if (!pWin) return 3; pHead = (ShapeEventPtr *) LookupIDByType(pWin->drawable.id, EventType); enabled = 0; if (pHead) { for (pShapeEvent = *pHead; pShapeEvent; pShapeEvent = pShapeEvent->next) { if (pShapeEvent->client == client) { enabled = 1; break; } } } rep.type = 1; rep.length = 0; rep.sequenceNumber = client->sequence; rep.enabled = enabled; if (client->swapped) { {n = ((char *) (&rep.sequenceNumber))[0]; ((char *) (&rep.sequenceNumber))[0] = ((char *) (&rep.sequenceNumber))[1]; ((char *) (&rep.sequenceNumber))[1] = n; }; {n = ((char *) (&rep.length))[0]; ((char *) (&rep.length))[0] = ((char *) (&rep.length))[3]; ((char *) (&rep.length))[3] = n;n = ((char *) (&rep.length))[1]; ((char *) (&rep.length))[1] = ((char *) (&rep.length))[2]; ((char *) (&rep.length))[2] = n; }; } WriteToClient (client, sizeof (xShapeInputSelectedReply), (char *) &rep); return (client->noClientException); } static int ProcShapeGetRectangles (client) register ClientPtr client; { register xShapeGetRectanglesReq *stuff = (xShapeGetRectanglesReq *)client->requestBuffer; WindowPtr pWin; xShapeGetRectanglesReply rep; xRectangle *rects; int nrects, i; RegionPtr region; register int n; if ((sizeof(xShapeGetRectanglesReq) >> 2) != client->req_len) return(16); pWin = LookupWindow (stuff->window, client); if (!pWin) return 3; switch (stuff->kind) { case 0 : region =((pWin)->optional ? pWin ->optional-> boundingShape :((void*)0)); break; case 1 : region =((pWin)->optional ? pWin ->optional-> clipShape :((void*)0)); break; default: client->errorValue = stuff->kind; return 2; } if (!region) { nrects = 1; rects = (xRectangle *)Xalloc((unsigned long)(sizeof (xRectangle))); if (!rects) return 11; switch (stuff->kind) { case 0 : rects->x = - (int)((int) (pWin)->borderWidth); rects->y = - (int)((int) (pWin)->borderWidth); rects->width = pWin->drawable.width +((int) (pWin)->borderWidth); rects->height = pWin->drawable.height +((int) (pWin)->borderWidth); break; case 1 : rects->x = 0; rects->y = 0; rects->width = pWin->drawable.width; rects->height = pWin->drawable.height; break; } } else { BoxPtr box; nrects =((region)->data ? (region)->data->numRects : 1); box =((region)->data ? (BoxPtr)((region)->data + 1) : &(region)->extents); rects = (xRectangle *)Xalloc((unsigned long)(nrects * sizeof (xRectangle))); if (!rects && nrects) return 11; for (i = 0; i < nrects; i++, box++) { rects[i].x = box->x1; rects[i].y = box->y1; rects[i].width = box->x2 - box->x1; rects[i].height = box->y2 - box->y1; } } rep.type = 1; rep.sequenceNumber = client->sequence; rep.length = (nrects * sizeof (xRectangle)) >> 2; rep.ordering = 3; rep.nrects = nrects; if (client->swapped) { {n = ((char *) (&rep.sequenceNumber))[0]; ((char *) (&rep.sequenceNumber))[0] = ((char *) (&rep.sequenceNumber))[1]; ((char *) (&rep.sequenceNumber))[1] = n; }; {n = ((char *) (&rep.length))[0]; ((char *) (&rep.length))[0] = ((char *) (&rep.length))[3]; ((char *) (&rep.length))[3] = n;n = ((char *) (&rep.length))[1]; ((char *) (&rep.length))[1] = ((char *) (&rep.length))[2]; ((char *) (&rep.length))[2] = n; }; {n = ((char *) (&rep.nrects))[0]; ((char *) (&rep.nrects))[0] = ((char *) (&rep.nrects))[3]; ((char *) (&rep.nrects))[3] = n;n = ((char *) (&rep.nrects))[1]; ((char *) (&rep.nrects))[1] = ((char *) (&rep.nrects))[2]; ((char *) (&rep.nrects))[2] = n; }; SwapShorts ((short *)rects, (unsigned long)nrects * 4); } WriteToClient (client, sizeof (rep), (char *) &rep); WriteToClient (client, nrects * sizeof (xRectangle), (char *) rects); Xfree((pointer)(rects)); return client->noClientException; } static int ProcShapeDispatch (client) register ClientPtr client; { register xReq *stuff = (xReq *)client->requestBuffer; switch (stuff->data) { case 0 : return ProcShapeQueryVersion (client); case 1 : return ProcShapeRectangles (client); case 2 : return ProcShapeMask (client); case 3 : return ProcShapeCombine (client); case 4 : return ProcShapeOffset (client); case 5 : return ProcShapeQueryExtents (client); case 6 : return ProcShapeSelectInput (client); case 7 : return ProcShapeInputSelected (client); case 8 : return ProcShapeGetRectangles (client); default: return 1; } } static void SShapeNotifyEvent(from, to) xShapeNotifyEvent *from, *to; { to->type = from->type; to->kind = from->kind; { ((char *)&(to->window))[0] = ((char *) &(from->window))[3]; ((char *)&(to->window))[1] = ((char *) &(from->window))[2]; ((char *)&(to->window))[2] = ((char *) &(from->window))[1]; ((char *)&(to->window))[3] = ((char *) &(from->window))[0]; }; { ((char *) &(to->sequenceNumber))[0] = ((char *) &(from->sequenceNumber))[1]; ((char *) &(to->sequenceNumber))[1] = ((char *) &(from->sequenceNumber))[0]; }; { ((char *) &(to->x))[0] = ((char *) &(from->x))[1]; ((char *) &(to->x))[1] = ((char *) &(from->x))[0]; }; { ((char *) &(to->y))[0] = ((char *) &(from->y))[1]; ((char *) &(to->y))[1] = ((char *) &(from->y))[0]; }; { ((char *) &(to->width))[0] = ((char *) &(from->width))[1]; ((char *) &(to->width))[1] = ((char *) &(from->width))[0]; }; { ((char *) &(to->height))[0] = ((char *) &(from->height))[1]; ((char *) &(to->height))[1] = ((char *) &(from->height))[0]; }; { ((char *)&(to->time))[0] = ((char *) &(from->time))[3]; ((char *)&(to->time))[1] = ((char *) &(from->time))[2]; ((char *)&(to->time))[2] = ((char *) &(from->time))[1]; ((char *)&(to->time))[3] = ((char *) &(from->time))[0]; }; to->shaped = from->shaped; } static int SProcShapeQueryVersion (client) register ClientPtr client; { register int n; register xShapeQueryVersionReq *stuff = (xShapeQueryVersionReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; return ProcShapeQueryVersion (client); } static int SProcShapeRectangles (client) register ClientPtr client; { register char n; register xShapeRectanglesReq *stuff = (xShapeRectanglesReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeRectanglesReq) >> 2) > client->req_len ) return(16); {n = ((char *) (&stuff->dest))[0]; ((char *) (&stuff->dest))[0] = ((char *) (&stuff->dest))[3]; ((char *) (&stuff->dest))[3] = n;n = ((char *) (&stuff->dest))[1]; ((char *) (&stuff->dest))[1] = ((char *) (&stuff->dest))[2]; ((char *) (&stuff->dest))[2] = n; }; {n = ((char *) (&stuff->xOff))[0]; ((char *) (&stuff->xOff))[0] = ((char *) (&stuff->xOff))[1]; ((char *) (&stuff->xOff))[1] = n; }; {n = ((char *) (&stuff->yOff))[0]; ((char *) (&stuff->yOff))[0] = ((char *) (&stuff->yOff))[1]; ((char *) (&stuff->yOff))[1] = n; }; SwapShorts((short *)(stuff + 1),((client->req_len << 1) - (sizeof(* stuff) >> 1))); return ProcShapeRectangles (client); } static int SProcShapeMask (client) register ClientPtr client; { register char n; register xShapeMaskReq *stuff = (xShapeMaskReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeMaskReq) >> 2) != client->req_len) return(16); {n = ((char *) (&stuff->dest))[0]; ((char *) (&stuff->dest))[0] = ((char *) (&stuff->dest))[3]; ((char *) (&stuff->dest))[3] = n;n = ((char *) (&stuff->dest))[1]; ((char *) (&stuff->dest))[1] = ((char *) (&stuff->dest))[2]; ((char *) (&stuff->dest))[2] = n; }; {n = ((char *) (&stuff->xOff))[0]; ((char *) (&stuff->xOff))[0] = ((char *) (&stuff->xOff))[1]; ((char *) (&stuff->xOff))[1] = n; }; {n = ((char *) (&stuff->yOff))[0]; ((char *) (&stuff->yOff))[0] = ((char *) (&stuff->yOff))[1]; ((char *) (&stuff->yOff))[1] = n; }; {n = ((char *) (&stuff->src))[0]; ((char *) (&stuff->src))[0] = ((char *) (&stuff->src))[3]; ((char *) (&stuff->src))[3] = n;n = ((char *) (&stuff->src))[1]; ((char *) (&stuff->src))[1] = ((char *) (&stuff->src))[2]; ((char *) (&stuff->src))[2] = n; }; return ProcShapeMask (client); } static int SProcShapeCombine (client) register ClientPtr client; { register char n; register xShapeCombineReq *stuff = (xShapeCombineReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeCombineReq) >> 2) != client->req_len) return(16); {n = ((char *) (&stuff->dest))[0]; ((char *) (&stuff->dest))[0] = ((char *) (&stuff->dest))[3]; ((char *) (&stuff->dest))[3] = n;n = ((char *) (&stuff->dest))[1]; ((char *) (&stuff->dest))[1] = ((char *) (&stuff->dest))[2]; ((char *) (&stuff->dest))[2] = n; }; {n = ((char *) (&stuff->xOff))[0]; ((char *) (&stuff->xOff))[0] = ((char *) (&stuff->xOff))[1]; ((char *) (&stuff->xOff))[1] = n; }; {n = ((char *) (&stuff->yOff))[0]; ((char *) (&stuff->yOff))[0] = ((char *) (&stuff->yOff))[1]; ((char *) (&stuff->yOff))[1] = n; }; {n = ((char *) (&stuff->src))[0]; ((char *) (&stuff->src))[0] = ((char *) (&stuff->src))[3]; ((char *) (&stuff->src))[3] = n;n = ((char *) (&stuff->src))[1]; ((char *) (&stuff->src))[1] = ((char *) (&stuff->src))[2]; ((char *) (&stuff->src))[2] = n; }; return ProcShapeCombine (client); } static int SProcShapeOffset (client) register ClientPtr client; { register char n; register xShapeOffsetReq *stuff = (xShapeOffsetReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeOffsetReq) >> 2) != client->req_len) return(16); {n = ((char *) (&stuff->dest))[0]; ((char *) (&stuff->dest))[0] = ((char *) (&stuff->dest))[3]; ((char *) (&stuff->dest))[3] = n;n = ((char *) (&stuff->dest))[1]; ((char *) (&stuff->dest))[1] = ((char *) (&stuff->dest))[2]; ((char *) (&stuff->dest))[2] = n; }; {n = ((char *) (&stuff->xOff))[0]; ((char *) (&stuff->xOff))[0] = ((char *) (&stuff->xOff))[1]; ((char *) (&stuff->xOff))[1] = n; }; {n = ((char *) (&stuff->yOff))[0]; ((char *) (&stuff->yOff))[0] = ((char *) (&stuff->yOff))[1]; ((char *) (&stuff->yOff))[1] = n; }; return ProcShapeOffset (client); } static int SProcShapeQueryExtents (client) register ClientPtr client; { register char n; register xShapeQueryExtentsReq *stuff = (xShapeQueryExtentsReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeQueryExtentsReq) >> 2) != client->req_len) return(16); {n = ((char *) (&stuff->window))[0]; ((char *) (&stuff->window))[0] = ((char *) (&stuff->window))[3]; ((char *) (&stuff->window))[3] = n;n = ((char *) (&stuff->window))[1]; ((char *) (&stuff->window))[1] = ((char *) (&stuff->window))[2]; ((char *) (&stuff->window))[2] = n; }; return ProcShapeQueryExtents (client); } static int SProcShapeSelectInput (client) register ClientPtr client; { register char n; register xShapeSelectInputReq *stuff = (xShapeSelectInputReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeSelectInputReq) >> 2) != client->req_len) return(16); {n = ((char *) (&stuff->window))[0]; ((char *) (&stuff->window))[0] = ((char *) (&stuff->window))[3]; ((char *) (&stuff->window))[3] = n;n = ((char *) (&stuff->window))[1]; ((char *) (&stuff->window))[1] = ((char *) (&stuff->window))[2]; ((char *) (&stuff->window))[2] = n; }; return ProcShapeSelectInput (client); } static int SProcShapeInputSelected (client) register ClientPtr client; { register int n; register xShapeInputSelectedReq *stuff = (xShapeInputSelectedReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeInputSelectedReq) >> 2) != client->req_len) return(16); {n = ((char *) (&stuff->window))[0]; ((char *) (&stuff->window))[0] = ((char *) (&stuff->window))[3]; ((char *) (&stuff->window))[3] = n;n = ((char *) (&stuff->window))[1]; ((char *) (&stuff->window))[1] = ((char *) (&stuff->window))[2]; ((char *) (&stuff->window))[2] = n; }; return ProcShapeInputSelected (client); } static int SProcShapeGetRectangles (client) register ClientPtr client; { register xShapeGetRectanglesReq *stuff = (xShapeGetRectanglesReq *)client->requestBuffer; register char n; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&stuff->length))[1] = n; }; if ((sizeof(xShapeGetRectanglesReq) >> 2) != client->req_len) return(16); {n = ((char *) (&stuff->window))[0]; ((char *) (&stuff->window))[0] = ((char *) (&stuff->window))[3]; ((char *) (&stuff->window))[3] = n;n = ((char *) (&stuff->window))[1]; ((char *) (&stuff->window))[1] = ((char *) (&stuff->window))[2]; ((char *) (&stuff->window))[2] = n; }; return ProcShapeGetRectangles (client); } static int SProcShapeDispatch (client) register ClientPtr client; { register xReq *stuff = (xReq *)client->requestBuffer; switch (stuff->data) { case 0 : return SProcShapeQueryVersion (client); case 1 : return SProcShapeRectangles (client); case 2 : return SProcShapeMask (client); case 3 : return SProcShapeCombine (client); case 4 : return SProcShapeOffset (client); case 5 : return SProcShapeQueryExtents (client); case 6 : return SProcShapeSelectInput (client); case 7 : return SProcShapeInputSelected (client); case 8 : return SProcShapeGetRectangles (client); default: return 1; } } static int ProcShapeDispatch (client) register ClientPtr client; { register xReq *stuff = (xReq *)client->requestBuffer; switch (stuff->data) { case 0 : return ProcShapeQueryVersion (client); case 1 : return ProcShapeReold_contrib//sieve.c�������������������������������������������������������������������������������� 664 � 0 � 0 � 2754 11411736623 13100�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������sys��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sieve: doug's sieve in C - pietro gagliardi (4 jun 2008) sieve [n] prints n prime numbers, default 100 */ #include <u.h> #include <libc.h> #include <thread.h> #define STACKSIZE 1024 int mainstacksize = STACKSIZE; typedef struct FilterArg FilterArg; struct FilterArg { ulong prime; Channel *listen, *send; }; void counter(void *arg) { Channel *c = (Channel *) arg; ulong i; for (i = 2; ; i++) sendul(c, i); } void filter(void *a) { FilterArg *arg = (FilterArg *) a; ulong i; for (;;) { i = recvul(arg->listen); if (i % arg->prime) sendul(arg->send, i); } } FilterArg *mkfargs(ulong p, Channel *l, Channel *s) { FilterArg *t; t = (FilterArg *) malloc(sizeof (FilterArg)); if (t == nil) sysfatal("memory exhausted: %r"); t->prime = p; t->listen = l; t->send = s; return t; } void sieve(void *arg) { Channel *prime = (Channel *) arg; Channel *c, *newc; ulong p; c = chancreate(sizeof (ulong), 1); threadcreate(counter, c, STACKSIZE); for (;;) { sendul(prime, p = recvul(c)); newc = chancreate(sizeof (ulong), 1); threadcreate(filter, mkfargs(p, c, newc), STACKSIZE); c = newc; } } void threadmain(int argc, char **argv) { Channel *prime; ulong n = 100, i; if (argc > 2) { fprint(2, "usage: %s [n]\n", argv[0]); threadexitsall("usage"); } else if (argc == 2) n = strtoul(argv[1], nil, 10); prime = chancreate(sizeof (ulong), 1); threadcreate(sieve, prime, STACKSIZE); for (i = 0; i < n; i++) print("%d\n", recvul(prime)); threadexitsall(0); } (client); } staticold_contrib//transpose.c���������������������������������������������������������������������������� 664 � 0 � 0 � 12446 11411736623 14022�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������sys��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <u.h> #include <libc.h> #include <draw.h> #include <memdraw.h> /* June 8-11, 2008 */ enum{ DESCEND, ASCEND, VERTICAL, HORIZONTAL, CLOCKWISE, COUNTER, UPSIDEDOWN, IDENTITY }; Memimage * dtranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(Rect(rin.min.x, rin.min.y, rin.max.y, rin.max.x), in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(y, x)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * atranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(Rect(rin.min.x, rin.min.y, rin.max.y, rin.max.x), in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(rin.max.y - y - 1, rin.max.x - x - 1)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * vtranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(rin, in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(rin.max.x - x - 1, y)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * htranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(rin, in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(x, rin.max.y - y - 1)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * rtranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(Rect(rin.min.x, rin.min.y, rin.max.y, rin.max.x), in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(rin.max.y - y - 1, x)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * ltranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(Rect(rin.min.x, rin.min.y, rin.max.y, rin.max.x), in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(y, rin.max.x - x - 1)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * utranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(rin, in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(rin.max.x - x - 1, rin.max.y - y - 1)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * itranspose(Memimage *in) { Memimage *out; Rectangle rin; int x, y; rin = in->r; out = allocmemimage(rin, in->chan); if(out == nil) sysfatal("memory exhausted: %r"); for(y = rin.min.y; y < rin.max.y; y++) for(x = rin.min.x; x < rin.max.x; x++) *byteaddr(out, Pt(x, y)) = *byteaddr(in, Pt(x, y)); return out; } Memimage * reorigin(Memimage *m, int ox, int oy) { Rectangle inr, outr; Memimage *new; int x, y, x2, y2; inr = m->r; if(ox == inr.min.x && oy == inr.min.y) return m; outr = Rect(ox, oy, inr.max.x, inr.max.y); if(ox > inr.min.x) outr.max.x += ox; else outr.max.x -= ox; if(oy > inr.min.y) outr.max.y += oy; else outr.max.y -= oy; new = allocmemimage(outr, m->chan); if(new == nil) sysfatal("memory exhausted: %r"); for(y = inr.min.y, y2 = outr.min.y; y < inr.max.y; y++, y2++) for(x = inr.min.x, x2 = outr.min.x; x < inr.max.x; x++, x2++) *byteaddr(new, Pt(x2, y2)) = *byteaddr(m, Pt(x, y)); free(m); return new; } void usage(void) { fprint(2, "usage: %s [-vhadrlui] [-o x y] [infile]\n", argv0); exits("usage"); } void main(int argc, char *argv[]) { Memimage *in, *out; int fd; int mode = DESCEND; char *ostr = nil, *oargs[2]; int ox, oy; ARGBEGIN{ case 'd': mode = DESCEND; break; case 'a': mode = ASCEND; break; case 'v': mode = VERTICAL; break; case 'h': mode = HORIZONTAL; break; case 'r': mode = CLOCKWISE; break; case 'l': mode = COUNTER; break; case 'u': mode = UPSIDEDOWN; break; case 'i': mode = IDENTITY; break; case 'o': ostr = EARGF(usage()); if(tokenize(ostr, oargs, 2) != 2) usage(); ox = atoi(oargs[0]); oy = atoi(oargs[1]); break; default: usage(); }ARGEND memimageinit(); if(argc == 1){ fd = open(argv[0], OREAD); if(fd < 1) sysfatal("open: %r"); in = readmemimage(fd); close(fd); }else in = readmemimage(0); if(in == nil) sysfatal("memory exhausted: %r"); if(ostr == nil){ ox = in->r.min.x; oy = in->r.min.y; } switch(mode){ case DESCEND: out = dtranspose(in); break; case ASCEND: out = atranspose(in); break; case VERTICAL: out = vtranspose(in); break; case HORIZONTAL: out = htranspose(in); break; case CLOCKWISE: out = rtranspose(in); break; case COUNTER: out = ltranspose(in); break; case UPSIDEDOWN: out = utranspose(in); break; case IDENTITY: out = itranspose(in); break; default: sysfatal("wrong mode - huh?"); } out = reorigin(out, ox, oy); writememimage(1, out); freememimage(in); freememimage(out); exits(0); } int n; register xShapeInputSelectedReq *stuff = (xShapeInputSelectedReq *)client->requestBuffer; {n = ((char *) (&stuff->length))[0]; ((char *) (&stuff->length))[0] = ((char *) (&stuff->length))[1]; ((char *) (&sREADME���������������������������������������������������������������������������������������������� 664 � 0 � 0 � 1013 11411741713 10103�������������������������������������������������������������������������������������������������������ustar�00pietro��������������������������sys��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������After a hiatus, I am returning to the Plan 9 community. I have decided to archive my old contributions over to an old_contrib folder in this directory, keeping the mv.pdf and my (still WIP) programming tutorial intact here and removing the infernovol1 and vol2 files (which were just compilations of the Inferno man pages and Plan 9 /sys/doc documents into single files, and may have since become outdated). In the future, I will populate this space with new projects and useful (to some, perhaps) files. Pietro Gagliardi ] = ((char *) (&stuff->window))[2]; ((char *) (&stuff->window))[2] = n; }; return ProcShapeGetRectangles (client); } static int SProcShapeDispatch (client) register ClientPtr client; { register xReq *stuff = (xReq *)client->requestBuffer; switch (stuff->data) { case 0 : return SProcShapeQueryVersion (client); case 1 : return SProcShapeRectangles (client); case 2 : return SProcShapeMask (client); case 3 : return SProcShapeCombine (client); case 4 : return SPr����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������