tugboat - tex · tugboat volume21,number3/ september2000 2000annualmeetingproceedings 155...

163
TUGBOAT Volume21,Number3 / September 2000 2000 Annual Meeting Proceedings 155 Robin Fairbairns / Editorial Comments — TUG ’2000 157 TUG’2000 Program Talks 159 Benjamin Bayart / The description language chosen for FDNT E X 176 Barbara Beeton / Unicode and math, a combination whose time has come — Finally! 186 Alexander Berdnikov, Yury Yarmola, Olga Lapko, and Andrew Janishewsky / Some experience in converting LH Fonts from METAFONT to Type1 format [Abstract] 187 W lodek Bzyl / Typesetting T E X documents containing computer code 193 David Carlisle / xmltex: A non validating (and not 100% conforming) namespace aware XML parser implemented in T E X 200 Donald DeLand / Developing interactive, Web-based courseware [Abstract] 201 Michael Downes / The amsrefs L A T E X package and the amsxport Bib T E X style 210 Jonathan Fine / Line breaking and page breaking 222 Michel Goossens and Sebastian Rahtz / PassiveT E X: from XML to PDF 235 Pedro Palao Gostanza / Fast scanners and self-parsing in T E X 243 Hirotsugu Kakugawa / A device-independent DVI interpreter library for various output devices 250 M. Y. Kolodin, O. V. Eterevksy, O. G. Lapko, and I. A. Makhovaya / “Russian style” with L A T E X and babel: what does it look like and how does it work 251 Alex Kostin & Michael Vulis / Mixing TeX & PostScript: The G E X model 265 Michel Lavaud / The AsT E X Assistant and Navigator [Abstract] 266 Bernice Sacks Lipkin / L A T E X and the personal database 278 Frank Mittelbach / Formatting documents with floats: A new algorithm for L A T E X2 ε 291 Timothy Murphy / The Penrose notation: a L A T E X challenge [Abstract] 298 Marina Yu. Nikulina and Alexander S. Berdnikov / Chess macros for chess games and puzzles 303 John Plaice / Omega version 2 [Abstract] 292 Apostolos Syropoulos and Richard W. D. Nickalls / A Perl port of the mathsPIC graphics package 304 Philip Taylor and Jiˇ ı Zlatuˇ ska / The N T S project: from conception to birth [Abstract] News & Announcements 306 Calendar 154 TUG’2001 Announcement 305 Miscellaneous Photos TUG Business 308 TUG ’2000 Attendees 307 Institutional members 310 TUG membership application Advertisements 311 T E X consulting and production services 312 IBM techexplorer cover 3 Blue Sky Research

Upload: others

Post on 14-Jul-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

TUGBOAT

Volume 21, Number 3 / September 20002000 Annual Meeting Proceedings

155 Robin Fairbairns / Editorial Comments —TUG ’2000

157 TUG ’2000 Program

Talks 159 Benjamin Bayart / The description language chosen for FDNTEX

176 Barbara Beeton / Unicode and math, a combination whose time has come—

Finally!

186 Alexander Berdnikov, Yury Yarmola, Olga Lapko, and Andrew Janishewsky /

Some experience in converting LH Fonts from METAFONT to Type1

format [Abstract]

187 W6lodek Bzyl / Typesetting TEX documents containing computer code

193 David Carlisle / xmltex: A non validating (and not 100% conforming)

namespace aware XML parser implemented in TEX

200 Donald DeLand / Developing interactive, Web-based courseware [Abstract]

201 Michael Downes / The amsrefs LATEX package and the amsxport BibTEX style

210 Jonathan Fine / Line breaking and page breaking

222 Michel Goossens and Sebastian Rahtz / PassiveTEX: from XML to PDF

235 Pedro Palao Gostanza / Fast scanners and self-parsing in TEX

243 Hirotsugu Kakugawa / A device-independent DVI interpreter library for various

output devices

250 M. Y. Kolodin, O. V. Eterevksy, O. G. Lapko, and I. A. Makhovaya /

“Russian style” with LATEX and babel: what does it look like and

how does it work

251 Alex Kostin & Michael Vulis / Mixing TeX & PostScript: The GEX model

265 Michel Lavaud / The AsTEX Assistant and Navigator [Abstract]

266 Bernice Sacks Lipkin / LATEX and the personal database

278 Frank Mittelbach / Formatting documents with floats: A new algorithm for

LATEX2ε

291 Timothy Murphy / The Penrose notation: a LATEX challenge [Abstract]

298 Marina Yu. Nikulina and Alexander S. Berdnikov / Chess macros for chess

games and puzzles

303 John Plaice / Omega version 2 [Abstract]

292 Apostolos Syropoulos and Richard W. D. Nickalls / A Perl port of the mathsPIC

graphics package

304 Philip Taylor and Jirı Zlatuska / The NT S project: from conception

to birth [Abstract]

News &

Announcements

306 Calendar

154 TUG’2001 Announcement

305 Miscellaneous Photos

TUG Business 308 TUG ’2000 Attendees

307 Institutional members

310 TUG membership application

Advertisements 311 TEX consulting and production services

312 IBM techexplorer

cover 3 Blue Sky Research

Page 2: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

TEX Users Group

Memberships and Subscriptions

TUGboat (ISSN 0896-3207) is published quarterlyby the TEX Users Group, 1466 NW Naito Parkway,Suite 3141, Portland, OR 97209-2820, U.S.A.

2000 dues for individual members are as follows:Ordinary members: $75.Students: $45.

Membership in the TEX Users Group is for thecalendar year, and includes all issues of TUGboat

for the year in which membership begins or isrenewed. Individual membership is open only tonamed individuals, and carries with it such rightsand responsibilities as voting in TUG elections. Amembership form is provided on page 000.

TUGboat subscriptions are available to organi-zations and others wishing to receive TUGboat in aname other than that of an individual. Subscriptionrates: $85 a year, including air mail delivery.

Periodical-class postage paid at Portland, OR,and additional mailing offices. Postmaster: Sendaddress changes to TUGboat, TEX Users Group,1466 NW Naito Parkway, Suite 3141, Portland, OR97209-2820, U.S.A.

Institutional Membership

Institutional Membership is a means of showingcontinuing interest in and support for both TEXand the TEX Users Group. For further information,contact the TUG office ([email protected]).

TUGboat c© Copyright 2000, TEX Users GroupPermission is granted to make and distribute verbatim

copies of this publication or of individual items from this

publication provided the copyright notice and this permission

notice are preserved on all copies.Permission is granted to copy and distribute modified

versions of this publication or of individual items from

this publication under the conditions for verbatim copying,provided that the entire resulting derived work is distributed

under the terms of a permission notice identical to this one.

permission is granted to copy and distribute transla-tions of this publication or of individual items from this

publication into another language, under the above condi-tions for modified versions, except that this permission notice

may be included in translations approved by the TEX UsersGroup instead of in the original English.

Copyright to individual articles is retained by theauthors.

Printed in U.S.A.

Board of Directors

Donald Knuth, Grand Wizard of TEX-arcana†

Mimi Jett, President∗+

Kristoffer Rose∗+, Vice President

Don DeLand∗+, Treasurer

Arthur Ogawa∗+, Secretary

Barbara BeetonKarl BerryKaja ChristiansenSusan DeMerittStephanie HogueJudy Johnson+

Ross MoorePatricia MonohonCheryl PonchinPetr SojkaPhilip TaylorRaymond Goucher, Founding Executive Director †

Hermann Zapf, Wizard of Fonts†

∗member of executive committee+member of business committee†honorary

Addresses

General correspondence,payments, etc.

TEX Users GroupP. O. Box 2311Portland, OR 97208-2311U.S.A.

Delivery services,parcels, visitors

TEX Users Group1466 NW Naito ParkwaySuite 3141Portland, OR 97209-2820U.S.A.

Telephone

+1 503 223-9994

Fax

+1 503 223-3960

Electronic Mail

(Internet)

General correspondence,membership, subscriptions:[email protected]

Submissions to TUGboat,letters to the Editor:[email protected]

Technical support forTEX users:[email protected]

To contact theBoard of Directors:[email protected]

World Wide Web

http://www.tug.org/

http://www.tug.org/TUGboat/

Problems not resolved?

The TUG Board wants to hear from you:Please email to [email protected]

TEX is a trademark of the American MathematicalSociety.

Page 3: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

2000

Nov 13 –Jan 6

Gutenberg exhibit, including workingreplica of his original printing press,Louisville Free Public Library,Louisville, Kentucky.

2001

Feb 28 –Mar 3

DANTE 2001, 24th meeting,Fachhochschule Rosenheim,Germany. For information, visithttp://www.dante.de/dante2001/.

Mar 26 – 28 XML World Europe, Amsterdam,Netherlands. For information, visithttp://www.xmlworld.org/.

Apr 1 –Jun 15

The Best of the Best: A traveling juriedexhibition of books by members of theGuild of Book Workers. Ohio StateUniversity Library, Athens, Ohio.Sites and dates are listed at http://

palimpsest.stanford.edu/byorg/gbw.

Apr 9 – 13 Seybold Boston, Boston,Massachusetts. For information, visithttp://www.key3media.com/

seyboldseminars/boston2001/.

Apr 29 –May 2

BachoTEX 2001, 9th annual meeting ofthe Polish TEX Users’ Group(GUST), “Contemporary publishingTEXnology”, Bachotek, Brodnica LakeDistrict, Poland. For information, visithttp://www.gust.org.pl/BachoTeX/.

May 14 – 17 Congres GUTenberg 2001, “Le documentau XXIe Siecle”, Metz, France.For information, visit http://

www.gutenberg.eu.org/manif/gut2001/.

Jun 4 – 8 Rare Book School Summer Session,University of Virginia, Charlottesville,Virginia. A series of one-weekcourses on topics concerning rarebooks, manuscripts, the history ofbooks and printing, and specialcollections. For information, visithttp://www.virginia.edu/oldbooks.

0 TUGboat, Volume 21 (2000), No. 3

Calendar

Jun 6 – 8 Society for Scholarly Publishing,

23rd annual meeting, San Francisco,California. For information, visithttp://www.sspnet.org.

Jun 13 – 17 ACH/ALLC 2001: Joint InternationalConference of the Association forComputers and the Humanities, andAssociation for Literary and LinguisticComputing, New York University, NewYork. For information, visit http://

www.nyu.edu/its/humanities/ach_allc2001/.

Jul 6 –Aug 18

The Best of the Best: A travelingjuried exhibition of books by membersof the Guild of Book Workers.Columbia College Chicago Center forBook and Paper Arts, Chicago, Illinois.Sites and dates are listed at http://

palimpsest.stanford.edu/byorg/gbw.

Jul 13 – 15 TypeCon 2001, Rochester, New York.For information, visithttp://www.typecon2001.com.

Jul 16 –Aug 10

Rare Book School Summer Session,University of Virginia, Charlottesville,Virginia. A series of one-weekcourses on topics concerning rarebooks, manuscripts, the history ofbooks and printing, and specialcollections. For information, visithttp://www.virginia.edu/oldbooks.

TUG 2001

University of Delaware, Newark, Delaware.For information, visit http://www.tug.org/tug2001/.

Aug 6 – 10 Intermediate/Advanced LATEX trainingclass.

Aug 12 – 16 The 22nd annual meeting of the TEXUsers Group, “2001: A TEX Odyssey”.

Aug 12 – 17 Extreme Markup Languages 2001:“There’s Nothing so Practical as aGood Theory”, Montreal, Canada.For information, visithttp://www.gca.org.

Status as of 1 December 2000

For additional information on TUG-sponsored events listed above, contact the TUG office(+1 503 223-9994, fax: +1 503 223-3960, e-mail: [email protected]). For events sponsoredby other organizations, please use the contact address provided.

Additional type-related events and news items are listed in the Sans Serif Web pages,at http://www.quixote.com/serif/sans.

Page 4: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Aug 12 – 17 SIGGRAPH 2001, Los Angeles,California. For information, visithttp://www.siggraph.org/s2001/.

Sep 8 WDA’2001: First International Workshopon Web Document Analysis, Seattle,Washington. For information, visithttp://www.csc.liv.ac.uk/~wda2001.

Sep 10 –Oct 26

The Best of the Best: A travelingjuried exhibition of books bymembers of the Guild of BookWorkers. Dartmouth College,Hanover, New Hampshire. Sites anddates are listed at http://

palimpsest.stanford.edu/byorg/gbw.

Sep 17 – 20 XML World 2001, San Francisco,California. For information, visithttp://www.xmlworld.org/.

Sep 23 – 27 EuroTEX 2001, “TEX and Meta: theGood, the Bad and the Ugly Bits”,Kerkrade, Netherlands. For information,visit http://www.ntg.nl/eurotex/.

TUGboat, Volume 21 (2000), No. 3 1

Sep 29 29th Annual General Meeting of theDanish TEX Users Group (DK-TUG),Arhus, Denmark. For information, visithttp://sunsite.dk/dk-tug/.

Oct 24 – 26 4th International Conferenceon The Electronic Document,Toulouse, France. For information, visithttp://www.irit.fr/CIDE2001/.

Nov 5 –Dec 21:

The Best of the Best: A traveling juriedexhibition of books by members of theGuild of Book Workers. Smith College,Northampton, Massachusetts.Sites and dates are listed at http://

palimpsest.stanford.edu/byorg/gbw.

Nov 9 – 10 ASM Symposium on DocumentEngineering, Atlanta, Georgia.For information, visithttp://www.documentengineering.org.

Page 5: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

InstitutionalMembers

American Mathematical Society,Providence, Rhode Island

Center for Computing Services,Bowie, Maryland

CNRS - IDRIS,Orsay, France

College of William & Mary,Department of Computer Science,Williamsburg, Virginia

CSTUG, Praha, Czech Republic

Florida State University,Supercomputer ComputationsResearch, Tallahassee, Florida

Hong Kong University ofScience and Technology,Department of Computer Science,Hong Kong, China

IBM Corporation,T J Watson Research Center,Yorktown, New York

ICC Corporation,Portland, Oregon

Institute for Advanced Study,Princeton, New Jersey

Institute for Defense Analyses,Center for CommunicationsResearch, Princeton, New Jersey

Iowa State University,Computation Center,Ames, Iowa

Kluwer Academic Publishers,Dordrecht, The Netherlands

KTH Royal Institute ofTechnology, Stockholm, Sweden

Marquette University,Department of Mathematics,Statistics and Computer Science,Milwaukee, Wisconsin

Masaryk University,Faculty of Informatics,Brno, Czechoslovakia

Max Planck Institutfur Mathematik,Bonn, Germany

National Institute for Child& Human Development,Bethesda, Maryland

New York University,Academic Computing Facility,New York, New York

Princeton University,Department of Mathematics,Princeton, New Jersey

Space Telescope Science Institute,Baltimore, Maryland

Springer-Verlag Heidelberg,Heidelberg, Germany

Springer-Verlag New York, Inc.,New York, New York

0 TUGboat, Volume 21 (2000), No. 3

Stanford Linear AcceleratorCenter (SLAC),Stanford, California

Stanford University,Computer Science Department,Stanford, California

Stockholm University,Department of Mathematics,Stockholm, Sweden

University of Canterbury,Computer Services Centre,Christchurch, New Zealand

University College, Cork,Computer Centre,Cork, Ireland

University of Delaware,Computing and Network Services,Newark, Delaware

Universitat Koblenz–Landau,Fachbereich Informatik,Koblenz, Germany

University of Oslo,Institute of Informatics,Blindern, Oslo, Norway

Universita degli Studi di Trieste,Trieste, Italy

Vanderbilt University,Nashville, Tennessee

Vrije Universiteit,Amsterdam, The Netherlands

Page 6: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Information about these services can be obtained

from:

TEX Users Group

1466 NW Naito Parkway, Suite 3141

Portland, OR 97209-2820, U.S.A.

Phone: +1 503 223-9994

Fax: +1 503 223-3960

Email: [email protected]

URL: http://www.tug.org/

consultants.html

North America

Loew, Elizabeth

President, TEXniques, Inc.,675 Massachusetts Avenue, 6th Floor,Cambridge, MA 02139;(617) 876-2333; Fax: (781) 344-8158Email: [email protected]

Complete book and journal production in the areas of

mathematics, physics, engineering, and biology. Servicesinclude copyediting, layout, art sizing, preparation of

electronic figures; we keyboard from raw manuscript or

tweak TEX files.

Ogawa, Arthur

40453 Cherokee Oaks Drive,

Three Rivers, CA 93271-9743;

(209) 561-4585Email: [email protected]

Bookbuilding services, including design, copyedit, art,and composition; color is my speciality. Custom TEXmacros and LATEX2ε document classes and packages.Instruction, support, and consultation for workgroups andauthors. Application development in LATEX, TEX, SGML,PostScript, Java, and ßC++. Database and corporatepublishing. Extensive references.

0 TUGboat, Volume 21 (2000), No. 3

TEX Consulting & Production Services

Outside North America

DocuTEXing: TEX Typesetting Facility

43 Ibn Kotaiba Street,Nasr City, Cairo 11471, Egypt

+20 2 4034178; Fax: +20 2 4034178

Email: [email protected]

DocuTEXing provides high-quality TEX and LATEXtypesetting services to authors, editors, and publishers.

Our services extend from simple typesetting and technicalillustrations to full production of electronic journals. Formore information, samples, and references, please visit ourweb site: http://www.DocuTeXing.com or contact us bye-mail.

Page 7: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Editor’s notes

Robin Fairbairns

Computer Laboratory

University of Cambridge

UK

[email protected]

Oxford (and Cambridge)

Here, finally, we have the proceedings of TUG 2000:TUG’s annual meeting in Oxford (“the other place”).It may seem odd to have a Cambridge-based editorof an Oxford conference: but you may not under-stand why this would be remarkable, so I shall boreyou all with a little academic history (some of itdecidedly personal. . . ).

My decision, of which of the two “old” Englishuniversities1 to grace with my presence as a student,was made on the basis of deep academic consider-ation. Cambridge, when I first visited over the fi-nal weekend of the Cuban missile crisis in 1962, wasbeautiful under a frosty, clear sky; I spent two nightsat the home of a school friend, whose father was adon of long standing, and all was wonderful.

When I first visited Oxford in early 1963, theweather was foul —windy, wet and cold; I had hopedto spend time with a friend from school, but he hadleft town for the weekend. Over all the years since,I’ve never had the opportunity to “get the feel” ofthe city: on each visit I’ve either had no spare time,or the weather has been bad.

Which is all terribly . . . characteristic. The Uni-versity of Cambridge (in something approaching itspresent form) was probably established by dissidentOxford students getting on for eight hundred yearsago. Ever since, Cambridge people have been ex-

pected not to know about Oxford, and to despise allof Oxford’s doings. We’re supposed to despise theirstyle of poling their punts2, and to disparage theiracademic achievements. And vice versa.

I’ve never really believed in this silly caricature,so a week to get to know Oxford, based in the centreof the city, in weather as good as we get nowadays(with global warming apparently already upon usand bringing even more rain in our summers), wasa real treat.

1 There are other universities almost as venerable as Ox-

ford and Cambridge in these islands, but I didn’t know about

them in 19632 Which in fact are of a completely different design from

those we use in Cambridge, so would be poled differently

The meeting

We have to thank the local team (led by SebastianRahtz and Kim Roberts) for a splendidly run confer-ence. The college seemed to me ideal for the sort of“small” conference that TUG runs: compact enoughthat everyone could feel they were on top of thewhole event, and yet spacious enough that we couldspread out and feel comfortable. The social events(notably the reception in the University Museum)were splendid, and Kim’s arrangement for those thatwanted to go to an open-air dramatisation of Car-roll’s “Through the Looking Glass” was inspired (forthis member of the audience at least, despite less-than-ideal weather).

A strong cast presented an intriguing set of pa-pers, with meat for every taste in the TEX world.For me, the highlights were Mike Vulis on his VTEX/GEX system, discussion of the achievements and fu-ture of the PDFTEX and Omega projects, Don De-land’s demonstration of his interactive courseware,and (of course) Frank Mittelbach’s paper on direc-tions for the LATEX output routine (which was votedbest paper of the conference).

The papers

I took over preparation of these proceedings at alate stage, and from the start I experienced prob-lems. Neither I, nor the printers that Kim Robertshad chosen, could print one of the pages of Kostin& Vulis’ paper for the preprints: I don’t believeI’ve ever before seen conference proceedings with anapology for the absence of a page for that reason.

The papers that follow represent much of thebest in the conference, but there are sad omissions:none of DeLand’s presentation of his use of IBM’stechexplorer, the AsTEX, the PDFTEX or the Omegapresentations is here represented. TUGboat hopesto present a detailed account of PDFTEX in a fu-ture issue, but we can do little but hope for paperscovering the other topics.

The difficult papers Two papers presented par-ticular technical difficulties, since both of them de-manded use of the technology they described.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 155

Page 8: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Robin Fairbairns

Alex Kostin & Mike Vulis described VTEX, andtheir paper included demonstrations of the capabil-ities of VTEX/GEX. I suppose we could have fakedthe effects, but the simpler course seemed to be toinstall and use a copy of the free (Linux) versionof VTEX. The installation itself proved very sim-ple, but (as mentioned above) there were problemswith the output. VTEX produces its output of thepaper in PDF, and the problem with the outputwasn’t apparent in Adobe’s Acrobat Reader, merelywhen that program produced printer output. Inter-estingly, PostScript output of the troublesome pagealso defeated Adobe’s Acrobat Distiller, so that atthe time of the meeting I suspected a bug (that Icouldn’t at the time characterise) in the Acrobatsuite. The bug was in fact in VTEX’s failure to de-tect some infelicity in the data for one of the paper’sdiagrams, and has long since been corrected; thepreprint of the paper was an ordinary LATEX docu-ment that used a series of \includegraphics com-mands on images of the working pages of the paper,and had an apology in place of the rogue page. Thepaper presents itself in glorious TEXnicolour; whichyou can’t see in these proceedings, but which will bevisible when the paper appears on TUGboat’s website.

Frank Mittelbach described the outcome of ex-perimental work on the algorithms desirable for afuture version of LATEX: this is another in a longseries of papers on directions towards the mythicLATEX 3 and in most respects is the answer to the

average maiden’s prayer. However, the version Iworked with couldn’t deal with the (old LATEX) con-struct \twocolumn[〈stuff 〉], which is how the TUG-

boat class creates paper titles in a proceedings issue.So after much agonising, we have decided to set thepaper with the title set separately, so as to demon-strate that the code he describes “works” (in so faras it does!).

Regrets

I need hardly repeat that I’m deeply ashamed athow long it has taken me to produce these proceed-ings: even now they wouldn’t be with you had it notbeen for editing support from Barbara Beeton andthe continuing sterling work done by Mimi Burbankbehind the scenes. (In particular, Mimi’s taken onthe role of “Robin’s conscience”, prodding me ev-ery so often on the necessity of getting on with it!)The time since the meeting has been very full (I’vemoved house, for example), but the delays have, Iadmit, been mostly of my own making.

Several of the presentations at the conferencehave not resulted in papers in these proceedings (weprint the pre-conference abstracts in these cases).Most of the presentations are sorry omissions fromthese proceedings, but we will perhaps pick up mat-ter to publish in future editions of TUGboat. Thelack of the papers comes as an awful warning to usall: we must attend the annual meetings to keepup with what is going on with TEX and its relatedtechnologies.

156 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 9: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Programme, TUG2000

TUG 2000

Programme of events

Sunday, August 13, 2000

Mimi Jett, President of TUG

The Tao of TEX

Barbara Beeton

Unicode and math, a combination whose time has come — Finally!

Frank Mittelbach

Formatting documents with floats: A new algorithm for LATEX2ε

Phil Taylor

NTS Report

Jonathan Fine

Line breaking and page breaking

Monday, August 14, 2000

Benjamin Bayart

The description language chosen for FDNTEX

Michel Lavaud

The AsTEX Assistant and Navigator

Hirotsugu Kakugawa

A device-independent DVI interpreter library for various output devices

Donald DeLand

Developing Interactive, Web-based Courseware

Alexander Berdnikov

Some experience in converting LH Fonts from METAFONT to Type1 format

Michael Vulis

Mixing TEX & PostScript: The GEX model

Tuesday, August 15, 2000

Hans Hagen

What is PDF?

Sebastian Rahtz

The history of pdfTEX

Erik Frambach

Fonts in pdfTEX

Han The Thanh

How pdfTEX can improve your pages

Hans Hagen

Graphics in pdfTEX

Ed Cashin

pdfTEX in a workflow

Hans Hagen

Going beyond static documents

Ed Cashin

Setting up pdfTEX

Berend de Boer

Postprocessing PDF

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 157

Page 10: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Programme, TUG2000

Han The Thanh

The future of pdfTEX

TUG Annual General Meeting

John Plaice

Omega version 2

Wednesday, August 16, 2000

Pedro Palao Gostanza

Fast scanners and self-parsing in TEX

W lodek Bzyl

Typesetting TEX documents containing computer code

Timothy Murphy

The Penrose notation: a LATEX challenge

David Carlisle

xmltex: A non validating (and not 100% conforming) namespace aware XML parserimplemented in TEX

Sebastian Rahtz and Michel Goossens

PassiveTEX: XSL processing using TEX

Bernice Sacks Lipkin

LATEX and the personal database

Michael Downes

The amsrefs LATEX package and the amsxport BibTEX style

Alexander Berdnikov

Chess fonts and chess macros for chess games and puzzles

Olga Lapko

“Russian style” with LATEX and Babel: what does it look like and how does it work

Dick Nickalls and Apostolos Syropoulos

A Perl port of the mathsPIC graphics package

Thursday, August 17, 2000

Tutorials

John Plaice

Omega Tutorial

Hans Hagen, et al.

ConTeXt and PDF Tutorial

Friday, August 18, 2000

Tutorials

Frank Mittelbach et al.

LATEX3 Tutorial

Sebastian Rahtz and Michel Goossens

XML and XSL Tutorial

158 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 11: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

♥♠♥ ②rt r r♦ss♥t Prsr♥②rtr♥r

strt

♥ ts ♣♣r ♥tr♦ t ♣ sr♣t♦♥ ♥ tt s ♥ ♦s♥ t♦ s ♥ ❳ ♥ s♦rt ts ♥ s ❳ t t rst ♥tr♦ ❳ t♦ ♦t♥ ♦♦ r♣rs♥tt♦♥ ♦ ts rqr♠♥ts♥ ♥tr♦ t t tt t♦ ♦♥t♥ ♥ t sr♣t♦♥ s♥② ♥tr♦ r② t ts

s ♣♣r s t♦ ♥rst♦♦ ♦r t t s rst t♦ts ♦♥ ♦ t♦♦t♥ t rt ♥ ❲t s t♦ ①♣rss ② ts ♥ s s♦♠t♥♥t t t ts s ♥ ♥ r② st ♦♣♠♥t t t t♠ ♦ rt♥s t ♦s sr ♥ t rsts st♦♥s ♥ t sr tr r♥ ♦♥t ♦♥sr t s r♦♥

❱♦r②

♦r ♣ s t sr ♠♥♥s ♥ ts ♣♣r ts ♥ tr♦s♦♠ ♥ rt♥♣s ♣ ♥ ♣♥♥ ♦♥ t ♦♥t①t

• ❳ st② rr②st②

• ♣rt ♦ t strt♦♥ t ♣ ♦♥t♥♥ ❳ ts ♦r t ♦♥ ♦♥t♥♥ Ω

• ♥r② rs♦♥ ♥ ♥ ♦r ♦ t ♣r♦s ♦♥ t r♣♠ ♦♥t♥♥ Ω ♦r❳

ts s♦♠t♠s r t♦ st♥s t♥ t tr♠♥♥s s♥ t② ♦t♥ r♣rs♥t tr sts ♥t ♦ t s♠ ♦t rr② s ♣♥ t rst ♠♥♥ s ♥② ❳ sr ♥♦s s s♦ ♣ ♦r♥ t♦ t s♦♥ ♠♥♥ s♥❳ s sr♣t♦♥ ♦ t t ♣♥♥s♠t♦s t♦ ♥ ♥st t ♥ s♦ ♦♥ ♥ s♦ ♣ ♥ t tr ♠♥♥ s♥ tr♣♠ ♦r ♦ t strt♦♥ ♦♥t♥ ♥ r♣♠

♣ rr②❳ s s♥ t♦ ①st ♥r sr r

s♦♥s ♦♥ ♦r r ♦♥ ♦r ♥①P♦♥ ♦r ♥①♥ ♦♥ ♦r P❯❳ ♥ s♦ ♦♥♦s rs♦♥s ♥♠ ♦rs ♥ ts ♣♣r t♦ ♦ ♦♥s♥ t rr t♥ rs♦♥s♦ ❳ ♥ rs♦♥s ♦ t ♣s tt r♣rt ♦ t

♦r♥ t♦ t ♦♥t①t rr tr t♦t t♦r ♦r t♦ ♥ ②♣♦tt srs t♦ts

♥tr♦t♦♥

❳ s ♥ strt♦♥ ♦ ❳ s ♣♦♥r♥t s r♦♠ t ♣r♦s ♦♥s

♦r t❳ ♣♣r ❳ strt♦♥s t♦ ♣r strt♦♥ ♦ ❳ t ♣r♦r♠ ♥ t strt② rqr s t♦ t ♥♠ t ♦r ♥ st♥♦♥ ② ♥② ♦tr t♦♦s ♦♥ts ♦r ♦r♠ts ♦r ①t♥s♦♥s t♦ ♥st ② ♥

♥ t❳ ♣♣r ♥ ♠♦rsrr♥② ♦r ♦♥ ♥ ♥st t ♦ t♥♥ ♦t♥ rtr ♦♠♣t ❳s s②st♠ ♥♥ ❳ ♥ ♦ts ♦ s ①t♥s♦♥s

t ♦♥ ♦♥ strt ♥ t s♠ ② s t♦ r② ② s②st♠ ♣r♦♥ ♥② ♦♥t s② ♣♥s ♦♥ts t♦ ♥② sr ♥ ss♥s♣♥ ♦♥s s strt♥ ♥rs♠②ts s②st♠ ♦ t ♥ sss ♦r ♥♥sr

♦ ♦ ts ♣r♦♠ t♦ ②s ♥ strstrt strt♦♥s t♦ ♦♦ sst ♦ t s ♣♦ss ♥ ♦♣ srs sss ♥ ♥st♥t ♠ss♥ ♣rts ② t♠ss ♦r s r♥t♣♣r♦ ♦ t strt♦♥ ♣r♦♠ ❳ s♥ tt♠♣t t♦ t s♦♥ s♦t♦♥

s s ♥r②♥ ❳ s♥ rr② sr s ♦♦

• ② ♠♦r ♥ ♥ r♥ ♦♥t ♥t

t♦ s ♣t♥ ts ♦♥t ♥st t

• s② t♦ ♣r ♣rt t♦t r♥st♥ t♦ t♥ ♣r ♠② ❳ r♥ r②

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 12: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

s① ♠♦♥ts ♦r s♦ ♥ ♦♥t ♥t t♦ ♥

♠② ♦♠♣tr ♦r♥ ♦♥ts tt ♦t♥

• s② t♦ ♥st ♦♥ t trt s②st♠ s

strt♦♥ ♥st ♦ t r♦♦ts♦r ts st

s ♦♥t ♥t t♦ ♥st sss ♦♠

♣r

♦r♥ s ♥ s♠♣r ❲ s❳ ♥ t ♥ t♠ ♦ ♦r ♠♥strt ♣r♣♦ss ♥ ts ♥ t♦ t♥st ♦♥ ♦r ♦♠♣trs ♥ stst♦r② ②♦st ♦ s r ♥♦t ♦♦ t s♥ ❳ ♦ts ♦ts rstrt s ♥ t ♠ t ♦♥② ♦♥ ♥t t♠ ♦ ♥♦s ♦t t ♥tr♥s ♦ ❳t❳ ♥t ♦♥t♥ t ♣s ♥ s strt ♦♣♥ ❳ strt♦♥ tt ♦sts② t♦s rqr♠♥ts ♥ ts s s♦ ② tsstrt♦♥ s ❳ ♦r♥② t s ❳ strt♦♥ t♦ s ②

ts ♦♦ t s♦♠ ♥strt ①♠♣st♦ ♠♦r ♣rs ♦ t s st♥♥ ♥ t♦s tr s♠♣ s

② ♠♦r ② stt♥ tt ❳ s t♦ ♠♦r sr ♣r♦♠s r rss

rst ♣r♦♠ s r② ♥ sss ♦♥t ♥ ♣t♥ s♥ ♦♥t ♥t t♦ ♥rt ②♣♥t♦♥ ♣ttr♥s ♦r ♥ ♥ t♥ ♦♥t ♥t t ♦♥ ♠② s②st♠ ♠♠r② ♦♥ts P♦str♣t ♦♥ts t ♦♥t ♥t t♦ tr♠trs ♥ t rt s♦tr ts sss s♦ ♦♥ ♠② s②st♠ ♥ ♦strt t s ♦❳ ♦♥ ♥ ♦ ♦♠♣tr t s♠ s

s♦♥ ♣r♦♠ s rr t♦ ♥rst♥s ♠ r♥ ♥t Ω s ♦ s♦♠ ♣ t♦ ♠ t♦ s ♦♥② Ω ♥ Ωs ♦r♠ts t♥ ♦♥t ♥t t♦ ♥st ❳ ts t Ω ♥stt ♠♥s tt t ♠♥♠ sst ♥ t♦ strt❳ ♥♥t ♦♥t♥ ❳ ts

tr ♣r♦♠ s tt ♥t t♦ ♦ t♦ ♥st ♦♥② t ♠♥♠ sst ♦ t ♦❳r rqr t♦ t ♦♦ ♠ rt♥t ♠♥s tt ♦♥t ♥t t♦ ♥st r t♥s t P ♠trs ♦♥t s P♦str♣t♦♥ts t ♥ ♠② ♦♦ ♥ ♥ ♠♦r ♦♥②s ♠s ♦r s♦♠ tts ♦♥t ♥t t♦ ♥sts♦♠t♥ t♦♦ r ♦♥ t ♣♦♦r ♦ ♣t♦♣ tt t♦ s t♦ rt ts ♦♦ s s♦♠t♥ sr s t P ♠trs ♥♦t ♣ ♦r ❳ t t♦ s♣t ♥t♦ sr♣rts ♣r♦② ♦♥ ♣r ♦♥t

tt s s t♦ s②st♠ t ♥rs ♦♣s st ② s♣tt♥ ♦♥ t ♥♥t♦ st♥t s♦tr ♥ts s t♦ sr ♦③♥

♥♦♥ ♣r♦t ♦r♥③t♦♥ s ♥ ♥tr♥t ss♣r♦r

♣s ♦ t ♥rs ♦ ①t♥s♦♥s ♦❳ s s♦ ♥ t♦♥♦♠♦s ♣ t st ♥s♦♠t♠s sr ♦r r ♣rts s ♠s ♥rs ♦r ♣r♣s t♦s♥s ♦ ♣s s ♣rt ♦t ♥ strt♦♥

♥ ♥♥♦t ♦r t♦ ♥♦ ♦ t♠ ♥ ♥♦ts t♦ t♦ ♦♦s s tr ♠st r sr♣t♦♥ ♦ t ♣♥♥s t♥♣s ♦ r r♠♠r tt tr① rqrs rr② t♦ ♥st ♦r tt ♦♥♠t ssr ♥ tr ♠st ② t♦ ♦♦s rs♦♥ sst ♦r ♥ s ♥t t♦ s❳ t♦ t②♣st ♣♣r ♦t tr♦♥s ♥ ② t♦ s② r②t♥ rt t♦ tr♦♥s s ♦♥trst t♦ ♠ ♥ s♦♥ ② t♦ ♠♦r ♣rs ♥strt♦♥s tr t♦ ♦r r♠♦ ♣s ②♥

s② t♦ ♣r s ♣♦♥t s sr t♦ ♥rst♥ ♥ s② t♦ t♦♠t ♦♥② r② rt♥ s t♦ ♥ str♥ ss

ts ♦♦ t ②♣♦tt ①♠♣ts s② r ❳ r♦t ♣s ♥

r r② s♠ ♦♥s ♥ ts r strts s♥ ♦♥ s t♦s ♣s r s♠ ♥strt s s♥ t♥ t② r ♥ t s♠♥ ♥ ❳ t ♠♦♥ts tr ♦r♦♦ ♦ r ❳ s ♦r ♦t ♥ s ♣s ♥ ♥rs ♦ trs ♥ r ♥♦ r②r ♦♥s ♥ ♦♠♣♦s ♦ ♦③♥s ♦ s♠♥♣♥♥t ♣rts ❲ ♦ t♥ ♥ t♦ r♥t♠ s♣rt② s ♦ t♦ ①♣♥ t♦ t s②st♠tt ♣r♥ r♦♠ t rst ♥ ♠♥s♥st♥ t tr s♣rt ♥s ♥ tt r♦♠ts ♣♦♥t ♣rt ♥ ♣r s♣rt②

♦rs t s②♠♠tr ①♠♣ s s♦ tr♦s♦♠ t♦ s♣rt t♥s r ♥♦ ♥ ♥ s♥ ♥ ♦ ♥ ①♣♥ ts t♦ t s②st♠

♥ ♠♦r ♦♥ ♥ ♠① t ♣r♦♠s tr♠♥ts r r♣ ② t♦ ♥ t ♥ rs♦♥♦ t♦ ♣r s②

♠♦♥ts s♣♥t ♦r♥ ♦♥ ❳ ♥♦t ②t t♦ ♥② ♥r s♦t♦♥ t♦ ts ② ♣r♦♠

s② t♦ ♥st ♦♥ t trt s ♣♦♥t s ♥♥trst♥ ♦♥ s♥ ts ♦♥ ♦ t♦s t♦♦ts ♦ sss♦♥s ♦t t s♥ ♦ ❳

♠♥ ♥ ①♣♥ s♦ s r♥ t s②st♠ ♥t ❳ ♣ t♦ ♥ r♣♠ s♦ tt ♥ ♥st t s② s♥ ♠②s s②st♠ t♦♦s

s ♠♥s rt♥ sr ♦rs ♦ t strt♦♥ s♦♠t♥ ♦♥ ♣r trt s②st♠ ♥

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 13: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

♥tr♥ r♣rs♥tt♦♥

♣r♣r♦ss♦r

sr♣t♦♥

♥rt♦r ♥rt♦r ♥rt♦r ♥rt♦r

t♦s♣

♣r♦ss♦r

r♣♠

s

♣r♦ss♦r

♣♦rts

♥tr

♣r♦ss♦r

r ♥ ts r♠ tt②♣ t①t ♥ts ♣②s r♣rs♥tt♦♥ ♦ t ♥♦r♠t♦♥♥ r♦♠♥ t①t ♥ts ♣r♦ss t♦ ♦ r♦♠ ♦♥ r♣rs♥tt♦♥ t♦ t ♦tr ♥tr♥r♣rs♥tt♦♥ s r♥t s♥ t ♦♥② ①sts ♥ t ♠♠♦r② ♦ ♣r♦r♠ ♥ ♥♦t ♥ r

s♦♠t♠s ♠♦r sr ♦rs ♦ s②st♠ ①st s ♦r ♥① r ♥s s②st♠s ♠♦st ♥♦ ♦♠♠♦♥ ♣♦♥t t ts ♦♥s

♥♦tr ② ♦ t♦ ♦♣ r② st♥♦♥ s②st♠ tt ♦ ♣r♦ r②t♥ r♦♠t sr♣t♦♥ ♥ t♦ t ♥ ♥r② ♦r♠t♥♥ t ♥ t♦♦s ♥ t ♦tr t♥s♥ s②st♠ ♦ r② sr ♦r ♠r t strt♦♥ ♠r r ♥st ♦ st♠ t ♦ t♦ s♦♠t♥ ♦ ss ♥trst ♦r♠♦st ♣♦♣ ♥ t ♦tr ♥ t ♦ ♣r♠t ♦♣♠♥t ♦ rs♦♥② ♦♠♣t strt♦♥ ♥ s♦rt ♣r♦ ♦ t♠ ♣r♦t♦t②♣ s ♦♣♥ ♦♥② ♠♦♥ts ♥ t ♦ ♦ ♦♣♥ t ♥r s②st♠ tt r sss♥ r

s ♦♣ r r ♠♥♥ s ♦♥s tr s t♠ ♦r♥ ♦♥ t strt♦♥ t♣♦♣ t t♦ ♥rt♦r t r ♠♥♥ss ts s ♥♦t t s t st s ♥r t rt② ♦ ♦♣rt♥ s②st♠s ♥ t ♥♦ tt s rqr t♦ ♦♣ ♦t ♦rs

r t♥ ♣r♦♠s rs r♦♠ ts ♥t♥t♦♥ t♦ ♦s t♦ t trt s②st♠ ①♣♦st♠ tr ♦♥ ♥ t st♦♥ ♦♣rs t♦♦s

s♥ ♠♣♠♥tt♦♥ t♦♦s

♥ ts st♦♥ sss t ② ❳ st♦ ♦♣ ♥ t t ♦♣♠♥tt♦♦s t s t♦ s② ♥♦t t t rst♥ ♥r②♣s s♦ ♥♦r ♣s ♣rt♦ t strt♦♥ t ♦ ♣s rt♦r ♥② ♦r ♦ t strt♦♥

s②st♠ s♥ ♣r♦t♦t②♣ ♦ ❳

s rtt♥ rt② ♥ ♥ r♣♠ r♣rs♥tt♦♥ t♥② t s r ♥ ♦ s ♥ s♣ ♦r♠t s tt s ② r♣♠ ♥ r♦♠ tt t♦♠t② tr♥st ♥t♦ t rt ♥ ♦ s ♦rr ♣♦rts s ♣♣r♦ s ♦ ♦rs r♦♥t t st s s♦♥ tt rt♥ s strt♦♥ s s

rt ♦ s ♦ ♦rs s s♦♥ ♦♥ r t♦ ♦♠♣t ♥ ♣rs sr♣t♦♥ ♦t ♣ ♥ t♦ ♦♥sr ts r♣rs♥tt♦♥ ♥ ♥ s②st♠ s② r♣♠ st♦♦s ♦r t♥s tts ♣r♦t♦♥ s ts sr♣t♦♥ s t♦ s♣rst ♦ t ♥ ①♣rss ♥ t r♦s trt♥s

♦♣rs t♦♦s t♦♦s s t♦ rt tstrt♦♥ ts r r② s♦♥ ♥ r rst ♦♥ s t ♣r♣r♦ss♦r ♠♥② ♣rsr tt♥rst♥s t ♦r♥ sr♣t♦♥ ♦ t strt♦♥ s ♦♥ s ♥ t str♦♥② ♥ t♦ t♥ s t♦ sr t ♣s

sss♦♥s ♦t P t♦ t ♦♥s♦♥tt rt♥ r♥ ♥ ♥ r♦♠ srts♠s t♦ ♦ ♥ tt t s ttr t♦s ❳ s t r♣rs♥tt♦♥ ♦ t ♥♦

s ♣r♦t♦t②♣ ♥ ♦♥♦ r♦♠ t♣t♣♣r♣❳❳Pr♦t♦t②♣ ts rtr ♦ t♦♦ ♥♦ t♦ ♠♦r ♣rs ♦ t ♦ t♦ r

❳ P ♥r ♥ ♣r♦♣♦s ② ♠♦♥♦③♥s st♥ t③ ♥ r P♦♣♥ r ♥♣♥♥t② ♦ ❳ t s t♦ r② s♠r s②st♠ ts ② sss rst ♦♥ ♦♠♣t①tt① ♥ t♥ ♦♥ s♣rt ♠♥ st

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 14: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

ts ♥r②♥ t strt♦♥ s t ♣r♣r♦ss♦r ♥ r s ♦♥② st ❳♣rsrt s♦♠ ♥♦ ♦ t s②st♠

♠♦st ♥trst♥ ♣♦♥ts ♦ ❳ ♦r ts♣r♣♦s s tt ♦♦ ❳♣rsrs ①st ♦♥ ♠♦sts②st♠s rtt♥ ♥ r♦s ♥s s♦ tt ♦♥♥ s Prs s②st♠ ♦♥ ❯♥① s②st♠s ♦r♥ ♥②t♥ss ♦♥ ♦♥ ♥t♦ss t♦t tr♦s rt t♦ t sr♣t♦♥ ♦ t strt♦♥

r♦s ♣r♦ss♦rs r ♦ ♦rs s ♦♥t t♦♦s t t♦ t r♦s ♦rs ♦ t strt♦♥ t ♥♦t ♦♥② tt ② ♥ t♦♦st♦ t♦♠t② ♠♥ t r♥ s♦ ♦♥♠t ♦♦ ss t s②st♠t t♦♦s

♠♦st ♦♠♣t ♣rt s t ♥rt♦rss♥ t② ♥♦ ♦t t t ♥ t sr♣t♦♥♦ t ♣ ♥ r t♦ rt t ♣r♦t♦♥♦r ♥ ♦r s ♣rt s r t♦ t♦ t r ♥♠r ♦ ♦rs

s t ♥ s♠s t♦ ♥t tt t♦♥② ② t♦ ♦t♥ ♦♦ rsts s t♦ ♣♦♣t ♦♦ ♥♦ ♦ t trt s②st♠s rt♥t♦s ♥rt♦rs

❯srs t♦♦s s stt ♦r ♥ t ♥tr♦t♦♥tr s♦♠ ♥s ♦r srs t♦♦s s♦♠ ♥ ♣r♦ ② t trt s②st♠ t ♦♥s t♦♥st ♦r ♣r ♣ ♦trs ♥♦t t♦♥s tt ♠♥ ♦♥rt♦♥ ♦ t ♦ t♥♦s t♦♦s ♣r♦② rs r♦♠ ♣r♦sstrt♦♥s t ♦♥s s ♥ t❳ ♦r ❳

♦r ♥♦r♠t♦♥ ♠♥ ♠ ♦ ts ♣♣r s♥♦t t♦ sr t ♥tr♥s ♦ ❳ ♥ ①t♥t t t♦ ①♣♦s ♦ t sr♣t♦♥ ♥s ② t s s♥ ♥ t♦ sss t ♣♦♥tstt t♦ ts s♥ s ♦♥ ss t♦ ♠♦r ♥♦r♠t♦♥ ♦t ♦tr ♣♦♥ts rt t♦❳ t rr♥ ♦♠♥ts t ❳♠♥st ♦r t rr♥t rs♦♥ ♦ t ♥ rtr r♦♠ t♣ sts t♣t♣♣r

♣❳❳

t t t♠ ♦ rt♥ t ❳ ♠♥st s♥♦ ♦♥r ♣t♦t t ♣r♦② ♣t♦r ②♦ r t

sr♥ ♣

sr♣t♦♥ ♦ ♣ s♦ ♦♥t♥ sr♣rts

rst ts ♥tt♦♥ ♣r♦♥ t rs♦♥ ♥♠r ♥♦r♠t♦♥ ♦t ts t♦r s♦rtsr♣t♦♥ ♥ r♦s ♥s ♥r ♣♦ss

♥ ♦tr t♥s ♦ t ts ♥♦r♠t♦♥ ♥ t♥ r♦♠ t ♥♦♥ t♦

♦♥ ♥♦r♠t♦♥ t♦ ♦t t r t s♦t ♥ s♦r ♦r♠ ♦♥ sts ♦r ♥② ♦trs♦r♦t♦♥ ♦r ♥♦♥ ♣s s s r♥t r♦♠ t st ♦ s♦r s ♥ s t♦ s t♦ s♦ t ♣s ♥ tr ♦r ♦♥♦tr ♥s ♦ ♦t♦♥s r ♦ ♥trst ♦♦ ♦♥ t♦ ♣ t ♣ ♥ tr s ♦♥ t♥t♦♥t② t ♣r♦s ♥st ♦ ts ♦t♦♥ ♦♥ ♥ s tr r ♦ sst♦ ♠t♠ts ♥ ♥② ♣ rt t♦ t②♣stt♥ r ♦ ♥ ts str ♥♦r♥tr ts ♣ ♦r ♣♥ ❳ ♦r ♦r ❳

r ts ♦♥t♥t t st ♦ s ♦♥t♥♥ t ♣ ♥ tr ♣♦st♦♥ ♥ ♦♥♦r♠♥ strtr

♦rt ♥♦r♠t♦♥ ♦♥ ♦ t♦ t tt s♦♥ r♦♠ t s♦r ♦♥ t ♥tr♥t t♦ r♣rs♥tt♦♥ tt ♥ rt② s

t ♥♦r♠t♦♥ ♦♥ ♦ ts ♥ t♦ ♦tr♣s tt s ♣♥♥s

①t ♥♦r♠t♦♥ ♦♥ ♦ t♦ ♠♥ t ♦♥t trt s②st♠ ♣r♦rs ♦r ♥stt♦♥ ♥stt♦♥ ♣r ♥ s♦ ♦♥

♦♥t♥ts ♦ t ♣ ♦♥② t♥♦ s t♦ t ♦♥② sts s rt t♦ s♣♣♦s② ♥♦♥ r♦♦t ♦r t sts t♠♥ ♠♦r ♣r♠tr ② ♦r ①♠♣ ♥ trst s t ♦♥t ♠tr ♦ ♠r ♥ sts t①♠♦♥tst♠♣♠♠rt♠ ♥ t ♣r♠tr ♦r♠ t ♠t ①♣rss s❳❨♠rt♠ s♦ tt t ♥ t♦♠t② st ♦♥ t ② t♦ ♥ trt

♥ ts ♥ ♦ r♠♣♣♥ ♦ trs s♠ss② t♦ ♦t♥ r♦♠ r ♣ts t rst ♦ s♥ rt♥ ♦♥ ♥s t♦ r♠♣ ♦♥♦r♠♥ tr t♦ ♥♦tr ♦♥ t ♦♥ ♥ t♥rt♦r rtr t♥ ♥ t ♣r♣r♦ss♦r

♥ ♣ r♥ t sss♦♥s ♦tts sr♣t♦♥ ♥ t♦ r♥t ②s ♦ sr♥ t ♥ ♥ st

rst ♦♥ t sr ♦♥ r♦♠ t ♦♣r♣♦♥t ♦ ♥ t ♠♦r ♣♦r s t♦ s ♣♦r ♥ sr♣t♥ ♦♥ ♦r♥ ♦ ♣rt ♥t ♥ t♦ rt t sr♣t♥ ♣r♠tr③ ♦r♠ s♦ tt t ♥ s♦♥ r rt② ♦ s②st♠s s s s♠♣ s♥t t♦♦s st t♦ s t sr♣t s s ♥ ♣♦r s♥ ♦♥ ♥ ①♣rss ♥ ts ♥ ①t②

t♦ ♥ rtr r♦♠ ♥② st ♦r♠rr♦r t ♣t♦ ♥ s rtt♥ t ❳ ♣ rs♥ ts ♦♥t♥ts

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 15: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

♦ t s s ♦♥ r s②st♠ t r♥s rt ♦r t ♣rs♦♥ ♦ rts t sr♣t♦♥♦ t ♣ ♥ t rts ♦ ♣♦rtt②♦r♥ ♦ ♦ ♥♦ ♥trst ♦♥ ♥♦♥❯♥①s②st♠s ♥ ♠♦r♦r tr r r r♥st♥ r♥t ♦rs ♦ ts ♥

s♦♥ ♦♥ rr t♦ r♦♠ t ♦♣rs ♣♦♥t ♦ ♥ ss ♣♦r s t♦ ①♣rss t ♥ ♥ ♦ t t♦♦s♥ t ♥ s♦♠t♥

❳ t♦♦s♥s

❳❱ tr♣

❳❱ rr②

stt♥ tt t ♥s t♦ ♣r♦ss t♦ t♣s s t♦♦s♥s ♥ tt t♠ ♦ ♦♠♥tt♦♥ s t♦ ♦♠♣ t t♥ s r♥♦ ♠♥① t♦ ♣r♦ t ♥① t♥ ♥♦tr♦♥ t♦ ♣r♦ t st♦r② ♦ ♥s ♥ ♦♦ssr② t♥② ♥ ♥♦tr st r♥ tr♦❳

s♦♥ ② s r ttr ♦r ♣♦♣ ♦ t♦ sr ♣ ♥ s s② tr♥st♦♥ ♥② s②st♠ ② t ♥rt♦r t ♦♥ ♥tst♦ ♦♠♣t ♥♦ ♥ t♦ ♥ ♥②♥ r② s ♦♥ rt ♥ s ♦♠♣①s trt♦♥ sr♣t♥ ♦♥ ♦♠♣① ♥ ♦ t♥ sss s♥ t ♦ t♦♦ r t♦ ♥rst♥

♦♦ ♦ s t♥ t♦ ♦t t ♥ ♥ ①♣rss t s ♥ t♦ t ♣ ♦r ♠♦st ♦rs t♥ st s t♥ ♥ ♦r ♥s t♦ ①♣rss t ♥ ♠♦rt ♦r♠ t♥ st ♦rr t rst sr♣t♦♥

♦r♦r ♥ ♣ s t♦♦ r t♦ ①♣rss ts ♥ ♥ t ♥ t♥st s t ♦ ♦♥ ♥ sr t ♥rsr♣t♦♥ ♦ t ♥

s ♠♦ s♦♥s ♦♦ s♥ ♦ t ♣s sr ♥ t s② ② ♥ ♦♥② tt ♠♦st ♣r♦♠t sr ♥ tr ♦♥ s ♣♦rt♥ t strt♦♥ t♦ ♥s②st♠ ♣r♦♥ t rt ♥rt♦r ♣♦rt♥ t♦s

♦♠ ♦tr ♥♦r♠t♦♥ ♦ s t♦ t ♣ ♥♦ ♦ t s rqr t♦ ♥st ♦r strt♥ t♦ ♥②t♥

♥ ①♠♣ ♥ ♦♥ ♥♥♦t

t♦t ♠ ♥ ♦♠♣r t ts s ♥ s②♦♥ ♥ ①tr♥ s♦ tt ♥ ♦ s②♥ t

♥ t rqr♠♥ts ①♣rss r r ♥♦t ♥ ts♦♣ ♦ ts strt♦♥ ❲ s♠♠rs t♦s rqr

♥♦tr str♥ ①♠♣ s tt t♦ Ω ♦♥♥s ❳ s str♥ s♥ ❳ ♥ t ♦♥ t♦♣ ♦ Ω ♥ t ❳ s rqr ♦♥②r♥ t ♥ st t♦ ♣r♦ t ♦♠♥tt♦♥ ♥ st ♦r♠ t ❳ s ♥♦t rqr t♦ ♥st Ω ♦♥ trt s②st♠

s ♥ t ♣♥♥s st♦♥ ♦ t sr♣t♦♥ ♦♥ t♦ ♣② tt♥t♦♥ t♦ t ♥ st ♦rs ♦♥ts ♥ rs ♦♥♥♥♦t t ♦♠♥tt♦♥ ♥ ♦r ♦ ♣ s ♥st

♥♦tr ♣♦♥t s tt s♥ ♥ ♥♣r♦ sr ♣s ♦♠♣♥ t ♥ ♣r♦s ♦③♥s ♦ ♣s s tr♠st stt ♥ s♦♠ ② t ♥ s rqr ♦r ♣

♥s t♥ ♣s s r②s♥ sr ♥s ♦ ♥s ♥ ①st t♥ ♣s ♥①t st♦♥s st t♠ ♥ ①♠♥ t ♦ ♦♠♣①t② rqr

♥stt♦♥ ♣♥♥② s ♥ ♦ ♥ st ♠♦st ♥t ♦♥ st♥ ♥ ♣ sr♣t♦♥ t ♣s tt ♥ t♦ ♥st ♦rts ♦♥ t♦ ♦r ♦rrt②

rst r ♣♦♥t s t♦ tr♠♥ ts st ②r♥ t ♣ ♦♠♥tt♦♥ ② r♥ tss♦r ② ①♠♥♥ ts ♦r ♦s② ♥ s♦♦♥ t s s② t♦ stt ts ♣♥♥s ♥ tsr♣t♦♥ ♥ t ♥♦r♠t♦♥ s r t♦♦t♥ st stt♥ tt tr① rqrs rr②s s②

s♦♥ r ♣♦♥t ♥ t r② r ♦♥s tt ♥♦t ♣♥♥s r tt s② t♦ ts st② t♦ ♥trst♥ ①♠♣s

rst ①♠♣ s t ♥t♦♥t② ♦♥t s♠s r tt rr② s ♥♦ ♠♥♥

❳ s ♥♦t ♥st ♥ tt ❳ s ♥♦ ♠♥♥ t♦t ❳ ♦ ♦♥sr tt rr② s ♦♥trst Ω ♥ Λ r ♥st s ♥ s♦ ♥ t♦ ②str ♣t t r♥ ♦♥t s ♦ rr② ② stt♥ ts rqrs ❳ ♦rΛ t♦ ♥st ♣s r♥s ♦♥ ♦ts ♦♣ sr♣t♦♥s ♦r ♣t t r♥ ♦♥ ❳♥ Λ t♦ stt ts ♣r♦s ❳ ♦r♠t s♦tt t rr② sr♣t♦♥ ♠② s② ts rqrs ❳ ♦r♠t

♥ t t s♦♥ tr♥t rqrs tt st ♦ ♥ ♥t♦♥ts tt ♣s

♠♥ts s ♦♥ ♥s ♦♠♣t ♥ ♦r♥ ♦♣rt♥ s②st♠t♦ ♥st ❳

Ω s ♥ ♦t♦♥ ♦ ❳ ♥ trs s ♦r ♥tr♥t♦♥st♦♥ ❯♥♦ ♥ Λ s t ♥♠ ♦ ❳ε♥ t ♦♥ t♦♣ ♦ Ω

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 16: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

♠② ♣r♦ ♦r rqr ♥ t♦ sr t♦ ①♣rss♥t♦♥ ♣♥♥s ♦♥② ♦r♥ t♦ ts st tr s ② t♦ ♦ s♦

♥ trts tt r② s ts ♥ ♦ t♥ts s② t♦ rs t ♣r♦t♦♥ ♦ ts ♥♦r♠t♦♥② rt tr♥st♦♥ ♥ ♦tr trts t tt rr ♥ t♦ ①♣rss ♦r ♦r ♦r ② st♥ t tr♥ts ♦r ♥♥t♦♥t② ♦rt♥t② t ♦ ♥ ♦♥ ②t ♥rt♦r s♥ t s ♥♦ ♦ t♣s ♦r t strts t♦ ♥rt ♥②t♥

s♦♥ ①♠♣ s s♦t ♣♥♥s♠♥ ♦♠♥t ss tt s ♥ ♦♣t♦♥

♣s♦♥ts tt ♥ t♦ ♣t t ②♦tt♦ P♦str♣t ♦♥ts ♥st ♦ trt♦♥ ♦♠♣tr♦r♥ ♦♥s ♥ ♥♦tr ♦♣t♦♥ ♦♥rt ttss t♦♥ ♥st ♦ ♦♠♣tr ♦r♥ ♦sts ss ♣♥ ♦♥ ♦♠♣tr ♦r♥ t♦♥ ♥P♦str♣t ♦♥ts

♦♥♥r♠ s tt t ss r② ♣♥s♦♥② ♦♥ ♦♠♣tr ♦r♥ ♦r t♦♥ ♦r P♦str♣t②t ♦♥② ♦♥ ♦ ts sts ♦ ♦♥ts s ♥stt ss s ♥♦t ② s ♣♥♥② ♥s♦ ♥♦t r♣♦rt r②t♥ ♦♦ ♥ t ♣rt♦ t s②st♠ ♥♥♦t s ♦r ♦ ♥♦tr

❲ ♥ sr ts stt♦♥ ② ♥tr♦♥t ♦♥♣t ♦ s♦t ♣♥♥s tt s ts ♣ ♣rrs ts ♦tr ♦♥ t♦ ♥st t ♥ s t♦t t t ②♦r ♦♥ rs

t s♠s s t♦ ♥ sr s ♦ s♦t♥ss ♦r ts stt♦♥ str♦♥ t t ♦r ♦r t ♦♥ t ♠♦st s ♥s t ♣♥♥② ♥ t ♣♥♥② s ♥ ♦r r s ♦ t ♣ ♦r ② ♥ ♦♣t♦♥ ♦ tt♥trst

t s♦t♥ss s ①♣rss ♦♥ r♥ r♦♠ t♦ r♣rs♥t♥ ♥♦t rqr t ♥ strt② rqr rr② ♦r tr① ts②st♠ ♦ ♦♥tr♦ ② s♣②♥ s♥ n t♦ ①♣rss ♥st ♣♥♥s rt♥ n s②st♠ ♠② st t n = 3s♦ tt t ♥sr ♥ r ♦♥② ♦t t ♣♦♥ts ♥ts t♦ ♦r r♦♣ t♦ n = 1 ♦s♥t ♥t t♦♦tr t ♦t ♦♦s♥ ♦r rs n t♦ ♥ts r② ♠♥♠ s②st♠

♠ s♦r ♥ ♦ ♣s ♣r♦r♦♠ t s♠ s♦r ♥ s s ♣t♥ ♥t♦♣ r ♦t ♣r♦ r♦♠ ♦ ♥ t♥ t♠ ts ♥ s t♦ ♣♣rr② ♥ t sr♣t♦♥

♥ ② t♦ sr t stt♦♥ s t♦ s ♣r② ♦t ♦r♥t r♣rs♥tt♦♥ ♥ s s♦r♥ ♥ ♠t♦

♥ ♣ ♣t♥ t♥ ♦♥ stts ttt ♠t♦ s t♦ ♣♣ t♦ ts♦r ♥ ♦rr t♦ ♣r♦ t ♣ ♣t

♥ s♦♥ ② s t♦ ♦♥sr tt t r ♦t

s t s♦r♥ ♥ tt t ♣s tt rrt r♦♠ t r ♣s ♦ ♥♦r♠t♦♥ rt t♦t ♥ ♦♥② t♦ t tt s ♥ strtr ② t♣ sr♣t♦♥ s ♣rt ♦ ts ♣r♥t s♦r♥ sr♣t♦♥

rst t♥q s♦♥s r② ♣♦r t q② ♦♠ r t♦ ♥ ♥ rt ② r♥ ♦r ♦t ♦ ♣♦♣ ♦♥② t♦ ♥①tr♠② rr ss ♥♦ s ss rs♥ ♥t ♣s ♥ t Pr♦t♦t②♣ tt ♦ rqrs ♦♠♣① s②st♠ ♥ s♦♠ ①tr♠② rr♦♥s ♥ ♠t ♥ t r ♦r

s rr♥t② t s♦♥ t♥q s st ♣♥♥s s ♦ st ♣♥

♥② tt s ♦♥sr ♥ t ♣r♦s st♦♥s t ♥stt♦♥ ♣♥♥② ♥stt♦♥ ♣♥♥s r ♦♠♣① ♥ r ♣r♦② t ♦♥② ♦♥stt ♥ t ♦ s♦t ♣♥♥s

♦♠ ♦tr ss t♦ ♥♥ s♦ ♦♥sr rr s t ♥

♣♥♥② stts tt ♦♥ ♥♥♦t ♥ ♣ ♥ss ♥♦tr s ♥st ❲ ♥ ♥sst tt ♥ ♣♥♥s s♦ strtt♦ ♦♥ ♥ ♥ ♥♥② ss ♥ s♦t ♣♥♥② ♠t s t st ♦♥ s METAFONT

rqrs ❳ t ♥ t t♦t ♥♦♥ s♣♣♦rt ♦r♥ strt ♣♥♥s ♦r t♥ st s strt ♦ ❳ s t♦ r②r ♥ t s♠ ② ♥♣♥♥t②♦ t s②st♠ ♦♥ t s t s ♦♥ ♥tst♦ r t METAFONT ♥r② ♣ ❳ rrs t♦ ♥st rst s♥ t ♥ tt METAFONT s ♥♦♥ s♣♣♦rt ♥❳

♥♦tr ♥trst♥ s ♦ t♦ st ♦♠♥tt♦♥ ♣♥♥s ♥ s♣rt st s♦ ttt s②st♠ ♦ s t sr ❳❳❳ s rqr ♥ ♦rr t♦ r t ♦♠♥tt♦♥ ♦ t ♣ ②♦r♥st♥ ♦ ②♦ ♥t t♦ ♥st t s s ♦ ♠♣♦rt♥ s♥ ♦♥ ♠♥♠ s②st♠ t sr ♥ ♥♦t t♦ ♥st r st ♦ ♦♥ts tt s ♦♥②rqr ② t ♦♠♥tt♦♥ ♦ t♥② ♣

② ts ①♣rss s ♦ ♥♦ ♠♣♦rt♥ r t ♥ ♣t♥ tt stts ♦ t ♥ts t♦ t ♦r t ♥♠t♦ stts t ts t♦ t ♦t ♠t♦s r q♥t ♥ tt ♥ ♥rt♦r r♥s tsr♣t♦♥s ♦ t ♣s ♥ ♦ t♦ ♣r♠t♦♥sst♥② ♥

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 17: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

♦♥ts st ♥ ♦ rt♦♥s♣ t♥ t♦ ♣s s ♦♥t tt s ♣ ♥♥♦t ♥st ♥♦tr ♦♥ s r② ♠♦st ♥t s s t tr ❳♣s♥ tr r♥t ♠♣♠♥tt♦♥s ①st ts♠ ♥♠ trst② r♥t s②♥t①s ♥r♥t ♦rs ♥ ♥st♥ ♠♦r t♥ ♦♥♦ t♦ ♥♦♥♣rt rsts ♦♥ ♥♥♦ts② ♦♥ ♦ r♥ t ♥ ♦ ♦♠♥t ♦s ♣s r② ♦♥t t② s ♥♦t ♥ ♥♥ ♣s tt ♦♥ttts rtr s② t ♥ sr♥ t ♦♥t

t♥q s ♥ ♦tr s♠r ♥ss t♦ ♣ stt ♦trs ♦♦♥t ♥ r ♥ ♦♥t t♥ stts♥ ts sr♣t♦♥ r s ♦♥t t ♥ rs r s sr♦s r t♦ ts t♥q tr ♣ s② rss tt ♦♥tst t t♦ ♣r♦s ♦♥s ts s t ♠♦st ♣r♦s t ♦♥ts t ♦♥ tr r rt ♣r♦ts t s♦ ♦♥t t t ♦tr t♥ ts t♦ stt r s ♦♥t t ♥ t ♥ t♥ t sr♣t♦♥s ♦ ♥ t♦ ♦rrt t♦ ♥t ts ♥ ♦♥t s s r②tr♦s♦♠ ♥♦t st s ♥ t♦ rt ♥ t♦ ♥ tr rs♦♥ ♥♠rs tr sr♣t♦♥s ♦trs r♠♥ t s♠

♥♦tr t♥q ♦ t♦ s♣rtst ♦ ♠t ①s♦♥s tt s t ♦♥② ♦♠♥ttt s t♦ ♦rrt t♦ ♥ t♦s ss ♥tt t ♥rt♦r s② tr♥st t ♥♦r♠t♦♥ ♣r♦ ② ts st ♥t♦ t ♦r♠ sr ♥t ♣r♦s ♣rr♣

t t t♠ ♦ rt♥ t trt♦♥ ② ss ♥ ❳ t ♣♥ t♦ st t♦ t ♦trt♥q ♥ r♦st s♦t♦♥ t♦ t rs ♥♠r t♦♠t ♥r♠♥t s ♦♥

t♦♠t ♦r r♦♠ ♣♥♥②♥ ♦♥t ♥♦r♠t♦♥ s r② sss ♠ t♦ t♦♦s r♥ t s②st♠ ♣r♦ss♦rtt rt t ♥ ♣ t s②st♠ s ♥♦t t♦ ♦ t ♦ ② t♦♠t②

s② ♣rt s t♦ s t ♥ ♣♥♥s t♦ t♦♠t ts ♣r♦ss ❲♥r t t♦♠t s②st♠ ♥ts t♦ ♥ ♣ trst s tt t ♥ ♣♥♥s rsts

r ♣rt ♠② ①♣♥ t ♥ ①♠♣ ts s② tt ♣ ♥s t rst ♦r♦ tr t♦ ts ♦♠♥tt♦♥ ♥ tt ♥st s♦♥ ♦r ❲♥ tt♠♣t♥ t♦ ts②st♠ ♥ ♥st t rst ♦r ♦ tr ts ♥♦t r② ♣rs♥t t ♥ t s②st♠trs t♦ t ♥♦t t ♦ t s♦♥

♦r ♦ tr ♥ tr② t♦ ♥st t t♦ t ♦♥t

rt ♦r ♦ t♦ r♠♦ t♦♥t♥ ♦r t♥ t♦ ♥st t rqr ♦♥t♥ r ♦ t ♣♥♥s ♦♥ t tts r♠♦ r②t♥ tt rqrs t ♦♥t♥♦r

s s ♥♦t ♥ t♦ t ② t ♥♦r♠t♦♥ s♣r♦ t t♦ t ② t s s

♥♠♥t ♥♦r♠t♦♥ ♠♥♠♥t ♥♦r♠t♦♥ s tt ♥s t♦ ♥ t ♣ t♦ ♦ ♦♦ ♠♥♠♥t ♦ t♦ s②st♠ ♥ ♦♥sst♥t ② ♥ t♣♥♥s ♦♥r♥ t r♦s ♠♥ts ♦♥ ♦♥ ♣rt t♦ s ♥♦tr ♦t r ♥st♦♥ t trt ♥ s♦ ♦♥ ♥ t♦ ♦ ♠♥♠♥t♦ t ♣ ts ♥ ♥st♥ ♥♥st♥♣r♥ ♥ s♦ ♦♥

♦st ♣s ♠♥♠ ♥ rrr♥t rqr♠♥ts ♦ ♠♥♠♥t r♥ t s

ts ♥♥ t ♦♥rt♦♥ s ♦③♥♦r s♦ ♦r r ♠♦rt② ♦ t ♣s ♥t rt s②♠♦ ♥s t t rt ♣ r♥t ♦r♠ts ♥ s♦ ♦♥ ♥ st ♥♦r♠t♦♥ ♥ ♥ ♥r s♦♥ s♥ ♥ t ♥ ♥ ♥ ② sr♦♥tr♦s♦♥ t♦♦ rqr

♣t♠③t♦♥s ♥ ♠♦st rt♥② srr t♦♦ t t tt ♦♥ ♥sts ♣s t ♣r♦② ♥♦ t♦ r t sts ♦♥② ♦♥ tr t st ♣ s ♦♣t♠③t♦♥ s ♠♣♦rt♥t s♥ r♣tt r♥♦ t ts s t♠ ♦♥s♠♥ ♥ ♥ ♥ s② t r♥ s ② ♥t tr t♥ ♦ t ♥stt♦♥s ♦r ♥ ♥strt♦♥ tt ♥ ♣t♦t ts s ♥ ♠♠t② ♥ tr♥ t ♣ ♦♥② ♥ strt② ♥♥ t t ♥ ♦ t ♥stt♦♥s

♦♠ st ss ♥ rs s t t♦♥s t♦ ♦♠♣s r ♦♠♣① t♦ sr♦r ①♠♣ ♥ t rst sts ♦ ♥ ♣r tt♦♥s rt t♦ t ♣r♦s rs♦♥ ♦ t ♣ ♥ ts s♦ ♣r♦ ② t ♥ r♥t ♥ sts t t♦♥s rt t♦ t ♥ rs♦♥ sr♥ t ♣r ♦ ♣ rqrssr♣t♦♥ ♥ rs♦♥ ♦ t♦ ♥st ♥ ♦t♦ ♥♥st t ♦r ♥ ♣r s t♦♥s ♠t st② r♥t r♦♠ ♥♦r♠ ♥♥stt♦♥♣r♦r

rtr stts ♥ rs ♥ ♣s♦ str♥② s ♥ t ♣r♦s s ♦ ♣s tt r r♣ ② ❲ ♠st ♦♥sr ♦♣s ♥ sr ♥ ♦t♦♥ tt s ♥♦t ♥

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 18: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

♣♥♥ ♠♦r♦r t sr♣t♦♥ ♦ t st sts♠② t♦ r ♦t t ♣r♦s② ♥st rs♦♥s ♦ t ♣s t♦ ♦ t♦ ♥ t♦ ♦♣rt♦♥ s♠♦♦t②

♦♦ ♠♦ t♦ rs t st ♦r t ♥t♦♥ts t ♣r♦s s tt s ② ♥ s♥ tts ♥t♦ ♦♥t t stts ♦t♥ ♦Ps rr t♦ t ♥ ♣♥ ♠♥ t♦ ♠♦r ♣rs ♦ t ♥ ♦ ♥trst

t♦ st♦r ts ♥♦r♠t♦♥

❲ ♥♦ ♥tr♦ t rst rt ♦ t tt s ② ❳ t♦ st♦r t sr♣t♦♥s ♦t ♣s ts ♥♦t ②t t t t♠ ♦ rt♥s t♦ ♣r♦ ♥② ♣ t ♦ q②t♦ rst rs rs♦♥ s t♦ ♣r♦ t rst♦rs ♥ t♥ ♣r♦② ♦ ♥ t♦ ♠♦r♠tr rs♦♥ ♥ ♥ ♦rs ♣♣r

♦rs ♥② ♦♠♠♥ts ♠♣r♦♠♥ts ♦r sst♦♥s r ♦♠ s r s t② ♠♣r♦ t ♥ ♠ t ♦sr t♦ t sr♣t♦♥ ♥ ♥t ♣r♦s st♦♥s s ts sr♣t♦♥ s ♠♦r ♠tr t♥ t ts

♥r strtr ♦♠♥t t ♦r♥ t♦ ts s srs ♦ t♦r ♥s♥ P sr♣t♦♥ ♦ t ♦ strt♦♥ ♥ s♥ ♦r ♦♥♥♥ s s♥ r②r ♦♠♥t s♥ ♦♥ ♥ t sr♣t♦♥s♦ t ♣s t♦ ♥rt t sr♣t♦♥ ♥ ♥ ♦r ts rqr ♦r s♦♠ ♦rs tr ♦♥ ♥ r♠ss ♦r ♦trs t P♦♥ P②s② tr ♠♦r ♣r♦② ♦♥①tr♥ ♦♠♥t ♦r ♥tt② ♥ t ♦♠♥t♦♥ ♣r t♦r ♣r ♥s ♥ ♣r P ♥♠② ♥ ♦♥ ♣r P ♥ ♥tr♥ ♠♥t ♦P

t♦r ♥ ♥s r t♦♣ ♦ts sts tr r rt② ♦ t♠ ♥ tr s ♥ ♦r ♦♥sst♥② ts ♥st ♦ sr♥♦③♥s ♦ t♠s ♦ s P rs t s♠s♠♦r ♥t t♦ sr ♠ ♥ ♥q ♥tt②♥ t♥ rr♥ rr ts ♥ ♥t sr♣t♦♥ ♦ t ♣s s rtt♥♠r② ♦r ♥ss s♥ tr r ♦♥② ♦③♥♦r s♦ ♦ t♠ ♦r♥ t♦ t t♦ t s♠ssss t♦ sr t♠ s♣rt② ♦r r② ♣

s ♦♥sr s s♥ ♦♠♥t tsr♣t♦♥ ♦ t ♦ strt♦♥ ♠t ♦♦ r

♥t t♦ ♦♥sr t s ♠♦r ♠♦r t♥ t♦ ♦♦s ♠t♦ t♦ rt t ♥♦r♠t♦♥ ♥ ♣♣r♦ s t♦ ♥ ❳ ♥♠♦r str♦♥② ♥ s t t♦ rt t ♦ ♦

①♠ rs♦♥ st♥♦♥②s

❨P ♦ ❨ ♥t①t

t♦r rs

♠ P rs♠

t①♣r♦t♦r

t♦r

♥s PP

❳ Pr♦t P ♥s

♥s

P

P♥tt♦♥

P♥tt♦♥

P

r ♦ sr♣t♦♥ s♥ s s♥ ts s t ② t s♥ ② t ♣rsr♥ ② t r♦s ♥rt♦rs ♥♦t t ② t st♦ rtt♥

♠♥t s♥ ♥tts ts ♦ s t♦ ♦♠♥t ♦♦s t ♦♥ ♥ r ♥ ♥t s tt t ❳♣rsr ♥ ♣r♦r♠ s♦♠♦♥sst♥② ♥ s s ♦♥ ♦♥ t s ♦ t♦ts tt t♦r s ♥ ♥♥ rrr t♦ ♥ ♣ sr♣t♦♥ s♥t s tt t rt♥ ♦♠♥t ♥ t♠ ♥ ♣ ♦r t♦r ♦r ♥ss t♦ t s②st♠

♥♦tr ♣♣r♦ s t♦ s st♥♦♥♦♠♥t ♦r ♣rt ♥ ts ♦♥ ♥ t♥ t♦ r② ♦♥ t t♦♣s②st♠ t♦ ♣rs t♥ ♦♠♥ts ♥ t rt ♦rr ♥ s s♥ t s②st♠ ♥s rr♥ t♦ t t♦r rs t ♦♦s ♦r ♥♠ t♦rs

rs①♠ ♣rss t ♥ t♥ ♣r♦r♠s t ♦♥sst♥② ♥ s ♦s ♥♦t s t ❳s♠♥s♠ ♥ ♥s ♥♦ t♦♣ t♦ ♥ t st♦ ♦tr s t t rqrs tt ♦♣ ♥♦tr ♣rsr ♦♥ t♦♣ ♦ t ❳ ♦♥ ♥ s♦ rqrs ♠♦r ♦r ♥ ♣♦rt♥ t strt♦♥ t♦ ♥ trt

tr s♦t♦♥ ♥ ♠♦r ♦♠♣①s♠s t ♠♦st ♥trst♥ ♥ ♣r♦② s♥ t ♥ s②st♠ ♥ t ♣rs♥t r ♦♥②

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 19: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

①♠ rs♦♥ st♥♦♥②s

❨P ♦ ❨ ♥t①t ❬

❨ rs

❨ t♦rsrs①♠

❨ ②rt

❨ t♦rs②rt①♠

❨ ♣♣

❨ ♥ss♣♣①♠

❨ t♦♦s

❨ ♣st♦♦s①♠

rs

②rt

♣♣

t♦♦s

r ♠t♣rt ♦♠♥t s ♣♦♥♥tts ts ♦s t ❳♣rsr t♦ ts ♥ rr♥s ♥ t ♦ s②st♠

t rst t♦ tr♥ts r q♥t ♦rt ❳♣rsr r

t♦rs ♥ ♥ss ♦♣ ♦ts t♦r

♥ ♥s r ♦t ♥t ② ♥q t s②st♠ ♣r♦ ② ❳ s s ♦r ts ♣r♣♦s

♥ t♦r rrs t♦ ♣②s ♣rs♦♥ ♦r t♦ ♥ r♦♣ t ♠t t t♦r ♦ ♣ ♦r ♦ ♣ sr♣t♦♥ ♣♥♥ ♦♥♥ ts rrr t♦ ♦r ♥ ♦ ♦t ❯♣ t♦ ♥♦ts ♦♥t♥s tt ♥♦r♠t♦♥ t ♠ ♥ ♥♦tt♦ ♦t ♣rs♦♥ t ♦t ♣♦♣ t ♠r② t♦t t♠ t♦ ♦ ♥②♦② t♦ ♦♥tt t♠ ♥ s♦ tr♦s r♣♦rts ♦r ♥s ♣r♦♠s

rr♥t② t tr s ♠♥ts s r♥♠② ♠ ♥ ♥s r ♥ t ❳t②♣♥ s②st♠ ❵❨ tt s ♥② ♥♦♥♣rs t①t ♥t ♥r tr t ♦♠ t ♠♦r strtrt ♠r♣s ♦r t ♥s t①t ♥ ♠♦r ♦r♠② t♦ ♥ ♠ rss ♥ ①♠♣ ♦ trr♥t strtr ♥ s♥ ♥ r ♠r♣ ♥ t t♦r ♥tt② s ♦♣t♦♥ ♥ ♠t r♣t ♥

♦t P P s ♥ ♦ ♣s ♦r ♣ r t r♦♠ ts♠ s♦rs s ❳ ♥ METAFONT r ♦t t

r♦♠ t s♠ s♦rtr t♥② P ♣r♦♥ sr ♣s ♥♥ t① ♦r ❳ ♥ ♠t♦♥t ♦r METAFONT

P ♦♥t♥s P♥tt♦♥ ttt ♥ts t ♥ t strt♦♥ ♦r♥

t♦ ♣ rtr t s♦rs ♥ st♦♥s②♥ ♦ t♦ t ♣s r♦♠ t ♥ ♥♦♥♠♣t② st ♦ Ps

P♥tt♦♥ ♦♥t♥s ♠♥t♦r②P♠ s s t♦ ♥t② t ♥ ♥♣r♦♥ ♣ rs♦♥ ♦ s♦rs ♥ ♥♦r ♥ ♦♣t♦♥ rs♦♥ ♥♠r t♦ t①tsr♣t♦♥s ♦rtsr♣t♦♥ ♠② sr♥ sr ♥s ♦♥sr♣t♦♥ ♠② s♦ ♥ sr ♥s ♠♥t♦r② ♥s

♥ ♥♦♥♠♣t② st ♦ t♦r ♥s s t ♥s ♥r t

♥ s strt ♥♣♥♥t② r♦♠ ❳ t ♣s r ♥ t♦tr ♦♥② ♦r ♦♥♥♥ ♥ t strt♦♥ t r ♥♦t ♥ rrr♥t♦ t ♦r♥ s♦rs t♥ t ♥s ts♠ s t ♦♥ ♦r t ♦ strt♦♥ ♥s ♥r t sr♣t♦♥ s strts t ♦♥ ♦ ❳ t t♦r ♦ t sr♣t♦♥ ♥ts t♦ ♠ tt ts ♣rt ♦ ❳ ♥t♥ t ♦s♥t ♥ t♦ ①♣♦s tr

t♦r ♥ t t♦r ♦ t ♥tt s t ♣♦♣ ♦ ♣t t♦s t♥s t♦tr♦r t t♦r ♦ t sr♣t♦♥ r s rr♥t②♥♦ ② t♦ st♥s t♥ t♠

sr♣t♦♥s r s♣♣♦s t♦ ♥t♥ sr r ♣r♦ t ♥ r♦s ♥st s ♦r ♦rtsr♣t♦♥s r ♣r♦t② r s♣♣♦s t♦ ♦r t♠s t s♠ t①tt ♥ r♥t ♥s t ♥ ♥ s♣ s s ♥ ♥ ❳ ♦♠♥t ♥ t♥t♦ ♥s

♦rtsr♣t♦♥ ①♠♥r

sr♣t♦♥ ♥ r♥çs

♦rtsr♣t♦♥

♦rtsr♣t♦♥

♥s sr♣t♦♥

♦rtsr♣t♦♥

♥ ♦ s♦rs ♦r♥ s rqr ② P s ♥♦♥♠♣t② st ♦ ♦r ♥ Pr♣r rt tt srs ♦ t♦♥♣ ♦ t♦s s♦rs ♥ st tr ♦r t♥ st

♦♠ ♦rs P ♥ ♥ tr ♦♥s♦r strt♦♥ ♦r♠t ♥ ts ♥ ♥♠ ♦rt s♦r ♣ ♦trs r rr♥s t♦t r♦r s♦r ♥ t♥ ♠t ♥♦t ♥ ♦ tt♥♦r♠t♦♥ ♥ ts rqr ② s♦♠ ts ♣r♦ t♦

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 20: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

♦r♥

♦r s

♠r♦st①♦♥trs♣♣♦rttr③

♦r

Pr♣r ❯♥♣♦

♥t③ s

Pr♣r

♦r♥

r ①♠♣ ♦ ♦r♥ t ♦r s♠♣ ♣ t s♦rs r♦♠

♦r ♥s ♥ t♦ rrr t♦② t Pr♣r rt ♥ s s♣♣♦s t♦ ❯ tts tr ❯ ♦r s♦♠t♥ s②st♠s♥ttr③ s ♥♦t tr ❯ r ♣s♦♣r♦t♦♦s t②r t ♥r ♦t♦♥s ♥ ♥ ♦r t♦ ♦ t♠ t♦ rr t♦ ♥② ♠rr♦r ♥ ❳ t♦ rr t♦ ♥② ♠rr♦r ♦ t♦ strt♦♥ s♦rs s r② ♣♥

❵♦♠♣♦st ♥r ♦t♦♥s ♠② s♦ ♥ ♦r ①♠♣ ♣ ♠② r r♦♠ t ♣t ♠② s s♠♣ s t♦ tt ts ♥♥ t♥ ❳ ♠② ♦♠r♦♠ ❳

Pr♣r rt s s ♦r t s s♦rts♦ s tr ③♣ ♥ s♦ ♦♥ rs ♣t st ts r♥t Pr♣rst st♦♠③ s ♥♦t②t ♥ ts ♥t♥t s t♦ ♣r♦ ①t♥s♦♥s♦r s②st♠s♣ rqr♠♥ts s ♥ ♣rtr ♦r rqrs s♣ trt♠♥t ♦r ♥♣♥t s♦rs

♣r♣rt♦♥ rt s ♥ ttrt tts t ♣ r t ♥♣ t s♦rs rt t♦ s♣♣♦s ♥♦♥ r♦♦t rt♦r② ♦r t P ♦r t s♦rs r s♣♣♦s t♦ ♥♣ s♦♠r ♥r srsrrt

❯ s② ♥ rt♦r② s♦r ts♦r r s s♦rt③ t ♠② sr sr s♦rs r ♣r♦ ♥ t t s♦r ts ①♠♣ t ttrt s♦r rt s st ♦ t♦♥s ♥ t rt ♦rrtt r t♦ ♦♠♣s t♦ ♦t♥ s♦rtr

♥ ①♠♣ s s♦♥ t r ❲♥ rtr♥ t s♦r t s②st♠ s

s♣♣♦s t♦ ss P ♦♠♠♥s

❬ tr s rqr t♦ ♦♥♥t t♦ t

♦ ♠rr♦r ♥ ♦ t♦ t r♦♦t

♦ t ♠rr♦r ❪

♠r♦st①♦♥trs♣♣♦rt

♥ ❳ ♣r♦② ♦♠ q♥t t♦ s♦♠t♥ s②st♠s♥①♥t①

t tr③

s s ♦ ♠♣♦rt♥ s♥ ♥ tr st ♦♥ t ② ts ♦♥ t ♠♦st ♣r♦② t s♠ strtr s t s ♦♥ t r s

t t t♠ ♦ rt♥ sr t♦♥s r ♥ t ♦trs ♣r♦②

♥tr ①♣♥s tr s ♠♥t♦r② ttrt s t ♥ ♥ ♦♣t♦♥ ♦♥ ♥♠st s ♥ r s t♦ ①♣♥s♦♠r ♥ t tr ♣r♦ ② ♣r♦str ① t♥

♥t③ s ①t② ♥ t s♠ ② trs ♦♠♣rss ② ③♣ ♦r ② t trt♦♥ ♦♠♣rss

♥t③ s ♥ t s♠ ② t rs♦♠♣rss ② ③♣

♣t ♣♣s ♣t s ♣r♦ ② ♥ t♦ s♦r tr t ts t ♠♦st ttrts t ♠♥t♦r② ♥ st

♦♣t♦♥ ♦s ♣t t♦ ♣♣ t♦ str ♣t ♦♣t♦♥ s s st ♣ r♠♥t t♦ t ♣t ♦♠♠♥ tt sss ♥ ♦♠♣rss♦♥ ♦♣t♦♥ t t♦♥♦♥ s♣s ♦ t ♣t s ♦♠♣rss ♥ ③ ③ ❩ ♦r ♥♦♥

Pr♣rst rt s t♦ ♣r♦ ♦♥tr♦ t♦ t t♦r ♦ sr♣t♦♥ ♦r ♥ ♦r ♦ t strt♦♥ ♦r ①♠♣ts ♥♦t r ♦ ③♦♦ r ♥ ♥♣♦♥ ❲♥♦s s②st♠ s♦ t ♦ ttr t♦♣r♦ ♦♥tr♦ t♦ t t♦r ♥st ♦ t♦♦r t♦♥ ♥ t ♥r rt ② t♦ ♠①♦t t Pr♣r ♥ t Pr♣rst ♠t ♣r♦ ♥ tr rs♦♥

tr t t♦♥s ♥ ♦♠♣st s♦rs t♦ r② ♥ t rt♦r② s♣ ② ❯♥♣♦ rt t♦ t ♥♦♥ r♦♦t♥ ② t ♦r ♦ t strt♦♥

sr♣t♦♥ ♦ t ♥ st s ♦r t♣r♣rt♦♥ st t ♥ st ♠② rtt♥ ♥ ♥r ② s♥ ♣r♥ t♦♥s ♥

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 21: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

♥ rt trs ♥ t ♣r♥ t♦♥s r ♥♦t st t ♠② rtt♥♥ s②st♠ s♣ ② t ♥② ♥ ♦ sr♣t♥♥ s♥ ♥st rt ♥♦ sr♣t♥ ♥ s ♦s♥ ♦r♥t♦ t trt s②st♠

r ♠st t ♠♦st ♦♥ ♥ rt ♥ tr ♠② sr ♥st ♦♥s s♦ t② t♦ r♥t trts ♥ rt s ♦♣t♦♥ s♥ s♦♠ ♣s♠t ♥♦t t ♥ ♥② ♥r ②

r s str♦♥② s②st♠♣♥♥t ♥ t♥ s♥♦ ♥r ♥ sr♣t♦♥ s♥ ts ♥♦t t♦ t ♦♥ ♥♥♦♥ trts

❯♣ t♦ ♥♦ ♦♥② t♦♥s ♥ ♣r♦♦r ♥ ♣ t ♦ ♦rs ♦trs ♥ t rst ♥♦♥♣ rs ♦ t

t① t♦ ❳ ♦♥ s t♦ ttrts ♠♥t♦r② s t ♥♠ ♦ t t♦ ♣r♦ss ♥ ♦r♠t ♦♣t♦♥ t t♦♣♥ s t ♥♠ ♦ t ♦r♠t t♦ s

t① t♦ ❳ ♦♥ s

♠♥t♦r② r♠♥t

t①t♦ ♣r♦s ♥tr t♦ t ♦♠♥tt♦♥s ♦ ❳ ♣s s t♦ ♠♦st ♦ t ♦r ♥ ♥t strt♦♥ t s ♠♥t♦r② ttrt s s♣♣♦s t♦ s①ss ♥♠ s① s t♦ t① ♥ ♦♣t♦♥ ttrts ① t t♦ ♥♦ s②♥ tr s♥ ♥① t♦ ♣r♦ss ♦ t t♦ ♥♦ s②♥ tr s ♦ssr② st♦r② ♦ ♥s s② t♦ ♣r♦ss s②♥ ♦r♣②rqrs ❳ r♥ ♦s ttrts ♥ tr ②s ♦r ♥♦ ♣rr♥s t s②s♦ ♠♥② t♠s ❳ s t♦ r♥ ♦rt ♥① ♦ssr② ♥ ♦r♣② r ♣r♦ss ♣♦str♥s t s②s ♦ ♠♥②t♠s ❳ s t♦ r♥ tr tt

♠t①sr s ♥ ♦♣t♦♥ ttrt ♥♠♠♥t♦r② stts t t♦♥ ♥ ② ♦r ♥♦t ♥ rs t s ♦r q♥t ♦♥ t trt ts ♦② t s sss t s ♥ ♥r tr ♥t ♥ssr② t♦♥s r rt t♦ ♥st ♦♥t ♥ ♣ s s rqr♦r ♣s r ♦♠♣♦s ♦ ♦♥t ts♥ t ❳ ♣ t♦ ♥ t s♥ t②s② t♦ ♥st ♦r ♥ t♦♠♥tt♦♥

♠♦ ts t♦ ♠♥t♦r② ttrts r♦♠ ♥t♦ ♥ s s t♦ ♠♦ ♦r rt♦r②r♦♠ ♣ t♦ ♥♦tr ♦ r s ♦

r ts ♥♦t t♦ s r ♦r t ♥stt♦♥ ♦ t ♣ t ♦♥② ♦r ♠♦♥ s ♥ t ♣

ts ♠♥t♦r② r♠♥t t♦ ♥ s s t♦♠♦ ♥t♦ t tr ♥ ♥s s♣♣♦s t♦ strt ♥ t rt♦r② s♣♥ t ❯♥♣♦ ttrt ♦ t ♣r♣rt♦♥st

t♦

t① ♠②t① ♦r♠tt①

s ♦ ♦rs q♥t t♦

t① ♠②t①

s r s t trt s②st♠ ♥s t t♦ ♦♦♥♦♠♠♥s ♥ t s♠ ②

t① t① ♠②t①

t① ♠②t①

s ❵♥♦t ②s♥ ①♠♣ ♦ s ♥ rt s

s♦♥ t r

sr♣t♦♥ ♦ t ♣ ts s ♦♥ ♥ss ts s t ♠♦st ♦♠♣① ♣rt ♦ t sr♣t♦♥ ♦r t st t r② ♥trst♥ ♦♥

♣ sr♣t♦♥ s ♦♠♣♦s ♦ ♣rts♥tt♦♥ ♥stt♦♥ ❯♥♥stt♦♥st t♦s ♥ ♣♥♥s rts ♥t♦♥ ♦ ♥♦♥ ♦ ts s ♥ t sss t s ♦♦ ♣r♦t♦t②♣

P s ♠♥t♦r② ttrt tt s ♥ ♦♥ ♥s t♦ rr t♦ t ♥ ♣♥♥s ♦ ♦tr ♣s s♦ t♥♠ ♦ t ♣ t ts ♣r♠ss t♦ s ♥②t♥ s

♥t②♥ ♣ st s P s P♥tt♦♥ P s ♥ ♥t

t♦♥ s t♦ s②st♠t② s t P♥tt♦♥ ♦♥② s ② s♦♠ ♦rs♦ ❳

♥tt♦♥ s t♦ ♣r♦ ❱rs♦♥ s t ♦♥ ♣r♦ ② t ♠♥ ♦ t♣ tr r sr ♠♣♦rt♥t s tr rs♦♥ ♥♠r t♥ t rs♦♥ ♥♠r ♣r♦ r ♥ ♥ rt ♦ t♦s ♦r t t t♦ ♠♣♦rt♥t s r ♥♠r ♥ t♥ t rst♥ ♣ ♥ ♥♠r ♦r ♦t ♥ ❲♥ t s ♣r♦ ♦r t ❳ r♥ t s♦ t♦ s t ♦♠♣rs♦♥ ♦ t♦ rs♦♥ ♥♠rs ♥ ♣r♥ t s②st♠

rs♦♥ ♥♠r s ♣r♦ ♦r t ♥ ♥ t P♥tt♦♥ ♦ t ♦rrs♣♦♥♥ P t♥ ts ♣♣♥ t♦ t rs♦♥

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 22: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

t① ♥s

t①t♦ ①②s ♦②s

t① tstt①

r ①♠♣ ♦ ♥ rt ♦r s♠♣ ❳ ♣ t ♦♠♥tt♦♥♥♥ ♥① ♥ st♦r② ♦ ♥s

♥♠r ♦ t ♣ ts s♦ tt ❳ ♥ ♥ ♥ ♣ ♥♠r ♥ t ♥ ♥r② rs♦♥ ♦ ♦r ♦ t strt♦♥

s s ♠♥t♦r② t♦ ♥t t ♣ s ♦ ♥ ts ❳ ♣♦rt t ♥♦t ♥ tss♦r rs♦♥ s ♥ ♦r♦tt♥ ♣♥♥② s t♦ t sr♣t♦♥ rr♥t② t rs s s♥ ♥tr rs ♥♠r ♥ ② ♥rs tr ② t t♦r ♦ t sr♣t♦♥ ♥t ♦s ♦r ② t s②st♠ ♥ ss ♦ t♦♠t♣♥♥② ♥♥ s st♦♥ ♦♥ts ♦♦r ♥ ①♠♣ ♦ s s

♥ tr rss ♦ t t s ♣r♦② ♠♦r ♥♦r♠t ♣r♣s ♥ ♦r ♥tr s②st♠ ♦r t rst rs t♥♥rs♥ t rst ♦♥ t sr♣t♦♥ ♦ t ♣ s ♦ ♥ ♥ ♠♣♦rt♥t ② ♠♥♥r♦♥ ♥ rts ♥rs♥ t s♦♥t t ♦ ♥ r♠ss ② ♣♥♥② ♠♥s tr s ♣r♦② ♥♦♥ ♦r ♣r♥ ♦r t tr t t ♦ ♥ ♠♥♦r ② t♦ ① t②♣♦ ♥ ♦♥sr♣

t♦♥ ♥ s tr s s♦t② ♥♦ rs♦♥ t♦♣r

①t sr♣t♦♥s s ①t② t s♠ strtr s t♦s ♦r Ps s ♦ t ♥s

s t ♥s ♥r t ♣ tss strt ♥ t♦r s t t♦r ♦t ♣ r tr s ♥♦ ♦♥s♦♥ t♥❵t♦r ♦ t ♣ ♥ ❵t♦r ♦ t sr♣t♦♥ ts s②st♠t② t t♦r ♦ t ♣t t♦r ♦ t sr♣t♦♥ s r② ♥ t♥ t ♥tt♦♥ ♦ t ♥

♥st♥ ♣ ♦♠ trt s②st♠s ♠②♥♦t t♦ ♦rrt② t t s r s♥ s♦r♥ ♣r♦s sr ♣s ♥s s②st♠s t P ts s ❵rt ♣ s ♥♦ r ①st♥ ♥ ♥sts♥♦ s ♦♥ t s②st♠ t rt ♣s rqr t rt ♣ t♦ t ♥ ♥sttr♦ t ♣♥♥s ♠♥s♠ ♦r ♥ t♠ss ❵♥ st ♦ s ♣s ♠♣t② ♥ tr ❵♥stt♦♥ ♣s

♥st t ♣rt ♦ t rt ♣ tt srqr

♦rs s stt② ♥ ♦♥② s♥ tr r sr Ps ♥ P ♥s ss t ♥ ♥ ♥stt♦♥ sts s②st♠s♣ ♦♥② ♦r t♦s trts tt ①♣r♥ ts ♥ ♦r tt ss ♦ ♣s

♥ ♠♦st ss ♥ t ♥ s t♦ ♥st ♥ s♥ r♥ t ♥stt♦♥ st ♥ t♥ t ♥ st ♥ t ♣r♣ ♥stt♦♥ st ♠♣t②

❲♥ ♦♥ s②st♠ tt ♥ ♥ ♠t♣ ♣s t ♥ st s♥ ♥sts t ♦ t♥ ♥ t ♥stt♦♥ st ♦s ♥♦t♥

❲♥ ♦♥ s②st♠ tt ♥♥♦t♥ ♠t♣ ♣s t ♥ st♦♥② s t ♥ ♥ t ♣r♣♥stt♦♥ s②st♠ ♥sts tt ♣s ♣rt t t②♣ ♥r② ♦r t t②♣ ♣

t♦♦s ♥ ♦ ♣s ♦r ❳ ♥ ♥ ♥ ts ♥trt② ② ♥r rts ts ♥r♥t② ♠t♣ ♥ ♦r s♥s t ♥ st ♦♥② ♥t ♣r♣ ♥stt♦♥ ♥st ♣ s♦ tt t rts t♦ rtt♥ ♦♥② ♦♥

❲♥ s♥ s♠ ♣ s s ♦r ♥② s②st♠ t ♥ sts ♥ t ♥stt♦♥ st ♥sts t♣ s s t ♠♦st rq♥t s

s ♦ r② ♦♠♣① ♥s

s ♥ ts s rrt♥ t ♥stt♦♥ st ♦r s②st♠s ♥♥♦t ♥ ♠t♣s s r② r ♥ rr♦r♣r♦♥ ❯s♥ ts♠t♦ t rr♦rs ♣♣r ♦♥② ♦r tr② ♠♥♠st s②st♠s ♥ ♥♦t ♦r

♦ st t ♥ st t ♥stt♦♥st s ♥ t♦ sr t♥st♦ ♦♥ ♥ ts ♥r sr♣t♦♥ ♥ ♦r♦ ♥ trt ♥s s♦♠ s♣ t♥s t♦ ♣r♦r♠ tt ♥♥♦t sr ② t ♥r♥

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 23: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

t s♦ s♦ ♥♦t tt t rst ♥stt♦♥t ♦♥ ♣r♦r♠ st tr t ♥st s ♥ ♦♠♣t s ② t♦ r r♦♠ ❵♥♦r♠ ♦♥ ♥st♥ t ♥ ♣ ♦♥ ttrt s②st♠ s t♦ ts r ♣r♦ ❲ t♦ sr t ♥stt♦♥ r ♥ t ♥r② ♣ ♥ ♥rt ♦r t ♦tr♦♥ ♦t ♦ t♠ st r♥t t♦ ♦♦rr♥

♥ t t t♠ ♦ rt♥s qt ♣♦♦r ♥ ♦ ♦t ♦♠ ♥♦r♠t♦♥s ♥ s ttrts ♦ t ♥stt♦♥ t

♥r ♦r t rt♦r② r t ♥r② ①ts t♦ ♥st ts s s♣♣♦s t♦ rt t♦ t r♦♦t ♦ t trt s②st♠♦r t st t♦ ♥♦tr r♦♦t t♥ t ♦♥ s♦r t ♦tr rt♦rs ♥ t t ♦t♥ ♥ ♦♥t♥t t♦ ♥② ♣r① ♥ ♥st♥ t r t♥ sr♦

r s t s♠ t♥ ♦r ♥r② s②st♠ rrs♠♦st② ♣ts

♥r s ♦r t s②st♠ ♥ s ♠♦st② t s rt t♦ ♣ts

♦r s t rt♦r② r t ♦♠♥tt♦♥ ♦r ts ♣ s♦ st♥ rt t♦t r♦♦trt♦r② ♦ t ❳ s②st♠ s②s♦♠t♥ ♦t① t♦ ♦♥t♥t t sr♦srt①♠r sr♦ s t ♣r① s♣ r♥t ♥stt♦♥ ♥ srt①♠ s t ♥♦♥ r♦♦t

st②r s t rt♦r② ♦r st② s ♣r♦ ②t ♣

str s♠ t♥ ♦r ❳ st②s

r ♦r ♦r♣ tss

t♠r ♦r t♠ s

♠r ♦r METAFONT s♦rs

♠♣r ♦r s rt t♦ t ♠♣ s②st♠ ♦r P♦♥ts

str ♦r ♠♥① st②s

♥strt♦♥s ♥ s♦ r r s ♦♦s

♠r t♦ rt rt♦r② ♦t ♦ t ♦♥s s♣ ♣r♦s② ♥ t ttrts

♦ s t♦ ♥st ♥ ♦r ♥ ts♠ ♦r ♥ st st② t♠ ♠ ♠♣ ♥ st

♦♥② ♦♥ t♦ ♥ ttrt s ♥ s ♥ ttrt str♣ ♥ tr ②s ♦r ♥♦ s ♦♣t♦♥ ♥ ts t♦②s ♥ s②s t ♥r② s t♦ str♣♣

♠t①sr s sr♣t♦♥ ♥ st♦♥ sr♣t♦♥♦ t ♥ st ♦

♦r♠t s ♠♣t② ♥ s ♠♥t♦r② ttrt ♥♠ ♥ t ♥♠ ♦ t ♦r♠t t♦r r s st ♥♦ ② t♦ s② tt t ♦r♠ts ♥ t♦ rt ♦r tt sr ♦t♠ t♦ ts t② ♣r♦♥ tr rs♦♥s ♦ t sr♣t♦♥ ♥

♥ ♣rt ♥ ♠♦st ss t ❲ ♥stt♦♥ ♠t♦ s t♦s ♥strt♦♥s t ♥rt ♦♥② stt s♥ ♠t①sr s♥t s②st♠ r② ts r t♦ ♠♦ t sst ♥ t st t♦ t rt ♣

t ♦r ♦r ♥♥st♥ ♣ s t♦ ♣r♦r♠ t ♦♥rs ♦ t t s♠ t♦♥s s ♦r ♥st♥ tt s r♠♦ t ♥st♦ ♥st♥ r♠♦ t rt♦rs ♠♣t② ♥ s♦♦♥ ♦r♠ts r s♦ rt s ♥ssr②

st ♦ s st ♦♥t♥s st ♦♦ ♥ r ♥ ♣rt♦ t r t♦ rt ♦♥rt♦♥ s r s♦t s♦ tt t ♥♥st ♥ ♣r s②st♠s ♥♥ t♠ s♠♦♦t② ♥ s t♠ rt♦rsr r♠♦ ♥♥st♥ t② r ♠♣t②

♣♥♥s ♣♥♥s t ♦♥t♥s st ♦ ♣ s t ♥♠ ♦ ♣ tt s t♦ ♥st ♥ ♦rr t♦ ts♦♥ ♣ s t ♥♠ ♦ ♣ tt st♦ ♥st ♦r ts ♦♥ t♦ s ♣r♦♣r② ♥♦♥t ♥ t ♥♠ ♦ ♣ tt rts ♦♥t ♥st ♦♥ t s♠ s②st♠ s ts ♦♥

♣ t s ♥ ♥tr ttrt tts t s♦t♥ss s st♦♥ ♥stt♦♥♣♥♥② ♦♥ ♣ ♦s t s r ♣♥♥② ♦ s t sss s♥ t ♠♥s ♥♦ ♣♥♥② t

♠♦r ♥r♥ s②st♠ s ♦r tr rs♦♥s ♦ t sr♣t♦♥ ♥ t st ♦rt ♦♥ts s♥ ts ♠♦ s r② r r♦♠ ♣rt ♥ s②st♠ ♠♦st ♣r♦② s♦♥ ♥ ①tr♥ st ♦ ♣s tt r ♥♦♥ t♦ ♥ ♦♥t ♥ ♥♦s s♦t♥ss s♦r ♦♥ts t♦ s② t s t♦ ♦rr ♦♥trt ♦r ♥♦t

♦♠♣t ①♠♣

♣ sr r s s♠ ♦♥ tt ♣r♠ts t t②♣stt♥ ♦ rr♠ tæ s r♥♦♠♣♥s t♦ s t♠ ts ❳ ♣t tst ♥ t ♦♠♥tt♦♥ ♥ tt s♦r ♥ t t① sr♣t♦♥ ♥r s ♥ t ♥st t

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 24: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

st ♥ t ♥♦t ②t s t♦ r ♣s♥ rr♥t② tr s st ♥♦ ♥rt♦r rtt♥

♦♠ ♣rts ♦ t ♦♠♥t ♥ t t ♠♣t② sr♣t♦♥ ♦ t ♣s st♥ t ♣♥♥s st

①♠ rs♦♥ st♥♦♥②s

❨P ♦ ❨ ♥t①t ❬

s t♦ s♦rt♥ t ♥♠ tr

s♥ ts ❳ ♦♠♥t s t②♣st ♥

t♦ ♦♠♥s ♠♦

❨ ♠s

♠r♦st①♦♥trs♣♣♦rt

♠①♠♠ ♥t ♦ ♥

t♦r ②rt

♠♥♠♥ ②rt♠

②rtr♥r

②rt♥♥ss♦♠r

t♦r

♥s ♣♣

❳ Pr♦t P ♥s

♥s

♥s ♥t①

❳ ♥s

♥s

P

P♥tt♦♥

P♠PP♠

♥s ♣♣

t♦r ②rt

P♥tt♦♥

♦r♥

♦r s

♠str③

♦r

Pr♣r ❯♥♣♦

♥t③ s

st

Pr♣r

♦r♥

t① ♥s

t①t♦

①②s

♦②s

t① tstt①

P ♠

♥tt♦♥

❱rs♦♥❱rs♦♥

ss

♦rtsr♣t♦♥

t♦ t②♣st r♥

rr♠ t

♦rtsr♣t♦♥

♦rtsr♣t♦♥ ①♠♥r

♣♦r ♠ttr ♥ ♦r♠ ♥

rr♠ t r♥çs

♦rtsr♣t♦♥

♦♥sr♣t♦♥

s ♣ ♦s ♦♥ t♦ t②♣st

rr♠ t s r♥

♦♠♣♥② ♦ ①♣t t♦ r t

♦♥sr♣t♦♥

♦♥sr♣t♦♥ ①♠♥r

♣ ♣r♠t ♠s ♥ ♦r♠

♥ rr♠ t t q♥

♥tr♣rs r♥çs stt♥r

r♦r

♦♥sr♣t♦♥

♥s ♣♣

t♦r ②rt

♥tt♦♥

♦t♦♥

♠r♦st①♦♥trs♣♣♦rt

♦t♦♥

♦t♦♥ ♥♥

♥r♥

♦t♦♥

♥stt♦♥

st②rt①t①

♦r♦t①

st②st②st②

♦♦

♦tstt①♦

♦tst♦

♠t①sr

♥rt

♠t①sr

♥rt

♥stt♦♥

st

t①t①st②

♦t①

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 25: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

♦t①tstt①

♦t①tst

st

t♦s

♦t ②t ♥

t♦s

♣♥♥s

♣ ♥♠❳♦r♠t

♣ ♥♠tr①

♣ ♥♠❳♦r♠t

♣ ♥♠tr①

♣ ♥♠

♣ ♥♠♥t

♣♥♥s

P

P

s s r② ♥ ①♣♥ ts ♦♠♥t ②♣♥t♦♥ s ♥♦t ♥ t s t ttts ♣♣r s sr ♥ t s ♥ s t♦t t sr♣t♦♥ ♠♦r ♣ t♦ t rs♦♥ ♠t t t♣t♣♥r♣❳♦♣♥t①t ♥ ♠♦r ♣t♦t rs♦♥ ♦ ts ♣♣r ♦r t st s♦♠t♥sr♥ t ♦rrs♣♦♥♥ rs♦♥ ♦ t s♦ t t s♠ ♣

♦ t♦r⑤P⑤♥s

t♦r ♠

t♦r ❯

♠ ❨

♥s ❨

♥s

①♠♥ ♥

P P♥tt♦♥

♦r♥

♥st

P

P♥tt♦♥

P♠

❱rs♦♥

♦rtsr♣t♦♥

♦♥sr♣t♦♥

♥s

t♦r

P♠ ❨

❱rs♦♥ ❨

♦rtsr♣t♦♥ ♥ ♦♥sr♣t♦♥

r ♥ tr ♦♥

♥ ♥♥ P

♥s P❨

♥s ❯

t♦r P❨

t♦r ❯

♥tt♦♥

P♠

❱rs♦♥

♦rtsr♣t♦♥

♦♥sr♣t♦♥

♥s

t♦r

♦r♥

♦r

Pr♣r⑤Pr♣rst

♦r ❨

♦r

Pr♣r

♥tr⑤

♥t③⑤

♣t

Pr♣r

❯♥♣♦ ❯

♥tr P❨

♥tr

st

♥t③ P❨

♥t③

st

♣t P❨

♣t

st

♣t

♦♠♣rss♦♥ ③⑤③⑤❩⑤♥♦♥

♥♦♥

Pr♣rst ❨

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 26: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

♥♠♥ ②rt

Pr♣rst

❯♥♣♦ ❯

♦r♥

♦r

Pr♣r ⑤ Pr♣rst

❯♥♣♦ ♠♣

t①⑤

t①⑤

t①t♦⑤

♠t①sr⑤

♠♦⑤

t① P❨

t①

♦r♠t ♣♥

t① P❨

t①

t①t♦ P❨

t①t♦

① ②s⑤♥♦ ♥♦

♦ ②s⑤♥♦ ♥♦

②s⑤♥♦ ♥♦

♣rr♥s

♣♦str♥s

♠t①sr ♥ tr

♠♦ P❨

♠♦

r♦♠ ❯

t♦ ❯

P❨

t♦ ❯

♥st ❨

♥st

rt ⑤♣♣⑤s♣r⑤♣

②st♠ ♥①⑤rs⑤s♦rs⑤

♣①⑤♣① ❯

P

♥tt♦♥

♦t♦♥

♥stt♦♥

❯♥♥stt♦♥

st

t♦s

♣♥♥s

Pr♦s

P

♠ ❯

♥tt♦♥

❱rs♦♥

s

♦rtsr♣t♦♥

♦♥sr♣t♦♥

♥s

t♦r

s ❨

♦rtsr♣t♦♥ P

♦rtsr♣t♦♥

①♠♥ ♥

♦♥sr♣t♦♥ P

♦♥sr♣t♦♥

①♠♥ ♥

♥s ♥ t♦r r

r② ♥

♦t♦♥ P

♦t♦♥

♥ t♥⑤♥ t♥

♥stt♦♥

❲tst

♥rt

♥rtst

♥stt♦♥

♥r

r

♥r

♦r

st②r

str

r

t♠r

♠r

♠♣r

str

♠r⑤

♦⑤

♥⑤

st⑤

st②⑤

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 27: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

sr♣t♦♥ ♥ ♦s♥ ♦r ❳

t♠⑤

♠⑤

♠♣⑤

st⑤

♠t①sr⑤

♦r♠t

❲st ❨

♥rt

♠r⑤

♦⑤

♥⑤

st⑤

st②⑤

t♠⑤

♠⑤

♠♣⑤

st⑤

♠t①sr⑤

♦r♠t

♥rtst ❨

♠r ❨

♦ ❨

♥ ❨

st ❨

st② ❨

t♠ ❨

♠ ❨

♠♣ ❨

st ❨

♠t①sr P❨

♠t①sr

♠♥t♦r② ②①⑤♥♦ ♥♦

♦r♠t P❨

♦r♠t

♥♠ ❯

❯♥♥stt♦♥

❲tst

♥rt

♥rtst

st

♦⑤⑤⑤r

r ❨

t♦s ❨

♣♥♥s

♣⑤

♣⑤

♦♥t

♣ P❨

♥♠ ❯

♣ P❨

♥♠ ❯

♦♥t P❨

♦♥t

♥♠ ❯

t♦s P❨

st

t♦s

Pr♦s P❨

Pr♦s

♠ ❯

♥♦♠♥ts

❳ ♥ ts ts ♣♣r s ♥♦t t ♣r ♦t♦♠ ♦ ♠② s ♦ t s♦ ♦♥sttt ttr strt♦♥ ♦ ❳ ts s♦ t rst ♦ ♦♥ts t r♥s ♦ ♠♥ é♠② r ♥r t♥t ♥ t ♣♦♣ ♠♦r ♥♦♥ t ❳ ♦r ♥ ♥ rt♥ strt♦♥s ♦❳ st♥ t③ ♦ sst t s♦ ❳ s sr♣t♦♥ ♥ ♠♦♥ ♦③♥s♦ ♠ t ♦ ♥ r P♦♣♥ ♦ ♦r t t③ ♦♥ t s②st♠ s ♥ ❳ ♦ ♦tr ♦ ♣r♦♣♦srt s ♦r ♣♥♥s tt ♥♦t ♥ ♠tr ♥♦ t st ② ♠ t♦ sss ♥ts ♣♣r ♦♥ rr♥s ♦ s ♦♦ r♥ t sss♦♥s ♦t P ♥ ♣r♦② ♦trs tt ♦r♦t

♣ t♥s t♦ ② Pér♦♥ ♦ s♣♥t ♦t ♦ ♦rs ♣♥ ♠ t♦ ♠♣r♦ ♠② ♥s ♥♣r♦♦ r♥ ts ♣♣r

❯♦t ❱♦♠ ♦ Pr♦♥s ♦ t ♥♥ t♥

Page 28: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Unicode and math, a combination whose time has come —Finally!

Barbara BeetonAmerican Mathematical Society

[email protected]

Abstract

To technical publishers looking at ways to provide mathematical content in elec-tronic form (Web pages, e-books, etc.), fonts are seen as an “f-word”. Withoutan adequate complement of symbols and alphabetic type styles available for di-rect presentation of mathematical expressions, the possibilities are limited tosuch workarounds as .gif and .pdf files, either of which limits the flexibility ofpresentation.

The STIX project (Scientific and Technical Information eXchange), repre-senting a consortium of scientific and technical publishers and scientific societies,has been trying to do something about filling this gap. Starting with a com-prehensive list of symbols used in technical publishing, drawn from the fonts ofconsortium members and from other sources like the public entity sets for SGML

as listed in the ISO Technical Report 9573-13, a proposal was made to the UnicodeTechnical Committee to add more math symbols and variant alphabets to Uni-code. Negotiations have been underway since mid-1997 (the wheels of standardsorganizations grind exceedingly slowly), but things are beginning to happen.

This paper will share the latest information on the progress of additionalmath symbols in Unicode, and the plans for making fonts of these symbols freelyavailable to anyone who needs them.

Introduction

The composition of mathematics has never beenstraightforward; it has always required special fontsabove and beyond the alphabetic complement re-quired for text. Even if an author makes an effortto describe mathematical concepts and relationshipsin words, there comes a point where symbols becomenecessary for both clarity and conciseness. In somefields (for example, symbolic logic), the use of nota-tion has expanded to such a degree that it is nearlyimpossible to express concepts clearly in ordinarywords; symbols convey the desired meaning muchmore directly. The situation might be comparedto that of two literate Chinese from different areasmeeting, and communicating by writing rather thanin their different spoken dialects. There is some-times just no reasonable substitute for a commonwriting system.

Although symbols form a large and importantpart of written mathematics, mainly indicating op-erations, relations, and other similar concepts, al-phabets are also co-opted from their role of rep-resenting ordinary language to provide the nota-tion for mathematical constants, variables and func-

tions — the things operated on. The number of dif-ferent alphabets used in some documents appearsto be limited only by what is available or by thecapacity of the typesetting system (manual, mecha-nized or electronic). Only numerals seem to denotemore or less the same kinds of concepts in both ordi-nary prose and mathematical notation. Needless tosay, font foundries have never been overly eager toprovide an unlimited supply of new symbol shapesof arcane design and often intricate production re-quirements.

Complicating this situation is the fact that theaudience for typeset mathematics is relatively small.If the number of mathematicians clamoring for com-petently printed material in their subject were any-where near the number of readers of novels or sportsmagazines, or if these mathematicians had budgetsmatching those of major advertising agencies, fontfoundries could muster much greater interest in do-ing this sort of work.

Terminology

When one looks at a printed page, one sees that itis constructed from many small elements. There areletters, digits, punctuation, symbols, dingbats, . . .

176 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 29: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Unicode and math, a combination whose time has come — Finally!

One might think to refer to all of these as characters.The dictionary [9] definition of character is, in part,

character . . . 1. A sign or token placedupon an object as an indication of some spe-cial fact, as ownership or origin; a mark,brand, or stamp. 2. Hence: a a graphicsymbol of any sort; esp., a graphic symbolemployed in recording language, as a letter.b Writing; printing. c . . .

Clear enough? Well, not quite.In standardese, a term can have only one mean-

ing. The basic ISO1 definition [5] is

character A member of a set of elementsused for the organisation, control, or repre-sentation of data.

Thus the term character cannot be used in an ISO

standard with any other meaning.Another relevant term is code; from the same

dictionary [9]:

code . . . 3. A system of signals for commu-nication by telegraph, flags, etc. (. . . ); also, asystem of words or other symbols arbitrarilyused to represent words; as, a secret code.

This is the term adopted to identify the system bywhich data is stored in a computer memory, and theindividual elements are known as coded characters,or characters for short. Different computer codingsystems use different bit patterns to represent thesame character; for example, the letter A would havea different code in ASCII, BCD, EBCDIC, ISO 646,ISO 8859-1, etc., but in each of these systems, Ais still considered the same character. If it is in acontext that might (in print) be represented in italicor boldface, that makes no difference; the same codeis used for all.

But an A in a font or on a printed page is not(by this system) a character, and an italic A is differ-ent from a boldface A, and so on. The term adoptedin standardese [3] for such an element is glyph:

glyph A recognizable abstract graphic sym-bol which is independent of any specific de-sign.

Thus it is clear that one code may represent manydifferent glyphs. The reverse is also true: while theword “file” is spelled with four letters, and coded asfour characters, when printed with a font that hasligatures, only three glyphs are used.

The association between characters and glyphsis referred to as mapping. What is important hereis that in neither direction is the mapping betweena coded character and a glyph one-to-one; it may

1 International Organization for Standardization

be one-to-many, or many-to-one. While this is notonly adequate, but even admirable, when dealingwith text, for mathematics it can introduce seriousambiguity.

Codes

The alphanumeric soup of standardized codes hasalready been mentioned. Consider the history ofcodes used for computer input.

Although quite a few different models of digitalcomputer architecture have been devised, very fewhave been based on a wider range of possibilities forthe smallest element other than zero and one — onand off. (This provides the rationale for naming thebit, “binary digit”.) Different combinations of bits,in strings of predefined length, designate characters.The number of bits in such a string is the limitingfactor in how many characters can comprise a code.

Very early codes contained six bits — 64 char-acters, just enough for a single-case (latin) alphabet,ten digits, five arithmetical operators (+, -, *, / and=), the punctuation required to format real num-bers and accounting data, and a number of control

codes to support interaction with a Teletype ma-chine. The following symbol complement, a variantof the BCD code, was available on a punched papertape device used in the 1970s at AMS; symbols inthe second row had to be preceded by an upshift andfollowed by a downshift, as they were piggy-backedonto other characters.

. , - / * # & $

: ; + = @ ( ) < > ’ "

This was sufficient to support Fortran, Cobol, andother antique programming languages, but not a di-rect visual representation of mathematical expres-sions.

ASCII, in its original form, had seven bits and128 characters, which could accommodate a lower-case alphabet and more symbols. (This is the codeunder which TEX was first implemented.) ISO 646 isthe “international” version of ASCII. A key princi-ple was — and is — that once a character gets into acode, it is never removed, so the current 8-bit ASCII

is backward compatible with the 7-bit version, atleast insofar as what can be encoded.

Other codes have been promulgated by manu-facturers, national standards bodies, and the ISO.Until the mid-1980s, these codes were used almostexclusively to support processing of programminglanguages and natural languages. Whatever sym-bols were included were necessary to specify pro-gramming operations, not the symbolic representa-tion of scientific disciplines, and typically, except for

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 177

Page 30: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Barbara Beeton

the few symbols and punctuation characters thatwere already present in six-bit codes, symbolic char-acters were typically segregated in programminglanguage–specific codes such as the one for APL.

Some language codes already exceeded the typ-ical eight-bit capacity of 256 elements. It is impossi-ble, for example, to fit in all the accented and vari-ant letters of the alphabet needed to represent allthe languages based on the latin alphabet. Andcodes for Japanese and Chinese had to accommo-date the nearly 10,000 characters used to publishnewspapers, or, preferably, the 50,000 characters ormore found in literary works.

The development of a multi-byte code, ISO

10646 (originally a two-byte code), undertook tocombine in a single code all existing nationaland commercial codes. Computer manufacturersand other commercial organizations dependent oncomputer technology became dissatisfied with theprogress of the ISO working group responsible forstandardizing codes, and, in 1988, formed the Uni-code Consortium for the purpose of creating a uni-fied international code standard on which new multi-national computer technology could be based. TheISO old guard was joined or replaced by the Unicodemembers, and since 1991 Unicode and ISO 10646have been parallel.

The content and structure of Unicode

In the Unicode 2.0 manual [7], the section Design

goals identifies some of the gaps in coverage by ex-isting codes.

When the Unicode project began in 1988,groups most affected by the lack of a con-sistent international character standard in-cluded the publishers of scientific and math-ematical software, newspaper and book pub-lishers, bibliographic information services,and academic researchers. . . . The explo-sive growth of the Internet has added to thedemand for a character set standard that canbe used all over the world.

The first iteration of Unicode included “char-acters from all major international standards pub-lished before December 31, 1990”. One of thesewas the SGML standard [2], which contained a size-able list of mathematical and technical symbols inits original Annex A (this list was later moved to atechnical report [4]). Other sources included “bib-liographic standards used in libraries . . . , the mostprominent national standards, and various industrystandards in very common use”.

In the Unicode 3.0 manual [8], only one refer-ence can be unambiguously associated with mathsymbols: ISO 6862, Information and documenta-

tion — Mathematics character set for bibliographic

information interchange (no explicit references areshown in the Unicode 2.0 manual). Many of thesymbols listed in the annex to the SGML standarddon’t appear in Unicode. More about this later.

There are several design principles especiallyrelevant to the designation of math symbols as char-acters [8]:

• The Unicode Standard encodes characters, notglyphs.

• Characters have well-defined semantics.

• The Unicode Standard encodes plain text.

The implication is that the meaning of each char-acter is distinct, so that the representation wheninterchanged or typeset will be unambiguous. Moreabout this later as well.

Unicode is organized into segments of 65,536characters called planes. The first of these, plane0, is the basic multilingual plane (BMP). Withinthis plane, characters with common characteristicsare grouped into blocks, usually of 256 characters.The first full block is equivalent to Latin 1, with thefirst half comprising 7-bit ASCII. The code for anycharacter assigned to the BMP can be represented by16 bits, a two-byte, or two-octet code. The formalrepresentation of such a code is “U+xxxx”, wherexxxx is a string of four hexadecimal digits.

Within the BMP, these blocks are occupied bysymbols:

• U+2000–206F: General punctuation

• U+2070–209F: Subscripts and superscripts

• U+20A0–20CF: Currency symbols

• U+20D0–20FF: Combining diacritical marksfor symbols

• U+2100–214F: Letterlike symbols

• U+2150–218F: Number forms

• U+2190–21FF: Arrows

• U+2200–22FF: Mathematical Operators

• U+2300–23FF: Miscellaneous technical (inUnicode 2.0, U+2380–23FF are unassigned,reserved for later additions)

• U+2400–243F: Control pictures

• U+2440–245F: Optical Character Recognition

• U+2460–24FF: Enclosed alphanumerics

• U+2500–257F: Box drawing

• U+2580–259F: Block elements

• U+25A0–25FF: Geometric shapes

• U+2600–267F: Miscellaneous symbols

178 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 31: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Unicode and math, a combination whose time has come — Finally!

• U+2700–27BF: Dingbats

• U+27C0–27FF: (unassigned)

• U+2800–28FF: Braille patterns (added inUnicode 3.0)

• U+2900–2DFF: (unassigned)

Symbols that were part of earlier codes are kept withthose codes in other blocks; if a code already existed,the character was not duplicated.

A segment of the BMP has been set aside forprivate use, where characters may be assigned whichare not formally included in Unicode but for whichan agreement exists between sending and receivingusers.

Up to now, most character assignments are inthe BMP, with the intention that they be easily ac-cessed. However, for less frequently occurring char-acters, work has begun to populate Plane 1. This isanother area with relevance that will become obvi-ous later.

Identifying symbols required for math

typesetting

Early in 1997, a group of scientific and technicalsocieties and publishers banded together under thename STIPub—Scientific and Technical Informa-tion Publishers — to address matters of common in-terest. The founding members of this group were

• American Chemical Society

• American Mathematical Society

• American Institute of Physics

• American Physical Society

• Elsevier Science, Inc.

• Institute of Electrical and Electronic Engineers

One topic of growing concern to the STIPubmembers was how best to move into the Internetage, to make use of the World Wide Web as an ad-junct, if not the new centerpiece, of their publishingefforts. A major obstacle facing Web publicationwas — and is — the pitifully inadequate symbol setavailable with HTML, and its lack of support for thetwo-dimensional positioning of mathematical nota-tion. Several attempts at providing some supportfor this material had been brushed aside as succes-sive releases of the HTML Recommendation2 addedfeatures to improve the visual presentation and con-trol of document layout.

It was understood that a future version of mostbrowsers would include “Unicode support”. Al-though it is unclear exactly what is meant by this,an obvious course of action was to make certain that

2 A Recommendation is the World Wide Web Consor-tium’s (W3C) equivalent of an international standard.

Unicode coverage for math and technical notation iscomplete.

A working group for Scientific and TechnicalInformation eXchange (STIX) was formed with thecharter to identify the required symbol complementand get the missing elements incorporated into Uni-code. A first step was to collect from the STIX par-ticipants and other sources lists of symbols currentlyin use, and to reduce this to two subcollections: sym-bols already in Unicode and symbols not in Uni-code. Information was gathered from the followingsources, in addition to the STIX members:

• the entity sets of ISO TR 9573-13 [4];electronic files were provided by the editor,Anders Berglund.

• fonts designed to be used with TEX:Computer Modern, AMSFonts, Lucida NewMath, lasysym, St. Mary Road, wasysym

• Wolfram Research (Mathematica)

• Justin Ziegler’s LATEX 3 project report [10]

• Taco Hoekwater (for Kluwer AcademicPublishers)

• Jorg Knappen (for Springer Verlag)

• Paul Topping, Design Science, Inc.(MathType)

• the ISO Z language standard (ISO CD 13568)

• various requests for specific symbols identifiedthrough AMS technical support and thenewsgroup comp.text.tex

More than 2200 distinct symbols were identified.The next step was to determine which were al-

ready included in Unicode. As already mentioned,not all symbols are located in the blocks designatedfor symbols; some have codes in other blocks, in-cluding Latin 1, Greek, and even among the CJK3

symbols and punctuation. About half of the sym-bols in the collection were found in the Unicode 2.0manual [7]; the remainder were assigned provisionalidentifiers in the Unicode private use area, and atable was constructed, listing the following for eachsymbol:

• its ID

• a possible cross-reference to an ID for anothersymbol of similar shape or meaning

• the AFII4 glyph identifier

• the entity name, TEX code, or other identifyinginformation for each contributor

• a brief description

3 Chinese, Japanese and Korean4 Association for Font Information Interchange

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 179

Page 32: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Barbara Beeton

1X0 1X1 1X2 1X3 1X4 1X5 1X6 1X7 1X8

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

3X0 3X1 3X2 3X3 3X4 3X5 3X6 3X7 3X8 3X9

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

Figure 1: First (arrows) and third (binary relations) of seven symbol tables in the December 1998version of the Unicode math proposal

This completed the first half of the project. Thesecond, more difficult, half remained—putting therequest into a form that would be acceptable to theUnicode Technical Committee (UTC).

Preparing the Unicode proposal

It is a UTC requirement that any request for encod-ing must be accompanied by a sample image of therequested character. This posed some problems. Formany of the symbols to be submitted, no fonts wereavailable. We solved that problem in a rudimentaryway by creating GIF images at a very low resolu-tion; for symbols we did have in fonts, this was ac-complished using latex2html, and for others, bitmapswere created by hand and packaged as GIFs. Theresulting images, packaged in HTML tables, wererough but recognizable. For the initial version of

the proposal, the order of symbols in the tables wasthe same as that in our master list, by reference ID;the full collection of tables and text— about 70 filesin all —was sent to the UTC in March 1998.

The arrangement of symbols was semi-random,and individual symbols were hard to find, so at theUTC’s request, the proposal was reorganized and thefirst revision delivered in December 1998. Figure 1shows two of the seven tables in this first revision.

Once the symbols were rearranged, the pres-ence of similar shapes —considered by the UTC tobe possible duplicates — became obvious.

The UTC takes its job seriously [8, p. 17]:

The Unicode Standard avoids duplicate en-coding of characters by unifying them withinscripts across languages; characters that areequivalent in form are given a single code.

180 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 33: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Unicode and math, a combination whose time has come — Finally!

Common letters, punctuation marks, sym-bols, and diacritics are given one code each,regardless of language, . . .

With respect to math symbols, this means thatif two symbols look very much alike, unless thereis very strong documentation to support the con-tention that they have different meanings, only onewill be assigned a code. Thus, for example, ≤ and ≦

might be considered equivalent — if they had not al-ready both been accepted into Unicode. Some UTC

members feel that the original inclusion of such pairswas a mistake, and they are determined not to re-peat it. Knowledge of that fact guided the organiza-tion of the math proposal, and helped to determinewhat kind of documentation would be needed.

The first rearrangement of the symbols was intogroups that roughly coincided with existing Unicodeblocks: arrows, “traditional” math symbols, geo-metric shapes, etc. The “traditional” symbols wereclassified further into groups that corresponded totheir functions: large operators, binary operators,binary relations, delimiters, etc. After some pre-liminary discussions with a member of the UTC, wedecided to structure our proposal in blocks corre-sponding to these functional groups, with the sym-bols arranged in the same general order as similarones already present in Unicode.

We were also advised to eliminate any “dupli-cates” of existing characters, but since slight vari-ations do often have different meanings in mathe-matical exposition, we decided to keep everythingfor the first round, and refine on the basis of spe-cific directives from the UTC. However, we did atthis stage identify symbols with similar shapes, andpossibly equivalent meanings, and flagged them inour master list to indicate the need for additionaldocumentation.

The UTC requested at the outset that symbolsused not in math, but in fields such as chemistry, as-tronomy, engineering and phonetics, be omitted, tobe requested separately by representatives of thosedisciplines. This change was made, eliminating morethan a hundred symbols.

In the first round of the proposal, we includedthree alphabets — blackboard bold, script and frak-tur —as well as a list of alphabets required formathematical exposition. Some additional alpha-betic inclusions were letters that occur in an unusualorientation (e.g., ` ) and variant forms of severalGreek letters (including ǫ, the straight-backed ep-silon) which were missing from the Unicode comple-ment. Although we felt that the case for includingthese alphabets was strong, opposition from mem-

bers of the UTC was stronger; in the next iteration,the alphabets were removed to a separate proposal.

Refining the proposal

Adjusting the content of the list of symbols to makeit acceptable to the UTC took several iterations overthe course of two years. Attendance at the meetingswhere the proposal was discussed proved to be es-sential, given the scope of the project. Two UTC

members were assigned to help refine the proposal,cast it in the form required by the ISO working group(WG2) in charge of character coding standards, andprepare the text that will appear in the publishedUnicode manual.

The first task was to overcome the reluctanceof some members of the UTC to believe that therecould actually be more than a thousand math andtechnical symbols not already in Unicode. The re-organized proposal, generally following the orderingof symbols already present, clarified the situation bymaking it relatively easy to compare the new mate-rial to the existing Unicode.

Quite a few symbols consisted of a base sym-bol plus a cancellation. This could be a long orshort slash or vertical stroke, a backwards slash, ora double vertical stroke. Although two lengths ofthe forward slash and vertical stroke appear in Uni-code among the combining diacritics, it was decidedthat the longer versions would be designated as theproper cancellation markers for math, leaving theactual shape of the cancelled symbol as a font issue.

Special attention was paid to symbols that looksimilar, that differ for example in the number

Several decisions were made in order to mim-imize the number of codes to be assigned. Thesewere the most important:

• Any symbols cancelled by a vertical or slantedstroke should be constructed from a base sym-bol and a combining diacritic; this eliminatedthe entire cancelled alphabet used by physicists.

• A “variant selector” (VS) would be provided toallow for shape variants that ordinarily repre-sent personal preference or house style and notdifferences in meaning. Except where neededto provide a base character for cancellation, inwhich case a code would be assigned, only themost common variant of such a symbol wouldbe assigned, and the specified variant repre-sented by the code for the base symbol plus theVS. A list of such variants appears in figure 2.

Documentation for the symbols that were mostlikely to be controversial was sought in publishedmaterial. A request for citations was presented on

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 181

Page 34: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Barbara Beeton

P

❱❯❲ ❳❩❨❱❬❭ ❪ ❫❴❴❵❪ ❫♠❫♦♥♣q❪r❵ts ❫①②④③❪❴①⑤❫⑥⑦⑦❱⑧⑨ ⑩❩❶❱❷❸ ❹❺❻♦❼❽❻❺❾❽❿❼➀❼➀➁➀➂❽➁➂➃➄➅ ❻♠❻♦➆②➃❼➅r❾t➇➉➈ ❽❿➋➊❻❺❽②➈④➌❼➅➍❽❺➂➎❻➏➐➐❱➑➒➓ →❩❱↔ ④❱♦♦②②♦❱ ❩❱ ♦②❮❰ÐÏÑ❱♦ÒÓ♦Ô②ÕÏ❮ÖÏ ❰❰×ØØ❱ÙØ❩Ú Û❩Ü❱ÝÞ ß à áââãäåæçéèêëâì④íì④à④æêîãðïñèà④à è②ò➉ì çóäåáâÐà④æçäîèïôäåáà è②òõáêÓà á♣óö÷÷❱øù❩ú û❩ü❱ýþ ÿ P ❯❱❲❳ ❨❩❬❭ ❪❫❴❵❴ ❴ ♠❫♠♥♦♦♣♠ ♠P♠♠qrstt ①②③④ ⑤⑦⑥⑧⑨❶⑩⑩ ❷❸❹❺⑨❻❽❼❸⑥⑩⑨❻❹❷❾❷❿➀⑨⑩➁➂➃➃➄➅ ➆➇➈➉ ➊ ➋➍➌➎➐➏➑➎➒➓➌❽→➎➋➌➒➑↔➑➌➋

♣♣❮❰ ÏÐÑÓÒ Ô➐ÕÖ♣×ØÔ×ÙÛÚÜÙ×ÝÕÞß ÔàPáâÞØãÞÚÙäã Ùå❽Ô➐ÙØÜæ×ÙåØÜ❶Õçå❽è♣ÜÙÙÜééê×éè♣×ØÔëìíîï ðñòÓó ô➐õöô÷øùúøøüûúýþÿ ù÷÷õþ ôýÿùøûÿ ø❽ôø➐ú÷øúõ❽ö♣úøøú

÷ö♣÷ô

P ❯❱ ❲❯❳❯❲❩❨❭❬❪❫❴❵❵❯❱❵ ❵❯❯❲❲❲♠♥♦ ♣qrsPtP ①②①③④⑤ ④②⑥ ⑦⑧⑦⑤❭⑨⑩❫②❶②③❷❷❸③③④②❹❺ ②①④③⑦❱❹❼❻❽⑦⑦②

❾❿❿➀➁➃➂ ➄➅➆➇P➈ ➉➊ ➋➉➌ ➍➎➐➏➌ ➑➒➓➊ →➓→➊ ➍➋➊↔➃ P ➐ ❱ ❱ ❮❰ ❮Ï❭Ð❮ÏÒÑÓÔÖÕ ❮×ÐÔ Ø❱Ô

ÙÛÚÚÚÜÞÝ ßàáãâ äåäçæ❱èéêëìíïîéð❱éèè ìèñÛòòòóÞô õö÷øõùúûü➃ýÿþ

P ❯❱❲❲❳❨❨❩❬❭ ❪❫❴❵ P ♠♥♦ ♣qrsst① ②③④⑤ ⑥⑦⑧⑨⑩❶❷❸⑨❹❺ ❻❹❼❺ ❽❾⑦❷❶❺❿⑦

➀ ❻❽❷⑦➁➂➃➂➅➄➇➆➈➊➉➆➋➌➍➈➎ ➉➎ ➏➐P➑♥➒➒➈➐P➓➃➑→➎ ➏➓➑↔➏➋➋➎➋➎➎ ➓q➑➃➇➋❸➉↔➎ ➓➋ ➈➑➏➓➃➓➆➈➐P➑➒➒➈➐P➓➉➆➋➌➈❸→➎➍➈

➌➃➒➑➎➈➋➉➉➑➑♥➏➋➉➌➍➑➉➉➎ ➈➄➇➆➈➋➉➉➑➍➐➎➋➓➈➓➈➓➐P➑➒➒➈➐P➓ ➈➉➐P➒➎ ➍➈➉➓➆➃➈➈➉➎ ➒➈➉➆➋➌➍➈

Figure 2: Symbols constructed using the Variant Selector

182 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 35: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Unicode and math, a combination whose time has come — Finally!

the AMS Web site during the summer and early fallof 1998. Although the response was not as greatas hoped for, some useful references were obtained.The ideal citation contained several similar-appear-ing symbols on a single page, in context, preferablywith definitions of one or more of the symbols inthe text. More than a hundred pages of such exam-ples were copied, annotated, assigned reference IDs,indexed, and provided to the two UTC members re-sponsible for advancing the symbols proposal. Thismass of data proved its worth more than once, whenit was possible to cite a particular sample in answerto a challenge.

Late in 1999, the content of the symbols pro-posal was agreed, codes were assigned, and a finalversion of the proposal was prepared for the spring2000 meeting of WG2. The proposal forwarded toWG2 places material into the following blocks:

• U+2000–206F: General punctuation (9 newcodes)

• U+20D0–20FF: Combining diacritical marksfor symbols (4 codes)

• U+2100–214F: Letterlike symbols (16 codes)

• U+2190–21FF: Arrows (12 codes)

• U+2200–22FF: Mathematical operators (14codes)

• U+2300–23FF: Miscellaneous technical (26codes)

• U+2400–243F: Control pictures

• U+25A0–25FF: Geometric shapes (8 codes)

• U+2900–297F: Supplemental arrows (new; 128codes)

• U+2980–29FF: Miscellaneous math symbols(new; 114 codes)

• U+2A00–2AFF: Supplemental math operators(new; 246 codes)

In addition, a few characters were added to otherareas; in all, 584 new codes have been assigned.

After much discussion, the proposition was re-luctantly accepted that the same letter from differ-ent alphabets has different meanings within a sin-gle document, and thus these different alphabetsdeserve to be coded for use only in mathematical

notation. The example used to clinch the argumentwas the contrast between these two formulas:

H =

∫dτ(εE2 + µH2)

H =

∫dτ(εE2 + µH2)

The first is the Hamiltonian formula well knownin physics; the second is an unremarkable integralequation.

These alphabets are needed for proper compo-sition of mathematics:

• lightface upright Latin, Greek and digits

• boldface upright Latin, Greek and digits

• lightface italic Latin, Greek and digits

• boldface italic Latin, Greek and digits

• script

• fraktur

• bold fraktur

• open-face (blackboard bold) including digits

• lightface upright sans serif Latin and digits

• lightface italic sans serif Latin

• boldface upright sans serif Latin, Greek, anddigits

• boldface italic sans serif Latin and Greek

• monospace Latin and digits

Except for the lightface upright letters and dig-its, which are to be encoded using the base Uni-codes (ASCII for the Latin letters and digits), thealphanumerics are to be placed in a tightly packedblock (U+D400–D7FF) in plane 1, so that they canbe used for math (most likely via entity names inMathML), but will be very difficult to access forother purposes.

The math alphanumerics block has been incor-porated into a larger proposal for plane 1, and itsschedule is slightly behind that of the symbols pro-posal. A “final” version is now in preparation, andwill be forwarded to WG2 for their fall meeting.

Assuming that the required three ISO ballotsare favorable, the new codes should be a formal partof Unicode and ISO 10646 by

Commissioning a font

Late in 1999, even before the fate of the Uni-code math proposals was known, STIPub issued aRequest for Proposal to a number of font suppli-ers. This RFP requested bids for creating a set offonts compatible with Times and incorporating allthe symbols and alphabets identified by the STIX

project, suitable both for use in Web browsers and inprint. The resulting font set is to be “made availablefor general use under license, but free of charge, withthe aim of easing and fostering the uninhibited flow,exchange, and linking of scientific information.” [6]

Proposals were received from four potential sup-pliers, and comments from a fifth, which refrainedfrom proposing because of a prior commitments. Asof this writing, a probable supplier has been chosen,and negotiations are proceeding toward a contract.

More details will be available on this topic atthe time of the Oxford TUG meeting.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 183

Page 36: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Barbara Beeton

Remaining

The Unicode manual contains extensive text de-scribing the proper use of the character codes, asa guide to programmers. Particular attention ispaid to processing of context dependencies, combin-ing codes and the like. Since mathematical notationwill be realized in a document as a combination ofcoding and markup, and not all mathematical sym-bols are interpreted in the same way, instructionsare needed. The creation of a technical report is anopen action item on the Unicode docket; the text ofthis report will ultimately be incorporated into theUnicode manual.

The symbols from chemistry, astronomy, engi-neering and phonetics that were excluded by requestof the UTC have been left for consideration by theorganizations that submitted them.

Mathematical notation is not static. Authorscontinually devise new symbols and ascribe newmeanings to existing ones. The complement of sym-bols requested from Unicode was frozen in mid-1998;a few additions were made only to achieve consis-tency in the base set of symbols affected by com-bining codes, namely the VS and negation marker.About 50 additional symbols used in math, physicsand theoretical computer science have been identi-fied since then. Documentation must be completedfor these, and the formal request presented to theUTC for their addition.

The glyph complement was frozen somewhatlater than the Unicode complement, but this tooremains to be addressed.

It has not been determined how these, or fur-ther additions, are to be handled. Nonetheless, Iam still actively collecting citations for new nota-tion, and welcome contributions.

Acknowledgments

Three UTC members were involved heavily in ad-vancing this project: Murray Sargent of Microsoft,formerly a practicing physicist; Ken Whistler ofSybase, the UTC archivist and general editor of Uni-code 3.0; and Asmus Freytag, the UTC font special-ist, who is responsible for typesetting the Unicodemanuals and ISO 10646. Their knowledge and expe-rience of character code standards has proved invalu-able, and the project’s success owes much to theirthoughtful assistance. Ken in particular is able toexplain in non-expert terms the UTC’s requirementsand the historical background affecting specific de-cisions. From the other direction, he can quicklyassess the evidence for support of an item and, ifconvinced that it has sufficient merit, can convince

the rest of the committee that it should be included.Thus, for the math proposal, the strategy was toprovide sufficient evidence for a symbol to convinceKen, and then let him persuade the committee usingarguments they would find convincing.

The contributors to the symbol collection werealways willing to provide additional information.Neil Soiffer of Wolfram Research attended sev-eral UTC meetings to explain the uses of several“letter-like symbols” that have special significancein Mathematica r©.

Patrick Ion, co-chair of the W3C MathML work-ing group, took my place at several UTC meetingswhen questions were expected that would best beanswered by a practicing mathematician, such as,“Do you know for a fact that [some particular sym-bol] is used, and are you sure it isn’t the same as[some other symbol]?” His presence and his answerssuccessfully conveyed the importance of this projectto the mathematical community.

Thanks to all for their efforts.

For more information

The history of the STIX project is recorded at theWeb site http://www.ams.org/STIX/.

References

[1] Association for Font Information Interchange,International Glyph Register, Volume 1:

Alphabetic scripts and symbols, Rochester,1993.

[2] International Organization forStandardization, ISO 8879:1986, Information

Processing — Text and office systems —

Standard Generalized Markup Language

(SGML), Geneva, 1986.

[3] International Organization forStandardization, ISO 9541:1991,Information Technology — Font Information

Interchange — Part 1: Architecture, Geneva,1991.

[4] International Organization forStandardization, ISO 9573-13:1991,Information Technology — SGML Support

Facilities — Techniques for using SGML —

Part 13: Public entity sets for mathematics

and science, Geneva, 1991.

[5] International Organization forStandardization, ISO 10646-1:1993,Information Technology — Universal

Multiple-Octet Coded Character Set (UCS) —

Part 1: Architecture and Basic Multilingual

Plane, Geneva, 1992.

184 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 37: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Unicode and math, a combination whose time has come — Finally!

[6] “STIPUB Request for Proposals for Scientificand Technical Fonts for the STIX Project”,November 16, 1999 (unpublished).

[7] The Unicode Consortium, The Unicode

Standard, Version 2.0, Addison-WesleyDevelopers Press, Reading, MA, 1996.

[8] The Unicode Consortium, The Unicode

Standard, Version 3.0, Addison WesleyLongman, Inc., Reading, MA, 2000.

[9] Webster’s New Collegiate Dictionary, G. & C.Merriam, Springfield, MA, 1959.

[10] Justin Ziegler, Technical Report on Math

Font Encodings, available from CTAN

(http://www.tug.org/tex-archive/info/ltx3pub/l3d007.tex and supporting files inthe same directory), 1994.

Barbara Beeton

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 185

Page 38: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Some experience in converting LH Fonts from METAFONT to Type1 format

Alexander BerdnikovInstitute of Analytical Instrumentation

Rizsky pr. 26

198103 St. Petersburg, Russia

[email protected]

Yury YarmolaInstitute of Analytical Instrumentation

Rizsky pr. 26

198103 St. Petersburg, Russia

[email protected]

Olga LapkoInstitute of Analytical Instrumentation

Rizsky pr. 26

198103 St. Petersburg, Russia

[email protected]

Andrew JanishewskyInstitute of Analytical Instrumentation

Rizsky pr. 26

198103 St. Petersburg, Russia

[email protected]

Abstract

This paper decribes the long-term project of CyrTEX (Association of Cyrillic TEXUsers Group) to convert Cyrillic LH fonts from METAFONT format into Type1format, which is more suitable for modern typography.

Sasha Berdnikov

186 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 39: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Introduction

One of the most difficult tasks in technical

typesetting is to get computer programs to look right.

[. . .] No automatic system can hope to find the best

breaks in programs, since an understanding of the

semantics will indicate that certain breaks make the

program clearer and reveal its symmetries better.

— D. E. KNUTH, Digital Typography

Computer books and journals do not look as beau-tiful as they used to. It is not their content thatis unsatisfactory, rather the typography is strange.The example below illustrates that. It is a re-ally disgusting piece of typography taken from thePolish translation of an English book.

Program JavaScript przedstawiony w listingu 6.2stanowi przyklad zastosowania cookie.

//========================================

// Here are our standard Cookie routines

//========================================

//----------------------------------------

// SetCookieEZ - Quickly sets a cookie

// which which will last until the user

// shuts down his browser

//----------------------------------------

function SetCookieEZ(name, value)

document.cookie=name+"="+escape(value);

//----------------------------------------

// GetCookie - Returns the value of the

// specified cookie or null if the

// cookie doesn’t exist

It seems that typesetters think that a typewriteris the best tool to prepare readable and clearprograms. This situation reminds us of an oldPolish proverb: “The shoemaker does not wearshoes”. Why? Because it is inexplicable that thetypesetter does not typeset programs. Why do

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 187

Typesetting TEX documents containing computer code

W9lodek [email protected]

Abstract

I would like to present a preprocessor driven by grammars able to automaticallymark-up pieces of computer code immersed in TEX documents. By computercode I mean any language for which a context free grammar exists, which YACC

will accept. These include almost any computer language. But my tool coulduse any such grammar to automatically mark-up text written in the languagedefined by it.

they use verbatim mode of typesetting—a kind of‘ASCII typography’? Do they have nothing better?Although typography is well developed, that ofcomputer code lags far behind. However, there arerules for typographic formatting of computer code.Developing excellent computer code typography waspioneered by two people: Peter Naur and MyrtleKellington, who set the standards that were adoptedby many computer journals [8, 6]. But it seemsthat they are no longer used at all.

Editor’s note: What does the citation 6 in theabove paragraph signify?— it’s a citation of Knuth

In the next section I will try to analyze why,and what makes code typesetting so difficult. Inthe following one, I will present my idea of aprettyprinting tool, which combines Knuth’s [3] andOppen’s [9] approaches. One example is worth athousand words, so the last section presents twolonger examples typeset by my tool.

The term ‘prettyprinting’, which goes backto 1975 book Programming Proverbs by HenryLedgard, is nowadays used instead of ‘code typeset-ting’.

Prettyprinting HOWTO

Obviously ASCII typography is what programmersare familiar with and see most often. Look atsomething less ugly.

The following code uses the extended features ofBC to implement a simple program for calculatingcheckbook balances.

print "Check book program!\n";

print " Exit by a 0 transaction.\n\n";

print "Initial balance? ";

bal = read();

Page 40: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

bal /= 1;

print "\n";

while (1)

"current balance = "; bal

"transaction? "; trans = read()

if (trans == 0) break;

bal -= trans

bal /= 1

Although the structure of the code is clearlylaid out, the beginner will have problems withrecognizing the elements which are predefined partof the language. Adding some typography to thisexample solves this problem and makes the programclearer.

The following code uses the extended features ofBC to implement a simple program for calculatingcheckbook balances.

print "Check book program!\n";print " Exit by a 0 transaction.\n\n";print "Initial balance? ";bal = read( );bal /= 1;print "\n";while (1) "current balance = "; bal

"transaction? "; trans = read( )if (trans ≡ 0) break;bal −= trans

bal /= 1

A simply bit of typography makes the differ-ence. So the question is: why is it not used? Addingtypography means adding mark-up to the sourcecode. This makes the source for the example looklike

The following code uses the extended

features of |\acroBC| to implement a

simple program for calculating checkbook

balances.

\startPP[BC]

\PPKprint\PPbreakspace \PPS"Check\ book\

\PPKprint\PPbreakspace \PPS"\ \ Exit\ by

\PPKprint\PPbreakspace \PPS"Initial\ bal

\PPVbal\PPequal \PPKread\PPbraceleft \P

\PPVbal\PPslasheq \PPN1\PPsemicolon \PP

\PPKprint\PPbreakspace \PPS"\\n"\PPsemi

\PPKwhile\PPspace \PPbraceleft \PPN1\PP

\PPS"current\ balance\ =\ "\PPsemicolon

\PPS"transaction?\ "\PPsemicolon \PPspa

\PPKif\PPspace \PPbraceleft \PPVtrans

\PPVbal\PPminuseq \PPVtrans\PPforce

188 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

W9lodek Bzyl

\PPVbal\PPslasheq \PPN1\PPforce

\PPbackspace \PPparenright

\stopPP[BC]

We can see that it is not that simple. Markuprequires consistency and time which people do nothave, whereas computers have both. So, whynot use computers?— it seems possible, becausecomputer languages, unlike natural languages, areunambiguously described by grammars. So wecan try to use grammars to control the processof marking-up code. For example, in C or PERL,one grammar rule for statement says that statement

is build of the opening brace ‘’ followed by astatement list and the closing brace ‘’, which couldbe concisely written as:

statement → ´´ statement list ´´

Now, assume that we want to typeset braces onseparate lines with statement list typeset indentedbetween them

statement list

This could be done in the following way: afterrecognizing the statement components, we typesetthe opening brace followed by the newline; next wetypeset indented each statement from the statementlist; next we typeset the newline followed by theclosing brace.

Editor’s note: Propose above paragraph be re-placed, to save enough space that the paperdoesn’t run to 6pp; wording would be (note thatthe operations described also appear later on):This could be done very simply once the syntacticelement has been recognized.

However, prettyprinting is not that simple, be-cause programmers use both syntax and semanticsto make their programs clearer and more readable.This makes the task of building a wholly automaticprettyprinting tool impossible. Fortunately, theconflicts between syntax and semantics are suffi-ciently rare that it is acceptable to require the userto override syntax-based decisions when necessary.

Building a tool

Many people have tried to formalize and implementthe idea of prettyprinting. William McKeeman [11]was the first to present a prettyprinting algorithm.Oppen [9] came up with the idea of using the orig-inal grammars to control the marking-up process.

Page 41: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Knuth’s [3, 12] approach is based on his so-called‘format primitives’ listed below.

indent indent the next line one more notchoutdent indent the next line one less notchoptbreak optional line breakbackspace backspace one notchbreakspace optional break or spaceforce force line breakbigforce force line break and

a little extra vertical spacenoindent no indentation

Spacing in expressions is inherited from the TEXmathematical mode.

Knuth does not use the original PASCAL or C

grammars to derive prettyprinting grammars. Foreach language, a specially designed and optimizedcontext sensitive grammar is created. These gram-mars do not describe reference languages, whichmeans that some pieces of correct code wouldnot be prettyprinted and incorrect code would beprettyprinted. Markup is done by manually builtparsers. Using parsers for building prettyprintersis a double-edged sword: comments are lost duringparsing, and while prettyprinting they have to beput back. Knuth’s tools recover comments too.

The main difficulty with Knuth’s approach liesin creating prettyprinting grammars. So far onlytwo such nontrivial grammars have been created.It took 10 years for the prettyprinting C grammarto evolve. Therefore, I think that the Oppen’sidea of enhancing the original grammars is easier toimplement.

For example, look at the rule for statement

above and assume, that we want to typeset state-ment list indented within braces. The following rulewill do:

statement → ´´ indent force statement list

force backspace ´´ outdent force

This reads as follows: print the opening brace

and prepare to indent following lines; next breakthe line with force and typeset statement list ; now,break the line again with force, backspace and printthe closing brace ; finally, remove with outdent theindentation for the following lines and force the linebreak again.

Combining the ideas above I designed a pret-typrinting tool named pp which works as a prepro-cessor for TEX.

foo.tex pp xfoo.tex tex xfoo.dvi

prettyprinting macros

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 189

Typesetting TEX documents containing computer code

It is also possible to typeset code verbatim—simply typesetting as it used to be.

foo.tex tex foo.dvi

verbatim macros

Examples

There are many computer languages in use nowa-days. Some of them I use on a day to day basis,some I use occasionally, some I want to look at, andstill others are used by my colleagues. ThereforeI want my tool to be able to learn as many lan-guages as possible. The current version knows howto typeset only two languages: EBNF—extendedBackus-Naur formalism and BC—the language ofthe binary calculator (a tool available on everyUNIX system), because it is still being developed.

Someone said “One picture is worth one thou-sand of words,” so I want to end up with two piecesof prettyprinted code. Because there is no generalagreement how to typeset computer documents, asopposed to mathematical ones, some readers maylike these examples and others not. Moreover,mathematicians, have a well developed notationwhich is supported by suitable fonts. This mayexplain why these examples are not as clear andreadable as they could be.

Source: Ken Arnold, James Gosling.”The Java Programming Language.”Addison Wesley Longman, Inc. 1996.

Consider the two groups of productions:

FieldDeclaration → FieldModifiers∗ Type

VariableDeclarators

;FieldModifiers → FieldModifier

| FieldModifiers FieldModifier

;FieldModifier → keywords common for field and

method| transient | volatile

;

and:

MethodHeader → MethodModifiers∗ResultType MethodDeclarator Throws∗

;MethodModifiers → MethodModifier

| MethodModifiers MethodModifier

;

Page 42: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

MethodModifier → keywords common for fieldand method

| abstract | native | synchronized;

where common keywords consists of: public, pro-tected, private, final, static.

Source: Philip A. Nelson.LIBMATH.B.The arbitrary precision math library for the BC

calculator.

To compute exponential we use the fact that ex =(ex/2)2. When x is small enough, we use the series:ex = 1 + x + x2/2! + x3/3! + . . . .

scale = 20;define e(x )

auto a, d , e, f , i , m, n, v , z

a — holds xy of xy/y! d — holds y! e — is the value xy/y! v — is the sum of the e’s f — number of times x was divided by 2. m — is 1 if x was minus. i — iteration count. n — the scale to compute the sum. z — orignal scale. Check the sign of x.if (x < 0)

m = 1; x = −x

Precondition x.z = scale;n = 6 + z + .44 ∗ x ;scale = scale(x ) + 1;while (x > 1)

f += 1; x /= 2; scale += 1; Initialize the variables.scale = n;v = 1 + x

a = x

d = 1for (i = 2; 1; i++)

e = (a ∗= x )/(d ∗= i)if (e ≡ 0)

if (f > 0) while (f −−) v = v ∗ v ;scale = z

if (m) return (1/v);return (v/1);

v += e

190 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

W9lodek Bzyl

Define the logarithm function.

define l(x ) auto e, f , i , m, n, v , z

Return something for the special case.if (x ≤ 0) return ((1 − 10ˆscale)/1) Precondition x to make .5 < x < 2.0.z = scale; scale = 6 + scale;f = 2; i = 0; For large numbers.while (x ≥ 2)

f ∗= 2; x = sqrt(x ); For small numbers.while (x ≤ .5)

f ∗= 2; x = sqrt(x ); Set up the loop.v = n = (x − 1)/(x + 1)m = n ∗ n

Sum the series.while (x < 2)

e = (n ∗= m)/iif (e ≡ 0)

v = f ∗ v

scale = z

return (v/1)v += e

The sin function uses the standard series:sin(x) = x − x3/3! + x5/5!− x7/7! + . . .

define s(x ) auto e, i , m, n, s , v , z

Precondition x.z = scale

scale = 1.1 ∗ z + 2;v = a(1)if (x < 0)

m = 1;x = −x ;

scale = 0n = (x/v + 2)/4x = x − 4 ∗ n ∗ v

if (n % 2) x = −x

Do the loop.scale = z + 2;v = e = x

s = −x ∗ x

Page 43: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

for (i = 3; 1; i += 2) e ∗= s/(i ∗ (i − 1))if (e ≡ 0)

scale = z

if (m) return (−v/1);return (v/1);

v += e

For arctan we use the formula: arctan(x) =arctan(c) + arctan((x− c)/(1 + xc)) for small c (0.2here). For x ≤ 0.2, use the series: arctan(x) =x − x3/3 + x5/5− x7/7 + . . . .

define a(x ) auto a, e, f , i , m, n, s , v , z

a is the value of a (0.2) if it is needed. f is the value to multiply by a in the return. e is the value of the current term in the

series. v is the accumulated value of the series. m is 1 or −1 depending on x (−x → −1); results are divided by m. i is the denominator value for series element. n is the numerator value for the series

element. s is −x · x. z is the saved user’s scale.m = 1; Negative x?if (x < 0)

m = −1; x = −x ; Special case and for fast answersif (x ≡ 1)

if (scale ≤ 25) return

(.7853981633974483096156608/m)if (x ≡ .2)

if (scale ≤ 25) return

(.1973955598498807583700497/m) Save the scale.z = scale; Note: a and f are known to be zero due to

being auto vars. Calculate arctan of aknown number.

if (x > .2) scale = z + 5; a = a(.2);

Precondition x.scale = z + 3;

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 191

Typesetting TEX documents containing computer code

while (x > .2) f += 1; x = (x − .2)/(1 + x ∗ .2);

Initialize the series.v = n = x ;s = −x ∗ x ; Calculate the series.for (i = 3; 1; i += 2)

e = (n ∗= s)/i ;if (e ≡ 0)

scale = z ;return ((f ∗ a + v)/m);

v += e

References

[1] Blashek, Gunter and Johannes Sametinger.“User-Adaptable prettyprinting.” Software—

Practice & Experience 19 (July 1989).[2] Gartner, Felix. 1998. The PretzelBook.

Available online as part of the PRETZEL

distribution, in directory ~gaertner/pretzel

at www.iti.informatik.th-darmstadt.de[3] Knuth, Donald E. 1983. “The WEB

System of Structured Documentation.”Computer Science Report 980. StanfordUniversity. Available online as part of theWEB distribution, in file~web/doc/webman.tex at ftp.dante.de.

[4] Knuth, Donald E. “Literate Programming”,The Computer Journal 27 (1984). pp. 97–111.

[5] Knuth, Donald E. 1986. “How to reada WEB.” Appeared in Computers &

Typesetting, Volume B. Addison-Wesley.[6] Knuth, Donald E. 1992. Literate

Programming. Center for the Study ofLanguage and Information Leleand StanfordJunior University.

[7] Knuth, Donald E. 1999. Digital Typography.Center for the Study of Language andInformation Leleand Stanford JuniorUniversity.

[8] Naur, Peter [ed.] et al. “Report onthe algorithmic language ALGOL 60.”Communications of the ACM 3 (May 1960).pp. 299–314.

[9] Oppen, Derek C. “Prettyprinting.” ACM

Transactions on Programming Languages &

Systems 2 (1980). pp. 465–483.[10] Ramsey, Norman. 1988. “A SPIDER

user’s guide.” Technical Report, Princeton

Page 44: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

University. Available online as partof the SPIDER distribution, in file~web/spiderweb/doc/spiderwebman.tex atftp.dante.de.

[11] McKeeman, William. “Algorithm 268.”Communications of the ACM 8 (1965).pp. 667–668.

192 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

W9lodek Bzyl

[12] Knuth, Donald E. and Silvio Levy. 1990.“The CWEB System of StructuredDocumentation.” Computer ScienceReport 1336. Stanford University. Availableonline as part of the CWEB distribution,in file ~web/c_cpp/cweb/cwebman.tex atftp.dante.de.

W9lodek Bzyl

Page 45: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

xmltex: A non validating (and not 100% conforming) namespace awareXML parser implemented in TEX

David CarlisleNAG Ltd

Jordan Hill Road

Oxford

[email protected]

Abstract

xmltex implements a non validating parser for documents matching the W3C

XML Namespaces Recommendation.

Introduction

xmltex may be used simply to parse a file (expand-ing entity references and normalising namespace dec-larations) in which case it records a trace of the parseon the terminal. However, in normal use, the infor-mation from the parse is used to trigger TEX type-setting code. Declarations (in TEX syntax) are pro-vided as part of xmltex to associate TEX code withthe start and end of each XML element, attributes,processing instructions, and with unicode characterdata.

Installation

The xmltex parser itself does not require LATEX. Itmay be loaded into initex to produce a format ca-pable of parsing XML files. However such a formatwould have no convenient commands for typeset-ting, and so normally xmltex will be used on topof an existing format, normally LATEX. In this sec-tion we assume that the document to be processedis called document.xml.

Using XMLTEX as an input to the LATEX com-

mand LATEX requires a document in TEX syntax,not XML. To process document.xml, first producea two line file called document.tex of the followingform:

\def\xmlfiledocument.xml

\input xmltex.tex

No other commands should appear in this file!The document may then be processed with the

command: latex document, or some equivalent pro-cedure in the user’s TEX environment.

Using XMLTEX as a TEX format built on LATEX

Some users may prefer to set up xmltex as a formatin its own right. This may speed things up slightly(as xmltex.tex need not be read each time) butmore importantly perhaps it allows the XML file to

be processed directly without needing to make the.tex wrapper.

To make a format, some command such as thefollowing is used, depending on the user’s TEX sys-tem.

initex &latex xmltex

initex \&latex xmltex

tex -ini &latex xmltex

tex -ini \&latex xmltex

This will produce a format file xmltex.fmt. Itis then possible to make an xmltex command bycopying the way the latex command is defined interms of latex.fmt. Depending on the TEX system,this might be a symbolic link, or a shell script, orbatch file, or a configuration option in a setup menu.

Making an XMLTEX format ‘from scratch’ Itmay be convenient, for some, to build an xmltex

format as above, starting from the LATEX format.However, other users may prefer to work with aninitex with no existing format file. Even for thosewho wish to use standard LATEX it may be preferableto make a TEX input file that first inputs latex.ltxthen xmltex.tex. In particular this permits dif-ferent hyphenation and language customisation forxmltex than for LATEX. Many of the features ofthe language support in LATEX are related to modi-fying the input syntax to be more convenient. Suchchanges are not needed in xmltex as the input syn-tax is always XML. Some language files may changethe meaning of such characters as < which wouldbreak the xmltex parser. Also, rather than us-ing latex.ltx one can in principle use a modifieddocstrip install file and produce a ‘cut down’ LATEXthat omits features that are not going to be used inxmltex.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 193

Page 46: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

David Carlisle

Unfortunately the support for this method ofbuilding xmltex (and access to non-English hyphen-ation generally) is not fully designed and totally un-documented.

Using XMLTEX

xmltex by default ‘knows’ nothing about any par-ticular type of XML file, and so needs to load exter-nal files containing specific information. This sec-tion describes how the information in the XML filedetermines which files will be loaded.

1. If the file begins with a Byte Order Mark, thedefault encoding is set to UTF-16. Otherwisethe default encoding is UTF-8.

2. If (after an optional BOM) the document be-gins with an XML declaration that specifies anencoding, this encoding will be used, otherwisethe default encoding will be used. A file withname of the form encoding.xmt will be loadedthat maps the requested encoding to Unicodepositions. (It is an error if this file does notexist for the requested encoding.)

3. If the document has a DOCTYPE declarationthat includes a local subset then this will beparsed. If any external DTD entity is referenced(by declaring and then referencing a parameterentity) then the SYSTEM and PUBLIC identi-fiers of this entity will be looked up in a cata-logue (to be described below). If either identi-fier is known in the catalogue the correspondingxmltex package (often with .xmt extension)will be loaded.

4. After any local subset has been processed, ifthe DOCTYPE specifies an external entity, thePUBLIC and/or SYSTEM identifiers of the ex-ternal DTD file will be similarly looked up, anda corresponding xmltex file loaded if known.

5. As each element is processed, it may be ‘known’to xmltex by virtue of one of the packagesloaded, or it may be unknown. If it is unknownthen if it is in a declared namespace, the name-space URI (not the prefix) is looked up in thexmltex catalogue. If the catalogue specifies anxmltex package for this namespace it will beloaded. If the element is not in a namespace,then the element name will be looked up in thecatalogue.

6. If after all these steps the element is still un-known then depending on the configuration set-ting either a warning or an error will be dis-played. (Currently only warning implemented.)

The XMLTEX Catalogue As has already been ex-plained, xmltex requires a mapping between PUB-

LIC and SYSTEM identifiers, namespace URI, andelement names, to files of TEX code. This mappingis implemented by the following commands:\NAMESPACEURIxmt-file

\PUBLICFPIfile

\SYSTEMURIfile

\NAMEelement-namexmt-file

\XMLNSelement-nameURI

As described above, if the first argument of oneof these commands matches the string specified inthe XML source file, the corresponding TEX com-mands in the file specified in the second argumentare loaded. The PUBLIC and SYSTEM catalogueentries may also be used to control which XML filesshould be input in response to external entity refer-ences. The \XMLNS command is rather different; ifan element in the null namespace does not have anydefinition attatched to it, this declaration forces thedefault namespace to the given URI. The cataloguelookup is then repeated. This allows for exampledocuments beginning <html> to be coerced into theXHTML namespace.

These commands may be placed in a configu-ration file, either xmltex.cfg, in which case theyapply to all documents, or in a configuration file‘\jobname.cfg’ (e.g., document.cfg in the exam-ple in section ‘Using xmltex’, above) in which casethe commands just apply to the specified document.

Configuring XMLTEX In addition to the ‘cata-logue’ commands described earlier there are othercommands that may be placed in the configurationfiles.

• \xmltraceonly

This stops xmltex from trying to typeset thedocument. The external files specified in thecatalogue are still loaded, so that the trace mayreport any elements for which no code is de-fined, but no actual typesetting takes place. Inthe event of unknown errors it is always worthusing xmltex in this mode to isolate any prob-lems.

It may be noted that if an xmltex format isbuilt just using initex without any typesettingcommands, the resulting format should still beable to parse any XML file if xmltex.cfg justspecifies \xmltraceonly and \jobname.cfg isempty.

• \xmltraceoff

By default xmltex provides a trace of its XML

parse, displaying each element begin and end.

194 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 47: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

xmltex: A non validating namespace aware XML parser implemented in TEX

This command in xmltex.cfg or \jobname.cfgwill stop the trace being produced.

• \inputoncexmt-file

The catalogue entries specify that certain filesshould be loaded if XML constructs are met. Al-ternatively the files may just always be loaded.The system will ignore any later requests toload. This is especially useful if an xmltex

format is being made.

• \UnicodeCharacterhex-or-dectex-code

The first argument specifies a unicode charac-ter number, in the same format as used forXML character entities, namely either a decimalnumber, or an upper case Hex number precededby a lower case ‘x’.

The second argument specifies arbitrary TEXcode to be used when typesetting this character.Any code in the XML range may be specified(i.e., up to x10FFFF). Although codes in the‘ASCII’ range, below 128, may be specified, thedefinitions supplied for such characters will notby default be used. The definition will howeverbe stored and used if the character is activatedusing the command described below.

• \ActivateASCIIhex-or-dec

The argument to this command should be anumber less than 128. If a character is acti-vated by this command in a configuration filethen any special typesetting instructions speci-fied for the character will be executed wheneverthe character appears as character data.

Some ASCII characters are activated by de-fault. The list is essentially those characterswith special meanings to either TEX or XML.

If a format is being made, there are essentiallytwo copies of xmltex.cfg that may play a role. Theconfiguration file input when the format is made willcontrol catalogue entries and packages built into theformat. A possibly different xmltex.cfg may beused in the input path of ‘normal’ TEX, this willthen be used for additional information loaded eachrun.

In either case, a separate configuration file spe-cific to the given XML document may also be used(which is loaded immediately after xmltex.cfg).

Stopping xmltex

xmltex should stop after the end of the documentelement has been processed. If something goes wrongone may be offered TEX’s * prompt from which onemight choose to exit with <?xmltex stop?>.

XMLTEX package files

xmltex package files are the link between the XML

markup and TEX typesetting code. They are writtenin TEX (rather than XML) syntax and may load di-rectly or indirectly other files, including LATEX classand package files. For example a file loaded fora particular document type may directly execute\LoadClassarticle, or alternatively it may causesome XML element in the document to execute\documentclassarticle. In either case the doc-ument will suffer the dubious benefit of being for-matted according to the style implemented in thestandard article class. Beware though that the pack-age files may be loaded at strange times, the firsttime a given namespace is declared in a document,and so the code should be written to work if loadedinside a local group.

Characters in xmltex package files have theirnormal LATEX meanings except that line endings areignored so that there is no need to add a % to theend of lines in macro code. Unlike LATEX .fd fileconventions, other white space is not ignored.

The available commands are:

• \FileEncodingencoding

This is the analogue for TEX syntax files of theencoding specification in the XML or text dec-laration of XML files. If it is not specified thefile will be assumed to be in UTF-8.

• \DeclareNamespaceprefixURI

This declares a prefix to be used in this file

for referring to elements in the specified name-space. If the prefix is empty then this declaresthe default namespace (otherwise, unprefixedelement names refer to elements that are not ina namespace).

Note that the elements in the XML documentinstance may use a different prefix, or no prefixat all to access this namespace. In order to re-solve these different prefixes for the same name-space, each time a namespace is encountered forthe first time (either by \DeclareNamespace ina preloaded package, or in a namespace decla-ration in the XML instance) then it is allocateda new number and any further namespace dec-laration for the same URI just locally associatesa prefix with this number. It is these numbersthat are displayed when the XML trace of theparse of the document is shown, and also if anyelement is written out to an external file it willhave a normalised numerical prefix whicheverprefix it originally had. (Numeric prefixes arenot legal XML, but this is an advantage, as it

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 195

Page 48: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

David Carlisle

ensures these internal forms can not clash withany prefix actually used in the document.)

Three namespaces are predeclared. The nullnamespace (0), the XML namespace http://

www.w3.org/1998/xml (1) which is predeclaredwith prefix xml as specified in the NamespaceRecommendation, and the xmltex name-space http://www.dcarlisle.demon.co.uk/

xmltex (2) which is not given a default prefix,but may be used to have XML syntax for someinternal commands (eg to have .aux files fullyin XML, currently they are a hybrid mixture ofsome TEX and some XML syntax).

• \XMLelementelement-qnameattribute-spec

begin-codeend-code

This is similar to a LATEX \newenvironment

command. It declares the code to execute atthe start and end of each instance of this ele-ment type. This code will be executed in a localgroup (like a LATEX environment). The secondargument declares a list of attributes and theirdefault values using the \XMLattribute com-mand whose description follows.

• \XMLelementelement-qnameattribute-spec

\xmlgrabend-code

A special case of the above command (whichmay be better made into a separate declara-tion) is to make the start-code just be the com-mand \xmlgrab. In this case the end-code hasaccess to the element content (in XML syntax)as #1. This content isn’t literally the same asthe original document, namespaces, white spaceand attribute quote symbols will all have beennormalised.

• \XMLattributeattribute-qnamecommand-

namedefault

This command may only be used in the ar-gument to \XMLelement. The first argumentspecifies the name of an attribute (using anynamespace prefixes current for this package file,which need not be the same as the prefixes usedin the document). The second argument givesa TEX command name that will be used to ac-cess the value of this attribute in the begin andend code for the element. (Note using TEX syn-tax here provides a name independednt of thenamespace declarations that are in scope whenthis code is executed). The third argument pro-vides a default value that wil be used if theattribute is not used on an instance of this ele-ment.

The special token \inherit will cause thecommand to have a value set in an ancestor el-ement if this element does not specify any value.

If a TEX token such as \relax is used as thedefault the element code may distinguish thecase that the attribute is not used in the docu-ment.

• \XMLnamespaceattributeprefixattribute-

qnamecommand-namedefault

This command is similar to \XMLattribute butis used at the top level of the package file, not inthe argument to \XMLelement. It is equivalentto specifying the attribute in every element inthe namespace specified by the first argument.As usual the prefix (which may be to denotethe default namespace) refers to the namespacedeclarations in the xmltex package: the pre-fixes used in the document may be different.

• \XMLentitynamecode

Declare an (internal parsed) entity, this is equiv-alent to a <!ENTITY]]> declaration, except thatthe replacement text is specified in TEX syntax.

• \XMLnamenamecommand-name

Declare the TEX command to hold the (nor-malised, internal form) of the XML name givenin the first argument. This allows the codespecified in \XMLelement to refer to XML el-ement names without knowing the encodingsor namespace prefixes used in the document.Of particular use might be to compare such aname with \ifx\XML@parent which will allowelement code to take different actions depend-ing on the parent of the current element.

• \XMLstringcommand-name<>XML Data</>

This saves the XML fragment as the TEX com-mand given in the first argument. It may beparticularly useful for redefining ‘fixed strings’that are generated by LATEX document classesto use any special typesetting rules specified forindividual characters.

XML processing

xmltex tries as far as possible to be a fully conform-ing non validating parser. It fails in the followingrespects.

• Error reporting is virtually non existent. Namesare not checked against the list of allowed char-acters, and various other constraints are not en-forced.

• A non validating parser is not forced to readexternal DTD entities (and this one does not).It is obliged to read the local subset and pro-cess entity definitions and attribute declara-tions. Entity declarations are reasonably wellhandled: External parameter entities are han-dled as above, loading a corresponding xmltex

196 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 49: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

xmltex: A non validating namespace aware XML parser implemented in TEX

file if known. External entities are similarly pro-cessed, inputting the XML file, a difference inthis case is that if the entity is not found inthe catalogue, the SYSTEM identifier will beused directly to \input as often this is a localfile reference. Internal parsed entities and pa-rameter entities are essentially treated as TEXmacros, and nonparsed entities are saved alongwith their NDATA type, for use presumably by\includegraphics.

Any default attributes specified in the localsubset are saved and added to the correspond-ing element befor any processing is triggered.Note that this defaulting, unlike the defaultsspecified with \XMLattribute are ‘namespaceunaware’ and only apply to elements using thesame expanded name. The element from thesame namespace but represented with a differ-ent prefix will not have these defaults applied.

• Support for encodings depends on having an en-coding mapping file. Any 8-bit encoding thatmatches Unicode for the first 127 positions maybe used by making a trivial mapping file. (Theone for latin1 looks over complicated as it pro-grams a loop rather than having 127 declara-tions saying that latin1 and Unicode are iden-tical in this range).

UTF-8 is supported, but support for UTF-16 is minimal. Currently only latin-1 valueswork: (In this range UTF-16 is just latin-1 witha null byte inserted after (or before, depend-ing on endedness) each latin-1 byte. The UTF-16 implementation just ignores this null bytethen processes as for latin-1. Probably the firstfew 8-bit pages could be similarly supported bymaking the low ASCII control characters acti-vate UTF-16 processing but this will never besatisfactory using a standard TEX. Hopefully asetup for a 16bit TEX such as Omega will cor-rect this.

Accessing TEX

In theory one should be able to control the documentsimply by suitable code specified by \XMLelement

and friends, but sometimes it may be necessary to‘tweak’ the output by placing commands directly inthe source.

Two mechanisms are availalable to do this.

• Using the xmltex namespace. The xmltex

namespace conatins a small (currently empty)set of useful TEX constructs that are accessedby XML syntax. For example if xmltex pro-vides a mechanism for having XML (rather than

LATEX) syntax toc files, it will need an ana-logue of \contentsline which might be an el-ement accessed by <xmltex:contentsline>. . .where the xmltex prefix is declared on this ora parent element to be xmlns:xmltex="http:

//www.dcarlisle.demon.co.uk/xmltex".

As the xmltex namespace is declared butcurrently empty, a more useful variant of thismight be:

• Declare a personal namespace for TEX tweaks,and load a suitable package file that attatchesTEX code to the elements in this namespace (orat least specify the correspondence between thenamespace and the package using \NAMESPACE).For instance, <clearpage xmlns="/my/tex/

tweak"/> will force a page break if, at suitablepoints, the document contains:

\NAMESPACE/my/tex/tweaktweak.xmt

and

\DeclareNamespacetwk/my/tex/tweak

\XMLelementtwk:clearpage\clearpage

• A second different mechanism is available, touse XML processing instructions. A Process-ing Instruction of the form: ?xmltex TEX com-

mands ?> will execute the TEX commands.

Bugs

None, of course.

Don’t Read Past This Point

Thus section discusses some of the more experimen-tal features of xmltex that may get a cleaner syntax(or be removed, as a bad idea) in later releases, andalso describes some of the internal interfaces (whichare also subject to change)

Input Encodings and States At any point whileprocessing a document, xmltex is in one of twostates: tex or xml.

States In the xml state, < and & are the onlytwo characters that trigger special markup codes.Other characters, such as !, >, =, . . . ; may be used incertain XML constructs as markup but unless somecode has been triggered by < they are treated sim-ply as character data. All characters above 127 are‘active’ to TEX and are used to translate the inputencoding to UTF-8. All internal character handlingis based on UTF-8, as described below. Some char-acters in the ASCII range, below 127 are also ac-tive by default (mainly punctuation characters usedin XML constructs, such as the ones listed above).Some or all of the others may be activated usingthe \ActivateASCII command, which allows special

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 197

Page 50: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

David Carlisle

typesetting rules to be activated for the characters,at some cost in processing speed.

In the tex state, characters in the ASCII rangehave their usual TEX meanings, so letters are ‘cat-code 11’ and may be used in TEX control sequences,\ is the escape character, & the table cell separa-tor, etc. Characters above 127 have the meaningscurrent for the current encoding just as for the xml

state, probably this means that they are unusablein TEX code, except for the special case of refer-ring to XML element names in the first argument to\XMLelement and releated commands.

Encodings Whenever a new (XML or TEX)file is input by the xmltex system the encoding isfirst switched to UTF-8. At the end of the input theencoding is returned to whatever was the current en-coding. The encoding current while the file is read isdetermined by the encoding pseudo-attribute on theXML or text declaration in the case of XML files, orby the \FileEncoding command for TEX files. Notethat the encoding mechanism only is triggered byxmltex file includes. Once an xmltex package fileis loaded it may include other TEX files by \input

or \includepackage these input command swill betransparent to the xmltex encoding system. Thevast majority of TEX macro packages only use ASCII

characters so this should not be a problem.Note that if the \includepackage occurs di-

rectly in the xmltex package file, the TEX codewill be included with a known encoding, the onespecified in the xmltex package, or UTF-8. If how-ever the \includepackage is included in code spec-ified by \XMLelement, then it will be executed withwhatever encoding is current in the document at thepoint that element is reached. Before xmltex ex-ecutes the code for that element it will switch tothe tex state, thus normalising the ASCII charactersbut characters above 127 will not have predefineddefinitions in this case.

Internally eveything is stored as UTF-8. So.aux and .toc files will be in UTF-8 even if thedocument (or parts of the document) used differentencodings.

To specify a new encoding, if it is an 8 bit en-coding that matches ASCII in the printable ASCII

range, then one just needs to produce a file withname encoding.xmt (in lowercase, on case sensi-tive systems) this should consist of a series of\InputCharacter commands, giving the input char-acter slot and the equivalent Unicode. If an encod-ing is specified in this manner character data willbe converted to UTF-8 by expansion and so liga-tures and inter letter kerns will be preserved. (Con-versely if characters are accessed by character refer-

ences, &#1234; then TEX arithmetic is used to de-code the information and ligature information willbe lost. For some large character sets, especiallyfor Asian languages, these mechanisms will proba-bly not prove to be sufficient. Alternative mecha-nisms are being investigated, but in the short termit may be necessary to always use UTF-8 if the inputencoding is not strictly a ine byte extension of theASCII code page.

XMLTEX Package Commands And TEX com-mand may be used in an xmltex package, althoughthe user should be aware that the file may be inputinto a local group, at the point in a document thata particular namespace is first used, for example.There are however some specific commands designedto be used in the begin or end code of \XMLElement.

• \ignorespaces

This is similar to the TEX primitive of the samename, but redefined to work more naturally inthis context.

• \obeyspaces

Obey consecutive space characters, rather thantreating consecutive runs as a single space. (Acommand of this name, but not this definitionis in plain TEX.)

• \obeylines

Obey end of line characters, rather than treat-ing then as a space, force a line break. (A com-mand of this name, but not this definition existsin plain TEX.)

• \xmltexfirstchild#1\@

If the start-code for an element is specified as\xmlgrab then the end-code may use #1 in or-der to execute the element content. However,the entire content is not always needed, and theconstruction \xmltexfirstchild\#1\@ (withcurrently unpleasant syntax) will just evaluatethe first child element of the content, discardingthe remaining elements.

• \xmltextwochildren\csa\csb#1

If it is known that the content will be exactlytwo child elements (e.g., a MathML frac or subelement) then this command may be used. Thecommand executes the TEX code \csachild-

1\csbchild-2 So either two TEX commandsmay be supplied, one will be applied to eachchild, or the second argument may be inwhich case the first argument may be a TEXcommand that takes two arguments. For ex-ample the code for MathML frac might be

\XMLelementm:mfrac

198 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 51: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

xmltex: A non validating namespace aware XML parser implemented in TEX

\xmlgrab

\xmltextwochildren\frac#1

• \xmltexthreechildren\csa\csb\csc#1

As above, but more so.

• \xmltexforall\csa#1

The TEX command \csa is executed repeatedly,taking as argument each time one child fromthe content ‘#1’ of the current element. Thecommand name \xml@name is set to the (nor-malised, internal) name of each child elementbefore \csa is executed.

• \NDATAEntity\csa\csb\attvalue

If the XML parser encounters an internal or ex-ternal entity reference it expands it without ex-ecuting any special hook that may be definedin an xmltex package. However NDATA en-tites are never directly encountered in an entityreference. They may only be used as an at-tribute value. If \attvalue is a TEX commandholding the value of an attribute, as declared in\XMLattribute then \NDATAEntity\csa\csb

\attvalue applies the two TEX commands \csaand \csb to the notation type and the value, ina way analogous to \xmltextwochildren, sofor example the XML version of manual docu-ment, from which this paper is derived, speci-fies:

<!NOTATION URL SYSTEM "" >

<!ENTITY lppl SYSTEM

"http://www.latex-project.org/lppl.txt"

NDATA URL>

and this is handled by the following xmltex

code

\XMLelementxptr

\XMLattributedoc\xptrdoc

\NDATAEntity\xptrdoc\@gobble\url

which saves the attribute value in \xptrdoc andthen discards the notation name (URL) and ap-plies the command \url to typeset the suppliedURL.

David Carlisle

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 199

Page 52: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Abstract: Developing Interactive, Web-based Courseware

Donald W. DeLand and Greg FaronIntegre Technical Publishing Co.

4015-B Carlisle N.E.

Albuquerque, NM 87107 U.S.A.

[email protected]

Abstract

This paper describes our company’s ongoing efforts to adapt mathematics text-books for online delivery. We show how the textbooks, written primarily in LATEX,have been adapted for web delivery using IBM’s techexplorer browser plug-in, andenhanced using an extensive set of interactive Java applets. To complement thesetextbooks, we are developing an online study, homework, and testing system formathematics that combines techexplorer, PHP (a free, open-source hypertext pre-processor), mySQL (an open-source database application), and application linksto computer algebra systems. Our ultimate goal is to provide a comprehensiveenvironment for delivering math courseware online.

Don DeLand

200 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 53: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

The amsrefs LATEX package and the amsxport BibTEX style

Michael DownesAmerican Mathematical Society

[email protected]

Introduction

When the bibliography entries in a LATEX documentare written in amsrefs form, they have rich internalstructure and high-level markup close to what is tra-ditionally found in BibTEX database files. Amongother things, this raises the information quality ofthe LATEX document if it is intended to serve as (orto yield via automatic translation) a self-containedarchival version. Using amsrefs markup also meansthat the style of the bibliography can be specifiedcompletely in a LATEX documentclass file, instead ofbeing handled partly by LATEX and partly by theBibTEX style file, in two different style languages,each of them more idiosyncratic than the other.

It has always been possible to write short bibli-ographies by hand without going through BibTEX,but those who do so usually put in as many ad hocformatting commands as BibTEX would. An authorwho uses the amsrefs package when writing a bib-liography by hand will be better off if it becomesnecessary at some later time to change the styleof the bibliography: the interior structural markupmeans that the same information can be reformat-ted in different ways by simple changes in the LATEXsetup rather than by explicitly changing formattingcommands in each item.

Some of the sources that I consulted during thedesign of the amsrefs package are given in the bib-liography. The bibliographies of [1] and [7] are rec-ommended. The chief goal of my design efforts wasto find a way of representing and citing bibliogra-phy entries at a level of markup abstract enoughto support automatic formatting for a wide range ofknown bibliography styles without any change in thedata; the secondary goal was to find a syntax for thisrepresentation that was natural in a LATEX contextand as easy as possible for authors to use. What Iended up with was a design that would leave any ex-perienced TEXnician aghast at the implementationdifficulties. Fortunately, however, many of the hard-est bits could be dealt with using known methods;for example, Donald Arseneau’s cite package estab-lished long ago that sorting and compressing lists ofcite numbers is not horrendously impossible to doin TEX, and the technique used in amsrefs for com-

bining multiple author names is adapted from somecode of mine written a while back for the amsart

documentclass.

Contents of a bibliography entry

Bibliography entries are done with a \bib command,not \bibitem, and look like this:

\bibBWarticle

author=Bertram, A.,

author=Wentworth, R.,

title=Gromov invariants for holomorphic

maps on Riemann surfaces,

date=1996,

journal=jams,

volume=9,

number=2,

pages=529\ndash 571,

This will be recognizable as very similar to thedata format used in BibTEX database files. Thereare, however, some key differences. If you use theamsxport BibTEX style and export from a BibTEXdatabase, the differences will be automatically at-tended to, but if you write a short bibliography byhand, you should bear in mind the following points:

braces Always use braces to enclose the value ofeach field, never quotes (BibTEX allows bothquotes and braces).

repeated fields Certain fields can be repeated(and should be, where applicable). As shown inthis example, when there is more than one au-thor, each author name is given separately. Thetask of combining the names as needed for the cur-rent publication is handled by LATEX. The fieldsthat are defined to be repeatable by the amsrefs

package are author, editor, isbn, review, andtranslator.

inverted names It is recommended to give authorand editor names uniformly in Last, First order.This is the form that provides the most flexibil-ity with the least extra markup. When printed,the names will be automatically uninverted inwhatever manner is specified by the bibliographystyle in use. (Some styles have the first author’s

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 201

Page 54: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michael Downes

name inverted and the remaining names not in-verted.) For suffixes such as III or Jr., writeSmith, John Q., III or Smith, John Q., Jr.

as the inverted form. For Chinese names and oth-ers where the surname comes first, if you writeLast First without a comma the parts will neverbe transposed.

abbreviations In certain fields abbreviations maybe used. In the example above the journal namejams will be expanded by LATEX to J. Amer. Math.Soc. Abbreviations for journals and publisherscan be defined with two commands provided forthis purpose:

\DefineJournal takes four arguments: the ab-breviation, the ISSN, a short form of the journalname, and the full journal name. For example,

\DefineJournalmpcps

0305-0041

Math. Proc. Cambridge Philos. Soc.

Mathematical Proceedings of the

Cambridge Philosophical Society

For \DefinePublisher the four arguments are:abbreviation, short form, full publisher name, andlocation, e.g.,

\DefinePublisherucp

Univ. Chicago Press

University of Chicago Press

Chicago

Beware of variation among the books of a singlepublisher in the cities of publication.

If the amsrefs package is invoked with the jpa

option, it will automatically load an auxiliarypackage amsjpa that contains \DefineJournal

and \DefinePublisher statements for more thana hundred of the journals and publishers men-tioned most often in AMS bibliographies. To geta different set of abbreviations, you can put yourown definitions in a .sty file and load them with\usepackage.

capitalization Proper nouns do not need to bewritten with extra braces: it is sufficient to writeRiemann instead of Riemann or Riemann (asrequired by BibTEX). Do not capitalize wordsthat are not proper nouns (unless you’re writ-ing in German, of course). Capitalization forEnglish-language titles will be applied automat-ically where specified by the bibliography style.See Capitalization of English titles, below.

ndash Using \ndash instead of -- for en-dashes isrecommended. (And \mdash instead of ---, forthat matter.) See the remarks on textcmds inthe Auxiliary Packages section.

date It is recommended to use a date field to givethe year of publication; although year is also ac-cepted, date is more general. If the date includesa month or month and day, using month numbersin ISO 8601 form is recommended, e.g., 1987-12 (or1987-12-30 if a day is present). This allows monthnames to be printed in full or abbreviated (or leftas numeric), at the behest of the current bibliog-raphy style, without changing the contents of thebibliography. For “Winter”, “Spring”, “Summer”,“Fall”, either use month numbers of 13, 14, 15, 16(respectively), or just put in the text before theyear:

date=Summer 1987,

The first mandatory argument of \bib is thecitation key to be used with \cite. Like \bibitem,\bib also takes an optional argument to be used asthe item label in the bibliography and as the printedoutput of the \cite command.

The second mandatory argument of \bib isthe entry type. The recognized entry types arejust about the same as the ones commonly recog-nized in BibTEX style files, except that phdthesis

and mastersthesis are subsumed under a singlethesis category. By default an entry of this type istreated as a master’s thesis; to indicate some otherkind, one can write, e.g., type=Ph.D. thesis ortype=Diplomarbeit. As a special case the abbre-viations type=phd and type=masters are alsorecognized.

Restricted key-value scanning

Although the fields within a \bib command are givenin standard LATEX key-value notation, the parserused to scan the keys and their values is not thestandard one from LATEX’s keyval package but onewritten especially for the amsrefs package in orderto provide some refinements in the error checking.It is embodied as a separate package, rkeyval.

Missing commas If a comma is missing in a \bib

command, you get an error message that tells youexactly what the problem is and where. With thestandard key-value parsing provided by LATEX thiswould not happen— a missing comma would lead toone erroneous value and one lost value without anywarning to the user. For example, consider whathappens with

\rotatebox[x=9pt y=9pt]180UPSIDE DOWN

This results in a value for x of “9pt y”, while thesecond 9pt is discarded and y retains its defaultvalue. Consequently the rotated box is positionedincorrectly and a spurious letter y is printed on the

202 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 55: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

The amsrefs LATEX package and the amsxport BibTEX style

page when LATEX attempts to use the value of x.And there is no warning message to alert the userthat something went wrong.

To be sure, when key-value notation is used foroptions that specify how some material should beprinted, the values tend to be short and simple, theyare normally written without braces, and missingcommas are not all that frequent. But when thevalues contain textual material, and each key-valuepair is given in braces on a separate line, missingcomma errors are very easy to make and occur quiteoften in practice. It was the sinking feeling of thisrealization that drove me in the end to write an al-ternative parser, with great reluctance, after usingthe standard parser for nearly the whole develop-ment period of the amsrefs package.

Mandatory use of braces for values Requiringbraces all the time is better for key-value pairs ifthe values are printable text. Because, of course,braces are the only completely reliable way to avoidthe problems that afflict delimited arguments if anykind of nesting is involved or if the argument maylegitimately contain the delimiter string.

If the braces are inadvertently left out, the errormessage looks like this (more or less):

! Package rkeyval Error:

Missing open brace for key value.

...

l.10 year=1985,

?

In most cases LATEX will be able to carry on aftersuch an error and produce something close to theintended output.

Capitalization of English titles

The capitalization recommended for English titles issentence case: all lowercase except for proper nouns(i.e., the same as is normally used anyway for allother languages with a Latin-1 character set). Initialcaps can be applied on demand to a title written inthis form, as explained in the discussion of \bibspecbelow.

The capitalization done by amsrefs succeedsrather well in following the rules given in the Chicago

Manual of Style, as paraphrased here:

Capitalize each word except for articles, coor-dinate conjunctions, and prepositions, or theword to in infinitives. Do capitalize pronounsand subordinate conjunctions. Always capi-talize the first and last word of the title andthe first and last word of any subtitles thatit may contain. In a hyphenated compound,

capitalize the second (or any later) word onlyif it is a noun or proper adjective, or it hasequal force with the first word.

If some word is capitalized that should not be capi-talized, putting braces around the word will preventthat. But I think it will be very seldom necessary inpractice; in a test of some two hundred titles takenat random from AMS journal articles, all of the titleswere capitalized correctly, even the ones containingmore difficult fragments such as hyphenated com-pounds, math formulas, or \ and ~ for inter-wordspaces.

Citations

The amsrefs package offers three primary citingcommands: \cite, \citelist, \cites. Featuresinclude:

• sorting and range compression for numeric citekeys (like the excellent cite package)

• support for author-year citation schemes, withsome additional commands \ycite, \ocite,\citeauthor, etc.

• back-reference capabilities (similar to those ofthe backref package that comes with hyperref)

The \cite command works just about theway the LATEX book says it should, except thatit supports an additional optional argument mech-anism that avoids a pitfall associated with thestandard optional argument syntax. Instead of\cite[Chapter 2]xyz, one writes

\citexyz*Chapter 2

Using this * notation instead of the usual squarebrackets prevents the unexpected error messagesthat novice users meet if they incautiously attemptto use a \cite command with the square bracketsinside another pair of optional argument brackets,for example,

\beginthm[\cite[Theorem 4.9]xyz]

The \citelist command takes one argument,which is simply a list of \cite commands, optionallyseparated by spaces.1 Each \cite command mayhave its own optional argument.

\citelist\citekey1

\citekey2*Chapter 2 \citekey3

The \cites command is a straightforward vari-ant of the \citelist command that can be usedwhen none of the individual \cite commands have

1 No commas or other inter-cite punctuation should be

written between the \cite commands because that will all be

supplied automatically and attempts to write it in by hand

will only interfere.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 203

Page 56: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michael Downes

an optional argument. Then one can give the listof cite keys without including a \cite command foreach one:

\citeskey1,key2,...

Use of multiple cite keys with \cite is deprecated,even though it must be supported for backward com-patibility. Using \cites or \citelist is better be-cause it clears up the semantically dubious old treat-ment of the optional argument.

Author-year citation schemes

In author-year citation schemes three main citingforms are required to cover the cases that in otherschemes require only one form. The first form is usedwhen the citation serves as a parenthetical annota-tion— i.e., it could be omitted without harming thegrammatical structure of the sentence containing it.For example:

The question first arose in systems theory(Rupp and Young, 1977).

The second form is like the first but is used when theauthor name is already present as a natural part ofthe sentence, and the cite therefore ought to supplyonly the year:

Rupp and Young (1977) have investigated . . .

The third form is used when the citation serves asa direct object or other inomissible noun-like ob-ject within its sentence. For instance, dropping thecitation from the following sentence leaves a gram-matically incomplete remainder:

. . . for further details, see Rupp and Young(1977).

The logic of requiring three forms is perhapsmost clearly seen if we envision replacing the author-year citations by numerical citations. The type oftext replaced by [14] is different in each case:

. . . arose in systems theory [14].

Rupp and Young [14] have investigated . . .

. . . for further details, see [14].

We delegate \cite to produce the primary par-enthetical form (Author, Year) and provide \ycite

(“year cite”) and \ocite (“object cite”) as the otherforms. Plural forms \ycites and \ocites are alsoprovided in parallel with \cites. And \citeauthor

can be used to produce the list of author names with-out the year.

These correspond with command names fromsome other commonly used author-year packages asfollows:

amsrefs harvard natbib

\cite, \cites \cite \citep

\ycite, \ycites \citeyear \cite

\ocite, \ocites \citeasnoun \citet

\citeauthor (none) \citeauthor

\citeauthory (none) \citet

Some people like to use \citet or \citeasnounwhen the author name serves as the subject of a sen-tence. This seems to me a questionable blurring ofthe boundary between the essential text of the sen-tence and the bibliography pointer. But just in caseI am mistaken (though you may gasp in disbelief atthe thought), I have provided \citeauthoryxyz

as an abbreviation for

\citeauthorxyz \ycitexyz

I.e., the command name is \citeauthor+\ycite

with the redundant second cite dropped.2

When an author-year scheme is in use, parensare normally added by \cite, \citelist and theirvariants — unless the character immediately follow-ing the command’s argument is a closing paren. Thissimple rule of thumb suffices for almost all cases.

Starred forms \cite* and \ocite* print thefull list of author names instead of an abbreviatedlist, when an (Author, Year) style of citation is inuse. For other citation schemes they produce thesame output as the unstarred forms. Some citationstyles require the first cite to use the full list and sub-sequent ones to use the abbreviated version. Withproper setup this can be done automatically, so thatthe starred forms of these commands should seldombe necessary in practice.

Bibliography style setup

With the amsrefs package all style changes can bedone with LATEX. You don’t need to understandBibTEX’s unnamed bst language. And because ev-erything is handled from the LATEX side, the bib-liography style for a given document class can bespecified completely in the class file instead of partlythere and partly in a .bst file.

The overall style of the bibliography list is dic-tated by a biblist environment; it takes an op-tional argument which may contain overrides of listparameters and other style specs. This makes it easyto modify the style slightly for a particular docu-ment. Documentclasses that load the amsrefs pack-age should supply their own definition of biblist,and doing so normally means that they can leavethebibliography environment unchanged, because

2 Why not simply call it \aycite, you may ask? Well, I

could hardly pass up the opportunity to get all six vowels in

a single command name, could I?

204 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 57: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

The amsrefs LATEX package and the amsxport BibTEX style

amsrefs makes it a simple wrapper function thatcalls biblist:

\renewenvironmentthebibliography[1]%

\bibsection

\biblist[\resetbiblist#1]%

%

\endbiblist

where \bibsection is normally defined as

\newcommand\bibsection%

\section*\bibname%

When defining \bibsection, the amsrefs packageuses \chapter if it is defined, otherwise \section.Of course you can always redefine \bibsection your-self if need be.

The interior formatting within entries is spec-ified by \bibspec commands, one for each entrytype. To illustrate, let’s look at an example stylespec for entries of type article:

\bibspecarticle%

+\PrintAuthors author

+, \textit title

+, journal

+ \textbf volume

+ \parenthesize date

+, pages

+, note

+. transition

+ review

It should be pretty obvious that each line speci-fies the formatting for a particular field. The funda-mental model here is that after reading the data for aparticular \bib command, LATEX steps through thestyle spec and for each field listed, prints the fieldwith the given formatting if and only if the field has

a nonempty value. The + character at the beginningof each field spec must be followed by three argu-ments: the punctuation to be added if the field isnonempty; space and/or other material to be addedafter the punctuation; and the field name. It is per-missible for the second part to end with a commandthat takes an argument, such as \textbf, in whichcase it will receive the field’s value as its argument.By defining a suitable command and using it hereyou can place material after the field contents as wellas before; \parenthesize is an example of this.

The reason that the punctuation and the fol-lowing space are specified separately is that betweenthem there is a crucial boundary for line breaks. Ifyou put a \linebreak command at the end of afield value, the break point will actually be carriedonward to a suitable point after the next bit of punc-

tuation (whose actual value may vary depending onwhich of the following fields is the first to turn upwith a nonempty value).

The meaning of the \parenthesize command,supplied by amsrefs, should be obvious. The mean-ing of the \PrintAuthors command is a differentstory. But I don’t think it is all that hard to under-stand. If we have two or three author names whichwere given separately, and we need to combine theminto a conventional name list using commas and theword “and”, then it would be nice if we had a com-mand which could take a list of names and Do TheRight Thing. And that is just what \PrintAuthorsis.

The rkeyval package allows keys to be definedas additive: if the key occurs more than once, eachsuccessive value will be concatenated to the previ-ous value, along with a prefix. The setup done byamsrefs for the author field is

\DefineAdditiveKeybibauthor\name

This means that if two names are given, as in

author=Bertram, A.,

author=Wentworth, R.,

then the final value of the author field seen whenLATEX processes the style spec will be

\nameBertram, A.\nameWentworth, R.

The transition field in our bibspec exampleis a dummy field to be used when punctuation orother material must be added at a certain point inthe bibliography without regard to the emptiness ornon-emptiness of the fields after it. The transitionfield always tests as non-empty but has no printedcontent. So when you use it you always get theindicated punctuation and space at the indicatedpoint in the list of fields. If it were the last thing inthis bibspec example, it could serve just to put inthe final period that is always wanted. But in AMS

bibliographies, if a Mathematical Reviews referenceis given, it is conventionally printed after the finalperiod. Using the transition field as shown hereensures that the final period will be always printed,even when the review field is empty.

Miscellaneous commands provided by the

amsrefs package Most of the following commandsare helper commands for use in \bibspec state-ments. The others are intended for use in bibliogra-phy data.

\parenthesize This command adds parenthesesaround its argument. It is useful in \bibspec

statements because there is no special provisionfor adding material after the field value.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 205

Page 58: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michael Downes

\bibquotes This command is much like \paren-

thesize but it adds quotes around its argu-ment and it has one other important difference:there are special arrangements to print the closingquote after a following comma or similar punc-tuation (unless the amsrefs package is invokedwith the logical-quotes option, in which case\bibquotes puts the closing quote immediatelyafter the quoted material).

\voltext The normal definition of this command isvol.~ to supply the text that precedes a volumenumber.

\editiontext This command produces ed. follow-ing an edition number. See \PrintEdition formore information.

\pptext This command is similar in spirit to\voltext but more complicated in its implemen-tation. It takes one argument which is expectedto contain one or more page numbers or a rangeof page numbers. The argument is printed with aprefix of “p.” if it seems to be a single page num-ber, otherwise with a prefix of “pp.”.

\tsup, \tsub, \tprime These are for text sub-scripts and superscripts, with \tprime producinga superscript prime symbol. Unlike the standard\textsuperscript and \textsubscript func-tions provided by LATEX, these do not use mathmode at all.3

\nopunct This command causes following punctua-tion to be omitted if it is added with the internalfunction \@addpunct (which is used throughoutthe \bibspec handling when appending a non-empty field).

\PrintAuthors This is a relatively complicatedfunction that tests a list of author names in or-der to decide whether \sameauthors or \aulist

should be called.

\aulist This takes a list of author names in theform

\nameJones, Sam\nameSmith, John...

and prints them in standard series form with thenames uninverted, e.g., “Sam Jones and JohnSmith”, or “Sam Jones, John Smith, and JamesTaylor”.

\UninvertedNames This is a lower-level functioncalled by \aulist. For documentation seeamsrefs.dtx.

\sameauthors This is a function of one argument.If you use the default set of \bibspecs from

3 There is one drawback: If you don’t want to get the

prime symbol for \tprime from the cmsy font, you will need

to redefine \tprime in some suitable way.

amsrefs, \sameauthors is applied to the authorname for a given \bib command if it matches ex-actly the author name of the preceding \bib com-mand. Change the definition of \sameauthors ifyou don’t want to get a bysame dash.

\bysame This is a horizontal rule of length 3 em.The default definition of \sameauthors prints\bysame instead of the author names.

\PrintEditorsA This is similar to \aulist butadds (ed.) following the editor name (or (eds.)if applicable).

\PrintEditorsB This is like \PrintEditorsA butputs parentheses around the entire list of editornames.

\Plural, \SingularPlural These are helper func-tions for use with \UninvertedNames that allowyou to conditionally print singular or plural formssuch as (ed.) or (eds.) depending on the numberof names in the current name list. The definitionof \PrintEditorsA reads, in part,

... (ed\Plurals.) ...

\ReviewList This is similar to \aulist but is usedfor printing (possibly multiple) MR numbers givenin the review field.

\inicap This command applies initial capitaliza-tion to its argument.

\EnglishInitialCaps This command will call\inicap if and only if the language of the cur-rent reference is English. If English is the defaultlanguage, you need to specify

language=German,

(for example) for non-English references to ensurethat nothing will be initial-capped.

\BibField This is for more complicated program-ming tasks such as may be necessary for some bib-specs. It takes one argument, a field name, andyields the contents of that field for the current\bib entry.

\IfEmptyBibField If one writes

\IfEmptyBibFieldisbnAB

then the commands in A will be executed if theisbn field is empty, otherwise the commands in B.

\PrintEdition If a bibliography entry has

edition=2

and the bib-spec used \PrintEdition to handlethis field, then the edition information will beprinted as “2nd ed.” —that is, the number is con-verted to cardinal form and “ed.” is added (takenfrom \editiontext).

206 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 59: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

The amsrefs LATEX package and the amsxport BibTEX style

\CardinalNumeric This provides the conversion tocardinal number form used by \PrintEdition.

\PrintDate, \PrintYear These functions converta date in canonical form (ISO 8601) to the form re-quired by the current bibliography style. You canget your preferred date form by redefining thesefunctions or by changing your \bibspec state-ments to use another function of your own devis-ing. The original definition of \PrintDate addsparens (as for the year of a journal article in nor-mal AMS style), whereas the \PrintYear functionsimply prints the year without any additional ma-terial (as for a book’s year of publication in normalAMS style).

\SerialName When a journal abbreviation is usedas the content of the journal field, \SerialNamewill be called with three arguments from the re-sults of the abbreviation lookup: ISSN number,short form, and long form. The default definitionof \SerialName prints the short form; by chang-ing the definition suitably you can arrange to getthe long form instead.

\PublisherName This is like \SerialName but getsshort form, long form, and city as its arguments;the default again is to print the short form.

\mdash, \ndash These are short forms for\textemdash and \textendash, recommendedinstead of the more usual --- and -- notation.From the textcmds package.

\cite, \cites, \citelist, \ycite, \ocite, etc.See the section on Citations.

Fields recognized by the \bib command

The following fields are supported out of the box bythe amsrefs package. It should be emphasized thatthis list is not cast in stone. Additional fields canbe supported by defining them with commands fromthe rkeyval package and modifying your \bibspecstatements to take them into account.

address issn series

archive journal setup

author label status

booktitle language subtitle

conference note title

date number translator

doi organization type

edition pages volume

editor part xid

eprint place xref

ios publisher year

isbn review

For some of these a few explanatory remarks are inorder.

archive The archive that holds the eprint listed inthe eprint field.

author This field can be repeated. Multiple authornames will be concatenated into a single fieldvalue. Names should be given in Last, First

order.

date This is a generalization of the year and month

fields. Its value should be written in ISO 8601format, e.g., 1987-06-05; but the day and monthare omissible, so this can be used instead of theyear field.

doi Digital Object Identifier

edition For books. If the value of this field is asimple number, \bib will convert it to cardinalform and add “ed.”.

editor Like author; can be repeated.

eprint Electronic preprint information such as forwww.arXiv.org.

ios Institution, organization, or school. Replacesthree different BibTEX field names.

isbn International Standard Book Number. Can berepeated.

issn International Standard Serial Number.

language Language of the work. The default lan-guage is English; however, this can be changedfor an entire bibliography by redefining the fol-lowing variable:

\renewcommand\biblanguagedefaultFrench

The language name should be the printed form,not Babel-style language names, since in princi-ple this field could contain more complicated re-marks such as “Russian, with French abstract”.

organization The BibTEX documentation says thatinstitution should be used for technical re-ports and organization for other entry types,whereas school should be used for theses. Hav-ing three different field names for these strikesme as overkill, so I introduced ios as a substi-tute. But organization is retained as a syn-onym, for the sake of those who don’t like overlycryptic short names.

part This is for a long journal article that is pub-lished in separate parts.

place A synonym for address. Or to put it an-other way, address is supported as a BibTEX-compatible synonym for place.

review A review number or similar pointer, e.g., forMathematical Reviews or Zentralblatt. Can berepeated.

setup This is a special field that can be used togive arbitrary commands to be executed at the

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 207

Page 60: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michael Downes

beginning of the current \bib entry, after allthe fields have been read. The idea is that onecan alter the formatting of an individual entrythrough this field, to handle special cases.

status Typically used for notes such as “to appear”or “in preparation” with journal articles.

subtitle Typically used with a multipart journalarticle to give a subtitle for each part.

translator Like author; can be repeated.

url Universal Resource Locator.

xid This is used by a cross-referenced item to passits identity to child entries that refer to it.

Miscellaneous features

Here are some miscellaneous features that might beof interest.

• Duplicate \bib keys are identified on the firstLATEX run and the line number is given. (With\bibitem you don’t get a warning until the pro-cessing of the .aux file at the beginning of thesecond LATEX run, nor any line number.)

• When a cite key is undefined, the cite commandprints the key, not question marks.

Package options

The amsrefs package supports the following op-tions. The options that are listed together are mutu-ally exclusive. The options whose name begins witha star are relevant only for BibTEX use and whenany such option is changed, the effects will not takehold until after the next BibTEX run.

? Information about the amsrefs package. If youuse the jpa option as well, the most obvious effectof this option is that all the available journal andpublisher abbreviations are shown on screen (andin the LATEX log).

traditional-quotes, logical-quotes This op-tion changes the action of the \bibquotes

command. When a field is appended after aquoted field, the closing quote is moved if neces-sary to fall after a comma or similar punctuationinstead of before. If the logical-quotes optionis chosen, ending quotes are not moved.

sorted-cites, non-sorted-cites Relevant onlywhen numeric cites are in use. Lists of two ormore cites are sorted into numerical order.

compressed-cites, non-compressed-cites

Relevant only when numeric cites are in use.Three or more consecutive cite numbers will beconverted to range notation (using \ndash).

short-journal-names, full-journal-names

These options only work for journals that are

specified via abbreviations. Otherwise, of course,you have either the full journal name or theshort-form journal name in your data and that’sall you’ve got.

short-month-names, full-month-names Thisshould be fairly easy to guess.

initials Convert authors’ first and middle namesto initials.

jpa Load the standard AMS journal and publisherabbreviations package.

backrefs Print back-reference page numbers in thebibliography.

numeric, alphabetic, author-year This optionspecifies the printed format to be used for cites.

*sorted, *citation-order This option is passedon to BibTEX (the amsxport style) and indicatesthat when producing the .bbl file the entriesshould be sorted or left in order of first citation,respectively. (The default is sorted.)

Auxiliary packages

The following components of the amsrefs packageare written in package form for reasons of modular-ity or to facilitate using them elsewhere.

textcmds This package provides \mdash, \ndash

and other commands to replace the TEX notationsfor ligatures that are “ligatures of convenience”rather than of esthetics — in effect, all the stan-dard ligature combinations that consist of punc-tuation characters rather than letters. The factthat the ligatures of convenience lead to quite abit of trouble in font substitutions and documentconversion suggests that they are fundamentallyflawed as a markup device. If you still like theconvenience of typing two or three hyphens to geta dash instead of some longer sequence, my sug-gestion is to use the capabilities of your text edi-tor to automatically convert -- to \ndash as youwrite. You will find a copy of the Emacs setupthat I use for this purpose in the dtx file for thetextcmds package.

inicap This package provides the basic \inicap

function which is called by \EnglishInitial-

Caps.

rkeyval This package provides the more restrictivekey-value parser used in processing the contentsof a \bib command.

ifoption This package provides a way of testing thepresence or absence of particular options:

\IfOptionjpa

\RequirePackageamsjpa[2000/02/02]

208 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 61: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

The amsrefs LATEX package and the amsxport BibTEX style

The \@ifpackagewith test that is already pro-vided by LATEX returns false for options that wereonly switched on with \ExecuteOptions, but notmentioned explicitly in the \usepackage call.

In order for \IfOption to work properly the op-tions must be declared with \DeclareExclusive-

Options or \DeclareBooleanOption and pro-cessed with an additional statement \Process-

ExclusiveOptions; see the package documenta-tion for further information.

amsjpa This package simply contains a number ofabbreviation definitions for the journals and pub-lishers that are most frequently mentioned in AMS

bibliographies.

BibTEX exporting— amsxport style

There are four chief functions of BibTEX: select-ing items required by a particular document from adatabase, sorting them, discarding unwanted fields,and applying LATEX formatting. If the formattingis handled instead entirely on the LATEX side, andif the author uses editor facilities such as the fineEmacs RefTEX package to handle selecting and sort-ing, it is a short step to wonder if BibTEX mightbe approaching superfluity. Since my work on theamsxport BibTEX style involved a certain amountof beating my head against various limitations ofBibTEX, I am indeed inclined to advocate abandon-ing it. (For example, there are only global variables(easy to clobber something inadvertently), and anextraordinarily low ceiling on the number of them;there’s no way to get the actual ASCII length of astring (text.length$ counts \foo as one charac-ter, not six)4; and there is no way to call up a givencite individually, e.g., to examine a crossref’d item.)If you convert your existing .bib files to amsrefs

format (using the amsxport style) you will neveragain have to worry about adding braces for propernouns or extra braces around accented letters whenadding material to your database. And if you letRefTEX build your bibliography incrementally whileyou write, you can get all your cites resolved on thefirst LATEX run, not the fourth.

For most users of the amsrefs package it willremain necessary, however, to use BibTEX at leaston occasion to convert .bib file data to amsrefs

form with the amsxport filter. Therefore it will beof interest to mention a few of its features.

• The supported fields are the standard BibTEXfields plus the additional fields that amsrefs

supports (see the list above).4 Well, you can write a loop to chop off one character at a

time until the remainder is empty, and I did so, but the fact

that I had to do so is the limitation.

• When sorting names, the amsxport style sorts“von Something” under “Something”, not un-der “von”.

• Options can be passed to the bst file; separatebst files are not needed to handle such varia-tions as sorting or not sorting. For example,the *citation-order option of the amsrefs

package works by writing \bibcite[citation

-order] to the .aux file: cite keys that beginwith a [ character are specially interpreted asoptions by the amsxport style.

• In preamble strings, ^^M is recognized as an es-cape sequence to put in newlines at good places.With a BibTEX style that doesn’t provide thisfeature (meaning every one except amsxport,at the present time, to the best of my knowl-edge), all of the text strings that you supplywith @preamble... get mushed into a sin-gle “paragraph” by BibTEX; there is no goodway that I know of to ensure that a real new-line gets written to the .bbl file at any givenpoint. (The bad way: put in percent charactersor other junk to fill up 72-character lines.)

Availability

A beta version of the package is currently availableat ftp://ftp.ams.org/pub/tex/.

References

[1] Pedro J. Aphalo, A proposal for citation com-

mands in LATEX3, TUGboat 18/4 (December1997), 297–302.

[2] Nelson Beebe, xbtxbst.doc, http://www.

math.utah.edu/pub/tex/bibtex/

[3] Chicago Manual of Style, 13th edition, 1982,University of Chicago Press.

[4] Dana Jacobsen, bp, a Perl Bibliography

Package (version 0.2.97 beta, 19 Decem-ber 1996), http://www.ecst.csuchico.edu/

~jacobsd/bib/bp/index.html

[5] Michael Piotrowski, Jens Klocker, and JorgKnappen, Is LATEX2ε markup sufficient for

scientific articles? EuroTEX’99 Proceedings(Giessen, Augsburg, 1999), ISBN 1438-9959.

[6] David Rhead, The “operational requirement” for

support of bibliographies, TUGboat 14/4 (De-cember 1993), 425–433.

[7] Reinhard Wonneberger and Frank Mittelbach,BibTEX reconsidered, TUGboat 12/1 (March1991), 111–124.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 209

Page 62: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Line breaking and page breaking

Jonathan Fine203 Coldhams Lane

Cambridge, CB1 3HY

United Kingdom

[email protected]

http://www.active-tex.demon.co.uk

Abstract

In their seminal paper of 1981, Knuth and Plass described how to apply themethod of discrete dynamic programming to the problem of breaking a paragraphinto lines. This paper outlines how the same method can be applied to theproblem of page make up, or in other words breaking paragraphs into pages. Oneof the key ideas is that there must be interaction between the line breaking andpage breaking routines. It is shown that TEX can, with one important limitation,fully support such interaction.

This article also shows how TEX can, by using a custom paragraph shapeand a special horizontal list, suppress hyphenation of the last word on a page.

Introduction

For many years the conventional wisdom has beenthat TEX is good at breaking lines into paragraphs(and setting mathematics and tables), but that itis not at all good at page make-up. There is somemeasure of truth in this statement. However, it isthe author’s view that almost all of the deficienciesarise not from TEX the program, but from the macropackages and other tools used with it.

The main problem considered in this article isthat of suppressing hyphenation on the last word ofa page. Traditionally, this has been avoided wher-ever possible, for it breaks the reader’s concentra-tion, to have to go to the next page (rather than thenext line) to complete a hyphenated word. The so-lution proposed involves constructing a special hor-izontal list, and an unusual paragraph shape.

Don Knuth’s view of TEX’s line-breaking algo-rithm is well expressed by this passage from The

TEXbook (page 94):

The remainder of this chapter explains thedetails precisely, for people who want to ap-ply TEX in nonstandard ways. TEX’s line-breaking algorithm has proved to be generalenough to handle a surprising variety of dif-ferent applications; this, in fact, is probablythe most interesting aspect of the whole TEXsystem. However, every paragraph from nowon until the end of the chapter is prefaced byat least one dangerous bend sign, so you may

want to learn the following material in easystages instead of all at once.

and twelve pages of technical details follow. Not allof it used here. The article by Knuth and Plass [4]and Plass’ thesis [10] are also well worth consulting.

From ASCII to dvi

It will help to have an overview of the process bywhich TEX converts its input file into typeset pages.In general terms the process is the same for all macropackages, but at each stage each package can use indifferent ways the capabilities offered by TEX theprogram.

Here we divide the process into seven stages,namely ASCII, tokens, macros, horizontal list, lines,vertical list and pages.

This section concludes with a discussion of thelook-ahead problem, whose solution is an importantpart of the line-breaking algorithm. The same prob-lem arises in page make-up, and it is the present lackof a solution that has given rise to the view that TEXis not good at page make-up.

ASCII This is the input stream, a text file markedup in some syntax, formal or informal. The inputfile might contain macro definitions and parametersettings, as well as the text to be typeset. For ex-ample, with LATEX the body size is a parameter tothe \documentclass command.

Strictly speaking, the input stream need not beASCII. TEX is capable of reading 8-bit input files.

210 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 63: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Line breaking and page breaking

We use ASCII as a convenient shorthand for the in-put text file.

Tokens Internally, TEX deals with tokens. Cate-gory codes control the translation of input charac-ters into tokens.

Traditionally, the ASCII character ‘a’ is givencategory code letter, which means that when readit become the token ‘the letter a’. The same goesfor the other letters. Digits and punctuation aregiven category other, and so the digit 7 become ‘thecharacter 7’ when read.

Certain other symbols, such as , and \, havespecial category codes. It is this that gives TEX itsfamiliar ‘backslash and braces’ input syntax. How-ever, this syntax is not built into TEX the program.

Internally the only tokens that TEX has arecharacter tokens (of various categories), and con-trol sequences. (A control symbol is a control se-quence whose name is a single character, usually anon-letter.) The traditional category codes causethe ‘eyes of TEX’ to convert the sequence of charac-ters \wibble to the control sequence whose name is,well, wibble. This is done by TEX the program, aspart of the process that turns ASCII characters intotokens.

In Active TEX, every input ASCII character isan active character. An active character is ratherlike a control sequence, in that it has a meaning, andthis meaning can be changed at any time. However,its ‘name’ is the active character ‘x’, or whatever itis. In plain TEX, the ‘~’ character is active.

Active TEX does not use the ‘eyes’ of TEX theprogram to form control sequences. Instead, it usesmacros and the \csname primitive to form controlsequences out of the active characters that it receivesfrom the eyes of TEX. This means that it never hasto change category codes, in order to achieve specialeffects, such as verbatim typesetting.

Macros The internal tokens of TEX (or more ex-actly their meanings) can be divided into two classes,namely the expandable and the unexpandable. Mostexpandable tokens are macros, and most of the prim-itive commands of TEX are unexpandable. How-ever, some primitive commands, such as \ifx, theother conditional commands and \csname, are ex-pandable.

Unexpandable commands do something (in thestomach of TEX the program), while expandable com-mands and macros control what it is that is done.In plain TEX the ‘~’ character, which is active, is de-fined to be a macro that places a penalty and some

glue on the horizontal list. This produces an un-breakable interword space.

Horizontal list TEX would not be able to typesetwithout commands that placed items on the hori-zontal list. The internal token ‘the letter a’ (ob-tained say by reading an ‘a’ from the input ASCII

file) will place a ‘character box’ that is the charac-ter ‘a’ in the current font onto the current horizon-tal list. (This is only in horizontal mode. In mathmode it does something else.) The internal token‘the character 9’ behaves in the same way.

There are other items that can go on the hor-izontal list. For this article, we need to know onlyabout glue, penalties and discretionary penalties.Glue is potentially stretchable and shrinkable inter-word space, while penalties record the undesirabilityof making a line break at this point.

Discretionary hyphens are hyphens that are op-tional. The line breaking algorithm can break linesat discretionary hyphens. If the break is taken at adiscretionary hyphen, the hyphen appears, and oth-erwise nothing appears. Discretionary hyphens canbe placed onto the horizontal list either explicitly,via the execution of a primitive command, or im-plicitly, as a result of the hyphenation algorithm.

Lines TEX’s line breaking algorithm turns a hori-zontal list into a sequence of lines. It does this bychoosing a sequence of break points in the horizontallist. Most of the time, any glue and penalty itemsafter a chosen break point are discarded. This allowsthe interword glue to disappear at line breaks.

Normally, TEX breaks the paragraph into linesusing the current value of the \hsize. However, the\parshape parameter allows the width (and offset)of each line to be specified individually.

Vertical list After the paragraph has been brokeninto lines, TEX places the lines onto the current ver-tical list. Often, this vertical list is the main verticallist, also known as ‘the current page’. Each line ofthe paragraph is a box (in fact a horizontal box).As well as boxes, a vertical list can contain (verti-cal) glue and (vertical) penalties. A vertical list canalso contain other items, such as insertions, that donot concern us here.

The line breaking algorithm places (vertical)glue between the lines, so that the baseline to base-line distance between the lines is uniform (unlessthe lines contain exceptionally tall or deep set mat-ter). It also inserts (vertical) penalties between thelines, to aid in the page breaking process. The\clubpenalty is the extra penalty for a page breakimmediately after the first line of a paragraph. The

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 211

Page 64: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Jonathan Fine

\widowpenalty is the extra penalty for a page breakimmediately before the last line of a paragraph.

Pages Whenever something is placed on the mainvertical list, TEX the program checks to see if it hasaccumulated enough to break off from it the cur-rent page. If it has, then TEX chooses the best ofthe available break points on the main vertical list.It then calls a special token list, the \output rou-tine, to add page numbers and the like to the brokenoff portion, and to ship it out to the dvi file. The\output routine is part of the macro package.

The dvi file This is the output file produced byTEX the program. As well as recording the place-ment of every character and every rule on the page,it can contain what are known as \special com-mands. Programs that process dvi files can readthe specials, and use them as parameters to theiractions. For example, a special might request theplacement of a graphic.

The look-ahead problem TEX’s line breaking al-gorithm ‘looks-ahead’ to the end of the paragraphbefore it makes any decisions as to where the first(or any other) line break occurs. Each line breakis, so to speak, considered not by itself but in thecontext of the other line breaks.

The page breaking algorithm does not performsuch a look-ahead. Each page break is considered inisolation, without regard for its consequences laterin the document.

At the end of a paragraph, the line-breakingalgorithm is called, and it produces lines of text.These lines are then placed on, say, the main verticallist. If enough material has accumulated, the page-breaking algorithm cuts off enough material for onepage, and the output routine is called.

Thus, from the end of the paragraph to the call-ing of the output routine, everything is under thecontrol of TEX the program. During this time nei-ther the user nor the macro programmer has any op-portunity to influence TEX’s behaviour, other thanthrough the values of parameters and the contentsof the horizontal and vertical lists.

TEX’s page-breaking algorithm clearly is defi-cient for complex work. One needs to be able lookahead, when there is floating matter to be placed.Multiple column layout is particularly complicated.There are two aspects to the problem. The first isthat an improved algorithm requires more than theinformation local to the current page. The secondis what it does with this information.

This article concentrates on making informa-tion available to an improved page-breaking algo-

rithm, but has little to say on the internals of suchan algorithm. As in the line-breaking algorithm,the page-breaking algorithm selects one sequence ofpossibilities from the many presented to it

The line-breaking algorithm has look-ahead. Itscontext is the current paragraph. To avoid hyphen-ating the last word on the last line of a page, thealgorithm needs to know where that last line will fall(unless it suppresses all hyphenation, and so is donewith the problem). Therefore, the page-breaking al-gorithm will have to feed information back to theline-breaking algorithm.

Once the location of the page break is known,this information can be fed to the line-breaking al-gorithm (in the form of a custom paragraph shape).Provided a suitable horizontal list is constructed, thealgorithm will suppress hyphenation at the requiredpoint. How this is done will be shown later in thisarticle.

Discrete dynamic programming

The purpose of this section is to describe those partsof TEX’s line-breaking algorithm that are speciallyrelevant to this article. This has two aspects. Thefirst is those features that are relevant to suppres-sion of hyphenation of the last word on some spec-ified line of a paragraph. The second is those fea-tures that help us to understand what can be donefor global optimisation of page breaks, and for es-tablishing communication between the line-breakingand page-breaking algorithms.

In our simplified model, a horizontal list con-tains character boxes, glue, penalties and discre-tionary hyphens. Glue and penalties are what areknown as discardable items. They can disappear ata line break. The other items are non-discardable.They will never disappear.

A legal breakpoint is any (finite) penalty, anydiscretionary hyphen, and any glue item, providedthe glue is immediately preceded by something thatis non-discardable. For any sequence of breakpoints,there is quantity called the total demerits, that de-pends on both the chosen breakpoints and on pa-rameters that can be set by the macro programmer.

For example, when breaking at a penalty, theamount of the penalty is part of the sum that isthe total demerits. Similarly, the \hyphenpenalty

and \exhyphenpenalty parameters are the contri-butions made by discretionary and explicit hyphensrespectively. If the line had been set loose or tight(shorter or longer than its optimum width) then abadness for the line contributes to the total demer-its.

212 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 65: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Line breaking and page breaking

Of all the possible sequences of breakpoints fora given paragraph, TEX chooses one that has thesmallest possible value for the total demerits. It doesnot choose the breakpoints line by line, or in otherwords locally. The breakpoints are chosen with aview to the whole paragraph, or in other words glob-ally.

The way in which it does this is interesting,because in general there are so many possible se-quences of breakpoints, that it is impossible for themto be considered individually. The method usedis known as discrete dynamic programming. Thismethod allows the last line of a paragraph to ‘com-municate’ with the first. (It is communication notin the sense of sending a message, but in the senseof being part a common larger whole.)

To save time, TEX tries first to make the para-graph without using any hyphenation. The param-eters \pretolerance and \tolerance are limits onhow bad a line can be respectively before and afterhyphenation. For simplicity, we will assume thathyphenation is alway tried, say because the pretol-erance is zero.

A sequence of breakpoints is said to be feasi-ble if no line has badness exceeding the tolerance.The line-breaking algorithm considers only feasiblesequences of break points. For formal reasons, theend of the paragraph is considered to be a break-point. It is, after all, the end of a line.

The formula the algorithm uses to compute thetotal demerits has the following useful property. Sup-pose an optimal sequence of breakpoints is selected,and say lines 5 to 9 are of the horizontal list are con-sidered in isolation from the remainder of the hori-zontal list. The optimal sequence of breakpoints forthe whole paragraph, when restricted to the isolatedlines, is also optimal for the line-breaking problemrepresented by the isolated problem. This is calledthe property of locality. It is a property of the for-mula for total demerits.

Discrete dynamic programming, as applied toline-breaking, consists of the following. Start at thebeginning of the paragraph. Calculate the feasi-ble breakpoints for the end of the first line. Fromthese breakpoints calculate the feasible breakpointsfor the end of the second line. We now prune the listof feasible sequences of breakpoints. If two or moresequences end the second line at the same point,keep only the best one. (If several are joint first,keep only one.) For each of the remaining two-linebreakpoint sequences, compute all the feasible ex-tensions to three-line sequences, and prune as be-fore.

As this process continues, so the number of bothfeasible and locally optimal sequences will in generalgrow. However, the growth will not be too rapid.Consider the spread in the location of the breakpointthat is the end of, say, the nth line. If the first n

lines contain as little set matter as is possible, thenwe get one location in the horizontal list. If theycontain as much as is possible, we get another. Thisis the spread. It is roughly linear in n. The numberof breakpoints in this spread is the number of locallyoptimal breakpoints that the algorithm must carryalong to the n + 1 stage.

This analysis limits the running time to of theorder of n2. However, we can do better. Whenthe spread gets large, it will cover the the lengthof a whole line, and so some of the calculations forn + 2 will have been done as part of n + 1. Thisalso shows why using a custom paragraph shape iscomputationally expensive. There is no longer sucha sharing of computations between lines.

The line-breaking and the page-breaking algo-rithms have a certain amount in common. This ishow Don Knuth puts it in The TEXbook (page 100):

TEX breaks lists of lines into pages by com-puting badness ratings and penalties, moreor less as it does when breaking paragraphsinto lines. But pages are made up one at atime and removed from TEX’s memory; thereis no looking ahead to see how one page breakwill affect the next one. In other words, TEXuses a special method to find the optimumbreakpoints for the lines in an entire para-graph, but it doesn’t attempt to find the op-timum breakpoints for the pages in an en-tire document. The computer doesn’t haveenough high-speed memory capacity to re-member the contents of several pages, so TEXsimply chooses each page break as best it can,by a process of “local” rather than “global”optimisation.

The situation is not impossible though. In Ap-pendix D (page 400) Don Knuth writes:

An output routine can also write notes on afile, based on what occurs in a manuscript. Atwo-pass system can be devised where TEXsimply gathers information during the firstpass; the actual typesetting can be done dur-ing the second pass, using \read to recoverinformation that was written during the first.

Provided sufficient information can be gatheredin the first pass, it can then be presented to TEX’sline-breaking algorithm, or some other program, sothat an optimal choice can be made from amongst

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 213

Page 66: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Jonathan Fine

those which are feasible. The second pass can thendo the actual typesetting.

Avoiding ‘last-word’ hyphenation

In this section we explain how a suitable horizon-tal list and paragraph shape specification taken to-gether will cause the line-breaking algorithm to sup-press hyphenation of the word at the end of somespecified line.

The basic idea is quite simple. Hyphenationplaces matter on the next line. Indeed, this is thevery purpose of hyphenation. However, if the nextline is not long enough to hold even the smallestfragment of a word, then the word at the end of theprevious line will not be hyphenated. (It is possi-ble for a very long word to be hyphenated two ormore times. Each hyphenation point is a legitimatebreakpoint.)

The sixth line has zero width. This pre-vents hyphenation of the word at the e-nd of the fifth line. This is because whe-n a word is hyphenated, part of the wor-d is placed on the next line. (This is the

very purpose of hyphenation.) A specia-l sequence of items of glue and penalti-es is placed between words. This allow-s the interword glue to span the zero-w-idth line.

Figure 1: Example of suppressed hyphenation

We can achieve this effect on say the fifth lineby making the width of the sixth line equal to zero.This however creates a problem. If we use ordinaryglue between words, then between any two wordsthere will be only one breakpoint, namely the gluethat was between the words. For some word to beallowed to occur at the end of the fifth line, it mustbe followed by a special piece of ‘glue’, that is capa-ble of spanning the zero width sixth line.

Recall that in our simplified model (which isall we need), breaks can occur at penalties, at dis-cretionary hyphens, and at glue that is preceded bysomething that is not discardable. To go further, weneed to understand exactly what happens at a linebreak.

According to The TEXbook (page 97):

When a line break actually does occur,TEX removes all discardable items thatfollow the break, until coming to somethingnon-discardable, or until coming to anotherchosen breakpoint. For example, a sequence

of glue and penalty items will vanish asa unit, if no boxes intervene, unless theoptimum breakpoint sequence includes oneor more of the penalties.

In other words, most of the time discardableitems are discarded, but any (finite) penalties areallowed to be part of the breakpoint sequence, if thatis what the algorithm decided to do. In other words,when moving on to the next feasible breakpoint, ithas something of a free choice in the discarding ofdiscardables.

Therefore, each piece of ‘glue’ between wordswill have to contain two legitimate break points, aswell as an ordinary piece of interword glue. The wayto get this is to place two penalties of zero, followedby the ordinary interword glue. (The penalty forbreaking at glue preceded by a non-discardable, suchas a word, is zero. Thus, in ordinary cases we getthe same behaviour as before.)

Something similar arises in ordinary practice.Sometimes a line is deliberately left short, say be-cause the next word is too long to fit on the line,and it cannot be hyphenated. The standard wayto achieve this is to insert \hfil \break in the line.The \break is just a shorthand for a penalty of zero,and the \hfil is glue that stretches to fill the line.When the line has zero width, no glue is required tofill it.

In August 1999, the author posted to the news-group comp.text.tex example code that suppressedhyphenation. A lively debate followed, but not untilthe author came to write this article did he discover,to his shock and horror, that the code he posted lastsummer did not work in many cases. In the first ver-sion of this paper, his solution had an unnecessarybut harmless zero-width piece of glue between thetwo penalties. This was not noticed until after thepaper had been refereed. Clearly, some of us havesomething to learn about penalties and glue.

The echowords environment

Figure 1 shows the result of applying the methodsof the previous section. So that there are many hy-phens, a discretionary hyphen has been placed be-tween adjacent letters of a word. The spaces be-tween words contribute, as described in the previ-ous section, two penalties of zero and an ordinaryinterword space. Although it is clearly possible toconstruct such a horizontal list by hand, doing so islaborious and prone to error.

Instead, the author has used Active TEX to sim-plify the form of the example’s input. In fact theauthor wrote

214 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 67: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Line breaking and page breaking

\beginhyphdemo5

The sixth line has zero width.

[...]

zero-width line.

\endhyphdemo

and it is the purpose of this section and the next todescribe the macros that were used.

By way of an example, this section contains thecomplete source for a LATEX environment that echoesits content to the console, word by word. Here aword is a maximal sequence of visible characters.White space separates words. The next section givesthe listing for the hyphdemo environment.

In the header of the source for this article theauthor wrote:

\RequirePackageatcode[2000/07/22]

\RequirePackageatlatex[2000/07/22]

and this loads two Active TEX macro packages.The first of these packages defines a program-

ming environment in which it much easier to writemacros that make extensive use of active characters.It has other advantages, which make it useful evenwhen writing macros that have no special features.One uses the command \@code to enter the environ-ment, and ]] to exit it. Later in this section therewill be examples of the input syntax and program-ming style for the package.

The first section also define macros for mak-ing all ASCII characters active, and giving themstandard meanings. More exactly, the active char-acter ‘a’ is a macro whose expansion is the con-trol sequence \active:lcletter followed be the ac-tive character ‘a’. This apparent recursion is veryuseful, for it allows each active character to knowits own identity. By letting the prefix control se-quence \active:lcletter be \string, for exam-ple, a character can be made to typeset itself.

The second of these packages defines a new com-mand, \active:latex, that makes it possible forLATEX macro programmers to access the facilities ofActive TEX. The hyphdemo environment above iscoded using this command, within an \@code pro-gramming environment.

First we enter the atcode environment. Whatfollows is the most general way, for it does not as-sume that the ASCII character @ has category codeletter. There must be a space before the @, and nospace after the code.

\csname @code\endcsname

Now all ASCII characters are active, and we arein the atcode environment. Here, control sequencesdo not need to be prefixed by a backslash. You canuse a backslash as a prefix, but it is neater to omit

the backslash whenever possible. Strings, however,have to be enclosed in double quote marks. Here isan example. (This semi-colon is not syntactic sugar.It tells atcode that it is safe to release the tokens ithas been accumulating. Semi-colons within braces,however, are syntactic sugar. The same goes forcommas.)

message "Hello world" ;

Next we set up a shorthand feature. This allowsus to type .digit instead of active:digit, and soon. From now on we will drop the backslash beforecontrol sequence names, in both text and in atcodesource. We will also drop the active: prefix. Thus,active:latex is .latex.

def active:prefix "active" ;

The macro get.word parses the.word from theinput stream, and calls do.word to process it. Itdepends on init.get.word, whose value will be setby the calling context. It also relies on some systemmacros that have not yet been described. In theatcode environment white space is ignored, unless itis part of a string or the like.

def get.word

begingroup ; aftergroup do.word ;

init.get.word ;

.suspend.white.space ;

let .suspend .end.xdef ;

xdef the.word iffalse fi ;

Here is the definition of the echowords environ-ment. It provides an example of the .latex com-mand. The ]] closes the atcode environment. Allis as it was before except that the macro get.word

and the environment echowords have been defined.

newenvironment "echowords"

begingroup ;

let .lcletter get.word ;

let .ucletter get.word ;

let .digit get.word ;

(default) ; let .symbol get.word ;

let .rs relax ; let .re relax ;

let .re-sp relax ;

let ! relax ; let |D09 relax ;

let init.get.word .string.visible ;

def do.word

message the.word ;

.latex ; // must come last

endgroup ;

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 215

Page 68: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Jonathan Fine

]] %% now back to the usual catcodes

We will now explain what is going on. First, the.latex command. This command opens a group, inwhich all ASCII characters are active. It looks for aline that begins with the (active) characters \end.When it finds this, it closes the all-active group, andpretends that it had read the \end with LATEX’snormal category codes. Thus, the first and last ofthe input lines

\beginechowords

These words are echoed,

one by one.

\endechowords

are processed by the begin and end commands ofthe echowords environment. The two lines in themiddle are read and processed with all charactersactive, and with the values set by the environment.

We simplify slightly. To avoid needlessly fillingTEX’s macro processor (the mouth) with a long listof tokens, this looking for the \end is done on aline by line basis. However, this makes no differencein practice.

The first three assignment commands tell Ac-tive TEX how to process letters (upper- and lower-case) and digits. Symbols are rather different. Mostif not all of the time, all lowercase letters are dealtwith by the same rules. The same goes for upper-case letters, and for digits. It often happens, how-ever, that each symbol has a specific meaning. Forexample, in the atcode environment, each symbolhas a distinct meaning of its own.

For this reason, Active TEX uses the concept ofsymbol sets. Within its realm, it ‘owns’ all the ac-tive symbols. (This is done in a way that does notinterfere with their use outside of its realm.) Insteadof directly assigning a value to a symbol, one selectsa symbol set, perhaps of one’s own creation. Theowner of a symbol set is free to change the meaningof symbols in that set. For as long as that symbol setis selected, for almost all practical purposes chang-ing the meaning of a symbol in a set is the sameas changing the meaning of the active symbol itself.However, when a different symbol set is selected, themeaning of all the symbols changes to those of thenewly selected set.

Parentheses, as above, are used to select a sym-bol set. The (default) symbol set is part of theatcode package, and in it every symbol expands tothe control sequence .symbol, followed the activesymbol itself. Thus the line of code:

(default) ; let .symbol get.word ;

causes all symbols to call get.word. In short, allvisible characters are to call the get.word commandwe just defined.

The .latex command ‘owns’ the active end-of-line character. Only when one knows for sure thatit is safe to do so, should one change its meaning.It is used by .latex to inspect the next line for the\end characters.

At the start and end of each non-blank inputline, .latex generates .rs and .re events. Blankinput lines generate the .rs-re event. These eventsare control sequences, whose values can be set bythe macro programmer. Here we are setting themto do nothing. (One can think of the visible char-acters as similarly being events, but this time withparameters.)

We have now initialised all the ASCII charactersexcept for space and tab. The next line sets themboth to relax. (The construction |ABC generatesa character whose category code is hexadecimal A,and whose character code is hexadecimal BC. Thus,|D09 is active tab.)

The low-level events (reading a character fromthe input stream) have now been dealt with. Theycreate higher level events, namely the initialisationof the parsing of a word, and the processing of theword once parsed. The .string.visible macro isa low-level system macro that causes all visible char-acters to behave as if they were characters of cate-gory code other. This system macro by-passes thesymbol set mechanism. It runs quicker, but must beused with care.

We are almost done. There are some commandsin get.word that need explanation. The command.suspend.white.space cause the active form of thewhite space characters (space, tab and end-of-line)to expand to .suspend followed by the active whitespace character. This should only be done within agroup, which is closed by white space. The parsingof a word is exactly such a context.

Finally, the atlatex package contains a helpermacro that is very useful for closing a ‘flying xdef’.Here is its definition.

def .end.xdef

iffalse fi ; ; endgroup ;

To conclude, we reconsider the get.word macro.

def get.word

begingroup ; aftergroup do.word ;

init.get.word ;

.suspend.white.space ;

let .suspend .end.xdef ;

xdef the.word iffalse fi ;

216 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 69: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Line breaking and page breaking

It opens a group. After the group, we calldo.word. The variable part of the initialisation rou-tine, namely init.get.word is defined to make allvisible characters ‘other’. Thus, when the xdef whichcloses the macro executes, it simply accumulates vis-ible characters in the.word. (The iffalse is a hackthat allows a macro to ‘contain’ unbalanced braces.)The two suspend commands cause white space toclose the xdef, and thereby trigger the processingof the word.

The reader may find it instructive to run thesemacros with tracingall on, and examine the re-sulting log file.

The hyphdemo environment

Our next example is more substantial. The sup-pression of hyphenation on the last line of a pagerequires the construction of a fairly special horizon-tal list. Here is the sequence of penalties and gluethat is to be placed between words. (We use hd as atwo letter prefix for ‘hyphenation demonstration’.)But first we enter the atcode environment.

\csname @code\endcsname

def hd:iwspace

unskip ;

penalty "0 " ; penalty "0 " ;

~ ; // ordinary interword space

The unskip is in case we get two spaces in arow. This is not rigorous, but in the context it isgood enough. Then we put down two penalties,which allows hd:iwspace to span a blank line. Fi-nally, we put down an ordinary piece of interwordglue. In Active TEX, ~ produces an ordinary spacecharacter.

So that we get lots of hyphens, we will place adiscretionary hyphen between adjacent letters in aword. To do this, we use a variant of the get.word

command. This macro applies string to the firstcharacter in the word. Each subsequent characteris then responsible for putting down a discretionaryhyphen before stringing itself. To avoid hyphen-ating just before punctuation at the end of a word,symbols do not insert a discretionary hyphen.

def hd:get.word get.word ; string ;

def hd:init.get.word

def .lcletter \- ; string ;

let .ucletter .lcletter ;

let .digit .lcletter ;

let .symbol string ;

The hyphdemo environment takes a single pa-rameter, namely the number of the line, at the end ofwhich hyphenation is to be suppressed. This param-eter controls the construction of a custom parshape,which will be coded later. If the parameter is zero,no suppression is offered.

The parameters encourage hyphenation. Thelarge value of the line penalty is to stop the line-breaking from making the lines very loose, just so itcan get the reward (negative penalty) for the addi-tional hyphen.

newenvironment "hyphdemo" [1]

par ;

begingroup ;

hyphenpenalty "-100" ;

doublehyphendemerits "0 " ;

linepenalty "200 " ;

leftskip "2pc " ;

rightskip leftskip ;

hd:set.parshape #1 ;

let .lcletter hd:get.word ;

let .ucletter .lcletter ;

let .digit .lcletter ;

(default) ; let .symbol .lcletter ;

let ! hd:iwspace ;

let |D09 ! ; let .re ! ;

let init.get.word hd:init.get.word ;

def .re-sp par ;

def do.word the.word ;

.latex ; // don’t forget this

par ; endgroup

The remainder of the definition of this environ-ment sets up the conditions for the parsing and pro-cessing of words, in much the same way as in theprevious section. Note that let do.word the.word

would be very wrong. This would cause the macroto continually process the value of the.word thatwas current at the start of the environment.

The difficult part of setting the parameters is tofeed the parameters to TEX’s parshape primitive. Ittakes 2n + 1 parameters, where n is the number oflines, whose width we are specifying. These are TEXnumber and dimension parameters, and not macroor token parameters. We use aftergroup accumula-tion to build up this list. Scratch counters are usedto hold the values of parameters whose values haveto be calculated.

def hd:set.parshape #1

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 217

Page 70: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Jonathan Fine

count@ #1~ ;

ifcase count@ ,

else

advance count@ tw@ ;

dimen z@ leftskip ;

advance dimen z@ rightskip ;

def temp z@ ; hsize ;

begingroup ;

aftergroup parshape ;

aftergroup count@ ;

count@ #1~ ;

loop ; ifnum count@ > z@ ,

aftergroup temp ;

advance count@ m@ne ;

repeat ;

endgroup ;

// accumulated tokens released here

z@ ; dimen z@ ; // zero-width line

temp ; // remaining lines normal

fi

Some words of explanation. If the parameter iszero, we do nothing, otherwise we store in scratchregisters the number of lines in the parshape, andthe sum of the leftskip and the rightskip (theactual width of a ‘zero-width’ line). We then store intemp the specification for a normal line. A processof ‘aftergroup accumulation’ is then used to buildup the parshape along with its parameters. (The@code environment uses the same method to gainits power. The asterisks problem in Appendix D ofThe TEXbook (page 373) is a simpler example ofthis.)

Outside the group, count@ is n+2, the numberof lines in the paragraph shape. Inside the groupit is set to n, which is the number of lines beforethe zero width line. (Grouping ensures that the twovalues do not interfere with each other.) The loopaccumulates n temp tokens. At the end of the group,the accumulated aftergroup tokens re-appear. Thezero-width line and the final temp complete the para-graph specification.

All that remains now is to close the atcode en-vironment.

]]

Flexible paragraphs

Sometimes it is helpful, for purposes of page make-up, to set a paragraph slightly longer or shorterthan is optimal. For this purpose TEX provides thelooseness parameter. Negative values of loosenesscan be thought of as tightness. If the looseness is 1,then TEX will try to make the paragraph one line

longer than it would otherwise. Traditionally, inthe TEX world, looseness is applied by hand, whenfine-tuning the document for publication.

Let us consider now how it might be done auto-matically. Ahead of time, we will not know how longwe will want the paragraph to be. Nor will we knowwhere the paragraph appears on the page, and thuswhich custom paragraph shape to use. Therefore,we shall consider all possibilities.

We might find, for example, that a given para-graph can be set using 9, 10 or 11 lines. We mightalso find that when 9 lines are used, we can suppresshyphenation at the line breaks 4, 6, 7 and 8. (Weare lucky if we can suppress hyphenation early on ina paragraph.)

The following table represents this data about9-line versions of the paragraph. Each line givesa way of breaking the paragraph, and the numberpointed to by the arrow is the total demerits for theoptimal way of so breaking the paragraph. Simi-lar tables can be constructed for the 10 and 11 lineversions of the paragraph. Such a report, on theflexibility of all paragraphs in the document, willbe the input for the global optimisation algorithmconsidered in the next section.

4+5->3489

6+3->2748

7+2->2956

9->2413

The reader may object that to prepare such areport, even by computer, will take a long time.This may be true, but the situation is not hopeless.First, if the document is in its final form, this reportneed be prepared only once. The page-breaking al-gorithm, by design, requires no knowledge of thedocument, other than this report.

Second, even if the document is not in its finalform, changes are likely to be confined to a smallproportion of its paragraphs. Matters can be con-figured, provided macros have been written with thisin mind, so that fresh report data need only be gen-erated for the paragraphs that have changed. This isprobably something that could be done in real timeon the entry-level hardware available today.

What is true is that much more time will bespent on trial paragraph breaking, to generate thereport, as is spent on breaking the paragraphs forthe final triumphant globally optimised version. Thesame is true, however, of the line-breaking algo-rithm.

Indeed, the two are yet more similar than this.Discrete dynamic programming depends on the prin-ciple of local optimality, which is a property of the

218 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 71: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Line breaking and page breaking

formula for total demerits. One consequence of thisproperty is the following. If an optimal sequence ofbreakpoints takes in the feasible breakpoints A andB, then over the range A to B this sequence is alsooptimal for this local form of the problem.

Now suppose A is ‘sufficiently distant’ from thestart of the paragraph, and that B is ‘sufficientlydistant’ from A. Here, ‘sufficiently distant’ meansthat there is a feasible (but not necessarily optimal)sequence of breakpoints linking the two points. Ifenough set matter of random width intervenes be-tween the two points, the concept has its intuitivemeaning. In these circumstances the line-breakingalgorithm will find an optimal sequence of break-points between A and B. It will do this whetheror not this is part of the finally chosen optimal se-quence.

Thus, the line-breaking algorithm finds not onlythe best breaking for the whole paragraph, but alsofor a great many portions of the paragraph. In thesame way, any worthwhile discrete dynamic pro-gramming solution to the problem of global opti-misation will consider most or all possible feasibleways of breaking the paragraphs that constitute thedocument. The strength of Knuth and Plass’s al-gorithm is not that it runs quickly in abstract, butthat the running time is roughly linear, rather thanquadratic, in the size of the problem. Because oflinearity, in time hardware will be able to catch up,even if the problems are large.

Global optimisation

This section describes briefly how a report on para-graph, as in the previous section, can be used as theinput for a global optimisation process. For simplic-ity, we assume that we are setting straight text ona grid, and that hyphenation is to be suppressed onthe last word of each page. We also assume that noparagraph is longer than a page, or in other words,that it cannot span two page breaks.

First, it is convenient to recast each paragraph’sreport into the following form. We give the possi-bilities in order first of the number of lines beforethe potential page boundary, and then in order ofthe number after. Thus, a fragment of paragraph’sreport might look like the following. (The values fortotal demerits are fictional, and are chosen to makethe rest of the exposition clearer. The right handcolumn will be explained later.)

4+5->4050 ; wibble 4050, 0 ;

4+6->4060 ; wibble 4060, 1 ;

4+7->4070 ; wibble 4070, 2 ;

; wobble ;

5+4->5040 ; wibble 5040, 0 ;

5+5->5050 ; wibble 5050, 1 ;

Given such a sequence of paragraph reports,and the requirement that there be, say, exactly 12lines on each page, there is an associated optimi-sation problem. First, for each paragraph reportchoose one of its entries. Call this a selection (ofparagraphs). Write the selection in the form

(5) + (3) + (4 + 7) + (5 + 2) + 10 + . . .

and say that the selection is feasible if, when sum-ming from left to right, successive exact multiplesof 12 are reached during the progress of the sum.The above selection is feasible (as far as it goes).For every feasible selection, define the grand totaldemerits to be the sum of demerits associated withthe terms of the form (a+b). Thus, the (4+7) termscontributes 4070 to the grand total demerits.

The optimisation problem is to find a feasibleselection that minimises the grand-total demerits.This is one way (there are many others) of defininga global optimisation for the line and page breaksof a document. If such a problem is to be solvedusing discrete dynamic programming, the global op-timisation data might take a more elaborate form,but the general structure will be the same. (Theinterested reader might wish to look at how TEX’sline-breaking algorithm supplies demerits for adja-cent lines whose looseness is visually incompatible.It is done by providing each partial problem with acontext.)

It is both interesting and fortunate that theglobal problem, as described above, can be solvedusing TEX’s line-breaking algorithm. It is a mat-ter of ‘putting the book on its side’, and thinking ofeach line as a ‘word’ in a paragraph. The problem isto construct a suitable list of boxes, glue and penal-ties. So that we can get nice diagrams, we will letone pica represent one line.

Discardable items can vanish at line breaks, andwith trickery this allows the problem to be solved.Consider for example the sequence of horizontal listitems,

penalty "4070 " ;

kern "-2pc " ;

noalign ;

kern "2pc " ;

Kerns are discardable items. If the line breakis taken at the penalty, the first kern will be dis-carded. The noalign is non-discardable, and it pre-vents the second kern from being discarded. Thus,if the penalty is not a break-point, the kerns can-cel, but if the penalty is a break point, it effectivelyinserts a kern of two pica.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 219

Page 72: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Jonathan Fine

Denote such a sequence of horizontal list itemsby wibble 4070, 2;, and let wobble represent akern by one pica. This procedure translates thesequence of paragraph reports into a horizontal list.When the line-breaking algorithm is applied to thislist, with a hsize of twelve pica, the result is a globaloptimisation of the line and page breaks. If we arenot typesetting on a grid, then some ‘interword glue’(representing interline glue) should be added to theabove construction.

As mentioned earlier, the line-breaking algo-rithm introduce penalties between the lines, in orderto help TEX’s page-breaking algorithm. These pre-vent, or discourage, page breaks just after the firstline of a paragraph, and just before the last line.In the algorithm described here, the potential pagebreak is part of the paragraph’s specification. Theclub penalty thus becomes an extra demerit chargedfor paragraph specifications of the form (1+n), andsimilarly the widow penalty applies to (n + 1).

Although there are some difficulties of a tech-nical nature in implementing such a solution, thereis a more fundamental problem. In 1989 [6], whenDon Knuth released version 3 of TEX, he introducedseveral new primitives. One of them, the \badness,records the badness of the box that was most re-cently constructed. Thus, this quantity is madeavailable to the macro programmer. Sadly, he didnot at the same time introduce \totaldemerits,and so there is no ready access to this quantity.

Summary and conclusions

When Don Knuth announced [8] in 1990 that hiswork on developing TEX had come to an end, hepointed out that improved macro packages couldbe added on the input side, and improved devicedrivers added on the output side. This article showsthat ten years after the event, there is still plenty ofroom for improvement on the macro package side.(However, the lack of a \totaldemerits commandis unfortunate.)

The problem of suppressing hyphenation at theend of a page is relatively simple, particularly if amacro package such as Active TEX is used to con-struct the horizontal list. What has not been dis-cussed is how to rearrange the resulting sequence oflines, so that the blank amongst them can be dis-carded. In abstract this is not difficult, but in thecontext of an existing macro package one may findassumptions being made that are inconsistent withthis goal.

The problem of page make-up is much harder,particularly where there are multiple columns andfloating material. TEX was not designed to do such

work, although it can readily typeset the paragraphsthat will go into the pages. As in shown in the pre-vious section, it is possible to use the line-breakingalgorithm to solve simple page make-up problems.For more complicated problems, an external pro-gram might be more suitable.

TEX is not good at complicated page makeup,but that is no reason to ‘improve’ it. Complicatedpage make-up was never a design goal of TEX. In-stead, TEX can be used to feed paragraphs and para-graph reports to an external make-up program. Suchcan be thought of as an improved device driver, inthe same way as Active TEX is intended to be animproved macro package.

Postscript

Prior to the TUG 2000 meeting I sent an earlierversion of this paper to Don Knuth, and invited hiscomments. He told me that I should cite and readMichael Plass’s thesis [10]. The citing is done, andI hope soon to read this work. He also says that hecannot add \totaldemerits, as that would meanchanging TEX and suggests instead that I approachthe authors of extensions to TEX.

In his essay on the errors of TEX, [7] Don Knuthwrote:

Of course I don’t mean to imply that all prob-lems of computational typography have beensolved. Far from it! There are still countlessimportant issues to be studied, relating espe-cially to the many classes of documents thatgo far beyond what I ever intended TEX tohandle.

I hope that this article shows that a few judi-cious extensions to TEX will produce a new systemthat can handle well many new classes of documents,and that even TEX can make a fair attempt at doingthe job. What seems to be required, above all, is anunderstanding of the problem, and the developmentof suitable algorithms. From then on, the program-ming of the extensions should be straightforward.

The article by Frank Mittelbach in these pro-ceedings addresses a different aspect of the pagemakeup problem. His concern is with placement offloats. Combining his work with mine, even at thelevel of algorithms, is already a challenge. When itcomes to implementation, the widespread use of ac-tive space characters is likely to present LATEX withmany problems. Assumptions about category codesare built into its input syntax.

So much for output. On the input side the pa-pers by David Carlisle and by Pedro Palao Gostanzain these proceedings have significant overlap with

220 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 73: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Line breaking and page breaking

this paper. I am delighted that others are takingsteps in the direction of making all characters active.However, we now have three incompatible systemsof values for the meaning of active letters and digits.

Active TEX provides a powerful and effectiveprogramming environment, especially for definingactive characters. Without such a device, the pro-grammer has to resort to ad hoc tricks, time andtime again. For example, of the 1,936 lines of xml-tex (v0.07), exactly 194 contain the string catcode.By contrast, of the 6,361 lines of my sgmlbase pack-age (v0.00), exactly 23 contain the string catcode.Perhaps if Carlisle had used Active TEX, his workwould have been easier.

For this area to flourish, standards are required.Without standards, incompatible versions of the ba-sic macros will be re-invented. Application program-mers will then have to work harder, to cope with thisunhelpful diversity. There is also be the danger ofschisms within the community.

To understand this, imagine what life would belike if there we used incompatible mechanisms forregister allocation (\newcount and the like). In The

TEXbook (page 346), Don Knuth addressed pre-cisely this problem:

Allocation of registers. The second majorpart of the plain.tex file provides a founda-tion on which systems of independently de-veloped macros can coexist peacefully with-out interfering in their usage of registers.

We need the same for active characters. Thepackages atcode.sty and atlatex.sty have beenwritten to be a fixed point that opens this area tothe plain and LATEX macro programmer. They differonly in a small but significant detail (colon insteadof prefix is used to segment the name space) fromthe version announced at TUG 1999.

I offer these packages to the community, andhope for the rapid and widespread adoption of astandard for the use of active characters. I wouldof course prefer that my own macros were the stan-dard, but more important both to me and to thecommunity as a whole, I believe, is that a standardacceptable to all is adopted.

References

[1] David P. Carlisle, xmltex: A non validating (andnot 100% conforming) namespace aware XML

parser implemented in TEX, these proceedings

[2] Jonathan Fine, Active TEX and the DOT inputsyntax, TUGboat, 20, (1999), 248–254

[3] Pedro Palao Gostanza, Fast scanners and self-parsing in TEX, these proceedings

[4] Donald E. Knuth, Michael F. Plass, Breakingparagraphs into lines, Software—Practice andExperience, 11 (1981), 1119–1184.

[5] Donald E. Knuth, The TEXbook, Addison-Wesley (1984).

[6] , The new versions of TEX and META-FONT, TUGboat, 10 (3) (1989), 325–328

[7] , The Errors of TEX, Software—Practiceand Experience, 19 (1989), 605–685; reprintedwith additions and corrections as Chapter 10 ofLiterate Programming.

[8] , The future of TEX and METAFONT,TUGboat, 11 (4) (1990), 489.

[9] Frank Mittelbach, Formatting documents withfloats, these proceedings

[10] Michael F. Plass, Optimal Pagination Tech-niques for Automatic Typesetting Systems,Ph.D. thesis, Stanford University (1981). Pub-lished also as Xerox Palo Alto Research Centerreport ISL-81-1

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 221

Page 74: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

PassiveTEX: from XML to PDF

Michel Goossens

CERN, IT Division, CH-1211 Geneve 23, Switzerland

[email protected]

Sebastian Rahtz

Oxford University Computing Services, Oxford, United Kingdom

[email protected]

Abstract

This article introduces PassiveTEX, a library of TEX macros based on xmltex,that processes XML documents containing XSL formatting objects and generatesPDF or DVI output. We show examples of typesetting XML sources marked upusing the TEI, DocBook, and MathML DTDs.

Introduction

New information becomes available on the Inter-net every day, and increasingly material is becomingavailable in XML. However, when one wants to printthe information on the screen one is faced with sev-eral shortcomings, the more important being the lowtypographic quality of the result or the problem ofhow to serialize a ‘tree’ of pages onto a linear outputmedium. In this article we explain how a source doc-ument marked up in XML can be typeset nicely bya two-step procedure that combines a transforma-tion of the XML source into XSL formatting objectsand the direct interpretation of these XML objectswith Sebastian Rahtz’ PassiveTEX, a variant of TEXbased on David Carlisle’s xmltex [4].

The choice of TEX as the typesetting engine isjustified by the fact that TEX handles mathematicsin a natural way, can manage several languages si-multaneously (hyphenation, typographic rules, mul-tiple encodings and alphabets, right-left typesetting,etc.), and has a good model for marking up com-plex tabular information. Moreover, TEX can easilyhandle very long documents, such as large softwaremanuals, or bills for hundreds of thousands of tele-phone subscribers.

In the first part of this article we use as an ex-ample some literary texts, including poems by theFrench poet Paul Verlaine and the Russian poetAlexander Blok, marked up according to the TEI

DTD (Text Encoding Initiative [3], Lite version). Inthe second part we show an example of a more tech-nical document, including a couple of simple mathformulae, using the DocBook [14] and MathML [17]DTDs.

The present article was prepared in XML us-ing TEI markup. It was not actually typeset withPassiveTEX, but transformed into LATEX with anXSLT transformation stylesheet and typeset usingthe ltugproc LATEX class file.

XSL formatting objects

The Extensible Stylesheet Language (XSL) is a lan-guage for describing page designs. For any givenclass of arbitrarily structured XML documents ordata files, an XSL stylesheet allows you to expresshow the content contained in the XML should bepresented. The stylesheet indicates how source ele-ments should be styled, laid out, and paginated insome presentation form. In this article we only ad-dress issues related to high quality typesetting (usingTEX). Our XML examples can be transformed intoother representations (see [7] for more discussion),in particular HTML, and XSL stylesheets targetingHTML are available for both the TEI [12] and Doc-Book [15] markup schemes.

An XSL processor reads an XML source docu-ment together with an XSL stylesheet, and producesthe presentation of the given XML content accordingto the instructions in the stylesheet. The prepara-tion of the presentation form proceeds in two steps.First, a result tree is constructed from the XML in-put source tree (tree transformation step). Second,the result tree is interpreted to produce the format-ted results (formatting step), that can be presentedon output media such as a computer screen, a WAP

display, on paper, in speech, etc.The result tree can be very different from the

structure of the source tree, since parts from the

222 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

Page 75: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

PassiveTEX: from XML to PDF

input can be deleted from the result tree, while sup-plementary information (e.g., table of contents) canbe generated. The tree transformation step also hasto add the information necessary to format the re-sult tree.

The nodes of the result tree are formatting ob-jects, whose semantics are expressed in terms of acatalog of formatting object classes defined in theXSL Specification [24]. They denote typographic ab-stractions such as page, paragraph, table, list, etc.Fine control over the presentation of these abstrac-tions is provided by a set of formatting properties,such as those controlling alignments, color, fonts,spacing, writing-mode, hyphenation etc. XSL offersa rich range of formatting objects as one of its aims isto cover the semantic functionality of both the Doc-ument Style Semantics and Specification Language(DSSSL) [10] and Cascading Stylesheets (CSS) [16]models as completely as possible.

PassiveTEX: implement XSL using TEX

In the previous section we explained how an inputXML document can be transformed into a new XML

document containing a result tree of XSL format-ting objects. How do we go about rendering thoseobjects with a real typesetting engine, and gettinghigh-quality printout? One way is to use TEX it-self. PassiveTEX is a library of TEX macros whichcan typeset the XSL formatting objects. In particu-lar, PassiveTEX combined with the pdfTEX variantof TEX generates high-quality PDF files in a singleoperation. PassiveTEX allows one to choose TEX asthe formatter of choice for XML, while hiding thedetails of its operation from the user.

PassiveTEX derives from and builds on xmltex

[4], a TEX package by David Carlisle, providing thecore XML parser and UTF8 handler. Ideas and TEXcode are also inherited from earlier work by Sebas-tian Rahtz on his JadeTEX package, which imple-mented the output of the Jade DSSSL processor’sTEX backend, and already used a catalogue of Uni-code/TEX mappings.

Issues in using TEX Since PassiveTEX is basedon TEX one can rapidly develop and test new highlevel code, knowing that TEX will take care ofthe typesetting details. Moreover, TEX is a well-understood, robust, and free page formatter, wheregood support for fonts, graphics inclusion, hyper-links, etc., is already available. One can also profitfrom TEX’s mature handling of language issues, in-cluding hyphenation, and its high-quality math ren-dering. Moreover, pdfTEX allows direct generationof high-quality PDF.

There are, however, some drawbacks associatedwith using TEX as typesetting engine. Firstly, we areconstrained to use TEX’s page makeup model, andhave to force the XSL formatting objects to fit thatmodel, which is not always straightforward. More-over, since PassiveTEX is actually layered over LATEXit is too easy to allow things to fall through and takeLATEX defaults.

On a more practical level, TEX macro writingis obscure and difficult and thus the system is nottransparent for most programmers. And, last butnot least, TEX is large and monolithic, and unsuitedto embedding in other applications.

Users of the system with a TEX backgroundcan find it confusing to understand that TEX nolonger does all the work, which is now split betwenthe stylesheet and the formatter; the four importantpoints to remember are:

• No explicit use is made of LATEX’s high-levelconstructs, in particular there are no sections,lists, cross-references, bibliographies, etc.

• all vertical and horizontal space is explicit inthe specification;

• page and line breaking is left to TEX: the restis up to the stylesheet;

• XSL formatting objects use XML syntax, so thatthe underlying character set is Unicode. By de-fault, entities are mapped to their Unicode po-sition.

PassiveTEX will switch to using the Unicode-based TEX variant soon (Omega [8]), to handle non-Latin material more naturally.

Two extensions are needed for practical use.The first is support of MathML; this is largely inplace (it is simply passed through as-is by an XSL

stylesheet), but needs some tuning. In particu-lar, the intricacies of equation numbers remain tobe dealt with properly. Second, we need to sup-port Scalable Vector Graphics (SVG) [21] XML codesomehow (e.g., by direct interpretation, translationinto MetaPost [9], or pre-processing). Moreover,SVG fragments need to be recognized directly to per-form in-line graphical functions (e.g., setting text atan angle). No work at all has been done on this.

Support for XSL formatting objects Not allparts of the XSL specification are fully supported.The XSL formatting objects which are implementedfairly well cover the page specifications, blocks, in-line sequences, lists, graphics inclusion, floats, fontproperties, and links. Not so well implemented atpresent are all the table properties, and object mar-gins, borders, and padding. In order to properly im-plement these, we have to put every paragraph into

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 223

Page 76: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michel Goossens and Sebastian Rahtz

an explicit TEX box ‘just in case’, and this becomesslow and clumsy. Tables, too, are treated rather dif-ferently in XSL, with many properties assigned atthe cell level.

Parts of the specification that are not yet im-plemented at all include bidi handling, backgrounds,aural properties, and a large number of assortedproperties.

A small example The set of XSL stylesheets forthe TEI DTD (tei-fo [12]) specify how the variousXML elements can be transformed into XSL format-ting objects (see Section 7.6.6 of [7] for a more de-tailed discussion). Without further comments, thefollowing code example shows the transformationsfor a paragraph (p element, lines 1 to 6) and em-phasized material (emph element, lines 7 to 11).

1 <xsl:template match="p">

2 <fo:block indent-start="10pt"

3 space-before="12pt">

4 <xsl:apply-templates/>

5 </fo:block>

6 </xsl:template>

7 <xsl:template match="emph">

8 <fo:inline-sequence font-style="italic">

9 <xsl:apply-templates/>

10 </fo:inline-sequence>

11 </xsl:template>

A few words about xmltex As PassiveTEX usesxmltex to read and interpret the XML source it isappropriate to say a few words about it. xmltex

is a non validating (and not 100% conforming)namespace-aware XML parser implemented in TEX.xmltex reads the encoding declaration and tries toimplement it; in particular it handles UTF8. It readsthe DTD subset and expands entities properly, ituses namespaces to load modules of TEX code toprocess elements (for instance for MathML, see thefollowing example). xmltex offers limited access tochild and parent elements to guide the interpreta-tion process.

The workhorse of an xmltex package file is the\XMLelement command, whose four parameters in-dicate how TEX will handle a given element, itsattributes and its content. The following exampleshows how a few simple elements of the MathMLnamespace are handled.

1 \DeclareNamespacem

2 http://www.w3.org/1998/Math/MathML

3

4 \XMLelementm:math

5

6 \beginequation

7 \endequation

8

9 \XMLelementm:mn

10

11 \xmlgrab

12 \mathrm#1

13

14 \XMLelementm:msqrt

15

16 \xmlgrab

17 \sqrt#1

Lines 1 and 2 declare the prefix m to be used for re-ferring to elements in the given namespace. Lines4 to 7 declare that the start and end tag of a math

element are transformed into the opening and clos-ing of an equation environment. Lines 9 to 12 de-fine how a MathML mn (number) element is typeset.Its contents are stored (grabbed, see line 11) andthen injected as parameter of a \mathrm to be type-set in roman. Similarly, lines 14 to 17 show howa square root (msqrt) element and its content aretransformed into LATEX’s \sqrt and its argument.

To fine-tune the output, xmltex supports pro-cessing instructions to manipulate TEX formattingdirectly.

The biggest problem at present in using xmltexto write PassiveTEX is that it uses TEX groupingto make sure each element is handled in the rightnamespace. Because TEX does not allow for nestedgrouping, each element is caught in a group; while\aftergroup can help a bit, this is the first hurdlefor anyone trying to extend the package.

An example of TEI markup typeset with

PassiveTEX

In this section we use an XML source file that con-tains a collection of literature of the French poetPaul Verlaine, the Russian poet Alexander Blok, theEnglish novelist Thomas Hardy, and the Finnish au-thor Aleksis Kivi. It is marked up according to theTEI Lite DTD. The master file poemstei-utf8 fol-lows:

1 <?xml version="1.0" encoding="UTF-8"?>

2 <!DOCTYPE TEI.2 SYSTEM "teixlite.dtd" [

3 <!ENTITY dash "&#x2010;">

4 <!ENTITY mdash "&#x2014;">

5 <!ENTITY oelig "&#x0153;">

6 <!ENTITY Verlaine SYSTEM "Verlainetei-utf8.xml">

7 <!ENTITY Blok SYSTEM "Bloktei-utf8.xml">

8 <!ENTITY Hardy SYSTEM "beyes.xml">

9 <!ENTITY Kihlaus SYSTEM "kihlaus.xml">

10 ]>

11 <TEI.2>

12 <teiHeader type="text" status="new">

13 <fileDesc>

14 <titleStmt>

15 <title>Various languages and scripts</title>

16 <author>Collected by Michel Goossens</author>

17 <respStmt>

18 <resp>Transcription in TEI.2 markup</resp>

19 <name>Michel Goossens</name></respStmt>

20 </titleStmt>

21 <publicationStmt>

22 <distributor>Distributed by mg</distributor>

224 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

Page 77: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

PassiveTEX: from XML to PDF

23 </publicationStmt>

24 </fileDesc>

25 <profileDesc>

26 <langUsage default="NO">

27 <language id="EN">English</language>

28 <language id="FI">Finnish</language>

29 <language id="FR">French</language>

30 <language id="RU">Russian</language>

31 </langUsage>

32 </profileDesc>

33 </teiHeader>

34 <text>

35 <front>

36 <titlePage>

37 <docTitle>

38 <titlePart>Languages and scripts</titlePart>

39 </docTitle>

40 <docAuthor>Collected by Michel Goossens</docAuthor>

41 <docDate>July 2000</docDate>

42 </titlePage>

43 </front>

44 <body>

45 &Verlaine;

46 &Blok;

47 &Hardy;

48 &Kihlaus;

49 </body>

50 </text>

51 </TEI.2>

This XML source document uses the UTF8 en-coding, since we want to mix various alphabets (inthis case Latin and Cyrillic). UTF8 is a Unicode-based encoding [13] that can encode each charac-ter in Unicode’s base plane and its sixteen extendedplanes (allowing for more than one million charac-ters) with at most three bytes. Documents thatonly contain ASCII can be coded using one byteper character. Parts of the XML source of the for-eign language documents (Verlainetei-utf8.xml,defined on line 6 and input on line 45; and alsoBloktei-utf8.xml defined on line 7 and input online 46) are shown in Figure 1.

To typeset this document we first transform theXML into XSL formatting objects using an XSLT

stylesheet, as explained previously. Then, this in-termediate XML file is handled by xmltex and Pas-siveTEX. In what follows we use James Clark’s xtXSLT processor ([5], see also Section 7.6.4 of [7]),but any conforming XSLT processor should be ableto handle these transformations.

xt infile.xml style.xsl fotex.xml

latex fotex.tex

The file style.xsl is an XSL stylesheet thatcontains the XSLT transformations needed to trans-form the input XML file infile.xml into XSL for-matting objects. The resulting intermediate XML

document fotex.xml can be interpreted by appli-cations that can render XSL formatting objects. Inour case we use PassiveTEX.

Below we show part of the beginning of theXML file fotex.xml that corresponds to the firstpage of the collection of poems of Verlaine trans-formed using Sebastian Rahtz’ TEI XSL stylesheets[12].1 ...

2 <fo:flow flow-name="xsl-region-body"

3 font-family="Times Roman"

4 font-size="10pt">

5

6 <fo:block text-align="center" space-after="8pt">

7 <fo:block font-size="16pt">

8 <fo:inline font-weight="bold">

9 Poems in various languages and scripts

10 </fo:inline>

11 </fo:block>

12 <fo:block font-size="14pt">

13 <fo:inline font-style="italic">

14 Collected by Michel Goossens</fo:inline>

15 </fo:block>

16 <fo:block font-size="14pt">

17 July 2000

18 </fo:block>

19 </fo:block>

20

21 <fo:block keep-with-next.within-page="always"

22 id="N115"

23 text-align="start"

24 font-size="14pt"

25 text-indent="-3em"

26 font-weight="bold"

27 space-after="3pt"

28 space-before.optimum="9pt">

29 1. Paul Verlaine, F\^etes galantes (1869)

30 </fo:block>

31

32 <fo:block keep-with-next.within-page="always"

33 id="N128"

34 text-align="start"

35 font-size="12pt"

36 font-weight="bold"

37 space-after="2pt"

38 space-before.optimum="4pt"

39 text-indent="-3em">

40 1.1. <fo:inline font-style="italic">

41 Clair de lune</fo:inline>

42 </fo:block>

43

44 <fo:block text-align="start"

45 space-before.optimum="4pt"

46 space-after.optimum="4pt">

47 <fo:block space-before.optimum="0pt"

48 space-after.optimum="0pt">

49 Votre \^ame est un paysage choisi

50 </fo:block>

51 ...

52 </fo:block>

53 ...

54 </fo flow>

At the beginning of the file (not shown) thevarious page masters are defined (margins, height,width, etc.), and the static page information (run-ning headers, footers) is initialized. Then, the con-struction of formatted output pages starts. We showwhat happens at the start of page 1 (compare with

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 225

Page 78: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michel Goossens and Sebastian Rahtz

1 <?xml version="1.0" en oding="UTF-8"?>

2 <div1 lang="FR">

3 <head>Paul Verlaine, Fêtes galantes (1869)</head>

4 <! +++++++++++++++++++++++++++++++++++++++++++++++++++++ >

5 <div2>

6 <head><hi rend="ital">Clair de lune</hi></head>

7 <! +++++++++++++++++++++++++++++++++++++++++++++++++++++ >

8 <lg type="stanza" org="uniform" sample=" omplete" part="N">

9 <l>Votre âme est un paysage hoisi</l>

10 <l>Que vont harmant masques et bergamasques,</l>

11 <l>Jouant du luth, et dansant, et quasi</l>

12 <l>Tristes sous leurs déguisements fantasques. </l>

13 </lg>

14 ...

15 </div2>

16 <! +++++++++++++++++++++++++++++++++++++++++++++++++++++ >

17 <div2>

18 <head><hi rend="ital">Les indolents</hi></head>

19 <lg type="stanza" org="uniform" sample=" omplete" part="N">

20 <l>Bah ! malgré les destins jaloux,</l>

21 <l>Mourons ensemble, voulez-vous ?</l>

22 <l>&dash; La proposition est rare.</l>

23 </lg>

24 ...

25 </div2>

26 <! +++++++++++++++++++++++++++++++++++++++++++++++++++++ >

27 <div2>

28 <head><hi rend="ital">Colloque sentimental</hi></head>

29 <lg type="stanza" org="uniform" sample=" omplete" part="N">

30 <l>Dans le vieux par solitaire et gla é,</l>

31 <l>Deux formes ont tout à l'heure passé.</l>

32 </lg>

33 <lg>

34 <l>Leurs yeux sont morts et leurs lèvres sont molles,</l>

35 <l>Et l'on entend à peine leurs paroles.</l>

36 </lg>

37 ...

38 </div2>

39 </div1>

1 <?xml version="1.0" en oding="UTF-8"?>

2 <div1 lang="RU">

3 <head>Àëåêñàíäð Áëîê, Ñòèõè î ïðåêðàñíîé äàìe (1901-1902)</head>

4 <! +++++++++++++++++++++++++++++++++++++++++++++++++++++ >

5 <div2>

6 <head>¾Îòäûõ íàïðàñåí. Äîðîãà êðóòà...¿ (28 äåêàáðÿ 1901)</head>

7 <lg type="stanza" org="uniform" sample=" omplete" part="M">

8 <l>Îòäûõ íàïðàñåí. Äîðîãà êðóòà.</l>

9 <l>Âå÷åð ïðåêðàñåí. Ñòó÷ó â âîðîòà.</l>

10 </lg><lg>

11 <l> Äîëüíåìó ñòóêó ÷óæäà è ñòðîãà,</l>

12 <l>Òû ðàññûïàåøü êðóãîì æåì÷óãà.</l>

13 </lg>

14 ...

15 </div2>

16 <! +++++++++++++++++++++++++++++++++++++++++++++++++++++ >

17 <div2>

18 <head>¾ß âûøåë. Ìåäëåííî ñõîäèëè...¿

19 (Ñ.-Ïåòåðáóðã, 25 ÿíâàðÿ 1901)</head>

20 <lg type="stanza" org="uniform" sample=" omplete" part="M">

21 <l>ß âûøåë. Ìåäëåííî ñõîäèëè</l>

22 <l>Íà çåìëþ ñóìåðêè çèìû.</l>

23 <l>Ìèíóâøèõ äíåé ìëàäûå áûëè</l>

24 <l>Ïðèøëè äîâåð÷èâî èç òüìû...</l>

25 </lg>

26 ...

27 </div2>

28 <! +++++++++++++++++++++++++++++++++++++++++++++++++++++ >

29 <div2>

30 <head>¾Âåòåð ïðèíåñ èçäàëêà...¿ (29 ÿíâàðÿ 1901)</head>

31 <lg type="stanza" org="uniform" sample=" omplete" part="M">

32 <l>Âåòåð ïðèíåñ èçäàëêà</l>

33 <l>Ïåñíè âåñåííåé íàìåê,</l>

34 <l>äå-òî ñâåòëî è ãëóáîêî</l>

35 <l>Íåáà îòêðûëñÿ êëî÷îê.</l>

36 </lg>

37 ...

38 </div2>

39 </div1>

Figure 1: Partial input source of French (left) and Russian (right) documents

the output shown in the upper left corner of Fig-ure 3). The fo:flow element contains the materialthat has to be typeset and cut into individual pagesby the typesetting engine. We see that the defaultdocument font is Times Roman at 10 pt.

Lines 6 to 19 typeset a block of centered mate-rial. In particular, lines 7–11 take care of the doc-ument title that is typeset in 16 point bold, lines12–15 correspond to the author’s name typeset in14 point italic, while lines 16–18 typeset the datein 14 point roman. All this information is obtainedfrom the content of the titlepage element of theXML master source file poemstei-utf8, shown pre-viously (lines 36–42).

The remaining text is in the external filesVerlainetei-utf8.xml (entity reference on line 46of poemstei-utf8, which contains the poems ofPaul Verlaine in French, a fragment of which is seenin the left half of Figure 1), and Bloktei-utf8.xml

(entity reference on line 47 of poemstei-utf8, whichcontains the poems of Alexander Blok in Russian, afragment of which is seen in the right half of Fig-ure 1).

The author and the title of the collection of po-ems (specified as the content of the head element ofa div1 element on line 3 in Figure 1) are handled

on lines 21 to 30 in the formatting objects output,where a block for the first level title is created. Notethat the section number (1. on line 29) is generatedby the XSLT application. Similarly, the title of anindividual poem (specified as the content of the headelement of a div2 element in Figure 1, e.g., on line6) is handled on lines 32 to 42. Once more, thenumber (1.1 on line 40) is generated automatically.Then, the stanza and the lines inside the stanza ofthe poem (the lg and l elements in Figure 1) aretreated. For instance, the stanza on lines 8–13 inFigure 1 corresponds to the block on lines 44–52 inthe formatting objects output, in particular the in-put line 8 becomes the block 47–50. More detailsabout the various XSL formatting objects and theirattributes can be found in the XSLT Recommenda-tion [24].

The second stage of the process (typesettingthe XSL formatting objects with LATEX) uses xmltexthat is called by running LATEX on the intermediatefile fotex.tex containing the following three lines:

1 \def\xmlfilefotex.xml

2 \input xmltex.tex

3 \enddocument

Line 1 specifies the file that has to be interpretedby xmltex, before it takes control on line 2. The

226 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

Page 79: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

PassiveTEX: from XML to PDF

result of treating the file poemstei-utf8.xml withthe two-step procedure outlined is shown in Fig-ure 2. Figure 3 shows, for comparison, the result oftypesetting the same XML source file directly withxmltex, where we had to define for each XML ele-ment and its attributes how it should be renderedby LATEX.

Besides PassiveTEX, FOP [2], originally devel-opped by James Tauber, and presently supported bythe Apache Project, is another application, writtenin Java, that transforms XSL formatting objects intoPDF. Because it uses Java, it is very portable, but itdoes not yet handle many aspects of fine typographyas well as TEX. Commercial products targeting thesame task of producing excellent typographic out-put from XSL formatting objects have also been an-nounced (RenderX, ArborText’s Epic), but are notyet available.

DocBook markup and some words about

mathematics

Up to now we have discussed a document markedup according to the Text Encoding Initiative (TEI)schema. In this section we show that other XML

markup schemes can also be used, in particular,DocBook [14] which we will combine with MathML[17], W3C’s XML DTD for mathematics.

DocBook is an XML (originally SGML) DTD

which is especially well-suited for marking up tech-nical documents. It is used extensively for preparingsoftware reference guides and computer equipmentmanuals.

The DocBook DTD or schema contains hun-dreds of elements to mark up clearly and explicitlythe different components of an electronic document(book, article, reference guide, etc.), not only dis-playing its hierarchical structure but also indicat-ing the semantic meaning of the various elements.The structure of the DTD is optimized to allow forcustomization, thus making it relatively straightfor-ward to add or eliminate certain elements or at-tributes, to change the content model for certainstructural groups, or to restrict the value that givenattributes can take.

An example of DocBook markup We are notgoing to cover the DocBook vocabulary in any detail(see Walsh’s book [14] or his DocBook Web page).We shall only consider an example where we usedthe DocBook markup schema. A file dbxmml.xml,whose first part is reproduced below, contains var-ious elements of the DocBook vocabulary. It willallow us to test the typesetting paradigm based onPassiveTEX outlined for the TEI schema previously.

1 <?xml version="1.0" encoding="ISO-8859-1"?>

2 <!DOCTYPE article SYSTEM

3 "/usr/local/share/docbookxml/4.11/docbookx.dtd"

4 [

5 <!ENTITY LaTeX "LaTeX">

6 <!ENTITY TeX "TeX">

7 <!ENTITY PTeX "PassiveTeX">

8 <!ENTITY xmltex

9 "<application>xmltex</application>">

10 <!ENTITY % equation.content "(math+)">

11 <!ENTITY % inlineequation.content "(math+)">

12 <!ENTITY % mathml

13 SYSTEM "mathmldtd/mathml2.dtd">

14 <!ATTLIST math xmlns CDATA #FIXED

15 "http://www.w3.org/1998/Math/MathML">

16 <!-- load MathML -->

17 %mathml;

18 ]>

19 <article>

20 <articleinfo>

21 <title>A Docbook document featuring a

22 few formulae</title>

23 <author><forename>Michel</forename>

24 <surname>Goossens</surname>

25 </author>

26 <pubdate>Wednesday, 18 July 2000</pubdate>

27 <abstract>

28 <para>

29 This XML document is marked up according the

30 DocBook schema It shows a few elements of the

31 DocBook vocabulary, as well as a couple of

32 examples of mathematical expressions where

33 we used MathML markup.

34 </para>

35 </abstract>

36 </articleinfo>

37 <section>

38 <title>The Docbook model</title>

39 <para>

40 DocBook <xref role="bib" linkend="docbook"

41 endterm="docbookab"/> is an XML model

42 <xref role="bib" linkend="rec-xml"

43 endterm="rec-xmlab"/> for marking up technical

44 documents. It is particularly well-suited for

45 software reference guides and computer

46 equipment manuals.

47 </para>

The DTD internal subset (lines 4–18) containthe general entity definitions of LaTeX, PassiveTeX,TeX, and xmltex (lines 5 to 9), and on lines10 and 11 parameter entity definitions specifyingthe content models for the equation.content andinlineequation.content elements, that can con-tain one or more math elements. Lines 12–13 definethe mathml parameter entity that defines the systemfile containing the MathML DTD, which is loaded online 17. Line 14 specifies the namespace of the mathelement. The remaining lines have markup usingthe DocBook vocabulary, and their meaning shouldbe rather straightforward to understand.

An example of MathML presentation markup[17] follows.

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 227

Page 80: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michel Goossens and Sebastian Rahtz

Col

lect

edby

Mic

helG

ooss

ens

òÅÑÌÉÚ×ÅÚÄÎÙÅÓÎÙ

.

òÏÂËÏ,ÔÅÍÎÏÉÇÌÕÂÏËÏ

ðÌÁËÁÌÉÓÔÒÕÎÙÍÏÉ

.÷ÅÔÅÒÐÒÉÎÅÓÉÚÄÁÌ£ËÁ

ú×ÕÞÎÙÅÐÅÓÎÉÔ×ÏÉ

.

3.

Fro

mA

Pair

Of

Blu

eE

yes,

by

Th

om

as

Hard

yE

lfrid

eS

wan

cour

tw

asa

girl

who

seem

otio

nsla

yve

ryne

arth

esu

rfac

e.T

heir

natu

rem

ore

prec

isel

y,an

das

mod

ified

byth

ecr

eepi

ngho

urs

oftim

e,w

askn

own

only

toth

ose

who

wat

ched

the

circ

umst

ance

sof

her

hist

ory.

Per

sona

lly,s

hew

asth

eco

mbi

natio

nof

very

inte

rest

-in

gpa

rtic

ular

s,w

hose

rarit

y,ho

wev

er,l

ayin

the

com

bi-

natio

nits

elfr

athe

rth

anin

the

indi

vidu

alel

emen

tsco

m-

bine

d.A

sa

mat

ter

offa

ct,y

oudi

dno

tsee

the

form

and

subs

tanc

eof

her

feat

ures

whe

nco

nver

sing

with

her;

and

this

char

min

gpo

wer

ofpr

even

ting

am

ater

ial

stud

yof

her

linea

men

tsby

anin

terlo

cuto

r,or

igin

ated

not

inth

ecl

oaki

ngef

fect

ofa

wel

l-for

med

man

ner(

forh

erm

anne

rw

asch

ildis

han

dsc

arce

lyfo

rmed

),bu

tin

the

attr

activ

ecr

uden

ess

ofth

ere

mar

ksth

emse

lves

.S

heha

dliv

edal

lhe

rlif

ein

retir

emen

t—th

emo

nst

rari

gig

ito

ofid

lem

enha

dno

tflat

tere

dhe

r,an

dat

the

age

ofni

nete

enor

twen

tysh

ew

asno

furt

her

onin

soci

alco

nsci

ousn

ess

than

anur

ban

youn

gla

dyof

fifte

en.

One

poin

tin

her,

how

ever

,yo

udi

dno

tice:

that

was

her

eyes

.In

them

was

seen

asu

blim

atio

nof

allo

fher

;it

was

notn

eces

sary

tolo

okfu

rthe

r:th

ere

she

lived

.T

hese

eyes

wer

ebl

ue;b

lue

asau

tum

ndi

stan

ce—

blue

asth

ebl

uew

ese

ebe

twee

nth

ere

trea

ting

mou

ldin

gsof

hills

and

woo

dysl

opes

ona

sunn

yS

epte

mbe

rm

orni

ng.

Am

isty

and

shad

ybl

ue,

that

had

nobe

ginn

ing

orsu

r-fa

ce,a

ndw

aslo

okedi

nto

rath

erth

ana

t.

4.

Fro

mA

lek

sis

Kiv

i’s

pla

yK

ihla

us

EE

NO

KK

IV

aiH

erro

jen-

Eev

an.T

ulik

om

ies

juon

ikka

aksi

,hu

rjapà

isek

si,

villi

tyks

i,ta

im

istà

kiep

pasi

hàn

tàm

ànro

hkeu

den?

JOO

SE

PP

IP

reiv

inki

rjoitt

iH

erro

jen-

Eev

atà

llàta

valla

mes

taril

leni

eile

nill

alla

:“K

raat

ari

Aap

eli!

Lyhy

esti

tahd

ontie

tàan

taa,

ettà

,jo

sJu

mal

ani

inon

salli

nut,

niin

valm

isol

enko

hta

tule

maa

nav

iopu

olis

okse

nne.

Tul

kaat

min

uaky

yditt

àmàà

ntà

àltà

luok

senn

e;si

llàhe

rrat

jàtà

nm

inà

tàm

ànija

nkai

kkis

enpi

lkun

pààl

là.

Sen

olen

nyt

vahv

asti

tykâ

nàni

pààt

tàny

t.”N

iinse

isoi

prei

viss

à.

EE

NO

KK

IJa

mes

taris

tàm

ànlu

ettu

ansa

rupe

situ

umai

le-

maa

nan

kara

sti?

JOO

SE

PP

IP

aste

erai

li,pa

stee

raili

edes

taka

isin

perm

an-

nolla

,raa

ppie

nni

skat

ukka

ansa

.

EE

NO

KK

IK

ihel

iâits

ipà

mie

hen

pààs

sà;

mut

tasi

tàen

ihm

ette

le.

—M

illà

tava

llalu

onni

stui

asia

?

JOO

SE

PP

IY

âllà

pàva

sta

leik

kino

usi.

Kov

inle

voto

nol

imes

tarin

i.M

illoi

npa

stee

raili

hàn,

mill

oin

heitt

ihàn

itsen

sàta

asen

vuot

eelle

,m

utta

sam

assa

pyâr

àhti

hàn

ylâs

jàlle

enja

rupe

siuu

dest

aan

past

eera

ilem

aan

raap

-pi

enai

nani

skaa

nsa.

Kol

me

kert

aakà

vihà

nva

lele

mas

sapà

àtàn

sàka

ivol

la.

Hàn

pelk

àsia

ivoa

nsa,

nàet

te.

EE

NO

KK

IE

ikà

ihm

e;si

llàon

pasi

tàpe

hmite

tty.

Tu-

umai

leja

hark

itse,

hark

itse

jatu

umai

lejo

kauu

sim

uudi

,le

ikka

usja

saum

a,ni

inky

sytà

ànpà

viim

ein

kuin

kaon

pààv

àrki

nla

ita.

—M

utta

mie

linpà

kuul

laku

inka

kàvi

lopu

lta.

2

Lit

era

ture

invari

ou

sla

ngu

ages

an

dsc

rip

tsC

oll

ecte

dby

Mic

hel

Gooss

ens

July

2000

1.

Pau

lV

erla

ine,

Fêt

esgala

nte

s

(1869)

1.1

.C

lair

de

lun

e

Votr

eâm

ees

tun

pays

age

choi

siQ

uevo

ntch

arm

antm

asqu

eset

berg

amas

ques

,Jo

uant

dulu

th,e

tdan

sant

,etq

uasi

Tris

tes

sous

leur

sdé

guis

emen

tsfa

ntas

ques

.

Tout

ench

anta

ntsu

rle

mod

em

ineu

rL’

amou

rva

inqu

eure

tla

vie

oppo

rtun

e,Ils

n’on

tpas

l’air

decr

oire

àle

urbo

nheu

rE

tleu

rch

anso

nse

mêl

eau

clai

rde

lune

,

Au

calm

ecl

air

delu

netr

iste

etbe

au,

Qui

fait

rêve

rle

soi

seau

xda

nsle

sar

bres

Ets

angl

oter

d’ex

tase

les

jets

d’ea

u,Le

sgr

ands

jets

d’ea

usv

elte

spa

rmil

esm

arbr

es.

1.2

.L

esin

dole

nts

Bah

!m

algr

éle

sde

stin

sja

loux

,M

ouro

nsen

sem

ble,

voul

ez-v

ous

?-

Lapr

opos

ition

estr

are.

-Le

rare

estb

on.

Don

cm

ouro

nsC

omm

eda

nsle

sD

écam

éron

s.-

Hi!

Hi!

Hi!

quel

aman

tbiz

arre

!

-B

izar

re,j

ene

sais

.A

man

tIr

répr

ocha

ble,

assu

rém

ent.

Siv

ous

voul

ez,m

ouro

nsen

sem

ble

?

-M

onsi

eur,

vous

raill

ezm

ieux

enco

rQ

uevo

usn’

aim

ez,e

tpar

lez

d’or

;M

ais

tais

ons-

nous

,sib

onvo

usse

mbl

e!

»

Sib

ien

que

ceso

ir-là

Tirc

isE

tDor

imèn

e,à

deux

assi

sN

onlo

inde

deux

sylv

ains

hila

res,

Eur

entl

’inex

piab

leto

rtD

’ajo

urne

rune

exqu

ise

mor

t.H

i!hi

!hi

!le

sam

ants

biza

rres

!

2.áÌÅË

ÓÁÎÄÒâÌÏË

,óÔÉÈÉÏ

ÐÒÅË

ÒÁÓÎ

ÏÊÄÁÍ

e(1

901-1

902)

2.1

.«ïÔÄÙÈÎÁÐÒÁÓÅ

Î.äÏÒÏÇÁ

ËÒÕÔÁ

...»

(28ÄÅË

ÁÂÒÑ

1901)

ïÔÄÙÈÎÁÐÒÁÓÅÎ

.äÏÒÏÇÁËÒÕÔÁ.

÷ÅÞÅÒÐÒÅËÒÁÓÅÎ

.óÔÕÞÕ××ÏÒÏÔÁ.

äÏÌØÎÅÍÕÓÔÕËÕÞÕÖÄÁÉÓÔÒÏÇÁ

,ôÙÒÁÓÓÙÐÁÅÛØËÒÕÇÏÍÖÅÍÞÕÇÁ

.

ôÅÒÅÍ×ÙÓÏË,ÉÚÁÒÑÚÁÍÅÒÌÁ.

ëÒÁÓÎÁÑÔÁÊÎÁÕ×ÈÏÄÁÌÅÇÌÁ.

ëÔÏÐÏÄÖÉÇÁÌÎÁÚÁÒÅÔÅÒÅÍÁ,

þÔÏ×ÏÚÄ×ÉÇÁÌÁãÁÒÅ×ÎÁóÁÍÁ?

ëÁÖÄÙÊËÏÎÅËÎÁÕÚÏÒÎÏÊÒÅÚØÂÅ

ëÒÁÓÎÏÅÐÌÁÍÑÂÒÏÓÁÅÔËÔÅÂÅ.

ëÕÐÏÌÓÔÒÅÍÉÔÓÑ×ÌÁÚÕÒÎÕÀ×ÙÓØ

.óÉÎÉÅÏËÎÁÒÕÍÑÎÃÅÍÚÁÖÇÌÉÓØ

.

÷ÓÅËÏÌÏËÏÌØÎÙÅÚ×ÏÎÙÇÕÄÑÔ.

úÁÌÉÔ×ÅÓÎÏÊÂÅÚÚÁËÁÔÎÙÊÎÁÒÑÄ.

ôÙÌÉÍÅÎÑÎÁÚÁËÁÔÁÈÖÄÁÌÁ?

ôÅÒÅÍÚÁÖÇÌÁ?÷ÏÒÏÔÁÏÔÐÅÒÌÁ?

2.2

.«ñ

×ÙÛÅÌ

ÅÄÌÅÎ

ÎÏÓÈ

ÏÄÉÌÉ

...»

(ó.-ð

ÅÔÅÒ

ÂÕÒÇ,

25ÑÎ×ÁÒÑ

1901)

ñ×ÙÛÅÌ

.íÅÄÌÅÎÎÏÓÈÏÄÉÌÉ

îÁÚÅÍÌÀÓÕÍÅÒËÉÚÉÍÙ

.íÉÎÕ×ÛÉÈÄÎÅÊÍÌÁÄÙÅÂÙÌÉ

ðÒÉÛÌÉÄÏ×ÅÒÞÉ×ÏÉÚÔØÍÙ

...

ðÒÉÛÌÉÉ×ÓÔÁÌÉÚÁÐÌÅÞÁÍÉ

,éÐÅÌÉÓ×ÅÔÒÏÍÏ×ÅÓÎÅ.

..éÔÉÈÉÍÉÑÛÅÌÛÁÇÁÍÉ

,ðÒÏ×ÉÄÑ×ÅÞÎÏÓÔØ×ÇÌÕÂÉÎÅ.

ï,ÌÕÞÛÉÈÄÎÅÊÖÉ×ÙÅÂÙÌÉ

!ðÏÄ×ÁÛÕÐÅÓÎØÉÚÇÌÕÂÉÎÙ

îÁÚÅÍÌÀÓÕÍÅÒËÉÓÈÏÄÉÌÉ

é×ÅÞÎÏÓÔÉ×ÓÔÁ×ÁÌÉÓÎÙ

!..

2.3

.«÷ÅÔ

ÅÒÐÒÉÎÅÓ

ÉÚÄ

ÁÌ£Ë

Á...»

(29ÑÎ×ÁÒÑ

1901)

÷ÅÔÅÒÐÒÉÎÅÓÉÚÄÁÌ£ËÁ

ðÅÓÎÉ×ÅÓÅÎÎÅÊÎÁÍÅË

,çÄÅ-ÔÏÓ×ÅÔÌÏÉÇÌÕÂÏËÏ

îÅÂÁÏÔËÒÙÌÓÑËÌÏÞÏË.

÷ÜÔÏÊÂÅÚÄÏÎÎÏÊÌÁÚÕÒÉ

,÷ÓÕÍÅÒËÁÈÂÌÉÚËÏÊ×ÅÓÎÙ

ðÌÁËÁÌÉÚÉÍÎÉÅÂÕÒÉ

,

1

Figure 2: Typesetting a collection of literature marked up according to the TEI, using XSL formattingobjects

228 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

Page 81: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

PassiveTEX: from XML to PDF

Literature in various languages and s ripts

Colle ted by Mi hel Goossens

July 2000

1 Paul Verlaine, Fêtes galantes (1869)

1.1 Clair de lune

Votre âme est un paysage hoisi

Que vont harmant masques et bergamasques,

Jouant du luth, et dansant, et quasi

Tristes sous leurs déguisements fantasques.

Tout en hantant sur le mode mineur

L'amour vainqueur et la vie opportune,

Ils n'ont pas l'air de roire à leur bonheur

Et leur hanson se mêle au lair de lune,

Au alme lair de lune triste et beau,

Qui fait rêver les oiseaux dans les arbres

Et sangloter d'extase les jets d'eau,

Les grands jets d'eau sveltes parmi les marbres.

1.2 Les indolents

Bah ! malgré les destins jaloux,

Mourons ensemble, voulez-vous ?

La proposition est rare.

Le rare est bon. Don mourons

Comme dans les Dé amérons.

Hi ! Hi ! Hi ! quel amant bizarre !

Bizarre, je ne sais. Amant

Irrépro hable, assurément.

Si vous voulez, mourons ensemble ?

Monsieur, vous raillez mieux en or

Que vous n'aimez, et parlez d'or ;

Mais taisons-nous, si bon vous semble !

Si bien que e soir-là Tir is

Et Dorimène, à deux assis

Non loin de deux sylvains hilares,

Eurent l'inexpiable tort

D'ajourner une exquise mort.

Hi ! hi ! hi ! les amants bizarres !

1

2 Àëåêñàíäð Áëîê, Ñòèõè î ïðåêðàñíîé äàìe (1901-1902)

2.1 ¾Îòäûõ íàïðàñåí. Äîðîãà êðóòà...¿ (28 äåêàáðÿ 1901)

Îòäûõ íàïðàñåí. Äîðîãà êðóòà.

Âå÷åð ïðåêðàñåí. Ñòó÷ó â âîðîòà.

Äîëüíåìó ñòóêó ÷óæäà è ñòðîãà,

Òû ðàññûïàåøü êðóãîì æåì÷óãà.

Òåðåì âûñîê, è çàðÿ çàìåðëà.

Êðàñíàÿ òàéíà ó âõîäà ëåãëà.

Êòî ïîäæèãàë íà çàðå òåðåìà,

×òî âîçäâèãàëà Öàðåâíà Ñàìà?

Êàæäûé êîíåê íà óçîðíîé ðåçüáå

Êðàñíîå ïëàìÿ áðîñàåò ê òåáå.

Êóïîë ñòðåìèòñÿ â ëàçóðíóþ âûñü.

Ñèíèå îêíà ðóìÿíöåì çàæãëèñü.

Âñå êîëîêîëüíûå çâîíû ãóäÿò.

Çàëèò âåñíîé áåççàêàòíûé íàðÿä.

Òû ëè ìåíÿ íà çàêàòàõ æäàëà?

Òåðåì çàæãëà? Âîðîòà îòïåðëà?

2.2 ¾ß âûøåë. Ìåäëåííî ñõîäèëè...¿ (Ñ.-Ïåòåðáóðã, 25 ÿíâàðÿ 1901)

ß âûøåë. Ìåäëåííî ñõîäèëè

Íà çåìëþ ñóìåðêè çèìû.

Ìèíóâøèõ äíåé ìëàäûå áûëè

Ïðèøëè äîâåð÷èâî èç òüìû...

Ïðèøëè è âñòàëè çà ïëå÷àìè,

È ïåëè ñ âåòðîì î âåñíå...

È òèõèìè ÿ øåë øàãàìè,

Ïðîâèäÿ âå÷íîñòü â ãëóáèíå.

Î, ëó÷øèõ äíåé æèâûå áûëè!

Ïîä âàøó ïåñíü èç ãëóáèíû

Íà çåìëþ ñóìåðêè ñõîäèëè

È âå÷íîñòè âñòàâàëè ñíû!..

2.3 ¾Âåòåð ïðèíåñ èçäàëêà...¿ (29 ÿíâàðÿ 1901)

Âåòåð ïðèíåñ èçäàëêà

Ïåñíè âåñåííåé íàìåê,

äå-òî ñâåòëî è ãëóáîêî

Íåáà îòêðûëñÿ êëî÷îê.

 ¹òîé áåçäîííîé ëàçóðè,

 ñóìåðêàõ áëèçêîé âåñíû

Ïëàêàëè çèìíèå áóðè,

åÿëè çâåçäíûå ñíû.

îáêî, òåìíî è ãëóáîêî

Ïëàêàëè ñòðóíû ìîè.

Âåòåð ïðèíåñ èçäàëêà

Çâó÷íûå ïåñíè òâîè.

2

3 From A Pair Of Blue Eyes, by Thomas Hardy

Elfride Swan ourt was a girl whose emotions lay very near the surfa e. Their nature morepre isely, and as modied by the reeping hours of time, was known only to those who wat hedthe ir umstan es of her history.

Personally, she was the ombination of very interesting parti ulars, whose rarity, however, layin the ombination itself rather than in the individual elements ombined. As a matter of fa t, youdid not see the form and substan e of her features when onversing with her; and this harmingpower of preventing a material study of her lineaments by an interlo utor, originated not in the loaking ee t of a well-formed manner (for her manner was hildish and s ar ely formed), but inthe attra tive rudeness of the remarks themselves. She had lived all her life in retirementthemonstrari gigito of idle men had not attered her, and at the age of nineteen or twenty she wasno further on in so ial ons iousness than an urban young lady of fteen.

One point in her, however, you did noti e: that was her eyes. In them was seen a sublimationof all of her; it was not ne essary to look further: there she lived.

These eyes were blue; blue as autumn distan eblue as the blue we see between the retreatingmouldings of hills and woody slopes on a sunny September morning. A misty and shady blue,that had no beginning or surfa e, and was looked into rather than at.

4 From Aleksis Kivi's play Kihlaus

EENOKKI Vai Herrojen-Eevan. Tuliko mies juonikkaaksi, hurjapàiseksi, villityksi, tai mistàkieppasi hàn tàmàn rohkeuden?

JOOSEPPI Preivin kirjoitti Herrojen-Eeva tàllà tavalla mestarilleni eilen illalla: Kraatari Aapeli!Lyhyesti tahdon tietà antaa, ettà, jos Jumala niin on sallinut, niin valmis olen kohta tule-maan aviopuolisoksenne. Tulkaat minua kyydittàmààn tààltà luoksenne; sillà herrat jàtànminà tàmàn ijankaikkisen pilkun pààllà. Sen olen nyt vahvasti tykânàni pààttànyt. Niinseisoi preivissà.

EENOKKI Ja mestaris tàmàn luettuansa rupesi tuumailemaan ankarasti?

JOOSEPPI Pasteeraili, pasteeraili edestakaisin permannolla, raappien niskatukkaansa.

EENOKKI Kiheliâitsipà miehen pààssà; mutta sità en ihmettele. Millà tavalla luonnistuiasia?

JOOSEPPI Yâllàpà vasta leikki nousi. Kovin levoton oli mestarini. Milloin pasteeraili hàn,milloin heitti hàn itsensà taasen vuoteelle, mutta samassa pyâràhti hàn ylâs jàlleen ja rupesiuudestaan pasteerailemaan raappien aina niskaansa. Kolme kertaa kàvi hàn valelemassapààtànsà kaivolla. Hàn pelkàsi aivoansa, nàette.

EENOKKI Eikà ihme; sillà onpa sità pehmitetty. Tuumaile ja harkitse, harkitse ja tuumailejoka uusi muudi, leikkaus ja sauma, niin kysytàànpà viimein kuinka on pààvàrkin laita. Mutta mielinpà kuulla kuinka kàvi lopulta.

3

Figure 3: Typesetting a collection of literature marked up according to the TEI, using xmltex

1 <section>

2 <title>A MathML example</title>

3 <para>

4 A MathML formula can be typeset inline, as here

5 <inlineequation>

6 <math><mi>E</mi><mo>=</mo><mi>m</mi>

7 <msup><mi>c</mi><mn>2</mn></msup></math>

8 </inlineequation>, Einstein’s famous equation.

9 </para>

10

11 <para>

12 A mathematical equation can also be typeset in

13 display mode using DocBook’s

14 <sgmltag class="element">informalequation</sgmltag>

15 element, as is shown in the following example

16 containing a matrix:

17 </para>

18

19 <informalequation>

20 <math>

21 <mrow>

22 <mi>A</mi>

23 <mo>=</mo>

24 <mfenced open="[" close="]">

25 <mtable><!-- table or matrix -->

26 <mtr> <!-- row in a table -->

27 <mtd><mi>x</mi></mtd><!-- table -->

28 <mtd><mi>y</mi></mtd><!-- entry -->

29 </mtr>

30 <mtr>

31 <mtd><mi>z</mi></mtd>

32 <mtd><mi>w</mi></mtd>

33 </mtr>

34 </mtable>

35 </mfenced>

36 </mrow>

37 <mtext>.</mtext>

38 </math>

39 </informalequation>

On lines 5–8 we use the inlineequation ele-ment, which contains a mathematical equation tobe displayed inline, whereas line 19 to 39 show aninformalequation element, that contains mathe-matical material (a matrix equation) to be type-set in display mode. The typeset result (with Pas-siveTEX, see below) is shown following the headingA MathML example in the lower left hand image ofFigure 4.

The DocBook example and PassiveTEX Weuse the same two-step procedure (transform theXML file into XSL formatting objects and then type-set with PassiveTEX as outlined previously in thecontext of the TEI) here with DocBook. For thetransformation of the XML DocBook markup intoXSL formatting objects we use XSL stylesheets de-veloped by Norman Walsh [15]. We customized thestylesheet somewhat to handle the mathematics andadd templates for a few elements. The customizedstylesheet foplus.xsl follows.

1 <?xml version=’1.0’?>

2 <xsl:stylesheet

3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 229

Page 82: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michel Goossens and Sebastian Rahtz

4 version="1.0"

5 xmlns:fo="http://www.w3.org/1999/XSL/Format"

6 xmlns:m="http://www.w3.org/1998/Math/MathML">

7

8 <xsl:import

9 href="/usr/local/share/xsl/1.15/docbook.xsl"/>

10

11 <!-- ******************************************

12 customisations of Norm’s XSL FO stylesheets

13 ***************************************** -->

14

15 <xsl:template match="m:math">

16 <xsl:copy>

17 <xsl:apply-templates mode="math"/>

18 </xsl:copy>

19 </xsl:template>

20

21 <xsl:template mode="math"

22 match="* | @* | comment() |

23 processing-instruction()|text()">

24 <xsl:copy>

25 <xsl:apply-templates mode="math"

26 select="* | @* |

27 processing-instruction() | text()"/>

28 </xsl:copy>

29 </xsl:template>

30

31 <xsl:template

32 match="informalequation|inlineequation">

33 <xsl:element name="name(.)">

34 <xsl:apply-templates/>

35 </xsl:element>

36 </xsl:template>

37

38 <xsl:template match="programlisting" priority="4">

39 <fo:block wrap-option="no-wrap"

40 whitespace-treatment="preserve"

41 font-family="monospace"

42 font-size="9pt"

43 space-before.optimum="4pt"

44 space-after.optimum="4pt"

45 text-align="start"

46 >

47 <xsl:apply-templates/>

48 </fo:block>

49 </xsl:template>

50

51 </xsl:stylesheet>

Lines 3, 5 and 6 define the prefixes of the variousnamespaces referenced: XSLT instructions (xsl),XSL formatting objects (fo), and MathML elements(m), respectively. On lines 8–9 we import Nor-man Walsh’s XSL stylesheet docbook.xsl, which ispart of his DocBook distribution. It transforms ele-ments in the DocBook namespace into XSL format-ting objects. The xsl:import XSL element mustbe placed at the beginning of the stylesheet if tem-plate definitions further down in the stylesheet areto take precedence over those defined in the im-ported stylesheet docbook.xsl. Lines 31 to 36specify that the elements informalequation andinlineequation themselves and their contents areto be copied through. Similarly (lines 21–29), the

MathML element m:math and the whole tree struc-ture it supports have to be copied unchanged to theresult tree. This means that the MathML elementsmust be dealt with by the application that interpretsthe XSL formatting objects (in our case PassiveTEXand xmltex). Finally, lines 38 to 49 show how we de-fine the characteristics of the programlisting ele-ment that is used to represent verbatim material andis to be typeset as-is (similar to LATEX’s verbatimenvironnement).

The two-step procedure to typeset the XML

source file dbxmml.xml uses the following com-mands:

xt dbxmml.xml foplus.xsl fotex.xml

latex fotex.tex

The first line transforms the DocBook markup intoXSL formatting objects, that are then handled (aswell as passed through MathML markup) by Pas-siveTEX (and xmltex) referenced on the second line.Figure 4 shows the result of typesetting the completeDocBook example document with PassiveTEX.

XML and PassiveTEX at the heart of the

Internet

Different ways of using an XML document in thecontext of an electronic document repository areshown in Figure 5. At the top right we represent theXML document with its defining vocabulary (DTD

or XML Schema [18], [19] and [20]). This docu-ment, which is encoded in Unicode, can be viewed,searched, indexed, edited, validated without prob-lems by any of a series of XML-aware applicationsanywhere on the Internet. The XML document canbe typeset using TEX or its Unicode-aware variantOmega [8]. Three methods are shown: (A) uses di-rect interpretation by xmltex, an example of whichwas shown in Figure 2, (B) uses XSL formatting ob-jects and PassiveTEX, as described in the presentarticle, (C) transforms the XML source into a LATEXfile. This procedure was used for typesetting thepresent article so that the resulting LATEX documentcould be included in proceedings of TUG 2000 Con-ference.

Alternatively the XML source can be trans-formed into HTML for viewing with present-daybrowsers (X2H via XSLT, see [7] for a detaileddiscussion). In the (near) future, once browserscan handle XML directly, we can probably skipthe HTML intermediate format and let CSS [16](possibly via XSLT) style the XML file directly fordisplay on the Web. Figure 5 also contains ar-rows going from left (TEX) to right (XML/HTML,

230 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

Page 83: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

PassiveTEX: from XML to PDF

A Docbook document featuring a few formulaeMichel GoossensWednesday, 18 July 2000

Abstract

This XML document is marked up according the the DocBook schema It shows a few elements of the DocBookvocabulary, as well as a couple of examples of mathematical expressions where we used MathML markup.

The Docbook model

DocBook ??? proposes an XML model ??? for marking up technical documents. It is particularly well-suited forsoftware reference guides and computer equipment manuals.

Docbook contains hundreds of elements to markup up clearly and explicitly the different components of anelectronic document (book, article, reference guide, etc.), not only displaying its hierarchical structure but alsoindicating the semantical meaning of the various elements. The structure of the DTD is optimized to allow forcustomization, thus making it relatively straightforward to add or eliminate certain elements or attributes, tochange the content model for certain structural groups, or to restrict the value that given attributes can take.

Norman Walsh developed a set of XSL stylesheets to transform XML documents marked up using the DocBookDTD into HTML or XSL formatting objects. The latter can be interpreted by PassiveTeX and xmltex to obtainPDF or PostScript output.

MathML and mathematics

MathML ??? is a W3C recommendation whose aim is to encode mathematical material for teaching andscientific communication at all levels.

MathML consists of two parts: presentation (notation) et contents (meaning). MathML permits the conversionof mathematical information into various representations and output formats, including graphical displays,speech synthesizers, computer algebra programs, other mathematics typesetting languages, such as TeX, plaintext, printers (PostScript), braille, etc.

MathML has support for efficiently browsing long and complex mathematical expressoins and offers anextension mechanism. MathML code is human readable, easy to generate and process by software applications,and well suited for editing (even though MathML syntax might appear unnecessarily verbose and complex to thehuman reader).

The W3C MathMl Working Group is actively preparing the second version of the MathML Specification, whichis planned to be released in the second half of 2000. Two public initiatives that allow the display of MathMLcode direcly and that are under active development are W3C’s Amaya and Mozilla. Commercial programs, suchas IBM’s techexplorer (a plugin for Netscape or Microsoft’s Internet Explorer) or Design Science Webeq (usingthe Java applet technology) can display MathML formulae in present day browsers. Several computer algebraprograms, e.g., Mathematica, or editors using e.g., mathtype, offer a user-friendly interface to enter, produce orread mathematics material marked up in MathML.

Presentation markup

Thepresentation part of MathML discribes the spacial layout of the different elements of a mathematicalexpression. MathML presenation markup has about thirty elements, that form the basis of a mathematical syntaxusing classical visual layout model. Some fifty attributes provide precise control on the exact positioning of thevarious components of the math expression.

List of presentation elements

• Token elements

mi identifier

mn numbermo operator, fence, separator

mtext text

mspace/ space

ms string literal

mchar non-Ascii character referencemglyph add new glyph to MathML

• General layout schemata

mrow group any number of sub-expressions horizontally

mfrac form a fraction from two sub-expressions

msqrt form a square root sign (radical without an index)mroot form a radical with specified index

mstyle style change

merror enclose a syntax error message from a preprocessor

mpadded adjust space around contentmphantom make content invisible but preserve its size

mfenced surround content with a pair of fences

menclose enclose content with a stretching symbol such as a long division sign

• Script and limit schemata

msub attach a subscript to a base

msup attach a superscript to a basemsubsup attach a subscript-superscript pair to a base

munder attach an underscript to a base

mover attach an overscript to a base

munderover attach an underscript-overscript pair to a basemmultiscripts attach prescripts and tensor indices to a base

• Tables and matrices

mtable row in a table or matrix with a label or equation number

mtr row in a table or matrix

mtd one entry in a table or matrix

maligngroup/ andmalignmark/ alignment markers

• Enlivening expressions

maction bind actions to a sub-expression

A MathML example

A MathML formula can be typeset inline, as hereE = m 2 , Einstein’s famous equation.

A mathematical equation can also be typeset in display mode using DocBook’sinformalequation

element, as is shown in the following example containing a matrix:

A =

x y

z w

.

Note the two attributes open and close on themfenced element to specify the style of the braces to be used.The MathML Specification ??? contains a detailed list of all possible attributes associated to each presentationelement.

Content markup

The meaning of mathematical symbols (e.g., sums, products, integrals) exists independently of their rendering.Moreover the presentation markup of an expression is not necessarily sufficient to evaluate its value and use it incalculations. Therefore, MathML definescontent markup to explicitly encode the underlying mathematicalstructure of an expressoin.

It is impossible to cover all of mathematics, so MathML proposes only a relatively small number ofcommonplace mathematical constructs, chosen carefully to be sufficient in a large number of applications. Inaddition, it provides aextension mechanism for associating semantics with new notational constructs, thusallowing these to be encoded even when they are not in MathML content element base collection.

MathML’s basic set of content elements was chosen to allow for simple coding of most of the formulas used insecondary education, through the first year of university. The subject areas targeted are arithmetic, algebra, logicand relations, calculus and vector calculus, set theory, sequences and series, elementary classical functions, andstatistics linear algebra. Using this basic sets more complex constructs can be built.

The list of the content elements of MathML follows.

token elements cn, ci, csymbol (MathML 2.0).

basic content elements apply, reln (deprecated), fn (deprecated for externally

defined functions), interval, inverse, sep, condition,declare, lambda, compose, ident.

arithmetic, algebra and logicquotient, exp, factorial, divide, max and min, minus, plus,power, rem, times, root, gcd, and, or, xor, not, implies, forall,exists, abs, conjugate, arg (MathML 2.0), real (MathML 2.0),imaginary (MathML 2.0),lcm (MathML 2.0).

relations eq,neq,gt,lt, geq,leq,equivalent (MathML 2.0),approx (MathML2.0).

calculus and vector calculus int, diff, partialdiff, lowlimit, uplimit, bvar, degree,divergence (MathML 2.0), grad (MathML 2.0), curl (MathML 2.0),laplacian (MathML 2.0).

theory of sets set, list, union, intersect, in, notin, subset, prsubset,notsubset, notprsubset, setdiff, card (MathML 2.0).

sequences and series sum, product, limit, tendsto.

elementary classical functionexp, ln, log, sin, cos, tan, sec, csc, cot, sinh, cosh, tanh, sech,csch, coth, arcsin, arccos, arctan, arccosh, arccot, arccoth,arccsc, arccsch, arcsec, arcsech, arcsinh, arctanh.

statistics mean, sdev, variance, median, mode, moment.

linear algebra vector,matrix,matrixrow,determinant,transpose,selector,vectorproduct (MathML 2.0), scalarproduct (MathML 2.0),outerproduct (MathML 2.0).

semantic mapping element annotation, semantics, annotation-xml.

constant and symbol element (all MathML 2.0)integers, reals, rationals, naturalnumbers,complexes, primes, exponentiale, imaginaryi, notanumber,true, false, emptyset, pi, eulergamma, infinity.

The matrix example given in the preceding section in its presentation markup form if recoded here using contentmarkup.

<reln>

<eq/>

<ci>A</ci>

<matrix>

<matrixrow>

<ci>x</ci><ci>y</ci>

</matrixrow>

<matrixrow>

<ci>z</ci><ci>w</ci>

</matrixrow>

</matrix>

</reln>

Bibliographic references

[XML98] World Wide Web Consortium, Tim Bray, Jean Paoli, and Michael Sperberg-McQueen.Extensible Markup Language (XML) 1.0 [http://www.w3.org/TR/REC-xml/]. See also theannotated version of the XML specification [http://www.xml.com/axml/axml.html]..

[WALSH99] Norman Walsh and Leonard Muelner.Docbook. The Definitive Guide.. O’Reilly & Associates,Inc.. Copyright © 1999. 1-56592-580-7. You can also consult theonline version of the DocBook reference guide [http://www.oasis-open.org/docbook/.html] and download theDocbook DTD and XSL stylesheets [http://nwalsh.com/docbook/index.html]..

[MATHML99] World Wide Web Consortium, Patrick Ion, and Robert Miner.Mathematical Markup Language (MathML[tm]) 1.01 Specification [http://www.w3.org/TR/REC-MathML/]. .

Figure 4: Typeset result of an article marked up according to the DocBook schema

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 231

Page 84: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michel Goossens and Sebastian Rahtz

FOs

books

multimedia

audio-video

Web

Internet

printers browsers

LaTeX

TeX

DVI

PS PDF

CSS

DV

IPS

DV

IPD

F

DTD

XMLXSL

CSS

X2L (via XSL)

DSSSL

X2F (via XSL)

JadeTeX

(X)HTML

macros, styles

X2H (Jade)

X2F (Jade)

L2H (LaTeX2HTML, TeX4ht)

FO

P

xmltex (direct interpretation)

pdfT

eX

PassiveTeX

(xmltex)A) C) B)

direct visualization (techexplorer, WebE

Q)

X2H

(vi

a X

SL)

otherprograms

MSW

FM, WP

Figure 5: XML as the central part of a document strategy for the Web

232 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

Page 85: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

PassiveTEX: from XML to PDF

browsers). They indicate programs to transform ex-isting LATEX source documents into XML (using oneor more standard DTDs) to store the information forarchiving purposes. The vertical ellipse in the cen-tre represents other editing tools, such as Adobe’sFrameMaker [1] and Corel’s WordPerfect [6], thatallow or are expected to allow import/export ofXML documents. Thus, XML genuinely becomesthe central element in a global strategy for man-aging electronic documents by allowing informationto be stored, saved, shared, and used by differentapplications on all computer platforms. PassiveTEXcan be truly considered as a much-needed comple-ment to XML for bringing typographic excellence tothe Web, just as Knuth with TEX introduced thesame excellence to the emerging electronic printingindustry a generation ago.

References

[1] Adobe. FrameMaker 6.0. http://www.adobe.com/products/framemaker.

[2] Apache XML Project. FOP, XSL FormattingObject Processor in Java. http://xml.apache.org/fop/

[3] Lou Burnard and C.M. Sperberg-McQueen.TEI Guidelines for Electronic Text Encodingand Interchange. http://etext.lib.virginia.edu/tei.html

[4] David Carlisle. xmltex A non validating(and not 100% conforming) namespace awareXML parser implemented in TEX. Can bedownloaded from CTAN in the directorymacros/xmltex/.

[5] James Clark. xt, an implementation inJava of XSL Transformations. http://www.jclark.com/xml/xt.html

[6] Corel. WordPerfect Office 2000. http://www.corel.com/Office2000 (MicrosoftWindows) and http://linux.corel.com/

products/wpo2000_linux (Linux).

[7] Michel Goossens and Sebastian Rahtz. TheLATEX Web Companion. Addison-Wesley,Reading, 1999.

[8] Yannis Haralambous and John Plaice. Thelatest developments in Omega. TUGBoat,17 (2), pages 181-183, June 1996. (See alsohttp://www.gutenberg.eu.org/omega/).

[9] John Hobby. A user’s manual for MetaPost.Computer Science Technical Report 162,AT&T Bell Laboratories, 1992.

[10] International Organization forStandardization. InformationTechnology—ProcessingLanguages—Document Style Semanticsand Specification Language (DSSSL). Firstedition, 1996 International Standard ISO/IEC10179:1996.

[11] Sebastian Rahtz. Passive TEX http:

//users.ox.ac.uk/~rahtz/passivetex/

[12] Sebastian Rahtz. XSL stylesheets for TEI

XML. http://users.ox.ac.uk/~rahtz/tei/

[13] The Unicode Consortium. The UnicodeStandard, Version 3.0. Addison-Wesley,Reading, 2000.

[14] Norman Walsh and Leonard Muelner.DocBook. The Definitive Guide. O’Reilly &Associates, Inc., Sebastopol, USA, 1999. Seealso http://nwalsh.com/docbook/index.html.

[15] Norman Walsh. XSL DocBook Stylesheets.http://nwalsh.com/docbook/xsl/index.

html

[16] World Wide Web Consortium. Hakon WiumLie, Bert Bos, Chris Lilley and Ian Jacobs(editors). Cascading Style Sheets, level 2.http://www.w3.org/TR/REC-CSS2.

[17] World Wide Web Consortium. Patrick Ionand Robert Miner (editors). MathematicalMarkup Language (MathML[tm]) 1.01Specification. http://www.w3.org/TR/REC-MathML/.

[18] World Wide Web Consortium, David C.Fallside (editor). XML Schema Part 0:Primer (W3C Working Draft). http://www.w3.org/TR/xmlschema-0.

[19] World Wide Web Consortium, Henry S.Thompson, David Beech, Murray Maloney,Noah Mendelsohn (editors). XML SchemaPart 1: Structures (W3C Working Draft).http://www.w3.org/TR/xmlschema-1.

[20] World Wide Web Consortium, Paul V. Biron,Ashok Malhotra (editors). XML SchemaPart 2: Datatypes (W3C Working Draft).http://www.w3.org/TR/xmlschema-2.

[21] World Wide Web Consortium, Jon Ferraiolo(editor). Scalable Vector Graphics (SVG)1.0 Specification (W3C Working Draft).http://www.w3.org/TR/SVG.

[22] World Wide Web Consortium. Tim Bray,Jean Paoli, and C. M. Sperberg-McQueen

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 233

Page 86: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Michel Goossens and Sebastian Rahtz

(editors). Extensible Markup Language (XML)1.0. http://www.w3.org/TR/REC-xml. Anannotated version of the specification is athttp://www.xml.com/axml/axml.html.

[23] World Wide Web Consortium, James Clark(editor). XSL Transformations (XSLT),Version 1.0 (W3C Recommendation 16November 1999). http://www.w3.org/TR/xslt.

[24] World Wide Web Consortium, Stephen Deach(editor). Extensible Stylesheet Language(XSL), Version 1.0 (W3C Working Draft).http://www.w3.org/TR/WD-xsl.

Michel Goossens Sebastian Rahtz

234 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

Page 87: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Fast scanners and self-parsing in TEX

Pedro Palao GostanzaUniversidad Complutense de MadridEdificio de CC. Matematicas,Ciudad Universitaria s/n,Madrid 28040,[email protected]

Abstract

In this paper we will explain how to build fast scanners for regular languages inTEX. The resulting scanners can be composed with different parsers if they arewritten as self parsers. This parsing technique allows us to choose the syntacticrigour: from loose parsers with almost no syntax checks, good for pretty-printers,to the strict parser needed to write a compiler.

Introduction

It is customary to embed little languages in TEX;LATEX picture environment, XY-pic [9] and TESLA [2]are illustrative examples. TEX can process theselanguages in a reasonable fast manner because theirsyntaxes are chosen with TEX’s abilities in mind;for instance, arguments are surrounded with bracesor delimited with fixed characters. Also, programswritten with these little languages are usually short.

Sometimes, TEX has to process programs writ-ten in bigger languages, or in languages designedwithout paying attention to TEX. Pretty-printingstructured programming languages is the ubiquitousexample [6, 11], but we also meet the same problemswhen trying to typeset HTML directly or when do-ing some Cronopio [3] activities like executing pro-grams written in high level languages [5] within TEX.Programs to cope with these problems are writtenaround a slow character by character processing en-gine. The \FIND macro ([4, 10]), possible in a modi-fied or subtle variant, is the kernel of this processingengine. This is the method adopted in Doumont’spretty-printer [6] and Wolinski’s scanners [11]. Slowprocessing is particularly striking here because pro-grams in these languages can be really long.

We became interested in this problem severalyears ago, while doing just another Pascal pretty-printer [7]. Since we found no trick to build afast scanner, we simply put the burden on theuser who was forced to write a backslash beforeevery identifier. In this way, every identifier was acontrol word and we could take advantage of TEX’sscanner. Obviously, this was a poor design decision.Fortunately, one year ago we found a trick to write

fast scanners in TEX; to our knowledge, it seems tobe an unused TEXnique.

The idea to make a fast scanner in TEX isnot to check every character. But, since a scannermust see every character, the implementation mustuse burst like processing : the scanner checks somecharacters, but TEX internal machinery eats therest. In this way, the final complexity will be a smallconstant (due to TEX internals) multiplying a linearfactor, plus a big constant (due to scanner checks)multiplying a sub-linear factor. We will call everyscanner that works without checking every characterin its input a fast scanner.

Our trick to make a fast scanner is based onactive characters and \edef. We will illustrateit with Pascal in the next section. The scannerengine is spread along all the active characters;each character knows how to keep the scanner alive.This organization, where every token knows whatto do, and there is no centralized set of processingmacros, is what we call self-parsing. Self-parsingcan be used to build scanners and parsers. Itstwo main advantages are: firstly, it allows to splitscanners and parsers like in a traditional compiler,and secondly, the syntactic rigour can be chosen.The first advantage allows us to write a definitivePascal scanner that can be used to feed a pretty-printer parser, a compiler parser, etc. The secondallows us to write a strict parser for a compiler anda loose parser for a pretty-printer with this sametechnique. Of course, each parser will have to bedeveloped from scratch.

To illustrate all these ideas we will use, as arunning example, a small Pascal subset that we

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 235

Page 88: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Pedro Palao Gostanza

Program ::= program Id ; Block .

Block ::= Decls begin Stats end

Decls ::= 〈empty〉 | Vars Decls

Vars ::= var SeqVar SeqsVar

SeqsVar ::= 〈empty〉 | SeqVar SeqsVar

SeqVar ::= Ids : Id ;

Ids ::= Id IdsExt

IdsExt ::= 〈empty〉 | , Ids

Stats ::= Stat StatsExt

StatsExt ::= 〈empty〉 | ; Stat StatsExt

Stat ::= Id := Expr| Id OptArgs | if Expr then Stat Else| while Expr do Stat | begin Stats end

Else ::= 〈empty〉 | else Stat

OptArgs ::= 〈empty〉 | ( Args )

Args ::= Expr ArgsExt

ArgsExt ::= 〈empty〉 | , Args

Expr ::= Rel

Rel ::= Term RelExt

RelExt ::= 〈empty〉 | = Term | <> Term| < Term | <= Term | > Term | >= Term

Term ::= Factor TermExt

TermExt ::= 〈empty〉| + Factor TermExt | - Factor TermExt

Factor ::= Atom FactorExt

FactorExt ::= 〈empty〉 | * Atom FactorExt| div Atom FactorExt | mod Atom FactorExt

Atom ::= Int | Id | ( Expr ) | - Atom

Id ::= Letter LettersOrDigits

LetterOrDigits ::= 〈empty〉 | Letter LetterOrDigits| Digit LettersOrDigits

Int ::= Digit Digits

Digits ::= 〈empty〉 | Digit Digits

Digit ::= 0 | · · · | 9

Letters ::= a | · · · | z | A | · · · | Z

Figure 1: Mini-Pascal syntax

will call ‘mini-Pascal.’ Its syntax can be found inFigure 1.

The rest of this paper is organized as follows.In the next section, we explain how to write a fastscanner for mini-Pascal. Although its main idea canbe reused, each language has its own tricks thatspeed the scanner even more; part of this sectionis devoted to explore useful tricks for Pascal andother structured programming languages. Next wewill devote two sections to building a pretty-printer

and a compiler for mini-Pascal. Both parsers workon top of the same scanner. Since pretty-printing isa widely studied area, the goal of our pretty-printeris not how to pretty-print a programming languagebut how to build a loose self-parser. Obviously,the goal of the compiler is how to built a strictself-parser. The section ‘Other uses’ reviews otherprojects where we have used fast scanners and self-parsers. Finally, we conclude and suggest somefuture work.

A Pascal scanner

By far, identifiers and keywords account for mostof the characters in a Pascal program. Letters areused exclusively for this purpose.1 Digits can alsoappear in identifiers, but do so rather seldom; theyalmost exclusively appear in numbers. Every othercharacter, apart from white space, is seldom used.White space has a strange occurrence pattern: everyline starts with a long white sequence (just afteran end of line), and then single spaces split othertokens.

In order to get really good sub-linear behavior,a scanner should operate checking no character inany identifier (including keywords), and no space inevery start-of-line white sequence.

The scanner will change each Pascal token intoa TEX control word: the identifier Foo to \IdFoo,the number 123 to \Int123, the keyword begin

to \Begin, := to \Assign, etc.Every character but roman letters will be ac-

tive; that is, ,, ., :, ;, (, ), +, -, *, =, <, >, 0,. . . , 9, and blanks are active characters. Forget fora moment digits and symbols composed with morethan one active character, like <>. So, every identi-fier is composed only with letters (non-active char-acters) and is surrounded with active characters. Tocatch these identifiers without an explicit character-by-character analysis, it is enough to start a captureat the end of each active character and to finish thiscapture at the beginning of each active character.The macro \catchId starts the capture:

\def\catchId\edef\mayId\iffalse\fi

This macro store every following characters in \mayId,while expanding active characters. To finish thiscapture an active: character uses

\def\endId\iffalse\else\fi

This capture does not always success; for example,there can be two active characters one after theother. Since every character that cannot take part inan identifier is active, the capture will be successfulif and only if \mayId is not \empty.

1 Not exactly: e and E are used in floating point literal

numbers.

236 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 89: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Fast scanners and self-parsing in TEX

\def\empty

\def\flush\ifx\mayId\empty\else

\expandafter\Id\expandafter\mayId\fi

These three macros are all a white space must do:

\def\blank\endId\flush\catchId

This is also needed at the beginning and the end ofthe scanner

\def\beginScanner\activeChars\defActive

\catchId

\def\endScanner\endId\flush

Other active characters will produce, in addition, itsown Pascal token:

\def+\endId\flush\Plus\catchId

\def.\endId\flush\Dot\catchId

...

Of course, some identifiers are keywords, whichintroduces two problems. First, it is necessary tocheck every identifier in order to test whether it is akeyword or a regular identifier. Several TEXniquesto implement sets may be used, for example:

• For each keyword k there is a control word\kw@k trivially defined (but not \relax). Check-ing whether an identifier is a keyword is simpleand fast:

\def\ifIsNotKW#1\expandafter\ifx

\csname kw@#1\endcsname\relax

But each new identifier introduces a new entryin TEX control sequences table. Since TEXnever deletes entries from this table, we canexhaust TEX limited hash memory.

• All keywords can be stored in a macro:

\def\kws|begin|end|if|...|while|

Checking an identifier is tricky and long

\def\ifIsNotKW#1\def\aux

##1|#1|##2\relax\ifx\relax##2\relax%

\expandafter\aux\kws#1|\relax

but it works in a constant amount of memory.

Since we want to build fast scanners, the firsttechnique is preferable.

The second problem arising with keywords con-cerns capitalization. Pascal is case insensitive, so weshould be capable of recognizing an identifier or key-word without regard to its capitalization. This canbe easily solved invoking a \lowercase over thosecharacters stored in \mayId. Since some parsers careabout capitalization, but others do not, it is betterto change the identifier Foo into \IdfooFoo in-stead of only to \IdFoo.

Part of the speed has already been achieved.The other acceleration source is to deal with spacesat the beginning of lines. The trick is to recoverthe original category codes of spaces at end of lines.

Then we look for the next TEX token so that TEXeats all the intermediate spaces.

\def\eoln\endId\flush\catcode‘\ =10 \eolnB

\def\eolnB#1\catcode‘\ =\active\catchId#1

Category code 9 (ignored character) also works.To consider numbers and composed symbols,

an state needs to be added to the scanner; we willcall it ‘scanner state’ because, latter in the paper,some other states will come into play. The scannerstate due to numbers is a macro \mayInt whereits digits will be stored. Composed symbols needtwo macros: \maySym and \symCode. \symCode is anumber that uniquely determines what charactersare in the current symbol; it is 0 if there is nocharacter, or a non-zero integer for each of the threecharacters that can start composed symbols:

\chardef\noCode=0

\chardef\colonCode=1

\chardef\lessCode=2

\chardef\greaterCode=3

\maySym stores which token will be generated if thereis no character extending the current symbol. Forinstance, a colon does not generate a \Colon tokendirectly; instead, it is stored, so that, if there isan equal immediately after it, an \Assign will begenerated.

\def:\endId\flush

\gdef\maySym\Colon\glet\symCode\colonCode

\catchId

But what if there is an identifier followed by anspace; the \Id token will be generated before the\Colon; it is even possible that the \Colon getlost. The solution is simple: \flush must not onlytake care of captured identifiers but also of delayedsymbols and stored numbers.

\def\flush\flushSym\flushInt\flushId

\def\genSym\maySym\glet\symCode\noCode

\def\flushSym\ifnum\symCode=\noCode

\else\genSym\fi

\def\genInt\expandafter\Int\expandafter

\mayInt\glet\mayInt\empty

\def\flushInt\ifx\mayInt\empty\else\genInt\fi

\def\genId\expandafter\Id\expandafter\mayId

\def\flushId\ifx\mayId\empty\else\genId\fi

Characters that can be in the second place of a com-posed symbol cannot simply \flush; they shouldflush integers and identifiers, but can only flush de-layed symbols if there is something intertwined:

\def\flushInter%

\ifx\mayInt\empty\else\flushSym\genInt\fi

\ifx\mayId\empty\else\flushSym\genId\fi

The definition of ‘>’ is illustrative because it can bethe first and the second character in a composedsymbol:

\def>\endId\flushInter

\ifnum\symCode=\lessCode

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 237

Page 90: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Pedro Palao Gostanza

\glet\symCode\noCode \NotEqual

\else\flushSym\gdef\maySym\Greater%

\glet\symCode\greaterCode

\fi\catchId

Digits do important work to keep the scanneralive, but they do not need to flush because acharacter will follow that will cause flushing. Themain digit task is to know whether it is part of anumber or an identifier.

\def\digit#1\endId

\ifx\mayInt\empty

\ifx\mayId\empty \gdef\mayInt#1\catchId

\else \catchId\mayId#1\fi

\else\ifx\mayId\empty

\xdef\mayInt\mayInt#1\catchId

\else\errmessageAn identifier cannot

start with digits\catchId

\fi\fi

This completes our fast scanner. But a littleproblem remains. Sometimes, the program we wantto parse is not embedded in the document sources,but stored in a separate file. Invoking \input insidean scanner context (\beginScanner\endScanner)has no use because backslash will loose its usualmeaning inside this context. The usual roundabout

\expandafter\beginScanner\input p.pas \endScanner

does not work either (read \@@input instead of\input if thinking in LATEX) because the last activecharacter in p.pas launches a \catchId that willbe closed in \endScanner after the end-of-file, i.e.,the last active character starts a definition that willbe closed pass the end of the file. Since TEX doesnot allow a definition to span across files, we willget the error “File ended while scanning definitionof \mayId.” Fortunately, TEX appends an end-of-line character to the last line of every file, if absent;so the last character in every file processed withTEX is an end-of-line. We are going to put onEOLN character the burden of crossing the end-of-file boundary before to launch \catchId. Of course,if not at the end of a file, an EOLN should behave asbefore. The cheapest manner to cross the end-of-lineboundary is with \futurelet:

\def\eoln\endId\flush\catcode‘\ =9

\futurelet\aux\eolnB

\def\eolnB\catcode‘\ =\active\catchId

Incidentally, \futurelet makes leading spaces (ig-nored characters) in the next line disappear.

A Pascal pretty-printing

Now, we have our scanner ready. Let us use it tobuild a pretty-printer. The pretty-printer is respon-sible for choosing a correct definition for the tokensthat the scanner generates. These definitions can-not look forward following tokens because the scan-ner may not have produced them yet and because

there can be TEX control words (that remain to beevaluated) before the next token. So the pretty-printer must conform to the self-parsing technique.Of course, each token can change the pretty-printerstate, in order to produce a visible effect, to preparethe environment for the next tokens, and to commu-nicate to future tokens its previous occurrence.

Self-parsing is such a natural technique to usein a pretty-printer that it has been discovered andused in several pretty-printers before (at least in [6]and in [7]). But it has never been used in apure manner, neither recognized as a useful generalparsing technique. So, our emphasis will be toexplain how self-parsing can be used to build a looseparser. Pretty-printer output will be very simple,just the raw style in [7]: every statement in a line;keywords are in bold face; identifiers are in italics;every expression, assignment and procedure call istypeset in TEX math mode. The formatted programto compute xn, for x = 3 and n = 9, follows:

program power;var x, n: integer;

x1, n1, pow: integer;begin

x← 3;n← 9;x1← x;n1← n;pow← 1;while n1 ≥ 1 do begin

if n1 mod 2 = 1 then pow← pow× x1;x1← x1× x1;n1← n1 div 2

end;write(pow)

end.To keep the pretty-printer alive, every token

must do some work. Some, like parenthesis, do areally simple work, without bothering about whereit is used.

\def\OpenPar(

Others, like assignments, do a simple work too, butrequire that other tokens have already opened amath mode.

\def\Assign\leftarrow

An assignment in an incorrect place will cause a“Missing $ inserted” error; this is a syntactic checkwith a bad error message.

Identifiers behave differently if placed at thebeginning of an statement or inside an expression.In the first case, they must open a math mode; in thesecond case, they only have to write themselves. Thebest agreement is to use a \ifinsideexpr condition

\let\ifinsideexpr\ifmmode

238 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 91: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Fast scanners and self-parsing in TEX

\def\openExpr\ifinsideexpr\else$\fi

\def\closeExpr\ifinsideexpr$\fi

\def\Id#1\openExpr\hbox\it#1

If a token can appear after an expression it shouldensure that the expression is closed; for example:

\def\Semicolon\closeExpr;\par

But not every semicolon behaves in this way;the semicolon after the program name must indentfollowing constructions a bit. There are threetechniques to solve this problem:

Conditions technique in which we have a globalcondition \ifafterprogram, which the defini-tion of \Program sets true. Other definitionsset it false; since there is only one semicolon af-ter a program name, the definition of semicolonis the best place to set it false.

Redefinition technique in which we have onedefinition for each possible behaviour. Othertokens redefine \Semicolon according to theexpected behaviour in an immediate future.

Steps technique in which we have a number, astep holder, that records the syntactic construc-tion where the present token occurs. Each to-ken can adjust its behaviour according to thevalue in the step holder, and change it as nec-essary.

These three techniques are equivalent, but depend-ing on the problem one is easier than the others.As the syntactic checks become stricter, one shouldmove from the first to the third. These three tech-niques can be used simultaneously; for instance, inthe above fast scanner we have mixed conditions andsteps in order to build symbols composed with morethan one character.

Usually a stack is needed in order to store values(before changing a condition, making a redefinitionor assigning to the step holder) that will be restoredwhen a nested construction ends. For a pretty-printer, TEX grouping is enough, but for stricterparsers it is better to maintain an explicit stack.

The following macros illustrate a pretty-printerbuilt with redefinition technique.

\def\Program\bf program\

\let\Begin\BeginBlock

\let\Semicolon\SemicolonProgram

\def\SemicolonProgram\closeExpr;\par\indent

\let\Semicolon\SemicolonBlock

\def\SemicolonBlock\closeExpr;\par

\def\BeginBlock\par\outdent

\bf begin\par\indent

\let\Begin\BeginStat

\def\BeginStat\ bf begin\par\indent

A Pascal compiler

Implementing a pretty-printer with self-parsing is aneasy task, easier than doing it with a classical andstrict parser. So, we wonder how the effort needed towrite a self-parser evolves when increasing syntacticchecks. We thought that the best test was to writea mini-Pascal compiler.

We envisaged the following organization. Tocompile a program, it must be surrounded with thepair \beginPC/\endPC. A program called power, forinstance, will be translated to a TEX macro called\power, that comprises an instruction sequence fora virtual stack machine. Whenever this macro iscalled, its instructions get executed, and everythingwritten (with write) appears inserted in the text.

Since a compiler needs to ensure a completesyntactic conformance, we will use the step tech-nique to produce its parser. But which are thecorrect steps? This question has already been an-swered: classical parsing techniques, like LL and LR,rewrite a context free grammar as an automaton.This automaton states are the steps we were look-ing for.

Here we will work out how to build an LL self-parser because it is simpler than LR parsing andPascal has an (almost) LL grammar. Nevertheless,the main idea and many details can be reused in anLR self-parser.

The construction of an LL self-parser for agiven grammar has been automated with a simpleprogram (written in Haskell [8]) called parTEX.Here we are explaining how to do by hand whatthis program already does alone. This programexpects an LL grammar annotated with semanticactions and semantic checks. Figure 2 shows theproduction for mini-Pascal statements. Semanticactions are surrounded with braces and semanticchecks are also preceded with a question mark. Bothsemantic actions and checks use several auxiliarymacros that read and modify the compiler state; anexplanation of their implementation and behaviouris beyond the scope of this paper, but their namesare chosen to evoke its meaning (sequences withoutspaces or end-of-lines are just one macro call with itsarguments). Semantic actions (checks) immediatelyfollowing a terminal that carries information, like anId, get this information through parameters. So, inthe semantic actions (checks) following Id, #1 is theidentifier down-cased string and #2 (not used) is theidentifier string.

Then, following [1], we add state numbers be-tween every symbol that appears in each productionright hand side. The state numbers for the produc-tion in Figure 2 (without semantic actions) are:

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 239

Page 92: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Pedro Palao Gostanza

Stat ::=

Id ?\isVarQ#1

\memDir#1\aMemDir

\emitCode\lit\aMemDir

":=" Expr \emitCode\put

| Id \def\procToCall#1 \noa=0

OptArgs \iftrue \isProcQ\procToCall\noa

\procDir\procToCall\noa\aProcDir

\emitCode\call\aProcDir%

\else \errmessageNo procedure

"\procToCall" with \number\noa\space

arguments\fi

| "if" Expr \newLabel\labelse \newLabel\labend

\emitCode\jzero\number\labelse

"then" \bgroup

Stat \egroup \emitCode\jump\number\labend%

\emitCode\label\number\labelse

Else \emitCode\label\number\labend

| "while" \newLabel\loopL \newLabel\endloopL

\emitCode\label\number\loopL

Expr \addCode\jzero\number\endloopL

"do" \bgroup

Stat \egroup \addCode\jump\number\loopL

\emitCode\label\number\endloopL

| "begin" Stats "end"

.

Figure 2: Statement production

Stat ::=

Id 42 ":=" 43 Expr 44

| Id 45 ArgsOpt 46

| "if" 48 Expr 49 "then" 50 Stat 51 Else 52

| "while" 54 Expr 55 "do" 56 Stat 57

| "begin" 59 Stats 60 "end" 61

There is an obvious map between semantic ac-tions (checks) and automaton states: every seman-tic action (check) occurs in an automaton state andan automaton state may have one semantic action(check). The semantic action (check) occurring instate n is stored in macro \sa@n (\sc@n). Thismacro has as many parameters as information bun-dles carried by the token preceding the semantic ac-tion. For example:

\defxsc@42#1#2\isVarQ#1

\defxsa@42#1#2\memDir#1\aMemDir

\emitCode\lit\aMemDir

\defxsa@49\newLabel\labelse \newLabel\labend

\emitCode\jzero\number\labelse

We will call these macros through

\def\semaction#1\csname sa@#1\endcsame

Due to the behaviour of \csname, an action canbe called even if it does not exist. To exploit thiscircumstance, those states after a token that carries

information but has no semantic action will have anexplicit empty action with enough parameters.

A semantic action is executed when entering itsstate. A semantic check is executed before enteringits state; if it returns true, its state will be entered;if it returns false, another possible next state will betried.

Traditional parsers encode the automaton andsemantic actions in a table. A loop uses the currentautomaton state and the next token to index thistable, to perform some action, and to change to thenext automaton state, and a stack is needed to storereturn states when entering a non-terminal. In aself-parsing implementation the current automatonstate and the stack are in the global parser state:\state and \stack. The table becomes code; theaction performed in the loop when looking at thetoken \Tok in state n is stored in the macro \[email protected], token \Tok behaviour is

\csname Tok@\state\endcsname

Since most entries in the table are just errors,memory can be saved not defining them. Checksfor errors can be factored in the following macro:

\def\exe#1\expandafter\let\expandadfter

\aux\csname #1@\state\endcsname

\ifx\aux\relax

\errmessageUnexpected token "#1"\fi

\aux

So, the definition of \Tok can be simplified to

\def\Tok\exeTok

Changing to another state, and pushing and pop-ping states from the stack will be abstracted with\toState, \pushState and \popState. Thesemacros are the best place to call semantic actions.

\def\toState#1\def\state#1\semantic#1

With all these helper macros, encoding theautomaton table with a set of macros is a simplebut boring task. For example, a while in state 53only have to change to state 54

\defxwhile@53\toState54

But while can appear in other states; for example,nested inside another while, that is, after a do(state 56); in this case, it must push state 57 inthe stack, change to state 54

\defxwhile@56\pushState5754

When nested while parsing ends, the state 57 willbe restored from the stack and its semantic actionexecuted so that the last instructions of the outerloop were generated. In a self-parser, tokens thatmay appear after a while statement are responsiblefor doing this. For example, end may appear afterevery statement type:

\defxend@44\popState\exeend

\defxend@46\popState\exeend

\defxend@51\toState52\exeend

240 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 93: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Fast scanners and self-parsing in TEX

\defxend@52\popState\exeend

\defxend@57\popState\exeend

\defxend@60\toState61

Notice, that end keeps rescheduling itself untilreaching state 60.

Encoding entries in the automaton table thatneed a semantic check to be disambiguated is abit more complex. For example, Id may occur instate 56, just after a do; changing to state 42 or 45depends on the semantic check in state 42:

\defxId@56#1#2%

\iftrue\semcheck42#1#2%

\toState42#1#2\else

\toState45#1#2\fi

As can be seen, there is nothing radically newin this code. The classical parser engine with amonolithic table is split into a lot of little macros.Deciding what to do next does not rely on the parserlookahead but each token checks the correctness ofits present occurrence, changes to the next stateand invokes a semantic action. Therefore, TEX is anice source language for a compiler-compiler. Beforeimplementing parTEX, we checked all these ideas byhand; having done this boring work, we are eagerto use it wherever possible. So now, we will inputagain the program pretty-printed on page 238, thistime surrounded with \beginPC/\endPC, just here,only with the intention to execute \power to ensurethat 39 = 19683.

Other uses

We have used these TEXniques in other projects.AGL is a small graphic library that our stu-

dents (and we) write and improve year after year. Itis written with the literate paradigm, using noweb.Moreover, there is a separate document “gettingstarted and reference”. In order to keep the ref-erence up to date, and to allow concurrent devel-opment, the description of each element (function,type, constant, etc.) is embedded in the implemen-tation; typesetting the implementation produces anup to date file to be input in the reference. To en-sure full agreement and to save some typing, thereis no place in a description to put its definition (thehead of a function, the structure of a type, etc.);instead, while processing the reference, TEX openssource code files (built with tangle (notangle)) andlooks for the definition of each described identifier.A fast scanner splits Pascal programs into tokens;then a search engine, organized like a self-parser,stores the tokens constituting each requested defini-tion in a macro; finally, when typesetting an elementdescription, these tokens feed a pretty-printer. So,the same scanner is composed both with a search

engine and a pretty-printer. TEX process hundredsdefinitions in a few seconds, thanks to the fast scan-ner.

EXercita is a hierarchical, human-readable databaseof exercises. Every exercise has, in addition to thewording of the exercise itself, an author (or source),its objective and difficulty, and several solutions.A set of macros helps in extracting exercises tobe included in a document. The macros to searchdatabases use a self-parser.

hTǫXml (HTML in TEX) is a work in progressto make TEX capable of type setting HTML directly.Almost all the processing work comes from HTML

tags. It is important to do it as fast as possible be-cause, although hand written HTML has few tagswith few parameters, machine generated HTML haslarge numbers of tags with lots of (usually unneces-sary) parameters. The simple syntax of HTML tagsmakes really ease to write a fast scanner. With thearrival of CSS a lot of new parsing capabilities areneeded.

Conclusions

Fast scanners are clearly fast. We have only col-lected simple figures. For example, in my old In-tel 80486, more than 1000 lines of Pascal code arescanned in 5.4 seconds, and pretty-printed in 4.6 sec-onds more. TEX typesets this same code (thinkingthat it is plain text) in 1.7 seconds and needs 0.9seconds to process a file that only loads the scan-ner and the pretty-printer— so, parsing and prettyprinting is only one order of magnitude slower. Ingeneral, it is astonishing to see TEX working so fastin every project were we have tried a fast scanner.

Self-parsing is a nice TEXnique to organizereusable parsers. It also allows an adaptable syntac-tic rigour. Its main drawback is the effort to builda strict self-parser by hand. Fortunately, parTEXremoves this burden. Fast scanners, being an ap-plication of self-parser, should inherit this complex-ity; but writing a fast-scanner generator for TEX isa daunting task because each language has its owntricks. Fortunately, writing a fast scanner by handis affordable because the lexical part of a program-ming language is simpler than its syntax. In addi-tion, each processing kind needs a new parser, butthe same scanner can be used once and for all.

References

[1] Alfred V. Aho, Ravi Sethi, and Jeffrey D.Ullman. Compilers: Principles, Techniques,

and Tools. Addison-Wesley, 1986.

[2] Henry Baragar and Gail E. Harris. An exampleof a special purpose input language to LATEX. In

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 241

Page 94: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Pedro Palao Gostanza

Proceedings of the TUG Annual Meeting, 1994.

[3] Julio Cortazar. Historias de Cronopios y

Famas.

[4] Jonathan Fine. The \CASE and \FIND macros.TUGBoat, 1(14):35–39, 1993.

[5] Andrew Marc Greene. BASIX—an interpreterwritten in TEX. In Proceedings of the TUG

Annual Meeting, 1994.

[6] Jean luc Doumont. Pascal pretty-printing:an example of “preprocessing with TEX”. InProceedings of the TUG Annual Meeting, 1994.

[7] Pedro Palao Gostanza and Manuel

Nunez Garcıa.pa

scal : Formating pascal

using TEX. In EuroTEX, 1995.

[8] Simon Peyton Jones, John Hughes, LennartAugustsson, Dave Barton, Brian Boutel, War-ren Burton, Joseph Fasel, Kevin Hammond,Ralf Hinze, Paul Hudack, Thomas Johnsson,Mark Jones, John Launchbury, Erik Meijer,John Peterson, Alastair Reid, Colin Runciman,and Philip Wadler. Haskell 98. a non-strict,purely functional language. 1999.

[9] Kristoffer H. Rose. XY-pic user’s guide. 1998.

[10] C.G. van der Laan. \FIFO and \LIFO sign theBLUes. TUGBoat, 1(14):54–60, 1993.

[11] Marcin Wolinski. Pretprin—a LATEX2ε packagefor pretty-printing texts in formal languages. InProceedings of the TUG Annual Meeting, 1998.

Pedro Palao Gostanza

242 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 95: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Device-Independent DVI Interpreter Library for Various Output Devices

Hirotsugu KakugawaFaculty of Engineering, Hiroshima University

1-4-1 Kagamiyama, Higashi Hiroshima,

Hiroshima, 739-8527 JAPAN

[email protected]

http://kakugawa.aial.hiroshima-u.ac.jp/

Abstract

In this paper, we describe DVIlib, which is a device-independent DVI interpreterlibrary written in C developed by the author. Since DVIlib is completely indepen-dent from specific output devices, new printer drivers and previewers (DVIware)can easily be developed. DVIlib is a set of functions to read and render DVI files.

To render a page, DVIlib generates a bitmap for each character in a page andcalls a callback function to draw a bitmap on a device. Therefore, what a pro-grammer must do to make a new DVIware program is to write device-dependentroutines (initialization and drawing a bitmap on a device). Since DVIlib adoptsVFlib as a font module, many font file formats are available, including PK, GF,VF, and Type 1. Thus, any DVIware that adopts DVIlib supports many font fileformats.

We developed a program to convert from DVI to bitmap, printer drivers, andpreviewers for the X Window System. These programs are easily developed byadopting DVIlib.

Introduction

Since TEX is a de facto standard of typesetting soft-ware, a set of software for handling the typeset result(a DVI file) plays an important role to print and viewdocuments in TEX. Such software is called DVIware.

In this paper, we introduce a new frameworkto build a set of DVIware, such as printer driversand previewers. Many kind of printer drivers andpreviewers are required for the following reasons:

• Different printers adopt different printer de-scription languages (escape sequences) to rep-resent images to be printed,

• Different previewer programs are required foreach window and desktop environment, or

• Novice users and expert users may require dif-ferent user interfaces.

Although an interpreter for a DVI file itself issimple, development of a new DVIware program isnot an easy task, since it requires complex inter-nal modules for handling font files and the ‘special’DVI instruction, for example, figures in Encapsu-lated PostScript (EPS), changes of text colors, andscaling texts. In addition, we expect that the pre-view image on a window system and the printedimage by printer are the same, except for deviceresolutions.

Most parts of program code for previewers andprinter drivers are the same, and therefore, develop-ing previewers and printer drivers individually is notadequate. In [1], Beebe proposed a set of functionswritten in C that can be used as ‘parts’ to form aDVIware program. To develop a new printer driveror previewer, such functions are lexically included ina DVIware program; only the device-dependent rou-tine needs to be developed. Since the same ‘core’of DVIware (e.g., a DVI interpreter and a font mod-ule) is shared among various DVIware, each DVIwareprogram has the same output and functionality, ex-cept for resolutions of output devices.

In this paper, we introduce a new frameworkto develop a family of DVIware. We developed adevice-independent DVI interpreter library writtenin C named DVIlib. Different from the approachby Beebe [1], DVIlib provides a set of functionsto be called by DVIware. Since DVIlib is com-pletely independent from specific output devices,new printer drivers and previewers can easily be de-veloped. DVIlib has following features:

• drawing EPS figures,

• handling change of text colors,

• scaling boxes, and

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 243

Page 96: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Hirotsugu Kakugawa

• support for various font file formats (GF, PK,virtual fonts, Type 1, etc.) by adopting VFlibas a font module [5].

Currently, xdvi, dvips, and ghostscript are widelyused. Although a combination of them is a strongset of software for handling TEX DVI files, we may bebothered configuring this software (e.g., font defini-tions) consistently to obtain the same output. Thisproblem often occurs when we use localized (e.g.,Japanese) versions of this software.

DVIware which adopts DVIlib shares the sameDVI interpreter and font rasterizer module. In ad-dition, the same configuration file can be shared bypreviewers and printer drivers. Therefore, what weget on paper from a printer is exactly the same aswhat we see on a CRT screen (except for device res-olution).

This paper is organized as follows. First weexplain how we can use DVIlib to develop printerdrivers and previewers. Then, the internal struc-ture of DVIlib is explained. Next, we explain thesupported features of the ‘special’ DVI instruction.Then, we introduce several printer drivers and pre-viewers using DVIlib. Finally, we give concludingremarks.

Structure

In this section, we explain the structure of DVIlib.(See Figure 1.)

DVIlib is a library which is linked against anapplication program. It offers a set of functions torender a DVI file.

It uses VFlib [5] to obtain glyphs of charac-ters in various font formats (GF, PK, Type 1 andVirtual Font, and more). VFlib uses a file named“vflibcap” as a font database. In this file, we candescribe a font definition; for example, a Type 1font is used for cmr10.600pk, or a PK font is usedfor cmbx10.600pk.

DVIlib has an interface to ghostscript, which isa PostScript interpreter, to render figures in EPS

format.DVIlib defines several callbacks to draw a page.

Fundamental callbacks are (1) drawing a given bit-map on a page, and (2) drawing a rectangle on apage. DVIlib internally obtains glyphs of charactersand converts EPS files to images. Thus, an applica-tion program can draw characters and EPS figuresby simply implementing a callback to draw a bitmapon a page.

Features and specification of DVIlib are de-scribed in detail in the next section.

Using DVIlib

DVIlib provides a set of functions to obtain a pageimage from a DVI file. DVIware using DVIlib mustobey the following framework to handle DVI files.

1. Initialize DVIlib by calling a function namedDVI_INIT().

2. Call a function named DVI_CREATE(), with aDVI file name as an argument, to create a DVI

object. A DVI object contains various informa-tion about a given DVI file.

3. Call a function named DVI_DRAW_PAGE(). Ar-guments for this function include a set of call-back functions and a page number to draw.

In DVIlib, an output device is abstracted bya structure DVI_DEVICE which is a data structurefor callback functions and device-dependent param-eters. It contains the following members, for exam-ple:

• resolution of a device,

• a pointer to a function to draw a bitmap on apage. (This callback is used to draw glyphs ofcharacters and EPS figures.)

• a pointer to a function to draw a rectangle ona page,

• pointers to functions to draw a graymap andpixmap on a page. (If one of these callbacks isdefined, it is used to draw EPS figures. Oth-erwise, a callback to draw a bitmap is used todraw EPS figures.)

• a pointer to a function to print error messages,

• a pointer to a function to change text colors,

• a pointer to a function to change backgroundcolors.

Since we can create multiple DVI objects inde-pendently and simultaneously in a single applicationprogram, for example, we can create a previewerthat opens and displays multiple DVI files at thesame time.

Now we explain details of three important func-tions.

DVI_INIT(char *vflibcap, char *params )

— Initialization function for DVIlib. The first argu-ment vflibcap is the path name of a font databasefile called “vflibcap”. It is used by VFlib (a fontlibrary) to resolve fonts used in DVI files. In avflibcap, variables can be used to customize itscontents at run time. For example, output deviceresolution is parameterized by a variable. VFlib hasa feature to define values of variables when its ini-tialization function is called. The second argument

244 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 97: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Device-Independent DVI Interpreter Library for Various Output Devices

ghostscript

vflibcap

Font Files

Device

scale/rotate

‘special’ handlerfont manager

color changeEPS

glyph requestfont open

glyph imagePostScript file

VFlib(a font library)

libVFlib.a

DVIlib libdvilib.a

a DVI interpreter

DVI Files

page draw request(put bitmap, draw rectangle, etc.)

callback

(Printer Driver / Previewer)

An Application Software

routines

devicedependent

Font Definition

Figure 1: The structure of DVIware based on DVIlib

params is used to pass variables value of VFlib forruntime customization.

If null pointers are given for these parameters,default values are used, i.e., the default vflibcap

file is used and no variable value customization.

DVI_CREATE(DVI_DEVICE dev, char *file,

DVI_PROPERTY prop )

— This function creates a DVI object for a givenDVI file file . The first argument dev is a set ofcallback functions.

The third argument prop is used to controlthe behavior of a DVI interpreter. Features ofa DVI interpreter are characterized as properties,and they can be enabled or disabled. Data typeDVI_PROPERTY is used to describe a set of proper-ties to be enabled. DVIlib has a set of functions tooperate a data of this data type.

The following features of a DVI interpreter arecontrolled by the third argument of DVI_CREATE.(Although there are other features to be controlled,they are omitted here.)

• Delay opening fonts until they are necessary.This property is effective for previewers to dis-play the first page quickly, since not all fontsneed to be opened to draw the first page.

• Invoke the ghostscript program immediatelywhen a DVI object is created. Standard be-havior is to invoke ghostscript when a DVI in-terpreter encounters the first EPS figure. Thisproperty is effective for previewers to displaythe first EPS figure quickly, since ghostscript

may finish its initialization before the first EPS

figure in a DVI file is encountered.

• Skip execution of the ‘special’ DVI instructions.For example, drawing EPS figures can be ig-nored.

• Print a list of fonts in a DVI file.

DVIlib has a function to change DVI propertiesafter a DVI object is created. It can used in a pre-viewer, for example, to control the behavior of a DVI

interpreter interactively.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 245

Page 98: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Hirotsugu Kakugawa

DVI_DRAW_PAGE(DVI dvi, DVI_DEVICE dev,

int page, double shrink )

— A function DVI_DRAW_PAGE() plays an importantrole in DVIlib. When it is called, it invokes a DVI

instruction interpreter for a given page of a DVI file.The fourth parameter shrink is the shrink factor;obtained bitmaps and their positions are automati-cally shrunk by DVIlib.

Whenever a DVI interpreter encounters aSET_CHAR, SET_x, or PUT_x DVI instruction1, it ob-tains a glyph by calling a function to obtain theglyph of a character in VFlib [5]. Then, the call-back function to draw a bitmap is invoked with theobtained glyph and its position on a page as argu-ments.

When it encounters a SET_RULE or PUT_RULE

DVI instruction2, it invokes a callback function todraw a rectangle with position, width and height ofa rectangle.

Support for the ‘special’ DVI instructions aredescribed later.

Callback functions

In this section, we describe callback functions. Fun-damental callback functions are (1) drawing a bitmap,and (2) drawing a rectangle. Although many othercallbacks can be defined, we explain only importantcallbacks here.

dev_put_bitmap(DVI_DEVICE dev, DVI dvi,

DVI_BITMAP bm, int font_id, long k,

long code_point, long x, long y )

— This callback function draws a bitmap bm . Itsposition is x and y . Other arguments are supple-mentary information, such as font number and char-acter code, for example.

dev_put_rectangle(DVI_DEVICE dev, DVI dvi,

long x, long y, long w, long h )

— This callback function draws a rectangle of widthw and height h on a page. Its position is x and y .

DVIlib defines other useful callbacks.

dev_put_graymap(DVI_DEVICE dev, DVI dvi,

DVI_GRAYMAP gm, int font_id, long k,

long code_point, long x, long y )

— This callback is used to draw EPS figures ingrayscale, if defined. If this callback is not defined,dev_put_bitmap is used to display EPS figures.

1 These are DVI instructions to draw a character on a

page.2 These are DVI instructions to draw a rectangle on a

page.

dev_put_pixmap_rgb(DVI_DEVICE dev, DVI dvi,

DVI_PIXMAP_RGB pm, int font_id, long k,

long code_point, long x, long y )

— This callback is used to draw EPS figures incolor, if defined. It this callback is not defined,dev_put_graymap or dev_put_bitmap is used todisplay EPS figures.

dev_color_rgb(DVI_DEVICE dev, DVI dvi,

int f, double r, double g, double b )

— Change text colors. Parameters r , g , b repre-sents intensities of red, green, and blue.

dev_message_error(DVI_DEVICE,DVI,char*,...)

— Print an error message. This callback can beused to display an error message on a message dialogwindow, for example.

Skelton of a DVIware

Following is the outline of a simple printer driverprogram with DVIlib:

#include <dvi-2.5.h>

int main()

int p;

DVI_DEVICE dev;

/* Initialize DVIlib */

DVI_INIT(NULL, NULL);

/* Make a set of callback functions */

dev = DVI_DEVICE_ALLOC();

dev->h_dpi = 300; /* 300 dpi */

dev->v_dpi = 300; /* 300 dpi */

dev->put_rectangle = dev_put_rectangle;

dev->put_bitmap = dev_put_bitmap;

/* Create a DVI object */

DVI = DVI_CREATE(dev, file, NULL);

for (p = 1; p < dvi->npage; p++)

/* Clear page buffer */

page_clear();

/* Invoke a DVI interpreter */

DVI_DRAW_PAGE(dvi, dev, p, 1.0);

/* Send page buffer to a printer */

page_send_printer();

return 0;

void

dev_put_bitmap(DVI_DEVICE dev, DVI DVI,

DVI_BITMAP bm, int font_id, long k,

long code_point, long x, long y)

246 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 99: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Device-Independent DVI Interpreter Library for Various Output Devices

/* Put a bitmap ‘bm’ at <x, y>. */

void

dev_put_rectangle(DVI_DEVICE dev, DVI DVI,

long x, long y, long w, long h)

/* Draw a rectangle of width ‘w’ and */

/* height ‘h’ at position <x, y>. */

Similarly, previewers can be built easily byadding a user interface to change pages to be dis-played by pushing buttons by mouse, for example.

Support for the ‘Special’ DVI Instruction

When an interpreter encounters the ‘special’ DVI

instruction, it invokes a handling routine accordingto a parameter string of the instruction.

• A figure in EPS.Pass the EPS file to ghostscript to render. Out-put of ghostscript is a bitmap; call a callbackfunction to draw the bitmap. If a callbackto draw a graymap (pixmap) is defined, PGM

(PPM) format is selected as an output formatof ghostscript. (Otherwise, PGM format is se-lected.) Then, a callback is invoked to place theobtained image.

• Change of text or background colors.If callbacks to change text and background col-ors are defined, they are invoked with RGB val-ues for new color.

• Change of scaling factors.This feature is offered by graphics.sty andgraphicx.sty packages (\scalebox and\resizebox commands). These macro pack-ages generate embedded PostScript code asa parameter of the ‘special’ DVI instruction.DVIlib parses embedded PostScript code (bysimple pattern matching) and generates scaledglyphs of characters and rectangles.

Currently, change of rotation angles is notsupported.

By this software architecture of DVIlib, ev-ery DVIware program can support EPS figures andscaled text and rectangles.

Multilingual Issues

John Plaice and Yannis Haralambous propose Ω asa multilingual extension of TEX [8]. They proposeΩFM (Ω font metric), which is an extended versionof TFM. pTEX also defines the extended font metricJFM (Japanese font metric). Since VFlib supportsΩFM, JFM, and ΩVF(Ω virtual font), DVIware

based on DVIlib can display and print DVI files byΩ and pTEX. (Currently, level-0 ΩFM is supportedby VFlib, but level-1 is not.)

In the Japanese community, a variant of TEXnamed pTEX is widely used. pTEX supports Japanesecharacters and vertical writing directionality [2]. Forsupporting vertical writing, pTEX defines new bytecode to change the writing directionality in the DVI

instruction set, and a new register in the DVI vir-tual machine to hold the current writing direction-ality. DVIlib supports the extended specificationof pTEX. This extension is encapsulated inside ofDVIlib; DVIware based on DVIlib is not aware ofthis extension. Thus, all DVIware based on DVIlibcan make use of such an extension.

DVIware with DVIlib

We developed several DVIware programs that adoptDVIlib.

• xgdvi

A previewer on X Window System with GTK+1.2 toolkit. This software has a fancy GUI fornovice users.

• spawx11

A simple previewer on X Window System.

• dvi2rpdl

A printer driver for Ricoh RPDL printers.

• dvi2escpage

A printer driver for Epson ESC/Page printers.

• dvi2img

A converter program to generate a PGM imagefile from a DVI file.

• dvifontlist

A utility program to print a list of fonts used ina DVI file.

• dvispecials

A utility program to print a list of ‘special’ DVI

instructions in a DVI file.

xgdvi is implemented about 6000 lines of C code.It supports displaying color EPS figures. Since com-plex routines for DVI interpretation, handling EPS

figures and font files are managed in DVIlib, most ofthe code of xgdvi is for the fancy GUI. A screen shotof xgdvi is shown in Figure 2. It supports multiplebuffers: multiple DVI files can be opened simulta-neously and they are switched without opening DVI

files again.dvifontlist and dvispecials are implemented by

making use of DVI proporties; a DVI file is openedby disabling character rendering and enabling print-ing DVI file information. These programs are imple-mented in about 350 lines of C code.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 247

Page 100: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Hirotsugu Kakugawa

Figure 2: Screen shot of xgdvi

We developed another previewer spwx113 on theX Window System with minimum factionality, as achallange. It is implemented by only 140 lines of Ccode; the program consists of the interface to DVIliband the X Window System to draw bitmaps andrectangles. Although this program does not supportan anti-aliased display, it does support displayingEPS figures and various font file formats. spawx11

is a previewer on X Window System with an anti-aliasing display feature.

Typically, a printer driver can be implementedin about 500 lines of C code (if it does not supportvarious printer description languages).

Conclusion

In this paper, we introduced DVIlib which is adevice-independent DVI interpreter. Since it adoptsVFlib for its font module, fonts in various font fileformats can be available. We also developed severalprinter drivers and previewers that adopt DVIlib.

By adopting DVIlib, we can develop a simpleprinter driver within a day. When we develop a

3 spwx11 stands for “the Simplest Previewer in the World

for X11”.

previewer, we can concentrate on our efforts for afancy GUI. Since all DVIware shares the same DVI

engine, the printed result is exactly the same as whatwe see on a display.

Currently, the following features are not imple-mented, for example.

• support for HyperTEX,

• full support for embedded PostScript literals(e.g., support for PSTricks packages),

• rotation of figures and texts (e.g., the \rotateboxcommand of graphics and graphicx packages).

DVIlib is written in C and about 6400 lines ofcode, half of which is for handling the ‘special’ DVI

instruction. (VFlib, a font module of DVIlib, is writ-ten in C and about 33000 lines of code.)

DVIlib is a part of the TeX-Guy package which isa collection of DVIlib and DVIware based on DVIlib(including xgdvi and spwx11). DVIlib and VFlib arefree software and distributed under the terms of theLibrary GNU Public License. DVIware such as xgdvi

is also free software and distributed under the termsof the GNU Public License.

These programs have been tested onFreeBSD 3.2, Solaris 2.5.1; it is not difficult to

248 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 101: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Device-Independent DVI Interpreter Library for Various Output Devices

port them to other Unix-like systems such asLinux. Visit our web pages: http://TypeHack.

aial.hiroshima-u.ac.jp/TeX-Guy/ and http:

//TypeHack.aial.hiroshima-u.ac.jp/VFlib/

for further information and download.

References

[1] Nelson H. F. Beebe. DVIxxx. Available on CTAN

as /dviware/beebe/.

[2] ASCII Coop. pTeX web page. http://www.

ascii.co.jp/pb/ptex/. Publishing TeX forJapanese, with vertical writing.

[3] Roger D. Hersch, editor. Visual and TechnicalAspect of Type. Cambridge University Press,1993.

Hirotsugu Kakugawa

[4] Hirotsugu Kakugawa. The web page ofVFlib. http://TypeHack.aial.hiroshima-u.

ac.jp/VFlib/.

[5] Hirotsugu Kakugawa. VFlib — a general fontlibrary that supports multiple font formats. InProceedings of the 10th European TEX conference(EuroTEX 98), pages 221–222, March 1998.

[6] Donald E. Knuth. The TEX book. Addison-Wesley, 1986.

[7] Donald E. Knuth. TEX: the Program. Addison-Wesley, 1986.

[8] John Plaice and Yannis Haralambous. TheOmega project home page. http://www.

gutenberg.eu.org/omega/.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 249

Page 102: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

“Russian style” with LATEX and babel:

what does it look like and how does it work

M. Y. Kolodin, O. V. Eterevksy, O. G. Lapko, and I. A. MakhovayaSt.Petersburg, Moscow, Russia

[email protected]

http://myke.webjump.com/tex/

Abstract

General and scientific typesetting in Russia has many specific features that shouldbe supported by (LA)TEX. Personal habits, local peculiarities and national tradi-tions and standards are involved, as well as (LA)TEX possibilities and limitations.The unified TEX implementation, stand-alone or based on babel, is needed tomeet all the requirements. These peculiarities and implementation are discussedinterdependently in the paper.

Olga Lapko

250 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 103: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Mixing TEX & PostScript : The GEX Model

Alex Kostin & Michael VulisMicroPress, Inc.68-30 Harrow StreetForest Hills, New York, 11375, USAPhone: 1 (718) 575 1818Fax: 1 (718) 575 8038

[email protected]

http://www.micropress-inc.com

Abstract

VTEX is a (commercial) extended version of TEX, sold by MicroPress, Inc. Freeversions of VTEX have recently been made available, that work under OS/2 andLinux. This paper describes GEX, a fast fully-integrated PostScript interpreterwhich functions as part of the VTEX code-generator.

GEX offers one-pass compilation of text (TEX) and graphics and thus easy in-corporations of graphics files (.eps) and inline PostScript code (PStricks, PSfrag)within a document. While it is this graphics support which is of primary interestto the end users, the presence of the PostScript interpreter within TEX and itsability to provide feedback to TEX raises interesting questions about mixing textand graphics in general and leads to new graphics-oriented packages.

This article serves as a short introduction to GEX, seeking to explain thedesign issues behind GEX and the extensions which now become possible.

Unless specified otherwise, this article describes the functionality in the free-ware version of the VTEX compiler, as available on CTAN sites in systems/vtex.

What did GEX come from?

During the early work on the VTEX PDF backendcirca 1998 it became apparent that the only way thebackend can handle PStricks graphics is by incorpo-rating a limited PostScript interpreter. GEX (whichstands for Graphics EXtensions and is to be pro-nounced g-e-ks) arose primarily from the author’smisguided optimism about the amount of work re-quired. By the time GEX fully supported PStricks,the code amounted to more than 20,000 lines of C++code, supported almost the entire PostScript lan-guage, and even went beyond it. GEX has becomepowerful enough to handle not only PostScript files(.eps) but also the common inline PostScript graph-ics packages (PStricks, PSfrag, XYpic, or Seminar).In addition, it has become possible to design newmacro packages with GEX in mind.

While the .eps file and inline PostScript in-clusion is the main attraction to the end user, thisarticle has very little to say about it. This is becausefrom the end-user standpoint, using GEX amountsto using standard and familiar commands like\includegraphics or \beginpspicture and see-ing the results appear as expected in the output. In-

stead, we will concentrate on the design issues andthe extensions.

What is GEX ?

GEX is a graphics counterpart to TEX. The basicdesign assumes that TEX is responsible for handlingof the text; GEX is responsible for processing thegraphics components of the document. Both TEXand GEX contribute to the output; since the over-all handling of the document is TEX’s responsibility,TEX has overall control.

Usually, but not always, GEX functions withinthe TEX \shipout routine and accepts responsibili-ties which would otherwise be given to a DVI driver.In more interesting cases, GEX functions during theTEX formatting phase; when so doing, it is capableof returning information to TEX and thus influenc-ing TEX formatting.

Since GEX may exercise subtle influence on TEX(load fonts, or change TEX registers), GEX is op-tional in VTEX implementations: the default oper-ation of the program is with GEX off; it is enabledby a command-line switch.

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 251

Page 104: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Alex Kostin & Michael Vulis

Of the four primary output modes of the VTEXcompiler (DVI, HTML, PDF, PostScript), GEX iscurrently supported with two: PDF and PostScript.The majority of GEX-related activities are identicalin these two modes. Where a behavioral differenceis desired, a macro writer can use the \OpMode countprimitive (with magic values of 0,1,2 and 10 for DVI,PDF, PS, and HTML output modes).

In PDF mode, GEX is basically a PS 7→PDF com-piler; in the PS mode, it is a PS 7→PS compiler whichreinterprets input PostScript and produces outputsimilar to what would be produced by printing PDF

to PostScript, albeit faster, often tighter and cleaner.(One of the benefits of this in comparison with DVI7→PS drivers is the combination of the fonts and otherresources that are often repeated in included .eps

files.)While GEX is a PostScript language interpreter,

it is not 100% PostScript; there are subtle designdifferences, that while not impeding the ability ofGEX to process standard PostScript code, allow newapplications.

The basic design paradigms

During the design of GEX it has become apparentthat a number of extensions will be needed to beadded to TEX to support the extra functionality.In all cases, the basic approach was to try to keepthe TEX syntax as close to the standard as possible,and avoid introducing additional keywords. Most ofthe TEX language extensions1 are merely \specialswhich are understood and resolved by the \shipoutcode in VTEX. Thus, VTEX syntax would not havenew words like \pdfimage or \pdfoutline; thesewould be backend \specials. In practice, we didend up with adding some primitives, but these wereprimarily new count and skip registers.

In designing the syntax of the \specials them-selves, an attempt has been made to avoid depen-dency on the PDF output mode. This makes themeither applicable or at least safely ignorable in otheroperation modes of VTEX (DVI, HTML), not justin the PDF and PostScript modes, where GEX isfully operational. Thus, VTEX’s \special neveruses PDF-specific code. While a direct write to theoutput is supported (with \special!=..., anal-ogous to \pdfliteral... in pdfTEX), it is gen-erally discouraged.

Finally, wherever possible, the \specials arescreened from the user, mostly by means of extend-ing the graphicx package.

1 There are also PostScript language extensions in play.

How does it work

The basic model of TEX-GEX interaction is the two\specials:

• \specialpS: ..... with the argument con-taining valid PostScript code

• \specialps: ..... with the argument be-ing a name of PostScript file to include

When the backend sees one of these \specials, itpasses it to GEX for compilation. (In PDF mode,with GEX off, it is simply thrown out; with GEX on,it is compiled. In PostScript mode, with GEX off,the parameter is pasted to the PostScript output, asin traditional DVI7→PS drivers; with GEX on, it isre-compiled).

Prior to giving control over to GEX, VTEX up-dates the information in PostScript’s graphics state(setting the coordinates for the current point, forexample). Upon the return from TEX, the relevant

parts of the PostScript graphics state are given backto TEX.

Because of the need to support inline PostScriptpackages the information about the current font isalso shared between TEX and GEX. For example,passing

\specialpS: currentfont setfont

to the PostScript interpreter is entirely legal (and isdone by PStricks); but the design implication is thatGEX is aware of the currently used TEX font and canaccess it by itself. Access may mean actually loadingthe font and executing the instructions in the fontfile; this would happen, for example, if one writes

\specialpS: gsave currentfont 2

scalefont setfont 0.5 0 0 setrgbcolor

[4 1] 0 setdash (Test stroke) false

charpath stroke grestore

which yields

Observe that here we use gsave/grestore toscreen TEX (and subsequent PostScript fragments)from the color and dash changes done in GEX.

Design implications: the font machinery isto be shared between TEX and GEX; GEX should beable to load TEX fonts and operate on them.

Solution: Provide all conceivably useful TEXfonts in Type 1. Extend GEX with command(s) forloading a font given its TEX name and point size(the .settexfont PostScript extension which loadsthe current TEX font into PostScript at the currentsize, as well as the .loadfont extension which allowsGEX to select any TEX font by its name. The secondextension is of use for MetaPost; see below.).

252 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 105: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Mixing TEX & PostScript : The GEX Model

Unresolved issues: The ability to pass fontsto GEX is currently unsupported on TrueType orCID fonts (used in CJK PDF generation). Thus, nofont effects are currently possible on Asian fonts2.

Error handling

Unlike in TEX, error correction of PostScript code ishardly possible. Errors are therefore converted intoTEX-style errors, followed by PostScript-style stackdumps.

For example, passing the following code to GEX

\specialpS: 1 2 movetoo

results in

! PS interpreter error, code=21

(Undefined name [movetoo]).

(This assumes, of course, that the movetoo namehas not been previously defined.) GEX errors areusually fatal; while the TEX portion of the docu-ment can be compiled through the end, PostScriptcompilation is abandoned on the first error. Onlywith several common errors, like font unavailabil-ity, or leaving junk entries on the operand stack (asexplained below), will GEX continue.

Interesting cases

While the above model is sufficient for most cases,there are unusual situations which arise in specificcases.

Typesetting text on a curve which is the ac-tivity of the pst-path component of PStricks pro-vides one difficulty. In PStricks, this is implementedby redefining the show operator. In conventionalPStricks, the expectation is that the redefined show

should hack the code which originated in TEX, butnow, after TEX 7→DVI and DVI7→PS conversions, thecode has become PostScript. In the VTEX case, wewant PStricks to work within the TEX \output rou-tine, where there is no PostScript code to hack.

Solution: The VTEX backend senses the re-definitions of PostScript text output operators likeshow; if it detects that show has been changed ittemporary switches to PostScript generating mode;then passes the output to GEX for recompiling.

A similar situation arises when a TEX macropackage “cuts out” a piece of PostScript code forreuse or discarding. Both PStricks and PSfrag doit by inserting a definition around PostScript codegenerated by TEX:

/something

<ps code>

2 see http://www.micropress-inc.com/CJK for additionalinformation on CJK/PDF support.

def

Design implications: The TEX backend mustsense when GEX is in such a “definition” mode, andswitch to PostScript generation if needed. In theabove example, upon processing

\specialpS: /something

GEX returns back an indicator that it did not fullyhandle the operator; only after

\specialpS: def

will the TEX backend be allowed to return to normalprocessing.

Transfer handling

〈int〉 .enabletransfer A problem which ariseswith some .eps images is the use of the settransferPostScript and related operators. The problem isthat these operators are used for both device-depen-dent and device-independent color manipulations.The first usage is more common and is essentiallyfor minor color adjustments. In such situations thebest strategy for producing device-independent PDF

files is to disregard the transfer altogether. This isthe default behaviour of GEX (and of the AcrobatDistiller).

However, in some (fortunately, rare) .eps filesthe same operators are used to effect major device-independent adjustments. An example of such anadjustment would be to invert a black-and-whitepicture; this can be done with the

1 exch sub settransfer

PostScript code snippet. Disregarding this code willproduce an inverted image. Thus, both Acrobat Dis-tiller and GEX allow the user to change their be-haviour. In the case of Distiller, the override is aglobal Job option which will apply to all parts of adocument; GEX allows you to override only the han-dling of an individual image. This is accomplishedwith the extension operator

.enabletransfer

With an argument of zero, .enabletransfer dis-ables processing of settransfer code; a non-zeroargument enables settransfer processing. Figure 1is an example of a small .eps file that uses transfercode.

MetaPost support

While GEX can handle MetaPost-generated files, itis important to state that MetaPost outputs invalidEPS files. Rather than use the standard fonts orembed fonts into the EPS, MetaPost merely includesdeclarations like

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 253

Page 106: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Alex Kostin & Michael Vulis

Figure 1: To the left the figure included with default settings, on the right the figure after enablingsettransfer.

/cmr10 /cmr10 def

and expects post-processing to find and substitutethe fonts. Instead of such post-postprocessing, GEXignores (i.e., processes and discards the result) thisdeclaration, but requires either explicit loading ofneeded fonts via the .loadfont extension

\specialpS: /cmr10 .loadfont

(using one such command for each required font) orby enabling of the autoloading feature via the.autofontload extension

\specialpS: 1 .autofontload

〈string〉 .loadfont loads the font by its TEXTFM name into the GEX font machinery and makesit available to findfont and related operators.

〈int〉 .autofontload If the integer argument isnon-zero, GEX will query the TEX font configurationfiles when the findfont operator cannot resolve afont name. The default is not to load fonts implicitlyand substitute Helvetica.3

These commands must be issued before a Meta-Post-generated file is actually included.

EPS-specific problems

In the process of testing GEX over many hundreds of“real-life” .eps files, some common problems havebeen discovered. While these are technically bugs in.eps, they are common enough so workarounds hadto be provided.

The majority of the .eps related workarounds(as well as many new options) have been incorpo-

3 One of the subtle differences between GEX and Post-Script is substituting Helvetica rather than Courier for fontsthat are not available; in the author’s opinion Courier is nota font to be used for any purpose.

rated as new keys to the \includegraphics com-mand; this provides for an easy end-user interface4.

Leaving entries on the PostScript operand stackis surprisingly common misbehavior which we haveseen in files generated by many applications. If the.eps file is sound otherwise, it will be processed cor-rectly; but an error may occur in handling the Post-Script code that comes after.

Because of the common nature of this error(and especially because it causes the error messageto point not to the culprit, but some later PostScriptcode), this GEX error is reported TEX-style:

! junk on PostScript stack, 4 items

? h

The PostScript code you just executed

has left some junk on the operand stack.

I’m taking it off; cross your fingers

and pray that this is all to it.

The fix required from the user is to add 4 popsat the end of the .eps image.

Degenerate matrices Near-degenerate matrixtransforms often cause serious problems with theAcrobat’s 16-bit computational limit. One can showthat the problem is not solvable correctly in general;and Adobe Acrobat Distiller would fail on degener-ate transforms.

The example file

% lwid.ps

0 0 moveto

gsave 100 200 lineto 2 3 scale

1 0 0 setrgbcolor stroke grestore

gsave 200 100 lineto 0.5 0.3 scale

0 1 0 setrgbcolor stroke grestore

4 Special thanks to DC for providing the ability to definecustom keys in graphicx.

254 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 107: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Mixing TEX & PostScript : The GEX Model

Figure 2: Fragment of a sample gears.eps

included with \includegraphicsgears.eps

gsave 200 200 lineto 0 0 1 setrgbcolor

[0.18672 -0.565306 0.87384 -2.64563 0 0]

setmatrix

stroke grestore

showpage

should produce three lines from the origin. Distiller,however, will miss the middle line. GEX, on theother hand, will produce correct output:

Near-degenerate matrices are not a perverted aber-ration: they tend to be generated by common soft-ware, such as CorelDraw. The particular set of num-bers in the source above came from a Corel example.

While GEX does the work correctly in mostcases (the precision limit in PDF guarantees that noPS 7→PDF conversion can work correctly in all cases):some distortion of the line widths is possible and isnot avoidable.

Level 1 strokeadjust Some graphics applications(for example, Freehand) output Level 1 PostScriptcode which fits the coordinates to an integer grid.This code, if executed literally, will produce ratherdisastrous results with GEX. Figure 2 shows one ofthe “real-life” examples.

The nature of the problem is a bug (or feature)in the Freehand adjustment code which does not

Figure 3: Same as Fig. 2 included with\includegraphics[innerscale=4]gears.eps

bother to check for the device matrix and assumesthat it corresponds to the output pixel resolutionof 300 dpi or higher (which would imply a devicematrix [4 0 0 4.. ..]). However, the GEX devicematrix is chosen to be an identity, to avoid extrarounding by TEX’s ⇔ GEX’s coordinate translation.This causes extremely coarse coordinate rounding(72dpi) in the default case.

GEX’s workaround to this problem consists of\specials that switches the device matrix to an ap-propriate one; this is incapsulated in the

innerscale=

option to the \includegraphics.The corrected picture on Fig. 3 was processed

with innerscale=4.

Level 1 / 2 differences While PostScript Level 2is supposed to be a superset of Level 1, it is wrongto conclude that PostScript graphics displayed cor-rectly on a Level 1 interpreter will appear the sameway (or at all) on a Level 2 interpreter. It is alltoo common for .eps files to actually check the in-terpreter version and then execute totally differentcode, depending on the version found.

Both images came from the same PowerPoint-produced .eps file. Since in this case the end usermight prefer the Level 1 appearance (but in someother .eps, perhaps in the same document, Level 2may be required), GEX provides an ability to switchbetween Level 1 and Level 2 dynamically. On thelower level, this is done by the

N .setlanguagelevel

extension operator. Alternatively, the user mightprefer to use the gexlevel option provided for the\includegraphics command and enter

\includegraphics[gexlevel=N ]paths.eps

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 255

Page 108: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Alex Kostin & Michael Vulis

Rr

Figure 4: Level 1 appearance

Rr

Figure 5: Level 2 appearance

Feedback to TEX

Since both TEX and GEX operate at the same time,it is possible to make them share information. Whilepassing information from TEX to PostScript is triv-ial and has been done for ages (by putting them in-side the PostScript language \special, in the caseof VTEX, \specialpS:..), getting informationback from PostScript is new.

In GEX this is accomplished by PostScript syn-tax extensions that allow access to TEX \toks reg-isters within GEX. The three new operators are:

• 〈int〉 〈string〉 .tkread 7→ 〈int〉 〈string〉

where the 〈int〉 parameter should be between0 and 65535 and designate a TEX token reg-ister5; the 〈string〉 parameter is the receivingstring. In the output, the integer value is thenew length of the string; the string contains thecontents of the \toks register.

5 Not a typo; the VTEX compiler has larger limits thanother versions of TEX and \toks10000 is legitimate.

Control sequence tokens are converted to spacesduring .tkread; they are counted as one char-acter for .tklength.

During .tkread a rangeerror may occur if the\toks register contains more characters thancan be placed into the receiving string; one canuse the .tklength operator to find out how bigthe receiving string should be before allocatingit.

• 〈int〉 .tklength 7→ 〈int〉

where the 〈int〉 parameter should be between 0and 65535 and designate a TEX token register;the output integer is the length of the contentsof the TEX \toks register.

• 〈boolean〉 〈int〉 〈string〉 .tkwrite 7→

where the 〈boolean〉 argument determines if thedata should be appended to the \toks contents(true) or overwrite it (false); the 〈int〉 param-eter is between 0 and 65535 and designates aTEX token register; the contents of the 〈string〉parameter will be globally placed into the spec-ified \toks register.

Token strings produced by .tkwrite containonly tokens with TEX \catcode 12 (other).

The interface is deliberately kept very general;It is assumed that a TEX macro writer would unpackthe \toks string as desired.

Here is how one can try to use GEX to generatea few random numbers:

\def\rand%

\specialpS: false 100 rand

10 string cvs .tkwrite%

\the\toks100

The numbers are = \rand, \rand, \rand.

The numbers are = 16807, 282475249,1622650073.

Immediate execution

While the syntax above provides a way to deliverinformation from GEX to TEX, the information willarrive too late to be of much use. This is because\specials are executed during the page building(\shipout), when it is too late to use the returneddata. For this reason, the example as written abovewill actually not work as specified.

While it is possible to overcome the problemwith usual TEX multi-pass tools (the .aux file), wechose to instead enhance TEX with the

\immediate\special...

256 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 109: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Mixing TEX & PostScript : The GEX Model

form. The semantics here are identical to thosewhen the \immediate command as used with thefile operations which are already in TEX.

Besides making the example above work, theimmediate form of \special proves very handy ina number of other cases, for instance:

• setting the background color for a page

• defining a PostScript header file

• thumb generation specials (PDF mode)

These actually cause difficulties for VTEX: a DVI

driver can scan a page ahead to see if such \specialsare present, but the one-pass nature of VTEX com-pilation requires them to be processed before the\shipout gets under way; the immediate form solvesexactly this.

Creating objects in immediate mode

The GEX feedback can be used for many purposes,some of which can be accomplished by TEX means (ifbarely) and some which cannot be. One reason is be-cause PostScript is a better computational languagethan TEX, and the \immediate form of \special

makes it fully available to TEX. trig.sty, for ex-ample, is one casualty of this approach.

More interestingly, PostScript is more awarethan TEX of the nature of the graphics objects thatare in the document. For example, it is possible touse GEX to compute the exact locations of the ex-tremes in a graph and then pass these locations backto TEX for placing of tags.

To allow development of this type of applica-tions, we provide some additional machinery:

• It is allowed to have GEX compile and gener-ate code for graphics objects in the \immediatemode; this code, however, is written to a mem-ory stream.

• A memory stream can be frozen and closed withthe \specialice command (naturally, an-other \immediate); when a stream is closed,its handle is provided in the \pdflaststream

register.

• As graphics are drawn, the placement of theTEX tags can be computed as well, and reportedto TEX via \toks.

• A stream is placed into the output page withthe \special!stream ... command. Herewe do not use the \immediate form, since thegraphics should be emitted and properly placedduring the usual \shipout.

Note: Code emitted prior to the \shipout

cannot go to the output page right away since theformatting of the output page is not yet known.

Thus, such code is emitted relative to the (0, 0) ori-gin; during the actual \shipout the code is shiftedto the position of the \special!stream... com-mand.

The technique outlined above has been success-fully utilized in several new macro packages, includ-ing vfplot. They, however, use the extensible na-ture of GEX as well, and it would be prudent toexplain this first.

Extending GEX

While in principle PostScript has as much compu-tational power as a conventional programming lan-guage, writing computations in PostScript is muchmore time consuming than in, for example, C or Pas-cal. (Complex PostScript code may also take a longtime to be interpreted.) The .extend operator inGEX seeks to add the extra power of conventionalprogramming to GEX. In essence, a user can imple-ment extra computational (or drawing) abilities in acompiled dynamic library (DLL for Windows/OS2,SO for Unix/Linux), then have these abilities avail-able as new PostScript operators.

We call such addon DLLs GEX plugins.Syntactically, one writes

(pluginname) .extend

where pluginname refers to the name of a DLL (Win-dows/OS2) or a shared library (Linux/Unix) whichcontains the implementation of new extension oper-ators. Upon encountering the above line, GEX will

• look for the requested plugin module

• ensure that its version matches the version ofthe GEX interpreter

• find out which new operators are implementedin the library, add their names to the PostScriptnamespace, and record the location of their im-plementation code.

Upon encountering a new operator, GEX calls theimplementation code in the plugin.

GEX API

The GEX Application Programming Interface (API)represents PostScript internal operators as callbackfunctions. For example, where a PostScript programwould execute

10 20 moveto

a GEX plugin written in C shall do

GeXi->moveto(10,20);

The C/C++ API is specified in the gexi.h headerfile; it generally parallels PostScript drawing opera-tors.

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 257

Page 110: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Alex Kostin & Michael Vulis

Rather than list the entire API here, we shalloutline its principles:

• GEX API functions call the GEX kernel and aregenerally equivalent to PostScript operators.

• GEX API functions return 0 on success, andthe PostScript error number on failure; it is theplugin’s responsibility to handle the errors.

• GEX API functions cover most PostScript draw-ing abilities, but not text output. This is be-cause plugins are not intended to do text for-matting; this task should be passed over to TEX.

• The GEX API includes functions for workingwith the PostScript operand stack.

• An exception to the above is the show() func-tion which is provided for the purposes of de-bugging only.

• Just like GEX itself, plugins can talk to TEX;this is done with the tkwrite(), tkread(), andtklength() functions.

For example, an extension operator square canbe defined to draw a 10×10 square with C code likethis:

int square(GEXI GeXi)

double x,y;

if (GeXi->currentpoint(&x,&y)!=0)

return error_nocurrentpoint;

GeXi->lineto(x+10,y);

GeXi->lineto(x+10,y+10);

GeXi->lineto(x,y+10);

GeXi->setrgbcolor(1,0,0);

GeXi->closepath();

GeXi->fill();

return 0; //success

This example is, of course, useless: it is so simplethat the task can be accomplished much easier inPostScript. However, the benefits of C programmingbecome clear in more complicated cases.

PieChart

The first GEX plugin was the PieChart plugin. Theimplementation consists of

• piechart.[dll|so], the extension library.

• piechart.sty, a matching LATEX2ε style, toshield the interface details from the end user.

The code below shows how the end user may beusing the plugin; a TEXnically minded person mightalso want to examine the sources which are availabletogether with the GEX API description.

%% Define some colors

\definecolorlightyellrgb1,1,0.75

LATEX 2e

Plain TEX

AmSTEX

LATEX 2.09

Other

Figure 6: Shares of TEX dialects

\definecolorpeachcmyk0,0.50,0.70,0

\definecolororangecmyk0,0.61,0.87,0

\definecolornavyblucmyk0.94,0.54,0,0

\begincenter

Shares of \TeX\ dialects:\par

\fbox\beginPieChart[rt]1.8in

\PieSlicelightyell65\LaTeX\ 2e

\PieSlicegreen20Plain \TeX

\PieSlicenavyblu10AmS\TeX

\PieSliceyellow4\LaTeX\ 2.09

\PieSliceorange1Other

\endPieChart

\endcenter

%%

A sample PieChart produced by this extension isshown in Figure 6.

Vchart

While PieChart is simple enough that it can be im-plemented in TEX/inline PostScript, its descendant,Vchart, breaks the barrier.

The Vchart package implements several formatsof business graphs. Like PieChart, it is a combina-tion of a plugin and a macro package.

To structure the user input, Vchart providesseveral environments. One defines the colors:

\definecolorc1rgb.565,.592,1

\definecolorc2rgb.565,.184,.373

\definecolorc3rgb1,1,.753

the headers:

\beginheadersides

\entry[fillcolor=c1]West

\entry[fillcolor=c2]East

\entry[fillcolor=c3]South

\endheader

\beginheaderABCD

\entryA\entryB\entryC\entryD

258 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 111: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Mixing TEX & PostScript : The GEX Model

\endheader

and the data:

\begindatatableexample

20.4 & 27.4 & 90 & 20.4 \\

30.6 & 38.6 & 35.6 & 31.6 \\

45.9 & 46.9 & 45 & 43.9 \\

\enddatatable

and applies the \DrawGraph command.The first graph in the series below has been

produced with

\colorboxgrbkcolor%

\DrawGraphgraphdata=example,

graphtype=column,width=100pt,

height=70pt,rowheader=sides,

colheader=ABCD

The other graphs differ only in the graphtype=setting. The separation of data from the actual com-mand allows to produce different charts from thesame values.

Vfplot

The most powerful GEX plugin designed so far is Vf-plot. The name stands for the Visual Function Plot;Vfplot converts functions given as formulas into theplots within the document. Unlike the facilities of-fered by standard plotting tools (MathCad or Mat-Lab), Vfplot was specifically designed with TEX inmind; the plots it produces are visually compatiblewith the TEX document (plots use the documentfonts and TEX-formatted text).

Like the plugins mentioned above, Vfplot comeswith a comprehensive macro package (vfplot.styfor LATEX2ε and vfplot.tex for Plain TEX) whichscreens the plugin details from the end user.

Samples of inputs to Vfplot and its outputs areshown in figures 8, 9, and 10.

Vfplot and PSfrag

In principle, plots similar to Vfplot’s can be also beachieved using a standalone math plotting system(like MatLab) in conjunction with the PSfrag pack-age. The basic advantage of Vfplot is that the plotis an integral part of the TEX document; it can bechanged by changing the plot code within a TEXfile directly, or employing the Visual plot editor (seebelow). PSfrag, on the other hand, is essentially awrite-once format, which requires a separate pro-gram for making the plot and additional manualwork in setting the substitution tags.

However, PSfrag also has an advantage of beingmore portable; Vfplot (and plugins in general) areVTEX-specific.

Graph Type/type Result

Column graph/graphtype=column

0

10

20

30

40

50

60

70

80

90

100

A B C D

Bar graph/graphtype=bar

A

B

C

D

0 10 20 30 40 50 60 70 80 90 100

dots and lines/graphtype=dots

0

10

20

30

40

50

60

70

80

90

100

A B C D

Radar graph type/graphtype=radar

0

20

40

60

80

100

Doughnut graph typegraphtype=doughnut

Figure 7: Sample Vchart output. Notice thatVchart does not have a piechart type of graph;but a pie, after all, is just a degenerate doughnut.

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 259

Page 112: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Alex Kostin & Michael Vulis

\beginplot[legend=rt]x-axis=MyAxis1,y-axis=MyAxis2,plotfill=CoorFill0

\function[linetype=MyLine1]

[minlimit=-3.14,maxlimit=3.14,level=0,hatching=FunHatch,fill=FunFill]

x/2+sin(x)+cos(x^2) | x in [-5,5]$+x\over 2+\sin x+\cos x^2$

\endplot

-10.0

-5.0

0.0

5.0

10.0

−π π−2π 2π

+x

2+ sin x + cos x2

Figure 9: Vfplot drawing: Color Map

\beginplot

x-axis=SineXAxis, % use a predefined axis

y-axis=SineYAxis,

gapsfill=Sunset2 % use a predefined

% gradient stretch

\function[linetype=MyLine]sin(t)

\endplot

y = sin(x)

0.0

0.2

0.4

0.6

0.8

1.0

0 π/4 π/2 3π/4 π

Figure 8: Vfplot drawing: 1D Plot

We, therefore, support exporting Vfplot envi-ronments into .eps/.inc file pairs; the .eps filecontains the plot itself, while an .inc file containsa PSfrag wrapper for it.

Vfplot Visual Frontend

While it entirely possible to create Vfplot input “by-hand”, the number of possible parameters is so largethat a Visual frontend becomes useful. Such a fron-tend currently exists under Windows only; its func-tionality includes abilities to

• edit plot environments within TEX documents.

• visually manipulate all possible options of suchenvironments:

• instant preview of the plot:

260 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 113: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Mixing TEX & PostScript : The GEX Model

\beginplot3dx-axis=AxX,y-axis=AxY,

z-axis=AxZ,isolines=false

\function[x-numpoints=60,y-numpoints=60,

uppersidefill=MyFill3,

lowersidefill=MyFill2,lineoff]

(1-x)^2+100*(y-x*x)^2 | x in [-1.5,1.5];

y in [-0.5,1.5]

\endplot3d

1.51.00.50.0-0.5-1.0-1.5 X-axis

10−2

10−1

1

10

102

103

Z-a

xis

1.5

1.2

0.8

0.5

0.2

-0.2

-0.5

Y-axis

Figure 10: VFPlot drawing: 3D Plot. The Rosenbrock function, z = (1 − x)2 + 100(y − x2)2

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 261

Page 114: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Alex Kostin & Michael Vulis

as well as somewhat slower full plot. (The in-stant preview does not expand TEX notation).

• export plots in many bitmapped formats.

• export plots as .eps, or .eps together with aPSfrag header (.inc).

Image processing

One important place where GEX differs from ordi-nary PostScript is the image handling. In “normal”PostScript, image is a primitive operator. By de-fault, it is the case in GEX as well; however, imageis implemented as a combination of two new exten-sion operators:

.loadimage does the unpacking and produces animage object on the operand stack.

.produceimage emits the image object to the out-put stream.

Thus, one can define

/image .loadimage .produceimage def

without changing the way image operates.Similarly, imagemask and colorimage use

.loadimagemask for the unpacking of theimagemask data

.loadcolorimage for the unpacking of thecolorimage data

and are internally defined as

/imagemask .loadimagemask

.produceimage def

/colorimage .loadcolorimage

.produceimage def

By itself, this adds nothing. However, it opens adoor for inserting a new operator between the twocomponents of image:

/image .loadimage myfilter

.produceimage def

Such an operator can manipulate the image data inmemory.

A filtering operator as defined above cannot bewritten in PostScript — there is no image data typein the PostScript language; and from the point ofview of the PostScript processor, image is just anint. A curious user can see this by trying

/image .loadimage pstack

.produceimage def

However, image filters can be easily implemented viaplugins.

Two plugins have been developed to performimage manipulations:

TransBit can alter the color model of the image.One of the applications is to convert color (RGB orCMYK) images to grayscale for printing purposes.TransBit functionality also covers the brightness andthe contrast of the image.

Degrade downsamples the image; this can be usedto decrease (often, greatly) the size of the resultingoutput file.

Both plugins take additional parameters. For ex-ample, if we want to brighten an image by 10 units,we would issue

\specialpS: (transbit) .extend

\specialpS: save

\specialpS: /image .loadimage

(toBright 10) transbit

.produceimage def

\includegraphicsmypic.eps

\specialpS: restore

The save/restore pair is needed to restore theoriginal definition of image.

The functionality of both plugins has been in-corporated in the \includegraphics command, sothe end user will merely write

\includegraphics[brightness=10]mypic.eps

Note: The graphicx package automaticallyloads the required plugins upon seeing keys that areimplemented in plugins.

Non-PostScript images

Although the above functionality applies to imagesstored within PostScript code (like the ones pro-duced by jpeg2ps), we can easily extend it to thebitmapped image files.

The idea here is to be able to load image filesinto the GEX/PostScript environment; this is donewith the .readimage extension operator. This op-erator takes a string argument with the image filename and converts it to an image object on the Post-Script operand stack; such an object can be followed

262 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 115: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Mixing TEX & PostScript : The GEX Model

up by a .produceimage or by imaging filter(s), andthen by a .produceimage.

The end-user interface is again trivial. For ex-ample:

\includegraphics[colorspace=grayscale 16]

picture.gif

will load the picture.gif file into GEX, and convertit to a 16-color (4-bits) grayscale using the TransBitplugin.

TransBit example

The examples in this and subsequent sections showthe same image, macaw.jpg, processed with differ-ent \includegraphics keys. The original pictureappears in the middle of the first example. Trans-Bit related keys are brightness, contrast, andcolorspace; these keys force the image processingvia .readimage, followed by a plugin application.

Sample code

\includegraphics[width=1.3in,

contrast=-0.3]macaw.jpg

\includegraphics[width=1.3in,

contrast=0]macaw.jpg

\includegraphics[width=1.3in,

contrast=+0.3]macaw.jpg

results in

contrast=-0.3

contrast=0

contrast=+0.3

Color model conversion would be, in particular,of use when the document is to be eventually printedon paper. For example, type\includegraphics[width=1.3in,

colorspace=bw]macaw.jpg

\includegraphics[width=1.3in,

colorspace=grayscale 16]macaw.jpg

\includegraphics[width=1.3in,

colorspace=grayscale 256]macaw.jpg

to produce

colorspace=bw

colorspace =

grayscale 16

colorspace =

grayscale 256

Color space conversion to grayscale also oftensubstantially reduces the size of the output.

Degrade example

The Degrade plugin is triggered by the degrade keyof \includegraphics; degrade=1 corresponds to nodownsampling.\includegraphics[width=1.3in]macaw.jpg

\includegraphics[width=1.3in,

degrade=0.6]macaw.jpg

\includegraphics[width=1.3in,

degrade=0.4]macaw.jpg

\includegraphics[width=1.3in,

degrade=0.3]macaw.jpg

\includegraphics[width=1.3in,

degrade=0.2]macaw.jpg

\includegraphics[width=1.3in,

degrade=0.1]macaw.jpg

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 263

Page 116: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Alex Kostin & Michael Vulis

degrade=0.6

degrade=0.4

degrade=0.3

degrade=0.2

degrade=0.1

The transformations given above usually resultin a drastic decrease of the size of the output. Aminimal TEX source file which consists of a solo\includegraphics with different degrade= coeffi-cients will result in PDF files of decreasing sizes:

Coeff. File Size

Uncompressed Flate-Compressed1.0 1,278,158 1,029,3770.6 459,780 392,8630.4 204,804 181,2560.3 115,908 104,7140.2 51,970 47,9320.1 13,952 13,242

Note: Downsampling can also be accomplishedby means of the Discrete Cosine Transform; thisis triggered by the dct and dctquality keys for\includegraphics. For photo-quality images thisoften leads to better results.

Color stack issues

The color package offers two distinct ways to main-tain color: rely on the color stack in the backend(usually, a DVI driver), or — when such a stack isnot available — emulate it within TEX.

As turns out, with GEX neither approach isfully adequate. The color stack within TEX is gen-erally incapable of preventing color leaks from onepage to another; but full use of the backend colorstack is not possible since GEX already implementsthe full PostScript graphics state stack (GSS). Whilethe GSS saves colors, it also saves the current point.This breaks some of the PStricks sub-packages, suchas pst-text or pst-path.

The workaround used in GEX is to support bothTEX and backend color stack approaches:

• vtex.def provides a macro \if@colorstack;when true, the color style uses the GSS stack;when false, color emulates the color stackwith TEX means.

• By default, \if@colorstack is true; the drivercolor stack is used.

• Environments like pspicture are redefined toset \if@colorstack to false; this assures thatPStricks are not broken.

Credits & Acknowledgements

The VTEX/GEX system itself was written by MichaelVulis. Most of the supporting macro packages werewritten by Alex Kostin. Vchart was written by Kir-ill Lebedev. Other plugins quoted in the article havetheir respective authors.

The authors wish to express thanks to

• Walter Schmidt and Taco Hoekwater for extra-ordinary efforts in making the freeware versionsof VTEX possible.

• Denis Girou and Timothy van Zandt for coop-eration and help in cleaning bugs in PStricksand Seminar which made their use with GEXpossible.

• David Carlisle for providing an extendable ver-sion of the Graphics package which makes a nat-ural interface to GEX features possible.

• Heiko Oberdiek for outstanding efforts in mak-ing sure that Hyperref manages all the multiplemodes of VTEX.

• Many end users who discovered and reportedbugs in GEX — thank you all — and please sendmore.

264 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 117: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Abstract: The AsTEX Assistant and Navigator

Michel LavaudDepartement des Sciences pour l’Ingenieur, CNRS

F-91405 Orsay Cedex France

[email protected]

Abstract

The Assistant AsTEX is a program to aid the use of TEX under Windows 95/98/NT. It permits the entry of commands or collections of commands in anyWindows editor via use of toolbar buttons rather than entering at the keyboard.

The Navigateur AsTEX allows navigation in dvi, ps, or pdf documents byclicking on elements provided in a navigation window.

It provides an interface independent of the program used to visualise thedocument. The programs that work with this standard include Dviwin, Dview,GSview and Acrobat Reader.

Michel Lavaud

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 265

Page 118: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

LATEX And The Personal Database

Bernice Sacks Lipkin9913 Belhaven RoadBethesda MD [email protected]

Abstract

Ignoring fixed-size and coded field formats, text databases can be viewed as eitherASCII-delimited or ID-prepended. ASCII-delimited databases reserve a particularsymbol as record delimiter, and another symbol as field delimiter. ID-prependeddatabases mark the start of each new field with stylized text unique to that fieldtype. Personal means that the record can take any form the database ownerdesires, from the rigidly-structured, where the informational fields are in thesame order in each and every record in the database, to the totally unstructuredrecords of ordinary documents.

TADS is a set of integrated programs that manipulate the text in a personaldatabase. Using TADS, field-specific LATEX instructions can be made an intrinsicpart of an ASCII-delimited database from its inception. To create a bibliographicdata base and incorporate items from the database into manuscript text requiresthat the writer do two tasks:

1. Using TADS, the writer creates a customized data entry program that willprompt for keyboard input to create the field order he wants; e.g., author, title,

journal, etc.. The data entry program writes a skeleton LATEX file, complete withskeleton commands, one per field. These macro names, which also prepend thefields in each database record, define font size and shape.

2. In writing a document for publication, the writer alludes to citations inthe document, using whatever phrases he can recall. The allusions are writtenwithin brackets; for example, Smith et al <smith*199?*tadpole*> suggested. . .

Under a script that stacks TADS program modules with the appropriate options,these allusions are extracted from the document, and serve as wildcard matchwords to pull out records in the derivative database. Records are automaticallysorted by number or by Name-Year and the numbers (or Name-Year) substitutedfor the allusions in the document. Fields can be rearranged or omitted in thebibliography; and the accompanying LATEX field macros can be redefined for thefont and style requirements of the particular journal.

Introduction

This paper presents some of the ideas that are ex-plicated more fully in a monograph in preparationon human-aided computer manipulation of biblio-graphic databases.

TADS1 is a set of gofer utilities for text process-ing. It has no artificial intelligence, no understand-ing of the meaningfulness of the text that it findsand manipulates. At the other extreme, in contrastto data mining, it doesn’t pull out patterns statisti-cally. It does recognize features of the text. It canpick out vowels or digits or all the letters of the al-phabet or all the alphanumerics. It knows the start

of a field from the rest of the field and where fieldsare located on disk. It can match words exactly orfind a word in the field or do wildcard matching.With these simple skills, it does text substitution

1. TADS is an acronym for Text Analysis, Description and

Synthesis. It is the latest reincarnation of a set of text manip-

ulation and string processing programs. Variations of many

of these programs were first written in the 1970s in Sail; the

system was called MaText. A later version called TXT was

written for the Microsoft C compiler and a DOS-Windows en-

vironment. It is documented in String Processing and Text

Manipulation in C, which came with a copy of the source code

for many of the functions on floppy. The book is currently

being revised for a Linux-Unix environment. The programs

now work with any size record.

266 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 119: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

LATEX And The Personal Database

and sorts records alphabetically or by class. There’seven a job called lazyboy sort, where the machine fig-ures out subclasses by examining the text. It com-presses records vertically and links files horizontally.It makes statistical tables by tallying frequencies oflinked words. It has no preconceived ideas abouthow to terminate a record or a field; you tell it therecord delimiter, and if the record has more thanone field, the field delimiter. It does insist that youreserve these marks — usually punctuation marks —as delimiters; that is, you can’t use them in the bodyof the text.

TADS works with the text you give it, what-ever it is. It works with your personal database,one that you design. If the input is a flat relationaldatabase — where the number of fields in each recordis the same, the types of information in the sequenceof fields are the same and fields are not subdivided—it can treat the fields as columns, and do all the find

and retrieve tasks we expect from a search engineoperating on a highly-structured simple database.But it is just as happy if it is directed to operate ona semi-structured database, where the first fields arepredictable, and the later fields are unstructured—clinical notes for example. It can handle hierarchi-cal fields, which include subfields or even subsub-fields, a format that truly keeps data that belong to-gether together. TADS treats ordinary manuscriptsas records, if you declare the period as record delim-iter. To partition a sentence, declare the comma asfield delimiter. Obviously, not as many operationscan be done on unstructured fields. But you can,for example, treat an entire book as a single recordand extract all the test phrase that are brackettedby <> or [] or () or whatever.

In Figure 1, the first example is a flat databaserecord, one where each field contains a single itemof information. The second keeps all the data onjobs in one field. It is an example of a hierarchi-cal database, where the field is subdivided into sub-fields, and the subfields are partitioned into subsub-fields. The number of subfields usually vary fromrecord to record. Subsubfields are generally rigidlystructured because they are usually designed to pro-vide quantitative results dependent on informationthat is ordered in time or in some other dimension.

Adding an unstructured Notes field to the firstrecord would not affect its processing but would con-tribute to its functionality. It could act as a re-minder of the times the consultant was used. Thefield could also be made private for evaluations andassessments by filtering the Notes field out beforethe file could be examined publically.

TADS searches are fast, but not as fast as google

or dogpile. Much of what it does is done by com-mercial database managers. It does, however, havesome nice features. It can handle any size record,any size field. It operates just on the fields you wantprocessed. Any and all databases can be read andmodified by you whenever you wish. (Of course, ifyou change a file that is searched by way of a TADS-created index, you will have to— or TADS will haveto —redo the index.) The original database is al-ways readonly, but TADS can send records that weremodified to one file, records that were unaffected toanother, eventually creating a genealogical tree that,properly manipulated, does the equivalent of AND,OR and NOT booleans.

When the programs were applied to databaseswith relatively simple structure — lists of biblio-graphic citations — I ran into a practical problemthat was not large and interesting but small and an-noying: the impossibility of picking a font formatthat would need no revision. For efficiency, markupinstructions are usually embedded directly into thedatabase text from the start. This can, however,produce problems downstream. What if one jour-nal wants Volume numbers bolded, another wantsthem italicized, the next slanted. Redoing font in-structions can be laborious, especially if you needto change the markup instruction in only one or twospecific fields in every record, whenever you mustuse a different font. Alternatively, it is possible tomaintain a database in unformatted text, adding ex-act instructions as needed. But this suffers from thesame need to revamp much of the text.

More recently, I’ve started working with the ID-prepended format. An ideal example is an item froma MEDLINE download, such as the one shown in Fig-ure 2. (I’ve omitted the Abstract field.) Keys to thearticle are listed individually in the Mesh Heading(MH) fields. The download format is stylized. Fieldnames are two-letter, followed by two spaces, a hy-phen and a space. What is a single hierarchical fieldin an ASCII-delimited record is split into individualfields. Field order is always the same. The UniversalIdentifier (UI) is always first. It is always followed bythe author(s), the title, the language, and so forth.

Look at the figure. It is obvious that if youprepend a backslash to the field ID, substitute a leftbrace for the “ - ” and add a right brace at the endof the field, you have a LATEX macro command withits text argument, a different macro command foreach type of field. Naturally, you must define thisnew command, flesh out the font size and shape.By defining a macro for each type of field in thepreamble, you can control the print characteristics

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 267

Page 120: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Bernice Sacks Lipkin

Flat field. The record delimiter is !. The fielddelimiter is /. They can not be used in thebody of the record. Notice that the end ofthe final field is not a diphthong; i.e., it termi-nates with the record delimiter, not the fieldand record delimiters.

ConsultantFile0027/1994/

Smith, John M./electrical

engineering/Ph.D., U

Calif./99 First Street,

Lakeview 11111 WI!

Hierarchical field. The field delimiter is /, thesubfield delimiter is % and the subsubfield de-limiter is $. Two fields are shown: one simple,one hierarchical. John Smith may have heldany number of positions, but each position sub-field has a fixed number of subsubfields, threein this example — title, university and startingdate.

John M. Smith, Ph.D./

Ph.D.$U. of Calif.$1957%

PostDoc$Yale$1959%

Asst Prof$Yale$1963%

Assoc Prof$Wisconsin$1967%

Prof$Wisconsin$1971/

Figure 1: Two types of database fields.

of the individual fields. This doesn’t solve all theproblems of modifying print appearance on the fly.But it helps.

The notion of tagging a record with a com-bined command name and field identifier when itis added to the database can be applied to ASCII-delimited records. The format I’m currently explor-ing is transitional; it has characteristics of both theASCII-delimited and the ID-prepended formats. Itstill relies on a record delimiter, the ˜, and field de-limiters, the /, to isolate and partition the record.This is an example after it was keyed in under adata entry program designed specifically for thesefield types and the fields rearranged.

\ACNUMDemoFile01/\NAMEYEAREisthen, 1992/

\AUTHOREisthen, H.L./\YEAR1992/\TITLEPhylo-

geny of the Vomeronasal System and of Receptor

Cell Types in the Olfactory and Vomeronasal Epi-

thelia of Vertebrates/\PAGES1-21/\JOURNALMi-

crosc. Res. Tech./\VOLUME23/\ISSUE1/ / /

/ / /\NOTES93004928~

A database is stored in ASCII with prependedIDs, which are actually LATEX macro commandnames. The end of a field in the current versionis redundant: it has both a right bracket that weneed for LATEX anyways plus a field delimiter. Insome files, I’ve eliminated the field delimiter alto-gether, using the both for LATEX syntax and fielddelimiter. But I won’t do this in a general way un-til I’ve convinced myself that there’s no interferencewith TADS in general, or at least in the major rami-fications and combinatorics of using its modules in asequence to get a particular result. The current for-mat clearly does not interfere with the programming

jobs that turn a database record festooned with tagsand extraneous information into a well-behaved ref-erence suitable for publication.

At this point, you are probably thinking BibTEX.BibTEX is indigenous to LATEX. It has a multitudeof formats, is easy to use and does much of its worktransparently. TADS was not designed as a biblio-graphic database manager. It has little terminologyspecific to bibliography. In fact, it has little termi-nology. Labeling fields is a major innovation. But itremains a set of general programs, each with multi-ple options, that leaves it up to you to work out thecorrect sequence of programs and the appropriateoptions to do a particular task. Once a database iscreated and a map for obtaining the desired resultis drawn— e.g., run dork task 3 with these options,then run addtext task 4 with these options, and soforth— it is simple enough to run the job from ascript.

One such job is integrating a canonical bibliog-raphy and manuscript for a particular journal. Torun the programs that do this, you first need to dotwo things:

Acquire a database.To use TADS, you must add at least a recorddelimiter or, better still, a record delimiterand field delimiters, to each record in the file.That’s it. TADS will extract a list of citationsfrom a database, alphabetize it, number it, andsubstitute the numbers in the manuscript. Butthere are advantages to building in LATEX macronames from the start. This paper describes aprogram that writes a data entry program tosupervise the creation of a database from text

268 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 121: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

LATEX And The Personal Database

UI - 20002969

AU - Keverne EB

TI - The vomeronasal organ.

LA - Eng

MH - Action Potentials

MH - Afferent Pathways

MH - Animal

MH - Behavior, Animal

MH - Chemoreceptors/chemistry/*physiology

MH - Female

MH - GTP-Binding Proteins/metabolism

MH - Human

MH - Hypothalamus/physiology

MH - Male

MH - Neurons, Afferent/*physiology

MH - Olfactory Bulb/physiology

MH - Pheromones/physiology

MH - Receptors, Cell Surface/chemistry/genetics/*physiology

MH - Signal Transduction

MH - Vomeronasal Organ/anatomy & histology/innervation/*physiology

RN - EC 3.6.1.- (GTP-Binding Proteins)

RN - 0 (Pheromones)

RN - 0 (Receptors, Cell Surface)

PT - JOURNAL ARTICLE

PT - REVIEW

PT - REVIEW, TUTORIAL

DA - 19991105

DP - 1999 Oct 22

IS - 0036-8075

TA - Science

PG - 716-20

SB - M

SB - X

CY - UNITED STATES

IP - 5440

VI - 286

JC - UJ7

AA - Author

EM - 200001

AD - Sub-Department of Animal Behaviour, University of Cambridge,

Madingley, Cambridge CB3 8AA, UK. [email protected]

RF - 56

PMID- 0010531049

PID - 7933

SO - Science 1999 Oct 22;286(5440):716-20

Figure 2: An Item from a MEDLINE Download.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 269

Page 122: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Bernice Sacks Lipkin

entered from the keyboard. It treats the keyed-in text as arguments to LATEX commands. Youcan, instead, add macro commands to an exist-ing database or to one you download from theNet or get from a scanned image.

Add allusions to the manuscript.As you write your manuscript, you tuck snipsof information about particular references in-side brackets. The program extracts these al-lusions, bounces them against the bibliographicdatabase, extracts the matched records, ordersthem by accession number or Name-Year, andsubstitutes the order tags for the allusions inthe manuscript.

Using TADS, this is the sequence of tasks thatresults in a database:

1. Write a file of instruction records. We will call itLbiblio.ins, but you name it as you like. Eachinstructional record provides the directives tocontrol the entry of a single field in what willeventually be a single database record.

2. Run Lquegen. It will use the information inLbiblio.ins, together with your answers to itsonline questions, to write you a customized dataentry program. We will call the source codefor the data entry program Lbiblio.c. You canrun Lquegen as often as you like, using differentinstructional files to develop different styles ofdatabase.

3. Compile Lbiblio.c. You don’t have to be a pro-grammer. A Make file is provided.

4. Run Lbiblio. It has sufficient flexibility to cre-ate databases for different scientific disciplines,each with its own control file, each of which hasthe format given it by Lquegen. Actually, if youknow C, you can go into the source code andmake some minor adjustments to change theformat.

5. Lbiblio needs to know where to send the pro-cessed text. Suppose we call this file Lbib.db.The first time you run Lbiblio to create recordsfor Lbib.db, it ships the start of a LATEX file witha set of commands, one per field, to Lbib.db.The macro name for a field is based on theprompt for that field.

6. Each time you run Lbiblio, it will store the val-ues for the options you choose in the control file,the TRL file, whose name you specify. In thisexample, it’s called Lbib.trl. The TRL file writ-ten the previous run stores the correct startingaccession number for the current run. And itkeeps a log of each run.

Lbiblio.ins, a file of instructions

Prompts and macro names are specified by giv-ing Lquegen an Instruction File Lbiblio.ins that de-scribes the prompt features of the database entryprogram as a set of records. Each field that is partof the record structure in the eventual database re-quires a separate record in Lbiblio.ins. If there willbe 10 fields in each database record, you need towrite 10 records. Figure 3 has an example of aninstruction file; it has 13 fields in each record.

The delimiters in Lbiblio.ins must be the sameas the ones you will use for the final database. Weuse ‘˜’ as the record delimiter and ‘/’ as field delim-iter. Notice that the record is terminated by ‘˜’, not‘/˜’

Each Instruction File record must have 5 fields.You need not fill in all the fields. A field may beempty, but it must end in a delimiter.

1. FIELD NAME. This must be a single word.When the data entry program is run, this willbe the main prompt. The field name will alsobe the field’s LATEX macro command name, soonly alphabetic characters are acceptable. I’veused upper case on the field names, but there’sno particular reason to do so.

2. EXTRA. This is optional extra prompt text. Ithelps conformity, if different people are typingin the data. It can remind them about punc-tuation and/or word order. It is reproduced aswritten, tabs, spaces, whatever.

3. DEFAULT ANSWER: If you just press ENTER,this will be the default text. The default answeris copied to the database as written. You canoverride it by typing in text. If you want notext in the field in some record, type a spaceand then press ENTER.

4. SUBFIELD: Is this field to be subfielded?YES/NO.

5. AND: Is this subfielded field to be ANDed?YES/NO.

The last two fields require explanation. Thedatabase(s) that will be created will be structuredso that each field is the argument of a specific LATEXcommand, which operates on the whole field. Tomake small changes on the text, the less informa-tion you store in a field, the better. In Lbiblio.ins,notice that VOLUME and ISSUE, which usually areneighbors in a citation, are in separate fields. Unfor-tunately, we don’t usually write individual authorsand editors in separate fields; and most of the mi-crovariation in print appearance between journals isprecisely in these two fields. Using subfielding and\AND is an attempt to solve one problem: does the

270 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 123: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

LATEX And The Personal Database

AUTHOR/:[FirstField] (SUBFIELD.) ex:Brown, A.//YES/YES~

YEAR///NO/ NO~

TITLE/: Title of article, NOT of the book//NO/ NO~

PAGES/: Separate with hyphen. Ex: 164-169//NO/NO~

JOURNAL/: Name of Book-Journal. Default:’Tech Manual X234L’/

Tech Manual 234L/NO/NO~

VOLUME/: ’3’ is the default/3/NO/NO~

ISSUE/: TM234L-0ZN-X34523 is the default/TM234L-0ZN-X34523/NO/NO~

ISBN///NO/NO~

EDITOR/: (SUBFIELD.) Name of editor. ex: A.B. Smith//YES/YES~

CITY/: city where book was published//NO/NO~

PUBLISHER///NO/NO~

BPAGES/: number of pages in book//NO/NO~

NOTES/ keywords, code words//YES/NO~

Figure 3: A File of Prompting Instructions

journal want an and before the last author or an ‘&’or nothing?

A subfielded field is divided into subfields, justas the record is divided into fields. Each subfield isterminated by a character you reserve as subfield de-limiter. Notice that, in the example, the AUTHOR,EDITOR and NOTES fields are subfielded. WhenLbiblio, the data entry program, prompts for textin a subfielded field, it repeats the prompt over andover again, until you press ENTER with no previ-ous text. Subfielding has different uses — separatingauthors to facilitate indexing, separating titles andsubtitles — but its usefulness here is that, with re-cycling, the program knows when you’ve typed thelast author.

YES in Field 5 requests that the program insertan \AND before the last subfield in the field (\AND is acommand we define; the user may redefine it later).It can only be used with subfielded fields. (In thisexample, it isn’t used in NOTES.)

Lquegen interprets the records in Lbiblio.ins

and writes out its understanding in a file called, inthis case, Lbiblio.ins.decode. In a Linux-Unix envi-ronment, you can pause while running Lquegen, readLbiblio.ins.decode and compare it to what you wrotein Lbiblio.ins. This is its analysis for fields 1 and 6in our example design.

Record [1]:

FieldID = AUTHOR

extra = :[FirstField] (SUBFIELD.) ex:Brown, A.

defaultans = (null)

subfld = YES

AND = YES

Record [6]:

FieldID = VOLUME

extra = : ’3’ is the default

defaultans = 3

subfld = NO

AND = NO

Lquegen, a program that writes programs

Choosing delimiters Conflict between differentprogramming systems that operate on a databaseis almost unavoidable. There is no set of symbolsthat are exclusively and universally reserved for pro-gram instructions, with non-intersecting subsets forthe different programming languages. What is textin one language is a directive in another. It is ahappiness-making happenstance when the sequenc-ing of programs is such that while the text is be-ing manipulated by one programming language, itis transparent to the others, until it is their turn.But it takes careful planning to avoid difficulties.Particularly in choosing delimiters.

First, you don’t want to use a character com-monly used in the text itself. This lets out thecomma and maybe the colon and semicolon. In-visible characters are poor choices. Second, the pro-gram reserves control-X, control-Y, and . Allother control characters are OK if LATEX, your ma-chine, compiler and/or script don’t reserve them.Records from the database will be formatted byLATEX, so %, \, & and # are very bad choices. Avoid$, ^ and backspace, which are used in LATEX mathmode.

Good delimiters for a database that will beLATEX-processed are: /, *, @, ‘ (octal 140), | (whichprints as a dash), ’ and " (single and double quotes).The characters = and + are OK if you don’t bring inarithmetic values.

Adding ID fields It is useful to have a perma-nent identifier (ID) to tag each of the records in the

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 271

Page 124: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Bernice Sacks Lipkin

database that Lbiblio will prompt you to construct.Lquegen can add two fields at the end of the fieldsdesigned by the Instruction File (see the examplein the Section on Database Record Format). Theycan be transferred to the top of the record by ge-

nio:rearrange, a TADS program that rearranges andoutputs the fields you specify.

An accession number field.This is an easy way to provide an ID for eachrecord. The first record in the file is 1, the sec-ond 2 and so forth. Because you may eventuallybe merging several data files, it is a good ideato have the ID also indicate the source of therecord or some other name that tells you in-stantly where the record came from. You cantell Lquegen what text should precede the acces-sion number when it asks for Leading Charac-ters; e.g., Molbiol2000: or ClinStudyAA. Thisis a permanent tag for the record. It is notthe accession number that is eventually givento records used by any particular manuscript.

You may, if you wish, make all the accessionnumbers the same size. If you say you wanta minimum width of 6, say, the program willpad each accession number with zeros to makeit 6-digit wide. (You can write a lot of recordsbefore you overflow a 6-digit width.) If you usethe default, the program won’t pad the number.It will use the actual length.

A Name-Year ID field.The program can construct an ID field usingthe name of the senior author and the year ofthe publication. You will need to tell it thefields where these items of information are tobe found. Actually, Lquegen only knows thatit is to use the text of the first field up to thecomma by default; or up to whatever size youstipulate. It uses all the text of the second field.Case can be set for the name: set all letters up-percase, set all letters lowercase, or leave caseas is.

The style of the ID will depend in part onthe text you tell the program to insert betweenthe two items; e.g., Smith2000, Smith:2000,Smith,2000, Smith, 2000, Smith:-2000. Or youcan put a large piece of fixed text between thename and year. And, if you wish, you can selecta width, so that the name is chopped or paddedto conform.

You can also vary the appearance of the recordswhen they are finally ensconced in the database file.You can start each field on a separate line, if youwish. And you can set line width. If the text you

type in has no space (at least 1 complete word)within the requested line width, the program willadd a hyphen to the end of the line prior to out-putting it, and will alert you to the hyphen by caus-ing the bell to ring.

Lbiblio, a data entry program

By the time you type in the last answer, Lquegen

has written you the C source code for a data entryprogram called, in this example, Lbiblio. You com-pile it by running a make file that comes with theprogram:

make FILE=Lbiblio

Once compiled, Lbiblio is immediately ready to actas a prompter for text data that you enter throughthe keyboard and to do housekeeping chores such asadding LATEX macro names and record/field delim-iters.

Initializing the data entry program The pro-gram needs some specific information before it canstart its work. These values can be declared as a setof options on the command line when Lbiblio is run.The minus sign is the signal that the next letter isan option. There is no space between the option andthe value. Options are separated by spaces. Thereis no input file.OPTION VALUE MEANING

-h YES or NO Want extra information?-o 〈filename〉 The output database file-q integer Starting accession number-t 〈filename〉 The Control-Log (TRL) file

-h Is initialization help wanted?If the answer is YES, the program providesshort essays at the start of the run. The de-fault is NO.

-o The name of the output file.If the file doesn’t exist, the program will cre-ate it, otherwise it will append to the file; itnever overwrites existing text. So it is possi-ble to come back time and again to the samefile to add references. Or you can use the sameprogram, if it is general enough, as most bib-liographic records are, for databases from dif-ference scientific disciplines, each in a separatedatabase file. There is no default. If the pro-gram is creating an output file, it prepends aLATEX skeleton file, which includes one macroin the preamble for each field in a record. Themacro definitions can be modified to meet thefont requirements of any particular journal ordocument structure. The skeleton LATEX file isshown in Figure 4.

272 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 125: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

LATEX And The Personal Database

-q The next accession number.It is assumed you will be adding to the database.To anticipate, it is a convenience that you candirect the program to get the value from thecontrol file. But you can also write it on thecommand line.

-t The name of the TRL file.Whenever the program is run, it writes the cur-rent values of the options to the TRL file, so thatit can read them the next run. The programalso records other data: how many records werecreated, the date and time, and characteristicsof the data entry program: line width, accessionnumber width, the file delimiters, which fieldsare subfielded, and so forth.

There are various ways to start the program.If you just write the name of the program on thecommand line, you will be in Interactive mode. Thisis the simplest way to jumpstart the program, but ittakes the most time. If you use the command line,the options can be written in any order.

Interactively. Just type the name of the program;i.e.,

Lbiblio

The program will query you for the values of theoptions. The very first time you run the pro-gram, there is no Control File, so you need toname it interactively. If there is no file with thename of the database, the program will createit. And any time you want to start a brand newdatabase with a new TRL file, run the programinteractively.

From the command line. Type the options di-rectly on the command line; for example,

Lbiblio -hn -oqmolbiol.db -q40 -tmolbiol.trl

means you don’t want extra explanation, thedatabase file is called qmolbiol.db, the TRL file iscalled molbiol.trl and the first record you writethis run will have 40 as its accession number. Ifthere is no file with the name of the database,the program will create it.

From the Control File. Type the name of thecontrol file option on the command line as theonly option; for example,

Lbiblio -tmolbiol.trl

will use the values stored in molbiol.trl the pre-vious run. The accession number will be cor-rect, because at the end of a session, the pro-gram writes the starting accession number forthe next session to the TRL file. The TRL file

also maintains a permanent record of the pre-vious data entry sessions that involve the dataentry program, the database and the TRL file.

You can call some of the values from the TRL

file and override other TRL file values by giving theparameters new values on the command line; for ex-ample,

Lbiblio -tmolbiol.trl -hy

requests that all the previous options, those storedin molbiol.trl, be used, except this time, you’d likesome help.

You can maintain several databases on differentsubjects, each with its own database file and its ownTRL file.

What the data entry program does

⋆ prompts for the necessary information for thefield, using the prompt text from the Instruc-tion File

⋆ writes the predefined default answer for the field(if there is one) to the database, if you pressENTER. You can override the default answerby writing in other text. To get an empty fieldin a field that has a default answer, type a spaceand then press ENTER.

⋆ adds the specified record and field delimiters toeach record.

⋆ ignores any record and field delimiters typed inthe body of the record

⋆ adds the subfield delimiter to subfielded fields.It adds the \AND command to subfielded fields,if that was requested.

⋆ writes out the full record to the database filewith the specified line width

⋆ writes out the record as a paragraph or writeseach field to a separate line

⋆ appends a stylized and padded Accession Num-ber field to the record, if this was requestedin Lquegen. This permanent accession numbershould not be confused with the numberingsthat will be given to records in the file thatcontains the citation list for a particular manu-script.

⋆ appends a Name-Year ID field to the record,using the name of the senior author and the yearof publication, if this was requested in Lquegen.

⋆ writes a LATEX header to the top of a newly-created database. The header includes a com-mand macro definition for each field in therecord, where the macro name for that field isthe user-specified prompt in the first field ofLbiblio.ins. And it prepends the same macro

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 273

Page 126: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Bernice Sacks Lipkin

\documentclass[10pt,letterpaper]article

\usepackagealltt

\usepackagemulticol

\usepackage[dvips]graphicx

\usepackagecolor

\usepackageboxedminipage

\usepackagepandora

%PAGE/PARA LENGTHS

\flushbottom

\parindent=0pc

\setlength\baselineskip14pt

\setlength\parskip13pt

%PAGE STYLE

\setlength\textheight7.4in

\setlength\textwidth5.5in

\setlength\oddsidemargin1in

\setlength\evensidemargin1in

%HEADERS/FOOTERS

\pagenumberingarabic

\setcounterpage1

\pagestylemyheadings

\markbothDemo Bibliographic Database

\newcommand\etal[1][et al.]\textit#1

\newcommand\AND[1][ and ]\textup#1

\newcommand\AUTHOR[1]\textup#1

\newcommand\YEAR[1]\textup#1

\newcommand\TITLE[1]\textup#1

\newcommand\PAGES[1]\textup#1

\newcommand\JOURNAL[1]\textup#1

\newcommand\VOLUME[1]\textup#1

\newcommand\ISSUE[1]\textup#1

\newcommand\ISBN[1]\textup#1

\newcommand\EDITOR[1]\textup#1

\newcommand\CITY[1]\textup#1

\newcommand\PUBLISHER[1]\textup#1

\newcommand\BPAGES[1]\textup#1

\newcommand\NOTES[1]\textup#1

\newcommand\ACNUM[1]\textup#1

\newcommand\NAMEYEAR[1]\textup#1

%ATTENTION: Before you process the file

%through Latex, make sure there is an

%\enddocument after the last reference.

%Remove any \enddocument in the body of

%the file.

\begindocument

Figure 4: The Top of the Database File.

name to the start of that field in each citationin the database. See Figure 4.

What the data entry program does not doAside from adding the \AND command, the programdoes not modify the text you key in. On the other

hand, as you key in text, you can use your ownmacros to reduce typing time and errors: macronames for long journal names, an alias for an au-thor with a long and difficult name. As an example,I’ve included a \etal command (see Figure 4), be-cause it is usually italicized. And it is inconvenientto format it after the fact.

In general, unless you write for a single journal,it’s almost impossible to write a canonical style fornames. One strategy is to adopt a style that worksfairly well for the journals in which you publish.LastName-Initial is more common than LastName-FullFirstName, so it’s fairly safe to use that style.It doesn’t, of course, prevent the need for smallpolishings: one journal wants last name, just ini-tials; another wants last name, followed by initialswith periods. I use periods, because they are eas-ier to erase than to add. Science uses an Initials-LastName format, which makes alphabetizing onthe field difficult. You can, however, alphabetizeon the NameYear field. If you publish often inboth in a Science-style journal and in one that usesLastName-Initial, it might be worthwhile keying inauthor fields in both versions. Depending on whereyou send the article, you will use one or the otherfield in the final List of References.

If you plan on making microadjustments to theAUTHOR field in Emacs or some other text proces-sor, it is a good idea to customize your data entryprogram to write each field in the record to a newline. You then search on the command name.

What you can do in response to a promptCreate the citation fields, one by one. In

our example, once the program is initialized, it willask a series of questions for each citation, wherea citation can be a reprint, a book or a technicalpublication. The typed responses will be confinedto separate fields. Answers may be of any length,including zero length; i.e., the field can be empty,but the program will add a field or record delimiter.Depending on the Instruction File, a field can besimple; i.e., the prompt is displayed and you type intext. Then the prompt for the next field is displayed.Alternatively, a hierarchical field prompt can be dis-played, where the prompt is repeated again andagain, each time defining another subfield. To stopa subfield and/or a field, don’t type any text— justpress ENTER.

Jump between fields in the record. Youcan jump between fields in the record by typing ˆY(control-Y). ˆY+6 or ˆY6 will jump forward 6 fields.ˆY-2 will jump back 2 fields. You can not jump outof a record. If you jump forward some large number,

274 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 127: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

LATEX And The Personal Database

you will land in the last field of the record. If youjump backward some large number, you will end upin the first field of the record. It is not advisableto jump from a subfielded field; it can mess up therecord.

Jumping forward to the last field is useful when,as in the example database template, you’ve essen-tially completed the citation for an article and wantto skip the BOOK questions. You can’t jump pastthe record, because the program does its housekeep-ing in the final field of the record, including choppinga clumped record into lines of the width specified inLquegen.

Jumping back repeats previous prompts. Whenthe program jumps back, it does not erase the inter-mediate fields. It just starts prompting from what-ever field it has jumped to. If used judiciously, thisfeature lets you recycle a cluster of fields. It is away of creating ID-prepended fields, such as thosein the MEDLINE download in Figure 2. However,the record is no longer well-structured as an ASCII-delimited file.

Stop the program. Type ˆX to stop the pro-gram. It will stop immediately. The best place tostop the program is at the prompt to the first field,so that the previous record has been completely pro-cessed. If you stop in the middle of a record, you willlose some text, and the record will be incomplete.

Database Record Format Next is an exampleof two database records that were keyed in underthe control of Lbiblio, which was itself created usingthe example instruction set. The first has a sin-gle author and no subfields; the second one has asubfielded AUTHOR field. Notice that the fields be-tween the ISSUE and NOTES fields are blank. Theydon’t apply to a journal article, so you would wantto skip to NOTES. The number in the NOTES fieldwas taken from the MEDLINE ID for the article.NOTES is also a good place to store the authors’first names, for the few times some publication willrequest full first names. And it can be utilized as adepository for keywords that can later be used forcross-indexing citations and sorting them by subjectmatter. The NOTES field can also serve to indicatethe physical location of the reprint, editorial com-ments, and so forth. The two last fields were addedby the program. Records are stored as shown. Forpublication, fields will be extracted, rearranged andbeautified, using available TADS routines.

\AUTHOR Eisthen, H.L. / \YEAR 1992 /

\TITLE Phylogeny of the Vomeronasal System

and of Receptor Cell Types in the Olfactory

and Vomeronasal Epithelia of Vertebrates /

\PAGES 1-21 /

\JOURNAL Microsc. Res. Tech. /

\VOLUME 23 /

\ISSUE 1 / / / / / /

\NOTES 93004928 /

\ACNUMDemoFile01/

\NAMEYEAREisthen, 1992 ~

\AUTHOR Freitag, J. @ Ludwig, G. @ Andreini,

I. @ Rossler, P. @ \AND Breer, H. /

\YEAR 1998 / \TITLE Olfactory Receptors in

Aquatic and Terrestrial Vertebrates /

\PAGES 635-650 /

\JOURNAL J. Comp. Physiol. /

\VOLUME 183 /

\ISSUE 5 / / / / / /

\NOTES 99056834 / \ACNUMDemoFile04

/\NAMEYEARFreitag, 1998~

Writing The Manuscript

This is a short manuscript that illustrates the tech-nique for writing allusions, using ordinary wildcardsyntax: a ? allows any single letter in the ? posi-tion; a * allows any amount of text or no text tointervene between the two neighboring text phrases.The spelling error in the last line is deliberate.

Phylogeny of vertebrate pheromonic sensorysystems is complicated by the proximity andsimilarity of the adjacent but distinct olfactorysystem [@??sthen*vertebrate*olfactory]. Thepresence of sex pheromone systems in gold-fish and the anatomic analogies of distinctolfactory systems [@Dulka*sex*pheromone]clearly establish both the antiquity andthe complex olfactory/brain relationshipsthat seems to characterize most if notall vertebrates [@??sthen*microsc], [evolu-tion@vertebrate@olfact]. The hypothesis thatthe Class II receptors are specialized for recog-nizing volatile odorants is questionable sincesome fish, e.g. Latimeria, possess both classes[Freitag*aquatic*vertebrate]. The presence orabsence of an accessory olfactory bulb is notin and of itself sufficient to affirm or denya functional vomeronasal system in a givenspecies [@bhatnag?r*diversity*mammalian],[bhatnag?r*bats*phylogenetic]. Attempts toinfer the form of the earliest vertebrate phero-nomic structures by comparative anatomy ofhagfish and lamprey are made difficult in that

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 275

Page 128: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Bernice Sacks Lipkin

the necessary physiologic data on these formsare not available [sennsory biology].˜

All the text phrases must be found in the ci-tation for a match, so an allusion is intrinsically aboolean AND. A difficulty with this technique isthat the text phrases that make up any wildcardmatch word must be sequential. This is fine onlyif you remember the exact field sequence. So thereis an alternate wildcard format: an @ prepends theword. The @ syntax tells the machine to matcheach phrase in the allusion from the beginning ofthe field.

I’ve elected to use square brackets, but anybracket pair will do to delimit the allusions. Anoption in dork:keepbracketedtext leaves the emptybrackets in the manuscript, when it strips the textfrom the brackets. So the square-bracket format isgood for Name-Year tags.

For a number tag, I’d still use the squarebracket but I would write ([〈text〉]), and usethe option that deletes the text brackets; thesquare bracket would be deleted, not the parens.([@??sthen*vertebrate*olfactory]) might eventuallybe written as (6).

If an entire manuscript is to be searched forallusions, add a single, unique record delimiter at theend. The file can now be described to the program asa single-fielded single record. Size is not critical forjournal articles. But one could encounter problemsif you were to treat an entire book as a single record.However, I’ve dummied up a 7 megabyte record byrepeating a real book several times. No problemswere encountered.

Linking Database and Manuscript

Various TADS modules come into play. This is thegeneral plan. Recall that the input file is always con-sidered read only. Any modifications are reflected inthe file where the processed records are shipped.

Using dork:keepbracketedtext, the allusions arestripped out and reappear in some output file, oneper line,

The allusions become a list of wildcard match-words that finder compares to records in a singledatabase or in a database that is a virtual merge ofrecords from several databases.

What constitutes a good allusion? The answeris tautological: a good allusion is one that is suffi-cient to attract the reference you want and only thereference you want. In practice, these are some ofthe types of errors that are encountered when theCitation Allusion (CA) in the Manuscript (MSS) ispitted against the Citations List (CL) in the sourcedatabase.

1. The citation is multiply listed in CL.

2. The citation is not listed in CL.

3. The citation is incorrectly written in CL.

4. The CA is incorrectly spelled in MSS.

5. The CA informational items are incorrectly con-catenated.

6. The CA is inaccurate and retrieves no citationfrom CL.

7. The CA is so general it retrieves multiple cita-tions.

8. There are multiple CAs to the same reference.

Depending on the circumstances, the citation isnot retrieved or unrequested citations are retrievedor a correct citation is repeated.

You can increase the probability of accurateretrieval by utilizing LATEX macro names. Instead ofwriting @199?*green*pheromone*goldfish, you wouldwrite @\date*199?*\author?green*\titlephero-mone*goldfish. But some people object to doing thiswhile in the throes of creative writing.

The next step —checking the allusions againsthe retrieved citations — is crucial. And it requiresyour participation. finder ships copies of the ci-tations it matches to a file. The key, i.e., the al-lusion that identified the bibliographic reference isprepended as a field to the citation.

If the number of citations extracted equals thenumber of CAs, it may mean we have no error. Onthe other hand, sources of error could balance out sothat the number of CAs equals the number of cita-tions. So we can not rely on counting the number ofcitations and simply comparing this to the numberof CAs.

TADS can present the original list of allusionsand the list of citations in ways that facilitate com-parison of the lists. genio:rearrange will split off theallusions field to a separate file, so the original listof allusions and the allusions prepended to the re-trieved citations can be compared. alp sorts listsalphabetically; using any of the fields as key. squish

eliminates duplicates. Spelling errors may have tobe corrected ‘by hand’. When you are sure the cor-rected allusions and citations correspond in a one-to-one fashion, hand the text back to TADS. Theprogram tags the final list of retrieved citations inan orderly sequence. You make two separate choices:

1. You chose between listing the references by firstappearance in the manuscript or in alphabeti-cal order. The same choice applies if you listreferences by chapter in a book.

2. In either case, you choose whether to numberthe records sequentially or by Name-Year ID.

276 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 129: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

LATEX And The Personal Database

The order tag — accession number or Name-Year ID — is substituted for the allusions in the man-uscript. This is done in four steps.

1. The citations can be left in the order in whichthey appear in the manuscript. Or they can bealphabetized using alp. If they are alphabet-ized, it is usually by author field or by Name-Year ID.

2. If ordering is by Name-Year ID, the order wasdone in the previous step. You will, however,need to add a final letter to the ID, if there ismore than one publication by the senior authorfor that year. Alternatively, addtext:acnum canadd an accession number to each record. Theaccession number becomes the first field in theexpanded record.

3. genio:rearrange creates a derivative database ofrecords, each with two fields: the allusion andthe accession number (or Name-Year). The al-lusion and number are now considered a sub-stitution pair. The entire file of records hasbecome a list of substitution pairs.

4. addtext:sbstitute brings in the file of substitu-tion pairs and substitutes accession numbers orName-Year IDs for allusions in the manuscript.

The List of Citations needs to be dressed upfor publication. genio:rearrange extracts particularfields in each record in the order you specify. Casecan be modified on a per field basis. Revampingthe macro definitions in the preamble will take careof the general appearance of the font. A beautifyprogram addtext:mssformat substitutes commas for(sub)field delimiters, periods for record delimiters.

Bernice Sacks Lipkin

Currently, this step usually calls for some small ad-justments in the text — such as adding or removingcommas and periods in the AUTHOR field, adjust-ments that are not easy to make globally. I workin Emacs, using the macro name to get to the rightfield per record and make changes locally —chang-ing case, deleting periods and transposing words,using Emacs commands. Writing the fields in therecords on separate lines simplifies the work consid-erably.

The list of references is appended to the manu-script, \enddocument is inserted, and the manu-script is ready.

Conclusion

In dealing with a database you have designed your-self, there are non-trivial advantages to prependinga field name that is also a LATEX macro:

1. A prompting program instills style conformityin the records of the database and reduces tran-scription errors.

2. You can design a canonical record style acrossmultiple databases.

3. You can manipulate font size and shape by fieldby redefining the field macro in the preamble.

4. You can use field names as part of a wild-card search of the database to reduce errorsin matching an allusion to the correct (readwanted) record in the database.

5. To effect small text changes while in a text edi-tor such as Emacs, you can get to the right fieldby searching on the field name.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 277

Page 130: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Formatting documents with floats

A new algorithm for LATEX2ε∗

Frank MittelbachLATEX3 Project

[email protected]

Abstract

This paper describes an approach to placement of floats in multicolumn docu-ments.

The current version of LATEX was originally written for single-column doc-uments and extended to support two-column documents by essentially buildingeach column independently from the other. As a result the current system showssevere limitations in two column mode, such as the fact that spanning floats arealways deferred to at least the next page or that numbering between column floatsand spanning floats can get out of sequence.

The new algorithm is intended to overcome these limitations and at the sametime extend the supported class of document layouts to multiple columns withfloats spanning an arbitrary number of columns.

Editor’s note

This paper describes facilities offered by the au-thor’s new algorithm for use with LATEX; it there-fore seemed appropriate that the paper itself shouldbe typeset using an implementation of it, and theauthor was enthusiastic in support of the plan.

With some help from members of the LATEXTeam, we have managed to typeset all but the presentpage of the paper using a version of LATEX that in-corporates a prototype implementation of the newalgorithm.

While customising the algorithm to produce thestandard layout that readers of TUGboat have cometo expect, the paper also exhibits the following ca-pabilities of the new algorithm:

• Alignment of text lines throughout the articleon an invisible grid.

• Support for spanning bottom floats; examplesare on pages 285 and 288.

• Restriction of float placement.

The float placement restrictions selected for thisarticle are as follows: floats have to appear aftertheir call-outs, can only occupy bottom areas, andare not allowed there if footnotes are present in thecolumn. This accounts, for example, for the place-ment of figure 1, which was moved from the secondcolumn of page 280 to the bottom of the first columnof page 281.

In the lingua of the algorithm the exact speci-fication used was:

float-callout-constraint = after,

float-callout-span-constraint

= flexible,

bottom-float-footnote-constraint

= forbidden,

max-float-num = 2,

area-list = b12,b11,b21,

These settings are admittedly rather bizarre andwere solemnly chosen by the author for illustrationpurposes.

In order to illustrate clearly the effect of thepage layout grid alignment used throughout, on page279 a grid of lines is superimposed; we hope thisdoes not detract too much from your enjoyment inreading the article.

In general it should be noted that the TUG-

boat layout isn’t really suited to be typeset usingan underlying grid; headings at the top of the col-umn need to drop to avoid a large gap between theheading and the following text (see page 279) andof course with a flush bottom setting you will getwidows and orphans since there is no stretchabilityon the page.

This title page has been set using the standard(released) LATEX output routine because the proto-type implementation does not at present supportswitching the number of columns in the middle ofthe page.

278 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 131: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Formatting documents with floats

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 279

Introduction

One problem with formatting documents containingfloats is the number of potential formatting solutionsthat need to be checked out. The number of trialsgrows combinatorially in the number of floats and ar-eas which can receive them. If we have n floats wait-ing to be placed and m areas in which we can placethem on the current page being built (not count-ing the “deferred area”) then the number of differentplacements is given by

#trials =

(

n+m

m

)

=(n+m)!

n!m!(1)

assuming that the order of floats has to be preserved,i.e., if the call-out of float fi is before the call-out offj in the text stream then the float fi will be placedearlier than float fj where “earlier” is a defined rela-tion of float areas.

For example, if we have 8 floats waiting to bedistributed among 12 areas (which corresponds to athree column page with float areas at the top andbottom allowing for partial spans) then we have tocheck 125970 possible distributions; if two additionalfloats appear we end up with 646646 trials.

Even though a large number of these distribu-tions would be unacceptable and discardable straightaway, after some initial test, the resulting runningtime of the algorithm would clearly be beyond anyacceptable speed. (Assuming we could do 1000 trialsper second, which is ridiculously high since many ofthem would require trial-typesetting the whole page,then the case of 646646 trials would still take roughly10 minutes to form a decision.)

Thus it is important to find algorithms with com-plexity that is at worst linear in both the number offloats on the trial list and the number of possible floatareas, even if this means that in a few cases a rela-tively good layout will not be found. It is even betterif they have minimal redundancy.

Note that assessing the actual running time ofTEX code is not straightforward since some activi-ties are very much faster than others. For example,performing a test by using a reasonable number ofmacro expansions and register assignments may bevery much slower than running through a long type-set list and then doing a simple test.

The algorithm we have implemented fulfills therequirement of being (essentially) linear in the num-ber of floats and the number of float areas.

The document source model

The document source is a single stream of continu-ous text containing call-outs to floating objects. (Atthe moment the call-outs are marked by placing theobjects into the stream but it would be possible toprovide them as separate objects.) Floating objects(as of today) come in three incarnations:

• Objects where the call-out and the placementrequires a strict spatial relationship, e.g., sameline in the margin. An example would bemarginal notes as implemented by \marginpar

in LATEX2ε.

• Objects where the call-out and the placementare required to fall onto the same column/page/spread, e.g., footnotes.

• Objects where there is a defined relation betweencall-out and object placement, e.g., “not in anearlier column”, or “on the same page or later”,etc. These are the traditional floats.

Float objects in the last group are typed where thetype is defined by the logical content of the object,e.g., “figure”, “table”, and so on.

The document formatting is achieved using aminimal but customizable lookahead (typically theconsidered galley material is the equivalent of onepage/spread of textual material ignoring the addi-tional size taken up by embedded float objects).

While making up pages the main “quality” guid-ance for the algorithm is to try to place each floatas early as possible without violating defined con-straints.

The document layout model

Page layout grid The algorithm supports the spec-ification of a page grid on which it will align textcolumns and other elements. This will allow (if suit-able parameters for various elements are chosen) tohave text lines of different columns all lying on gridpoints.1

Columns The page layouts which are supported bythe new algorithm support an arbitrary number oftext columns of equal width.

The number of columns per page as well as their

1 On the current page lines are drawn to highlight the grid.Note that headings, lists, and other “display” objects are notaligned.

Page 132: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Frank Mittelbach

280 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

width can be changed at forced page breaks such asthe start of chapters.

Balanced columns Balancing columns (as done bythe multicol package) is planned but not imple-mented. The major problem in that area is the han-dling of column floats during the balancing process.

Float areas Float objects are distributed into floatareas which are rectangular in shape. Float areasspan one or more text columns; their horizontal sizeis therefore given by the following formula (where c

is the number of columns spanned):

〈area-width〉 = c×(

〈col-width〉+〈col-sep〉)

−〈col-sep〉

The naming conventions for float areas is as follows:

〈identifier〉〈start-column〉〈span-count〉.

The 〈identifier〉 is a single letter denoting the type ofarea, e.g., t for top, b for bottom. The 〈span-count〉is a single digit denoting the number of columns tospan. The 〈start-column〉 is a single digit2 denot-ing the start column of the area. Thus t23 is atop area starting at column two and spanning threecolumns, i.e., two, three and four. A restriction dueto the naming scheme is that currently no more than9 columns are possible.3

Only a subset of the float areas is allowed to bepopulated on a page. In essence the new algorithmdoes not support placements that result in “splitting”the text of a column due to a float (other than col-umn “here” floats).4 This means that population ofsome float areas must be prevented, namely thosesatisfying these conditions when pcs (where p = pos,c = column, s = span) has just been populated:

pij with i < c ≤ i+ j < c+ s

or

pij with i ≤ c+ s < i+ j ≤ 〈number-of-columns〉

The first formula describes the areas which partlyoverlap from the left, the second formula describesthose that partly overlap from the right. Areas whichare sub- or super-areas, e.g., t13 and t22, do not af-fect each other. The above restriction is necessary to

2 With a bit of care in the code this could be extended toallow more than one digit.

3 The scheme is different from the original one used, wheret23 would have denoted an area starting at column two andspanning until column three.

4 Perhaps this restriction will be lifted one day.

prevent situations like the one shown in figure 1 onthe facing page, i.e., where the float area t32 (rep-resented as b’s) would result in splitting the fourthcolumn into two independent text areas.

The possibilities, as well as the restrictions, areequal for both top and bottom areas. This meansthat the new scheme in particular supports spanningbottom areas.

Float pages and columns Float pages, i.e., pagesconsisting only of floats, will be supported as well asfloat columns.

Float types The type of float influences the format-ting, e.g., where the caption is placed in relation tothe float body, how it is formatted, what kind of fixedstrings are added, etc. It also restricts the placementalgorithm in respect to which float areas can be pop-ulated as explained below.

Margins The marginal areas can receive marginalnotes which are aligned with the corresponding textline. In documents with more than two columnsmarginal notes are currently not supported thoughone could envision allowing them even there. Ifmarginals have to compete for space the latermarginal will be moved downwards if there is enoughspace on the page, otherwise the line containing themarginal will be moved to the next column/page.5

An alternative usage of the margin is to placefootnotes into it. A prototype version of this is pro-vided already, see section “Footnotes” on the nextpage.

Another potential use of the margin areas is touse them (or parts thereof) as float areas in their ownright. The problem with this would be that thesefloat areas would have a horizontal width which isdifferent from the column width, thus allowing onlya limited class of floats to appear therein.

Another potential extension would be to al-low float areas that border on a margin to use themarginal space as part of the float area, thereby al-lowing the filling of such an area with floats whichare wider than the nominal float area. A special caseof this, the placement of the caption in the marginbeside the float body, is already provided by choosinga suitable caption formatting instance.

5 This is not yet implemented — right now they overprinteach other.

Page 133: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Formatting documents with floats

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 281

Footnotes Footnotes can be regarded as a specialtype of floats. They are objects which are associ-ated with lines of text (their call-out) but in contrastto normal floats such as “figures” or “tables” theirplacement constraints are stronger, e.g., they typi-cally have to appear at the bottom of the columnwhich contains their call-outs, or at least they haveto appear on the same page as their call-outs.

In its current version, the model supports foot-notes beneath the call-out column (normal behavior);all footnotes in the last column (as with the ftnrightpackage for two-column mode); all footnotes in theouter (or inner) margin.

Without an extension to the page makeup al-gorithm (but instead with a suitable redefinition ofthe footnote commands) they could be processed asmarginal notes or alternatively as “end-notes”.

Headers and footers The header and footer ar-eas may use data received from individual columns.An extended version of TEX’s mark mechanism ismade available which allows the definition of arbitrar-ily many independent classes of marks. Within eachmark class information about the top mark (i.e., themark active at the top of the column), the first markand the last mark is made available for retrieval.

This allows the production of correct runningheaders and footers for various types of applicationssuch as dictionaries, manuals, etc.

The processing model

Float placement concepts To build a page orspread the algorithm first assembles enough textualmaterial to be able to fill the page without placingany floats. During this process all floats that havetheir call-outs within the assembled galley are col-lected. They form, together with unplaced floatsfrom previous pages, an ordered trial list of floats.

The allowed float areas on the page under con-struction are totally ordered as well.

The algorithm proceeds by taking the first floatfrom the trial list and trying to place it into the firstfloat area from the area list. It then checks if allconstraints (see below) are met and if not the algo-rithm will try to place the float into the next areauntil either all constraints are met or the areas inthe float area list are exhausted. A trial that doesnot fail means that this distribution of floats becomesthe best solution so far and all further trials will bebased on adding to this solution (no backtracking). Ifthe algorithm fails to place the float into any area itmeans that the float will be deferred to a later page.

As floats are added to areas, the constraints forfurther trials are changed. There are several reasonsfor this: on one hand, the call-out positions of variousfloats move since the float will occupy space on thepage; on the other hand, placing a float in some areamight result in disallowing the placement of otherfloats in the same or in other areas.

Float pages and columns At the moment thereis only rudimentary support for float pages available:at the start of each page the algorithm will try toform a float page out of all floats that have beendeferred from previous pages. However there is nolayout control available to define the conditions underwhich such a trial will succeed.

Float storage Float bodies are typeset into boxesat the point of ‘call-out’, as with the figure andtable environments in the standard LATEX; it mayalso be possible to specify at the call-out point a log-ical pointer to a float whose typesetting is specifiedelsewhere (e.g., an external file).

However, text sub-elements such as the caption,etc. (e.g., from \caption), are not typeset at thisstage but are stored as token lists; this allows fortrying different possible layout specifications, e.g., forits measure, during the float-positioning trials. Atpresent this is confined to at most a single captionelement per float.

Caption processing When a float is placed into anarea the caption is trial formatted and mounted ontothe float body. This process can take into accountvarious information about the float positioning trial,such as the area to format it into, the fact that itformats onto a verso or recto page, etc. It might tryseveral possibilities before making a decision, e.g., if

aaaaaaaaaaa 444

aaaaaaaaaaa 444

aaaaaaaaaaa 444

111 222

111 222 bbbbbbb

111 222 bbbbbbb

111 222 bbbbbbb

111 222

111 222 333 444

111 222 333 444

111 222 333 444

Figure 1: Overlapping float areas

Page 134: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Frank Mittelbach

282 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

one formatting of the float results in violating someconstraint(s) it might try a different formatting atthis point.

Flushing floats It is possible to mark points in thesource document as boundaries beyond which floatswhose call-outs are prior to the boundary cannotpass. In other words a “flush point” directs the algo-rithm to place all affected floats into areas which are“before” the flush point.

If due to other constraints the float could notbe placed in such an area the algorithm first retriesall potential areas using a less rigid set of constraints(for example, restrictions on the number of allowedfloats per area are dropped) and if this still doesn’tenable the algorithm to place the float properly it willas a last resort move the flush point to a later col-umn, which means breaking the column text beforethe flush point.

Flushing of floats can be done either for all floatsor on a per float type basis, e.g., it is possible to flushonly floats of type “figure”.

A flush point can be given an additional at-tribute which controls the “fuzziness” used by thealgorithm. By default the flush point algorithm usesstrict flushing as described above. The attributecolumn modifies the algorithm’s behaviour by en-abling a float to move past the flush point as longas it will be placed on the same column. Similarlythe attribute values page and spread will enforcethat the float will not be deferred further than thecurrent page or the current spread. This way it canbe guaranteed that a float is always visible from itscall-out.

Float sequence classes Float sequence classes arecollections of float types; each float type belongs toexactly one float sequence class. Within each se-quence class the call-out order in the document isalways preserved by the float placement algorithm,e.g., if c1, c2, . . . , cn are the call-outs of all floats ofa float sequence class then the corresponding floatswill be placed such that fi will be placed before fj

whenever i < j. Thus by putting all float types into asingle float sequence class all floats are placed in theorder of their call-outs. At the other extreme, if eachfloat type has its own sequence class6 then floats fromone type might move before floats of other types even

6 This is the LATEX2ε default.

though the corresponding call-outs are in a differentorder.

Float and call-out relations The algorithm alsokeeps track of the relation between an individual floatand its call-out. This allows one to define constraintswhich guide the algorithm during the float placementphase. It is always permissible to place a float “af-ter” its call-out, e.g., in a later column/page. At themoment the following constraints can be specified:

none which means that the relation between call-outand float placement is not relevant for placingfloats.

page which means that the float can be placed any-where on the page with the call-out (it is visiblefrom the call-out).

column which means that the float can be placedbefore the call-out as long as it is placed in thesame column.

after which means that the float has to be placedstrictly after the call-out.

When extending the algorithm to directly supportspreads the above list is going to be extended by anoption that allows floats to move backwards on thewhole spread.

Spanning float and call-out relations For floatsthat span two or more columns there are several pos-sibilities to interpret the spatial relationship betweencall-out and float areas. For example, if a float, whosecall-out is in the second column, has been placed intoarea b12, is this float “before” or “after” its call-out?The answer to this question depends on whether weconsider the float being placed into the first or thesecond column, both of which are valid interpreta-tions.

At the moment the following behaviour can bespecified:

strict which means that the leftmost columnspanned by the float is regarded as the columnin which the float was placed.

flexible which means that the rightmost columnspanned by the float is regarded as the columnin which the float was placed.

These settings are only relevant if the main float/call-out relations are set to column or after.

Float and footnote relations It is possible to di-rect the algorithm to check on each column if there

Page 135: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Formatting documents with floats

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 283

are footnotes, and if so to prevent it from placingfloats in the bottom area. In theory it might be possi-ble that a forbidden constellation might resolve itselfonce the algorithm has added further floats, e.g., itcould be the case that by adding additional floats theoffending footnote gets moved to a different column.However, checking for this would mean potentiallylarge backtracking so the algorithm uses a conserva-tive approach and simply considers a trial as failed iffootnotes and bottom areas collide.

It is planned to allow a designer the choice ofspecifying where the footnotes should be placed inrelation to any bottom floats (if the combination isallowed). Right now this is not implemented and col-umn footnotes will always appear below the text col-umn, i.e., above any bottom floats.

Area statuses For each area the algorithm keepstrack of whether or not it is closed for individual floattypes, e.g., is not accepting any more floats of type“figure” or closed for all types. The status of an areacan change due to floats being placed into other areas(this might, for example, close earlier areas, or areasthat overlap) or it can change due to the fact thatthe area became too full in some way (e.g., a sizeconstraint or a number of floats constraint).

Some of these constraints can be “relaxed” incertain situations, e.g., if the algorithm is directed toflush out remaining floats prior to a certain point inthe galley it will drop constraints related to numberof floats per area or size restrictions. However, if anarea was closed due to a different float being placedinto some other area, this area will stay closed in allcircumstances to ensure proper sequential placementof floats and to ensure that overlapping areas thatare forbidden as explained in section “Float areas”on page 280 will not receive floats at the same time.

Area constraints The algorithm offers several pos-sibilities for the designer to specify how and underwhat circumstances a float is allowed to be added toa certain area on the page.

As explained above all areas on a page are triedin a specific order. This order can be specified andchanged for specific parts of the document. Areasthat are closed for the current type will be bypassedas well as areas which do not span the right numberof columns to fit the horizontal size of the float. Ifthese initial tests succeed the float may still fail tobe placed into a certain area if it doesn’t fulfill thefollowing set of constraints:

• There is an upper limit on the total number offloats that can be placed on an individual page.

• Each area has an upper limit of floats that cango into it.

• After placing the float the remaining space inthe text column must be larger than a specifiedvalue.

All such constraints are customizable.Additional constraints will probably be imple-

mented once there has been some experience of whatcontrols are actually needed to allow the specificationfor a reasonable number of layouts.

For example, LATEX2ε allows the designer to re-strict the maximum size of an area, but should oneprovide this or should there be a constraint on thesize of all stacked areas? Or should there be both?

To “Here” or not to “Here” LATEX2ε allows theuser to control the placement of an individual floatby specifying one or more areas into which the floatwould be allowed to move using single letters. As aspecial notation an h would denote a so-called “here”float. Its advertised semantics is to try placing thefloat “at the position in the text where the environ-ment appears” [1, p. 197]. If this is not feasibleLATEX2ε would try the remaining allowed possibili-ties on the next page, thus a float with an ht specifi-cation would either appear within the text or at thetop of the next or a later page.7

In many cases people however prefer a “here”which always means “here”. The latter form is imple-mented in some add-on packages for LATEX2ε, how-ever usually at the cost of allowing floats to appearout of order.

The new model supports only the absolute“here” form for floats; however, correct ordering offloats in the output is guaranteed (if the tag gener-ating the here float issues flushing of floats for thecurrent type). If there is not enough space to placethe float in a column, the float plus the precedingtext line8 is moved to the next column/page.

Grid layout To produce layouts with elementsplaced on an underlying grid (typically with grid

7 In two-column mode this can in fact result in a placementon the top of the second column even though the call-out po-sition finally falls into the middle of that column.

8 More precisely the column is broken at the last breakpointpreceding the current position which is normally one line abovebut could be more (or less).

Page 136: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Frank Mittelbach

284 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

points vertically separated by \baselineskip) thealgorithm assumes that certain parts of the text col-umn, e.g., normal text, will automatically align onthe grid as long as the first line is positioned on thegrid. A further assumption is that such parts of thecolumn do not contain stretchable amounts of ver-tical glue so that they are not subject to stretchingor shrinking if the material is adjusted to fit a givensize.

Given these assumptions, the algorithm proceedsby ensuring that the space taken up by floats (includ-ing their separating white spaces) is always of a sizesuch that the remaining space for the text part ofthe columns allows for an integral number of gridlines. This is achieved by stretching or shrinkingthe space separating the areas from the text appro-priately while building the page as explained in sec-tion “Float placement concepts” on page 281.

Within the text column there are typically anumber of “display objects” such as headings, equa-tions, quotations, lists, etc., which should not bealigned on the grid. Instead, typically the text be-fore and after is supposed to lie on the grid.9 Thisis supported by allowing to mark lines of text (ormore generally points in the galley) to “snap to thenearest grid point”. One can think of the implemen-tation working by taking the column material up tothe marked line and putting it into a vertical box ofthe size of the nearest possible grid point. By this ap-proach stretchable glue around such a display objectwill allow the text line that should snap to the grid tomove into the correct position. This box is then givenback to the page builder to assemble more materialfor the column. In this way the preceding part of thecolumn becomes rigid; thus a later request for snap-ping to the grid will only stretch or shrink materialfurther down the column.

A prototype implementation that makes moststandard LATEX objects, like headings, displays, etc.,support grid design is available with the packagexo-grid. It is used for typesetting this document.

User control

Column and page breaks Breaking of columnsand pages can be controlled from the source doc-ument by placing special tags into it. The\columnbreak command ends the current column

9 In some cases, depending on the design, parts of the struc-ture might be supposed to aligned as well.

after the current line (if used in horizontal mode).Similarly the \pagebreak command ends the currentpage.10

Manual float flushing The flush float functional-ity is available within the source document via thecommand \flushfloats. This command takes twooptional arguments which, if present, denote the floattype to flush (by default all) and the “fuzziness” ofthe flush (by default strict). Other allowed valuesfor the fuzziness are column, page, or spread. If atype is specified for flushing, effectively all types withthe same float sequence class are flushed to preservethe ordering.

Specifying preferred areas At the time of writ-ing, the document source interface for specifyingthe group of areas into which a float is allowed tomove is not yet decided. One could envision keep-ing the original LATEX interface to float environmentswith optional argument. In that case somethinglike [t] could be internally interpreted as “any toparea that exists” and translated into a list such ast12 t11 t21. But other interfaces are conceivableas well.

Manually position all floats Any algorithm thatautomatically places all floats may fail to produceadequate results in some situations. In LATEX2ε theuser was offered only the optional arguments of thefloat environments and by this method and by mov-ing floats slightly in the source document one wasfinally able to change the formatting as needed.

This was a time-consuming and error-pronemanual task and any slight change in the source doc-ument text was likely to result in making this workobsolete.

To improve on this situation the new algorithmcan be directed to write out a file containing all of itsfloat11 selections (an example is shown in table 2 onthe facing page). By simple drag and drop the usercan produce alterations to this selection. If such amodified file is stored as \jobname.fpc then the al-gorithm will use these selections without attemptingto apply any of its internal rules. Thus the formatting

10 At the moment these commands force a break; there isno possibility, as in LATEX2ε, only to suggest that the currentpoint is a good or bad break.

11 Floats in this context mean “traditional” floats, not foot-notes or marginpars.

Page 137: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Formatting documents with floats

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 285

will happen exactly as specified.12

Beside moving floats between float areas it willbe possible to move floats in and out of the specialarea called hhh which represents a list of all “here”floats on the page. If a float is moved into the “here”area it means that it will be positioned as a here floatat the point of its call-out.

As an extension to this method we are experi-menting with restricting the manual control only toparts of the document, e.g., allowing the user to man-ually fix a single chapter but have the algorithm de-termine the remainder. We also plan to integratecolumn length control in this way, so that it becomeseasily possible to run a page or double-spread longor short by specifying this externally rather than viatags in the source document.

Tracing the algorithm’s behavior In contrast tothe LATEX2ε output routine, which is a black boxas far as the user is concerned, the new algorithmtries hard to make its decision process comprehensi-ble. Table 3 shows a sample output produced by it. Itshows for each float which areas have been tried, whythey were rejected, etc. There is also an option whichproduces about 1000 times as much information butthe latter is probably useful only for debugging thesystem in case there are errors in the code.

12 If the floats are stored within the source document at thepoint of their call-outs, the algorithm will be able to position afloat only if it has already encountered the float in the sourcedocument. This means that one can move a float arbitrarilyforward but only to a limited extent before its call-out position.If the floats are stored externally to the source document thisrestriction does not apply.

Manually aligning text in grid layout If the al-gorithm produces grid layout it automatically alignscertain text lines on the underlying grid. Formanual control this functionality is also providedwith the command \TextAlignGrid which will alignthe current text line on the grid. By issuing a\IgnoreAlignToGrid command grid alignment willbe temporarily disabled, while \ObeyAlignToGrid

will reestablish automatic grid processing.

Layout Specification

In the class file the designer is given control overthe algorithm’s behavior in all the aspects describedabove (and several more).

The layout specifications are done through thenew template and instance concept, see [2]. Addi-

Table 3: Progress output of the algorithm

=======================================================================

STATS: floats waiting = 2 on page 13

=======================================================================

Float: \bx@E 5 table (floats) 5 Statistics from the algorithm

area trial: b12 -> failed: span count b12 /= 1

area trial: b11 -> accepted

Float: \bx@F 6 table (floats) 6 Running times of the algorithm

area trial: b12 -> failed: span count b12 /= 1

area trial: b11 -> failed: b11 float num reached (1)

area trial: b21 -> failed: area below flush point (2=2, b21)

-> failed: --> retry with relaxed conditions

area trial: b12 -> failed: span count b12 /= 1

area trial: b11 -> accepted

STATS: trials = 7

Table 2: An example fpl file

Page: 1 (1)

Area: t13

Float: 4 (figure 4) []

Area: b21

Float: 2 (figure 2) [mylab:fig1]

Area: t31

Float: 3 (figure 3) [mylab:fig2]

Area: hhh

Float: 11 (table 1) []

Page: 2 (2)

Area: t13

Float: 8 (figure 8) []

Area: t22

Float: 5 (figure 5) []

Area: b11

Float: 6 (figure 6) [mylab:fig3]

Area: b31

Float: 7 (figure 7) [mylab:fig4]

Page 138: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Frank Mittelbach

286 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

tional information such as experimental code, fur-ther documentation, etc., can be found on the LATEXproject web site at:

http://www.latex-project.org

In contrast to the algorithm itself, which in itsbasic functionality now seems to be stable and reli-able, the design interface is far more experimental.Thus the example declarations given below representonly the current state of thought (or of implementa-tion) and are likely to be modified at any moment.

Float type declarations Float types are declaredusing the command \DeclareFloatTypewhich takestwo arguments: the name of the type which is de-clared and in the second argument a list of key/valuepairs which describe the properties of the float type,e.g.,

\DeclareFloatTypefigure

sequence-class-id = floats,

toc-extension = lof,

caption-text = \figurename,

numbered-boolean = true,

numbered-id = figure,

numbered-within-id = section,

numbered-action =

\thesection.\arabicfigure,

body-decls = ,

The sequence-class-id key defines to which floatsequence class the type belongs to. If it is absenta sequence class with the same name as the type isassumed. The sequence class will be automaticallyinitialized if not referenced before.

The toc-extension key defines the extension tobe used to write the caption to when generating “Listof floats” listings. By using the same extension withdifferent types it is possible to generate combined list-ings, such as “List of tables and figures”.

The caption-text key defines the fixed text tobe used as part of the caption text together with thefloat number if present, e.g., Figure. This informa-tion is passed to the caption formatting template sothe actual formatting is defined there.

The numbered-boolean defines whether or notfloats of this type are numbered.

The numbered-id key defines the name of thecounter to use when numbering floats. If absent acounter with the same name as the type is assumed.

By using the same counter with different types it ispossible to use a single numbering scheme—in thatcase the sequence-class-id for these types shouldprobably be identical as well to avoid strange num-bering sequences within the document.

The numbered-within-id key defines the nameof the “within” counter, i.e., the counter which ifstepped resets the numbering. If the value is emptyor not set the float type is numbered in a single se-quence throughout the document.

The numbered-action key defines the represen-tation of the float number, as used in the captionand by the \ref, \label mechanism. The default is\arabic〈counter〉.

The body-decls key can hold formatting in-structions that should apply to the float body. Theycan assume a normalized formatting environment al-ready set up by the algorithm.

The declaration of a new float type automati-cally defines the necessary user document environ-ments.

Float area declarations Any float area that is go-ing to be used at some stage by the algorithm needsto be declared beforehand. This is done through the\DeclareFloatArea command which takes two ar-guments: the name of the area (which has to followthe conventions explained in section “Float areas” onpage 280) and a list of key/value pairs describing thecharacteristics of the area.

\DeclareFloatAreat22

class-close-list = t11,b11,

all-close-list = t12,t32,

max-float-num = 2,

As of today an area is characterized through themaximum number of floats it is allowed to receive(max-float-num) and through two lists which tell thealgorithm which other areas are affected by adding afloat to the current area. The list class-close-listenumerates all areas which are not allowed to re-ceive additional floats of the same sequence class asthe float that has been placed into the current area,while the list all-close-list contains the informa-tion about all areas that are to be completely closedthe moment a float is received in the current area.

The class-close-list key is primarily in-tended to specify a partial order on the areas to en-sure that floats are not getting out of sequence in the

Page 139: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Formatting documents with floats

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 287

output. For example, the above declaration says: if afloat is placed into area t22, i.e., a top area starting atcolumn two and spanning two columns, then the sin-gle column areas t11 and b11 (i.e., those of the firstcolumn) are closed for floats of the same class. How-ever, assuming this example is part of a declarationfor a four column layout which could have areas liket14 or t13, there is nothing said about closing thoseareas. Thus in this particular layout a float spanningthree or four columns would still be allowed to go ontop.

On the other hand the all-close-list key isavailable to ensure more visual constraints, e.g, “ift12 gets filled we don’t want to have b12 filled aswell, we only want b22 in this case.” In addition itis needed to implement the restriction about overlap-ping float areas as described in section “Float areas”on page 280, e.g., in the example declaration t12 andt32 are closed since they partly overlap with t22.13

Footnote formatting declarations The format-ting of footnotes is specified by declaring instance(s)of type footnotesetup. At the moment three tem-plates are available though they should be consideredonly as prototypes: the template std produces con-ventional footnotes below each column, the templateftnright collects all footnotes and typesets them inthe rightmost column, and the margin template col-lects and typesets them in the right outer margin.

The keys of the above templates provide onlya rudimentary flexibility (to say it positively); in aproduction version all of them would need a largenumber of extensions. As an example,

\DeclareInstancefootnotesetup

mainmatterstd

text-sep = 14pt plus 3pt,

max-height = 8in,

would declare the named instance mainmatter thatprovides footnotes below columns with a separationof 14pt+ and a maximum height for footnotes percolumn being 8in.

Instances like this can then be used in the decla-ration for a particular page layout as explained below.

13 As mentioned before, this restriction might be lifted ina later version of the algorithm; as long as it is required onecould alternatively add those areas behind the scenes to avoidruntime problems.

Alternatively one could use unnamed instances thereusing the \UseTemplate method.

Page setup declarations At the heart of the layoutdeclaration are instances of the type pagesetup2.14

An example setup showing all currently availablekeys is given in table 4 on the following page.

Column specification The first four keys(column-num, column-width, column-height, andcolumn-sep) describe the column structure of thepage layout being defined, i.e., in this case a two-column layout.

Float constraint specification The followingfour keys define the standard constraints for the al-gorithm when placing floats: max-float-num is themaximum number of floats that can go on a nor-mal page; float-callout-constraint defines whatkind of relations between float and call-out are al-lowed (possible values are explained on page 282);float-callout-span-constraint handles the in-terpretation of spanning floats and is explained onpage 282; and bottom-float-footnote-constraintdefines whether or not bottom floats are allowed incase of footnotes.

The last three constraints are replaced byflush-float-callout-constraint, flush-float-callout-span-constraint, and flush-bottom-

float-footnote-constraint in case flushing can’tbe done without relaxing the conditions (max-float-num is disregarded in that case automatically).

Float area specification The key area-list

defines all float areas that are allowed in this pagelayout as well as defining the order in which the ar-eas are tried when placing floats. The keys defer-class-close-list and defer-all-close-list de-fine the “closing actions” for the special area whichreceives the floats that could not be placed. E.g., ifa float of a certain class can’t be placed then all ar-eas listed in defer-class-close-listwill be closedfor this class of floats. In other words the two keysare comparable to the ones available for area decla-rations.

Thus these keys together with the keys from thearea declarations are most important to guarantee asensible order of floats on the formatted page.

In an earlier implementation of the algorithm asimpler scheme was used: there was a single arealist which was shortened whenever a float couldn’t be

14 The number 2 has historical reasons and will vanish atsome point in the future.

Page 140: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Frank Mittelbach

288 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

placed into it thereby confining the remaining floatsto this restricted selection. This works fine as longas there are mainly single column floats since in thiscase the area can be reasonably ordered into a singlesequence. However the moment spanning floats aresupported the situation gets less straightforward. Isit allowed to place a later float into t12 if there isalready a float in the area t11?

It is quite likely that the current controls willturn out to be too crude. This will be seen once asuitable number of layouts have been produced underthis scheme (or couldn’t be produced because theyturned out to be unspecifiable).

There needs to be space between floats in an areaand areas need to be separated from each other, aswell as from the column text. For this we have thefollowing keys: float-float-sep is the separationbetween two floats in an area, float-area-sep is theseparation between two vertically adjacent areas, andfloat-text-sep finally is the separation between afloat area and the column text.15 The separationbetween inline floats and surrounding text is given

15 A possible extension would be to allow ornamental ma-terial in place of white space.

by float-inline-sep.Grid specification To produce a grid based

design the grid-point-sep needs to be given a pos-itive dimension. This defines the distance betweengrid points on which the algorithm aligns columntext, inline floats, etc.16

To align column text at a grid point the algo-rithm will extend the float-text-sep space. Al-ternatively, if the nearest grid point can be reachedby shrinking that space (assuming its specificationcontains a minus component) the algorithm will usethat grid point instead. In a similar fashion the spacearound an inline float will be determined by the valueof float-inline-sep.

Footnote, etc., specification Finally thekey footnote-setup receives an instance of afootnotesetup template, thereby defining how foot-notes are handled and presented.

What is clearly missing here is handling of otherpage elements such as running headers and footers,

16 Setting this parameter is not sufficient: to make grid set-ting possible several other parameters need to be set to suitablevalues as well, e.g., the distance between baselines should becompatible and the column height needs to be a multiple ofthis value.

Table 4: Example declaration for the pagesetup2 template showing all currently available keys

\DeclareInstancepagesetup2mainmatterstd

% column specification

column-num = 2,

column-width = 220pt,

column-height = 610pt,

column-sep = 20pt,

% float constraint specification

max-float-num = 3,

float-callout-constraint = after,

float-callout-span-constraint = strict,

bottom-float-footnote-constraint = forbidden,

flush-float-callout-constraint = page,

flush-float-callout-span-constraint = flexible,

flush-bottom-float-footnote-constraint = none,

% area specification

area-list = t12,t11,b11,b12,t21,b21,

defer-class-close-list = t12,t11,b11,b12,t21,b21,

defer-all-close-list = ,

float-float-sep = 15pt,

float-text-sep = 30pt minus 8pt,

float-area-sep = 15pt,

float-inline-sep = 6pt minus 2pt,

% grid specification

grid-point-sep = 12pt,

% footnote etc specification

footnote-setup = mainmatter,

Page 141: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Formatting documents with floats

TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting 289

the folio, etc. This will be added soon.

Float formatting declarations For the attach-ment of captions to floats there exists a prototypeinterface using templates of the type buildfloat.At the time of writing, available templates arecenteredbelow, centeredabove, and bottomright,which center the caption below or above the floatbody or place it to the right of it, aligned with thebottom of the float body. All of them would needto be generalized for a production system to becomemore flexible.

When trial-formatting a float the algorithmchecks for the existence of a number of buildfloatinstances and uses the first one that exists to buildthe float. More precisely it first checks if an instancewith the name 〈area〉-〈type〉 exists, then it looks for〈area〉, then for 〈type〉, and finally, if none of themexists, for an instance with the name default. Soat least the latter instance has to be declared by theclass.

\DeclareInstancebuildfloatdefault

centeredbelow

\DeclareInstancebuildfloattable

centeredabove

\DeclareInstancebuildfloatt31

bottomright

\DeclareInstancebuildfloatt22

bottomright

The example declaration above defines the placementof captions above tables and below for all other types,with the exception of the areas t31 and t22 wherethe captions are set to the side.

Performance of the algorithm

To test the performance of the algorithm we prepareda somewhat ridiculous test file containing three typesof floats (“figures”, “tables”, and “algorithms”) witha total number of 47 floats. The chosen layout had 3columns and 11 potential float areas. Figure captionshave been placed below the float while with tablesand algorithms the caption was placed on top. Theexception was the top areas adjacent to the outermargin: floats placed there got their captions placedto the right and partly into the margin. Footnoteswere collected for all columns and placed in the outermargin.

Floats had to strictly follow their call-out anda maximum of ten floats was allowed per page, i.e.,

roughly three per column.Since the document contained many floats early

on (24 on page one) and the first of these was espe-cially constructed to be not placeable the first timearound, the algorithm had to work hard to place allthe dangling floats. Table 5 shows some statistics asproduced by the algorithm on the number of trialsnecessary (the highest number was 397 for 37 floats;by comparison, equation (1) on page 279 would give22595200368 which would probably take a bit longerto evaluate). Note that on the third page the algo-rithm was able to produce a float page; on all otherpages the float page trial was unsuccessful.

Table 6 on the following page shows the runningtimes needed to produce the final document of 13pages when the algorithm is used with different trac-ing settings. The test machines were a Pentium iii

650 machine and an older laptop with a 486 proces-sor. In both cases TEX was run straight from a TEXLive 4 CD.

These times show that the algorithm has an ac-ceptable time performance since even on a 486 theaverage time to produce a page is roughly 2 seconds.

Outlook

While the current algorithm performs well there are

Table 5: Statistics from the algorithm

STATS: floats waiting = 24 on page 1

STATS: trials = 286

STATS: floats waiting = 19 on page 2 (float page)

STATS: trials = 159

STATS: floats waiting = 37 on page 2

STATS: trials = 397

STATS: floats waiting = 19 on page 3 (float page)

STATS: trials = 166

STATS: floats waiting = 7 on page 4 (float page)

STATS: trials = 41

STATS: floats waiting = 20 on page 4

STATS: trials = 204

STATS: floats waiting = 5 on page 5 (float page)

STATS: trials = 27

STATS: floats waiting = 12 on page 5

STATS: trials = 108

STATS: floats waiting = 0 on page 6 (float page)

STATS: trials = 0

STATS: floats waiting = 6 on page 6

STATS: trials = 57

...

STATS: floats waiting = 6 on page 12 (float page)

STATS: trials = 26

STATS: floats waiting = 6 on page 12

STATS: trials = 37

STATS: floats waiting = 0 on page 13

STATS: trials = 0

Page 142: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Frank Mittelbach

290 TUGboat, Volume 21 (2000), No. 3—Proceedings of the 2000 Annual Meeting

several areas in which its functionality could andprobably should be extended. The most importantpoints are given in the following list.

• Balancing of partial pages, comparable to theway the multicol package works, should be im-plemented to allow for layouts where, for exam-ple, a heading should span across all columns.

• We intend to provide more control over themarginal areas, allowing for marginal floats aswell as other objects in the margin, properly in-teracting with each other.

• Without much effort the algorithm could be ex-tended to properly support double-spreads sothis should be added some time soon.

• Once the algorithm has decided which floatsto place onto a page one could add a post-processing step in which the placement could bereconsidered according to different rules. For ex-ample, if the call-out relation is page then floatswill tend to be placed in the left-hand columns.This is fine as long as there are many floats toprocess but on a page with only a few floats onemight want to redistribute them differently onceit is clear which floats could go onto the page.

• Since it is known beforehand how many floats areactively waiting to be placed, one could use a dif-ferent algorithm that tries all possible combina-tions as long as there are only a limited numberof floats to be placed. The boundary at whichthe algorithm changes behavior could be madecustomizable so that people with faster machines(or more patience) could have the search for op-timum running for as many floats as they like.

References

[1] Leslie Lamport. LATEX: A Document Prepara-

tion System. Addison-Wesley, Reading, Massa-chusetts, second edition, 1994.

[2] Frank Mittelbach, David Carlisle, and Chris Row-ley. New interfaces for LATEX class design. TUG-

boat, 20(3):214–216, September 1999.

Table 6: Running times of the algorithm

Piii (650MHz) 486DX4 (75MHz)

no tracing

real 0m1.533s 0m27.633suser 0m1.460s 0m26.940ssys 0m0.050s 0m0.690s

progress information

real 0m3.116s 0m36.885suser 0m1.740s 0m34.470ssys 0m0.080s 0m2.420s

full tracing

real 0m7.833s 1m22.480suser 0m2.720s 1m7.890ssys 0m0.280s 0m12.360s

Frank Mittelbach

Page 143: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Abstract: The Penrose notation: a LATEX challenge

Timothy [email protected]

Abstract

Over 30 years ago, Roger Penrose — Oxford mathematician and AI scourge —invented a notation for tensors, which has become a kind of secret languageamong a coterie of aficionados.

This notation lies somewhere between the classic index notation of relativistsand the functorial notation of multilinear algebraists. By general consensus,Penrose’ notation avoids the complexity of the first and the chilling abstractionof the second, providing a concrete model for tensor algebra and calculus of greatpedagogical value.

The aim of this talk is to describe the Penrose notation—and it shouldbe emphasized at the outset that there are absolutely no mathematical ‘prereq-uisites’ to understanding this description— and to present a LATEX package forincorporating the notation into mathematical documents.

This package is far from perfect; indeed it is its very imperfection whichencourages the author to place it before this audience, in the hope (and trust)that its collective TEXpertise will suggest improvements in the package, or evenan entirely new approach.

Many mathematicians down the centuries have developed their own privatelanguages, necessarily restricted to their notebooks by the exigencies of metaltype. It is interesting to speculate on the influence of the press in ironing out id-iosyncrasies of thought, in the same way that it ironed out variations in grammarand spelling.

But the digital press opens up a new possibility: these once secret languagesmay enter the universal realm of mathematical discourse. The one-dimensionalage ushered in by Gutenberg may be at an end.

Notations like this are much more than diagrams. They hold the meaningof the document, and enter into the mathematical syntax. In our case, the firststep is to express the Penrose notation in BNF form, or its fashionable equivalent,XML,

Timothy Murphy

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 291

Page 144: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Perl port of the mathsPIC graphics package

Dedicated to the fond memory of Mikhail Syropoulos, my beloved brother.

— Apostolos Syropoulos

Apostolos SyropoulosDepartment of Civil Engineering

Democritus University of Thrace

Xanthi, Greece

[email protected]

Richard W. D. NickallsDepartment of Anaesthesia

City Hospital, Nottingham, UK

[email protected]

Abstract

This article describes the authors’ experience of porting the mathsPIC graphicspackage to Perl. The motivation for using Perl is described, as well as the reasonsfor developing it using the Noweb literate programming system. Finally, a simpleexample is presented.

Introduction

This article is a short work in progress report of ourporting of the graphics package mathsPIC (CTAN/graphics/pictex/mathspic/) to standard Perl; aproject designed to make it available for a widerange of platforms.

MathsPIC (Nickalls, 1999) is a filter programfor use with the excellent PICTEX drawing engine1.MathsPIC differs from other graphics packages inthat it provides an environment for manipulatingnamed points, which greatly facilitates the drawingof geometrical figures. It also accommodates relativeaddressing, scalar variables, and file input for datapoints and other commands. MathsPIC was origi-nally written in PowerBASIC 3.5, a commercial ver-sion of BASIC available only for MS-DOS systems.

However the original MS-DOS version ofmathsPIC does have certain limitations; for example,it is unable to parse mathematical functions. Fur-thermore, maths libraries for PowerBASIC are allcommercial. Consequently, in order to significantlyextend mathsPIC, the authors felt it was necessary toreimplement it in a systems programming languageconsistent with the philosophy ‘write once, run ev-erywhere’, namely Perl.

1 The original PICTEX files have been significantly im-proved and made memory-efficient by Andreas Schrell—seepictexwd.sty (CTAN/graphics/pictex/addon/)

This reimplementation of mathsPIC started inJanuary 2000, and has been conducted as a collabo-rative project over the internet, by the authors. Theauthors used different platforms during the develop-ment (Perl 5.6 on a Solaris x86 machine, and djgppPerl 5.005 on an MS-DOS machine).

Probably the most difficult aspects were main-taining a consistent syntax, and downwards compat-ibility. We decided to maintain case-insensitivity forcommand names, as this was found to be particu-larly useful in promoting readability. The log file(.mlg file) was structured to mirror the usual TEXand LATEX log files in order to allow tools whichprocess these files to work similarly with mathsPIC.This was also an appropriate time to revise and im-prove the syntax of the language. So, for exam-ple, the original variable command format, e.g.,variable(x)b,advance(4), has been improvedto allow an algebraic syntax, e.g., var x=b+4, as wellas allowing several variables to be defined using onecommand, e.g., var y=3*(j-2), j27=r/3, p4=AB.

Why Perl?

Perl is a high-level scripting programming languagewith an eclectic heritage designed by Larry Wall. Itis an interpreted language which has been portedto most operating systems, and so is a particularlygood choice for the implementation of programs

292 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 145: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Perl port of the mathsPIC graphics package

In this section we define a few global variables. More specifically:variable $version_number contains the current version numberof the program, variable $commandLineArgs contains the commandline arguments. These two variables are used in the print_headers

subroutine. Variable $command will contain the whole current input line. Hash %PointTable is used to store point names and relatedinformation. Hash %VarTable is used to store mathsPIC variable names and related information. Variable $no_errors is incremented whenever the program encounters an error in the input file. Variables $xunits, $yunits and $units are related to the paper command. In particular, variable $units is used to parse the unit part of the unit part of the paper command. Variable $defaultsymbol is used to set the point shape. Variable $PI holds the value of the pi constant.

<Define global variables>=

$version_number = "0.0 September 1, 2000";$commandLineArgs = join(" ",@ARGV);$command = "";$curr_in_file = "";keys(%PointTable) = 0;keys(%VarTable) = 0;$no_errors = 0;$xunits = "1pt";$yunits = "1pt";$units = "pt|pc|in|bp|cm|mm|dd|cc|sp";$defaultsymbol = ’$\bullet$’;$PI = atan2(1,1)*4;

Used above.

Figure 1: Literate (woven) extract from mathsPIC source

likely to be used on many different operating sys-tems. Its design has been largely influenced by theC programming language, but also by other toolsand languages, for example, SED, AWK, and theUnix shell. Perl’s process, file, and text manipu-lation facilities make it particularly well-suited fortasks involving quick prototyping, system utilities,software tools, system management tasks, databaseaccess, graphical programming, networking, andworld wide web programming. Finally, and impor-tantly, Perl is in the public domain, and so there areno commercial restrictions.

Literate programming

The Perl mathsPIC program was developed through-out using so-called ‘literate program’ methodology(Knuth, 1992; Syropoulos, 1999; Hatzigeorgiu andSyropoulos, 1998), in conjunction with Norman

Ramsey’s freely available Noweb literate program-ming tool (Ramsey, 1994).

Noweb was chosen partly because it is language-independent, but also because it can generate theweaved file in variety of formats, e.g., plain TEX,LATEX, HTML and nroff. Noweb allows programsto be built up of named chunks in any order withdocumentation interleaved, and has powerful index-ing and cross-referencing facilities. Furthermore,Noweb’s pipeline makes it easy to extend, and dif-ferent stages of the pipeline can can be implementedin different programming languages (Ramsey, 1994).Noweb uses its notangle and noweave tools to ex-tract code and documentation as required. Figure 1shows a formatted code chunk of the resulting liter-ate program.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 293

Page 146: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Apostolos Syropoulos and Richard W. D. Nickalls

Example

By way of example we show the mathsPIC scriptfile (fig2.m) which produced Figure 2, and alsothe associated output LATEX file (fig2.mt) gener-ated by mathsPIC. Note the use of pictexwd.sty(CTAN/graphics/pictex/addon/).

0

10

20

30

40

50

60

0 10 20 30 40 50 60 70

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.......................

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

............................................................................

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

...........................................................................................................

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.............................................................................................

..................................................................................................................................................................................................................................................................................................................................................................................................................

...............................................................................................................................................................................

......

.....

......................... . . . . . . . . ..........

••

.............

.............

.............

.............

.............

.............

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.............

.............

.............

.............

.............

.............

.............

.............

.............

.............

............

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

........................................................

Triangle, pentagonand three circles

A

B

C

J

K

E

72

I

P1

P2

P3

Figure 2: Example diagram (mathsPIC source intext)

%% mathsPIC script file (fig2.m)

%% Figure 2

\documentclass[a4paper]article

\usepackagepictexwd

\begindocument

\beginpicture

\setdashes

paperunits(mm),xrange(0,70),yrange(0,60),

axes(LBT*R*),ticks(10,10)

\setsolid

point(A)10,10 %% anchor point

point(B)A, polar(50,50 deg)

point(C)A, polar(50,0 deg)

point(J)pointonline(AB,30)

point(K)perpendicular(J,AC)

drawRightangle(JKC,3)

drawLines(AB,AC,JK)

drawIncircle(AJK)

drawExcircle(AJK,JK)

\setplotsymbol(\large .)

\setdots

drawCircumcircle(AJK)

point(I)IncircleCenter(AJK)[$\odot$]

point(E)ExcircleCenter(AJK,JK)[$\odot$,1.2]

point(P1)perpendicular(E,AC)

var r = EP1 %% radius of excircle

var d = 360/5 %% angle for pentagon

var a1=-90,a2=a1+d,a3=a2+d,a4=a3+d,a5=a4+d

point(P2)E, polar(r,a2)

point(P3)E, polar(r,a3)

point(P4)E, polar(r,a4)

point(P5)E, polar(r,a5)

drawPoints(ABCJKIEP1P2P3P4P5)

\setplotsymbol(\tiny .)

\setdashes

drawLine(P1P2P3P4P5P1,EP1,EP2)

\setsolid

drawAnglearcangle(P2EP1),radius(9),

internal,clockwise

\newcommand\figtitle%

\ \beginminipage30mm%

\ Triangle, pentagon and three circles%

\ \endminipage%

\ %

text(\fbox\figtitle)20,52

variable(s)5

text($A$)A, polar(s,230 deg)

text($B$)B, polar(s,50 deg)

text($C$)C, polar(s,0 deg)

text($J$)J, polar(s,90 deg)

text($K$)K, polar(s,270 deg)

text($E$)E, polar(s,0 deg)

text($72$)E, polar(5.5,-54 deg)

text($I$)I, shift(3, 0)

text($P_1$)P1, polar(s,a1)

text($P_2$)P2, polar(s,a2)

text($P_3$)P3, polar(s,a3)

\endpicture

\enddocument

The axes and bounding box used while con-structing the figure are shown here in order to makeit easier to understand the mathsPIC script file andthe output LATEX file (fig2.mt). They are easilyremoved simply by commenting out the axes andticks options from the mathsPIC paper command.

Note that in addition to mathsPIC commands(not prefixed with a backslash), the script file canalso contain PICTEX, TEX and LATEX commands,since mathsPIC processes the input file according tothe following rules.

• mathsPIC commands are converted into theirequivalent PICTEX commands. The mathsPIC

commands are also copied verbatim but com-mented out—this makes the output file easierto understand.

• Lines having a leading backslash followed byone or more spaces (e.g., \ ) are copied verba-tim except for the leading backslash.

294 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 147: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Perl port of the mathsPIC graphics package

• Lines having a leading backslash followed bya non-space character (e.g., \setdashes) arecopied verbatim.

Note that the output LATEX file (fig2.mt) also con-tains some additional information (e.g., coordinatesof derived points, radius of circles etc.) which isusually included at the end of the original mathsPIC

command, but sometimes as a separate line. Oncethe figure is finished, the output file can be gener-ated without any comment lines simply by using the-c command-line switch during the final mathsPIC

run.

References

Hatzigeorgiu, N and A. Syropoulos. “Literate Pro-gramming and the ‘Spaniel’ Method”. SIGPLAN

Notices 33(12), 52–56, 1998.

Knuth, D E. Literate programming. Number 27 inCSLI Lecture Notes. Center for the Study of Lan-guage and Information, 1992. Co-published byCambridge University Press.

Nickalls, R W D. “MathsPIC: a filter program for usewith PICTEX”. In Proceedings of EuroTEX’99,pages 192–210, Heidelberg, Germany. 1999. Aslightly updated version of this paper was pub-lished (in English) in the Greek TEX Friends’journal Eutopon, No. 3 (October 1999), pp. 33–49.

Ramsey, N. “Literate programming simplified”.IEEE Software 11(5), 97–105, 1994.

Syropoulos, A. “Literate programming: the otherside of the coin”. RAM Magazine (129), 248–253,1999. In Greek.

%% mathsPIC output file (fig2.mt)

%% Figure 2

\documentclass[a4paper]article

\usepackagepictexwd

\begindocument

\beginpicture

\setdashes

%% paperunits(mm),xrange(0,70),yrange(0,60),axes(LBT*R*),ticks(10,10)

\setcoordinatesystem units < 1mm, 1mm>

\setplotarea x from 0 to 70, y from 0 to 60

\axis left ticks numbered from 0 to 60 by 10 /

\axis right /

\axis top /

\axis bottom ticks numbered from 0 to 70 by 10 /

\setsolid

%% point(A)10,10 ( 10 , 10 ) %% anchor point

%% point(B)A,polar(50,50deg) ( 42.13938 , 48.30222 )

%% point(C)A,polar(50,0deg) ( 60 , 10 )

%% point(J)pointonline(AB,30) ( 29.28363 , 32.98133 )

%% point(K)perpendicular(J,AC) ( 29.28363 , 10 )

%% drawRightangle(JKC,3)

\plot 32.28363 10 32.28363 13 /

\plot 29.28363 13 32.28363 13 /

%% drawLines(AB,AC,JK)

\plot 10 10 42.13938 48.30222 / %% AB

\putrule from 10 10 to 60 10 %% AC

\putrule from 29.28363 32.98133 to 29.28363 10 %% JK

%% drawIncircle(AJK)

%% Incircle centre = 23.15115 , 16.13248 ; Radius = 6.132483

\circulararc 360 degrees from 29.28363 16.13248 center at 23.15115 16.13248

%% drawExcircle(AJK,JK)

%% Excircle centre = 46.13249 , 26.84886 ; Radius = 16.84886

\circulararc 360 degrees from 62.98135 26.84886 center at 46.13249 26.84886

\setplotsymbol(\large .)

\setdots

%% drawCircumcircle(AJK)

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 295

Page 148: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Apostolos Syropoulos and Richard W. D. Nickalls

%% circumcircle centre = 19.64182 , 21.49067 ; Radius = 15

\circulararc 360 degrees from 34.64181 21.49067 center at 19.64182 21.49067

%% point(I)IncircleCenter(AJK)[$\odot$] ( 23.15115 , 16.13248 )

%% point(E)ExcircleCenter(AJK,JK)[$\odot$,1.2] ( 46.13249 , 26.84886 )

%% point(P1)perpendicular(E,AC) ( 46.13249 , 10 )

%% var r = EP1 ( 16.84886 ) %% radius of excircle

%% var d = 360/5 ( 72 ) %% angle of pentagon (deg)

%% var a1=-90, a2=a1+d, a3=a2+d, a4=a3+d, a5=a4+d

%% a1 = -90

%% a2 = -18

%% a3 = 54

%% a4 = 126

%% a5 = 198

%% point(P2)E,polar(r,a2) ( 62.1567 , 21.64227 )

%% point(P3)E,polar(r,a3) ( 56.036 , 40.47987 )

%% point(P4)E,polar(r,a4) ( 36.22898 , 40.47987 )

%% point(P5)E,polar(r,a5) ( 30.10827 , 21.64227 )

%% drawPoints(ABCJKIEP1P2P3P4P5)

\put $\bullet$ at 10 10 %% A

\put $\bullet$ at 42.13938 48.30222 %% B

\put $\bullet$ at 60 10 %% C

\put $\bullet$ at 29.28363 32.98133 %% J

\put $\bullet$ at 29.28363 10 %% K

\put $\odot$ at 23.15115 16.13248 %% I

\put $\odot$ at 46.13249 26.84886 %% E

\put $\bullet$ at 46.13249 10 %% P1

\put $\bullet$ at 62.1567 21.64227 %% P2

\put $\bullet$ at 56.036 40.47987 %% P3

\put $\bullet$ at 36.22898 40.47987 %% P4

\put $\bullet$ at 30.10827 21.64227 %% P5

\setplotsymbol(\tiny .)

\setdashes

%% drawline(P1P2P3P4P5P1,EP1,EP2)

\plot 46.13249 10 62.1567 21.64227 / %% P1P2

\plot 62.1567 21.64227 56.036 40.47987 / %% P2P3

\putrule from 56.036 40.47987 to 36.22898 40.47987 %% P3P4

\plot 36.22898 40.47987 30.10827 21.64227 / %% P4P5

\plot 30.10827 21.64227 46.13249 10 / %% P5P1

\putrule from 46.13249 25.64886 to 46.13249 10 %% EP1

\plot 47.27376 26.47803 62.1567 21.64227 / %% EP2

\setsolid

%% drawAnglearcangle(P2EP1),radius(9),internal,clockwise

\circulararc -72 degrees from 54.692 24.0677 center at 46.13249 26.84886

\newcommand\figtitle%

\beginminipage30mm%

Triangle, pentagon and three circles%

\endminipage%

%

%% text(\fbox\figtitle)20,52

\put \fbox\figtitle at 20 52

%% variable(s)5 ( 5 )

%% text($A$)A,polar(s,230deg)

\put $A$ at 6.786062 6.169777

%% text($B$)B,polar(s,50deg)

296 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 149: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

A Perl port of the mathsPIC graphics package

\put $B$ at 45.35332 52.13245

%% text($C$)C,polar(s,0deg)

\put $C$ at 65 10

%% text($J$)J,polar(s,90deg)

\put $J$ at 29.28363 37.98133

%% text($K$)K,polar(s,270deg)

\put $K$ at 29.28363 5

%% text($E$)E,polar(s,0deg)

\put $E$ at 51.13249 26.84886

%% text($72$)E,polar(5.5,-54deg)

\put $72$ at 49.36531 22.39926

%% text($I$)I,shift(3,0)

\put $I$ at 26.15115 16.13248

%% text($P_1$)P1,polar(s,a1)

\put $P_1$ at 46.13249 5

%% text($P_2$)P2,polar(s,a2)

\put $P_2$ at 66.91198 20.09719

%% text($P_3$)P3,polar(s,a3)

\put $P_3$ at 58.97492 44.52495

\endpicture

\enddocument

Richard W.D. Nickalls and Apostolos Syropoulos

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 297

Page 150: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Chess macros for chess games and puzzles

Marina Yu. NikulinaSt. Petersburg Technical University

St. Petersburg, Russia

[email protected]

Alexander S. BerdnikovInstitute of Analytical Instrumentation

St. Petersburg, Russia

[email protected]

Abstract

The macro package uchess.sty described here generalizes the well known chessmacros chess.sty by Piet Tutelaers [1], bdfchess.sty by Frank Hassel [2] andthe less known chess.sty by Tomasz Przechlewski [9]. It adapts international(European) chess notation for other languages (primarily for Russian) as it isrequired by modern LATEX. It also allows the User to annotate non-classical chessgames — hexagonal chesses, Ω-chess, etc. Special care is taken to allow the Userto represent various chess puzzles with non-standard chess rules.

Introduction

The well known and available on CTAN chess macroschess.sty (by Piet Tutelaers) and bdfchess.sty

(by Frank Hassel) are excellent but do not workwell with the Russian language without manualcorrection of the original macros. Moreover, if thebabel package (versions 3.6 and 3.7) is used, neitherchess.sty nor bdfchess.sty can recognize thepresence of babel and hence cannot support multi-language chess notation as they should. The otherreason to issue a new macro set is that chess.sty

and bdfchess.sty only deal with the classical chessgame — such things as non-standard figures andnon-standard chess boards are not supported.

The new macro package uchess.sty outlinedhere should correct these gaps. It follows the schemesuggested in chess.sty and bdfchess.sty and ismore an extension of the ideas suggested in thesepackages than an original macro package. It in-cludes support of multilingual chess notation in amore robust way (including support of the Russiannotation). It supports multiple chess boards and po-sitions simultaneously and contains special macroswhich simplify the presentation of chess problems. Italso has special commands which help to representnon-standard chess puzzles with unusual boards andrules. It is based on an extended chess font whichpermits representation of chess and checkers on non-standard boards and with non-standard figures (like

the hexagonal chess [10] and Ω-chess [7] games), andwill draw the arrows showing moves, etc.

Problems with foreign language support

One of the most powerful features of chess.sty byPiet Tutelaers is the support of chess notation forforeign languages. But since that part of LATEXchanged greatly since chess.sty was released, thefeature has steadily transformed itself to a weakpoint of the package. Let us consider this effect inmore detail.

First, the support of foreign languages inchess.sty is entirely based on babel. But itrecognizes the presence of babel by the existenceof the macro \babel@core@loaded— which is ob-solete since babel 3.6a (1996/11/02), as explainedin the babel manual. As a result chess.sty

loads english.sty even if babel is already loaded.(And if by chance it reads the obsolete version ofenglish.sty included among other files with thebundle with chess.sty, the result may be ratherstrange.)

Second, the chess.sty support of foreign lan-guages analyzes the current babel language eachtime you switch to chess mode and unconditionallyredefines the chess notation as specified by thislanguage. So it is impossible without extensivelanguage switching to have chess notation in Englishwhile the main text is in German, French, Dutch orRussian. Moreover, if the corresponding language is

298 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 151: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Chess macros for chess games and puzzles

not supported by chess.sty at all (the current ver-sion 1.2 recognizes only english, french, german

and dutch as valid languages), you’ll see that yourchess notation disappears without any warning orerror message — so you must switch language tosome known one before each chess fragment. (Thisdefect is partially corrected in bdfchess.sty —namely, you can specify one language for chess nota-tion and another language for the main text. But ifthe language selected for chess notation is not sup-ported by chess.sty, you’ll still find all your chessfigures dissappearing from your document withoutany warning.)

You can correct this defect by adding the sup-port of the desired language in chess.sty directly.But if you would like to do this, you’ll need tocorrect the original file or to redefine its internalmacro \select@pieces— both operations are nottoo difficult for TEX experts (especially taking intoaccount the that the procedure is described in thedocumentation supplementary to chess.sty). Butfor the ordinary user it is not so clear how to do it,and there is no ready-to-use intrinsic mechanism foradding a new language in chess.sty with modesteffort and in a standard way. (And the strangebehaviour of chess.sty is quite annoying for an or-dinary user because he/she cannot understand whathappens and what is wrong with the document.)

Finally, chess.sty supports foreign languagenotation in the assumption that in any languageone-letter notation is used. This is true for English,French, German, Dutch, Italian, etc., but in Russianit is not so: two-letter notation is used to distinguishKing (‘Kp’) from kNight (‘K’). Taking into accountthat for the Russian language there is no unifiedinput encoding (different platforms uses differentencodings for Russian letters) the problem how tosupport Russian chess notation in a unified waybecomes even more difficult.

Foreign language support in uchess.sty

The support of foreign language notation is the maincomponent which is different in uchess.sty andchess.sty (to be honest, correct support of Russianchess notation was the main reason to substitutechess.sty by uchess.sty). You may control thelanguage used for chess notation independently ofthe language used for the main text by the com-mand \chesslanguage. And although your chesslanguage is synchronized with the main text if youspecify the chess language as babel, synchronizationis not obligatory.

The procedure for adding new languages intouchess.sty is modified as well. First, when a

special language is required for chess notation, thepackage checks that a characteristic macro com-mand based on the language name already exists.If the command does not exist, a warning messageis issued and the chess notation is switched to En-glish (the default notation built-in for uchess.sty).Second, if you need to add a new language foruchess.sty, you just define the necessary macrocommand — this is enough to extend the set oflanguages supported by uchess.sty — you do notneed to change anything thing inside the originaluchess.sty commands. Finally, when you loadthe package uchess.sty by the LATEX 2ε command\usepackage, you can define the list of supportedlanguages as its options — for each unknown op-tion name the file name.cld is loaded (.cld standsfor chess language definition). (uchess.sty alsochecks that the macro with the desired name isreally defined in this file. For all main languagesthe corresponding .cld-files are included with thepackage uchess.sty.)

But the problem with the Russian language andits numerous encodings still remains. To solve itwe added an additional (optional) parameter whichhelps the language switching macro to select the ap-propriate input encoding. Additionally, to simplifythe user’s work on defining the language switchingmacro there are standard commands which help todefine one-letter and two-letter abbreviations forchess figures. And if by chance the language switch-ing mechanism misbehaves (as it does for chess.sty

where the chess figures just disappear from your textif there are no standard chess abbreviations for yourlanguage), the user can always use macro commandswith fixed names.

The uchess.sty support of other languagesalso allows the user to switch flexibly between al-phanumeric notation and the ‘figurine’ notation inthe document without major changes to the inputfile (where the alphanumeric notation is in agree-ment with your language). Special precautionsare performed to adapt other special symbols usedby chess notation properly when the language isswitched as well (for example, the symbols usedfor international Chess Informant notation and thenotation traditionally used in Russia, Poland, etc.,differ widely as concerns the symbols used for check,checkmate, stalemate, etc.).

Non-standard chess games

Chess board for 4 players and its rules It isnice that there is the support of the classical chessgame in LATEX, but today the non-standard chessgames are becoming more and more popular [8, 7].

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 299

Page 152: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Marina Yu. Nikulina and Alexander S. Berdnikov

While it is necessary to keep chess figures of four

colors for the chess game for 4 players [8], it ispossible to overcome the restriction of typical black-and-white typography by rotating the correspondingchess figures by 90, 180 and 270. The fontsdescribed in [3] enable us to generate the rotatedfonts without any problems but it is questionablewhether that it is necessary to support such anexotic chess game inside uchess.sty. Maybe it willbe done someday — if somebody really needs it.

Ω-chess board and its rules While the chessgame for 4 players [8] seems to be just a privatejoke for home entertainment, Ω-chess [7] is a moreserious game, and its support by LATEX is a desirablefeature. Support of the Ω-chess board requires twoadditional figures (wizard and champion), a non-standard chess-board with 104 fields (10 × 10 plusfour separate corner squares) and support of non-usual moves and field notation in the way thatis already done for the classical chess game inchess.sty. Additional figures are included in ournew chess font [3], and the extended chess notationis supported when you mark your chess board as anΩ-game by a special option.

Hexagonal chess boards and their rules Inaddition to the Ω-chess board there are (at least)two hexagonal chess boards [10] with chess rulesof their own. These boards are composed fromhexagonal fields colored in three colors (white, grayand black), and although standard chess figures areused, the initial positions and the rules how tomove the figures over the board are far from beingstandard. As for Ω-chess the support of hexagonalchess games is included in uchess.sty althoughserious modifications of the internal representationsused for chess boards in chess.sty were necessary.

Chess problems The classical chess game is di-vided into two relatively independent branches.There is the chess game itself where two peoplefight for victory, and there is the solution of spe-cially prepared chess problems. (Actually there isa third branch as well — the computer chess gameand computer chess analysis — but these are not toodifferent from the other two branches as concernschess typesetting.)

While the support of an ordinary chess game isdone in chess.sty in a user-friendly manner, andwhile bdfchess.sty supports playing chess gamesby post in the same way, the support of chess type-setting for chess problems is not so flexible. To assistthe user working in this specific field uchess.sty

contains the support of several boards and posi-tions simultaneously, storing and copying the board

content, transformation of boards, adding/removingindividual chess pieces, etc. There are also specialchess environments used to typeset the main streamof the solution, its side streams and the alternativevariants — see section ‘Additional environments’ formore details.

Puzzles, fairy chess games, checkers, etc.

Apart from classical chess games and chess problemsthere are so-called unusual (fairy) chess games andproblems — i.e., with non-standard rules, boards,figures, etc. While the typesetting of chess diagramswith non-standard rules is more or less covered bymacros designed for ordinary chess diagrams, thisis not the case when we deal with non-standard (forexample, non-rectangular) chess boards and unusualchess figures.

Macros from uchess.sty extend the flexibilityof defining non-standard rectangular and hexagonalchess boards. In chess.sty each field may be blackor white, occupied by a chess figure or not, but inuchess.sty two more variants are included:

• empty field which is outside the board (drawnas an empty square),

• empty field which is a hole inside the board(drawn as a square filled by solid black color).

While neither field can be occupied by a figure, theyare drawn in a different style for a clear reason: itis not reasonable to fill with black the entire regionoutside the non-rectangular board, and it is difficultto distinguish the hole inside non-rectangular boardfrom the white field if it is just empty without anadditional marker.

The other aspect essential for fairy chesses isthe existence of non-standard figures. While thereare no strict rules how to represent these figuresgraphically (the Ω-chess game is an exception [7]),it is more or less clear that they should be differentfrom the ordinary chess figures. To satisfy theneeds of this group of users, uchess.sty supportsadditional pictograms (crosses, bullets) to representunusual chess figures, and a big bold circle which canmodify the meaning of an ordinary chess figure if it isnecessary. And in addition to these chess-like figuresit is necessary to note, that checkers and checker-

like board games can be considered as fairy chessgames as well — so it is natural to include supportof checkers in uchess.sty also.

Finally, it is necessary sometimes to draw mark-ers, borders, arrows, etc., over chess boards (partic-ularly for child-level chess textbooks). A separatefont enables us to draw arrows, etc., over the chessboard in the same way as in the picture environment,and it is possible to add plain borders and to make

300 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 153: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Chess macros for chess games and puzzles

bold boundaries between the square and hexagonalcells of the board.

Extended chess encoding

As a result of our attempt to cover all these con-tradictory requirements, a special chess font (or,more strictly, chess encoding) was developed. Itincludes all classical chess figures (black and white)and some special-purpose figures (wizard, champion,checker, double-checker, crosses and bullets) arealso added. Non-symmetrical figures exist in twovariants, straight and mirrored (hopefully there arejust two figures of that kind, knight and wizard) —because, for example, it is recommended to use thehorse with the head rotated to the left when itrepresents the knight on chess board, and to theright when it represents the knight in chess text [2].

Editor’s note: Surely the figures don’t exist asa text character, but rather as some sort of charactercode. . . We’ve already been told that in Russiannotation there is a two-letter representations.

Each figure exists as a text character, as thefigure placed over a black or over a white squarefield, and as the figure placed over a white, black orgray hexagonal field. (In fact, there is no separatefigure to be placed over a white hexagonal field —it is enough to have the figure placed over a whitesquare and a simple TEX macro. But the differencebetween ‘text figures’ and figures placed over whitesquare fields is essential — see [3] for more details.)In addition there are the empty square and hexago-nal fields of corresponding color, the fields filled bya solid black color, the lines used to surround thesquare field or the hexagonal field by a frame (orto make the solid frame around the whole board),and the solid circle used to modify the meaning of achess figure.

The final chess encoding and the details of newchess fonts are described in [3].

Chess Informant notation

Aside from chess figures there are many specialsymbols used to annotate real chess games in anabbreviated manner. The most famous is the in-ternational Chess Informant system, but there arealso other symbols locally accepted in national chesspublications. Since these symbols can be used intext only, there is no reason to put them in thesame font as ordinary chess figures. Moreover,these symbols should be visually compatible withthe ordinary Computer Modern text and, hence,change their style as the style of the main text ischanged. LATEX 2ε has a sophisticated but user-friendly NFSS-system which controls such behaviour

nearly automatically. All what we need to do is tofix the list of necessary symbols and the font en-coding, to create the fonts for all necessary variants(size/shape/series/family) and, finally, to preparecorresponding .def- and .fd-files and define macros.

Since this part of uchess.sty is under prepara-tion now, it does not contain symbol fonts which arecompatible with Computer Modern and EuropeanModern and the representation of the notation ofChess Informant to a full extent, but there are defi-nite plans to extend the support of the internationalchess notation to the level where Chess Informant

notation and national notations are fully supportedas well. (It is worth noting that sometimes Chess In-

formant notation and national notations are differ-ent — as a result the language-switching commandsshould control this difference as well.)

Arrows, borders, etc.

Chess figures and chess symbols described in sec-tions ‘Extended chess encoding’ and ‘Chess Infor-

mant notation’ are enough for almost all profes-sional chess typesetting. But what about textbooks?Quite often it is necessary to draw the arrows show-ing the moves of particular figures, to emphasizesome fields by special markers, to draw a specialborder around a chess diagram, to mark explicitlythe boundary between two chess fields, etc. — andthere are no such elements in our fonts nor macrocommands at our disposal!

But this just means that such elements and suchmacros should be added. Hopefully, there is a goodpredecessor for this — namely, the LATEX picture

environment based on restricted LR-mode whichenables construction of arbitrary two-dimensionalmosaics from discrete elements by explicit speci-fication of individual two-dimensional coordinates.Our environment allows the user to annotate byarrows, markers, borders, bounding lines, etc., fortextbook chess diagrams that are organized in thesame manner.

Although just now there is no special font witharrows, etc., available to uchess.sty for that pur-pose (and, consequently, there are no macros todraw arrows over the chess board), we have plansto add the necessary extensions.

Multiple chess boards

An essential extension of chess.sty is the supportof multiple chess boards inside the same document.The board is identified by its name, and by defaultthe board current is used. The board contains thedescription of the current position, the flags showingthe state of the game (white or black side is to make

TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting 301

Page 154: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Marina Yu. Nikulina and Alexander S. Berdnikov

the move, is it possible to castle, etc.) and a specialflag identifying the rules of the game. The boardcan be of non-standard size (square or rectangular)and, besides ordinary fields, can contain specialfields — namely, empty fields which are outside theboard and are displayed as empty white squares(hexagons), and null fields which are displayed asblack squares (hexagons) and represent the holesinside the standard board. It is possible to makea copy of the current content of a board with anew name, to correct the content of the boardin a silent mode without actually typesetting themoves, to change a board’s state manually, etc. Theboards obey standard TEX rules about block nestingwhich enables the user to play the game variantsand to investigate side game branches without anyproblems and special precautions.

Additional environments

Is it true that now we have everything we needfor accurate chess typesetting? Not at all — weneed specialized environments to mark up chess-oriented text fragments and to mark up logicallydifferent chess-oriented material as well. A verygood example can be found in the documentationof chess.sty — namely, the case where the mainstream of the annotated chess game is typed in boldwhile the alternative variants of the chess game aretyped as ordinary text. While these environmentsfor logical mark-up are outside the main style cre-ated by Piet Tutelaers, they are an intrinsic compo-nent of our package uchess.sty.

Acknowledgements

We express our warmest thanks to our colleaguesfrom other countries — their careful attention sup-ports our activity in TEX even in such unfavourableconditions as they are in modern Russia.

Special thanks are to Bogus law Jackowski andTomasz Przechlewski for valuable consultations, lit-

erature references and ready-to-use chess fonts andchess macros used when we worked on uchess.sty.

Alexander Berdnikov would like to thank sep-arately Dr. A. Compagner from Delft University ofTechnology for his long-term friendship and patientattention as a teacher — not necessarily relating tosome TEX or LATEX joint works.

References

[1] Piet Tutelaers. A font and style for typesettingchess using LATEX or TEX. Machine-readabledocument (supplement to chess.sty), 1992.

[2] Frank Hassel. A LATEX style for management ofcorrespondence chess games. Machine-readabledocument (supplement to bdfchess.sty),1993.

[3] Marina Nikulina, Alexander Berdnikov. Chessfonts for chess games and puzzles. — in theseProceedings.

Editor’s note: This paper was not in factpresented, and will not appear in the proceed-ings. Please supply an alternative description.

[4] Zalman Rubinstein. Chess printing via META-FONT and TEX. TUGboat, 10, pp. 170–172(July 1989).

[5] David Tofsted. An improved chess font. TUG-

boat, 11, pp. 542–544 (November 1990).

[6] Jan Eric Larson. A chess font for TEX. TUG-

boat, 10, pp. 351–352 (November 1989).

[7] Ω-Chess Home page: www.omegachess.com

[8] Chess game for 4 players: www.4playerchess.com

[9] Tomasz Przechlewski, chess.sty, private com-munication.

[10] Wojciech Pijanowski. Gry w ktore gra lem. “Po-morze”, Bydgoszcz, 1989.

[11] ß èê àíèìàòåëüíûå ìàòåìàòè÷åñêèå

èãðû íàíèå îñêâà

302 TUGboat, Volume 21 (2000), No. 3 — Proceedings of the 2000 Annual Meeting

Page 155: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Abstract: Omega version 2

John PlaiceSchool of Computer Science

UNSW

Sydney NSW 2052

Australia

[email protected]

Yannis Haralambous187, rue Nationale

F-59800 Lille

Freance

[email protected]

Abstract

We present the latest developments of the Omega system: multidirectional type-setting, a new accentuation algorithm, the use of external binary translation pro-cesses, enhanced XML/MathML generation, etc. We will also give an overview ofdevelopments by various Omega users around the world, for different languagesand scripts.

John Plaice

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 303

Page 156: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

The NTS project: from conception to birth∗

Philip TaylorRHBNC, University of London, United Kingdom

[email protected]

Jirı ZlatuskaMasaryk University, Brno, Czech Republic

[email protected]

Introduction

It is an enormous pleasure and privilege to be ableto present this paper on NTS at a TUG conferencein Oxford. For almost ten years, NTS has slowlybeen evolving from a concept to a reality, and I amdelighted to be able to report that NTS is virtuallycomplete. The fact that we have reached this pointis due almost entirely to the efforts of one man: myco-presenter, Karel Skoupy. Karel has work tire-lessly on this project, and without his efforts I haveno hesitation in saying that we would not be pre-senting NTS as a success story today.

Let me start by presenting an overview of to-day’s talk and presentation; We will attempt to coverseven separate areas, including (of course) the manda-tory questions and answers at the end. The sevenareas to be covered are:

Phil Taylor

∗ The present authors would like to record their grateful

thanks to all members of the NTS and ε-TEX teams, past

and present, without whom neither this paper nor NTS itself

could have ever come to fruition. A further debt of gratitude

is owed to GUT, in whose Cahiers GUTenberg an earlier ver-

sion of this article first appeared. And, most importantly of

all, we would like to thank the sponsors of the NTS project.

both private and corporate, without whose financial support

the project could never have succeeded.

• A brief history of NTS

• TEX, ε-TEX & NTS compared

• The choice of Java as the language of imple-mentation

• An overview of the classes, object and methodsof NTS

• A summary of the status quo

• A demonstration of NTS, and comparison withTEX

• Questions & answers

and you will soon realize that my expertise lies verymuch in the earlier areas; the implementation de-

tails of NTS are very much Karel’s area, and I willdefer to him whenever any explanation of a detailedimplementation issue is called for.

304 TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting

Page 157: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

2000

Nov 13 –Jan 6

Gutenberg exhibit, including workingreplica of his original printing press,Louisville Free Public Library,Louisville, Kentucky.

2001

Feb 28 –Mar 3

DANTE 2001, 24th meeting,Fachhochschule Rosenheim,Germany. For information, visithttp://www.dante.de/dante2001/.

Mar 26 – 28 XML World Europe, Amsterdam,Netherlands. For information, visithttp://www.xmlworld.org/.

Apr 1 –Jun 15

The Best of the Best: A traveling juriedexhibition of books by members of theGuild of Book Workers. Ohio StateUniversity Library, Athens, Ohio.Sites and dates are listed at http://palimpsest.stanford.edu/byorg/gbw.

Apr 9 – 13 Seybold Boston, Boston,Massachusetts. For information, visithttp://www.key3media.com/

seyboldseminars/boston2001/.

Apr 29 –May 2

BachoTEX 2001, 9th annual meeting ofthe Polish TEX Users’ Group(GUST), “Contemporary publishingTEXnology”, Bachotek, Brodnica LakeDistrict, Poland. For information, visithttp://www.gust.org.pl/BachoTeX/.

May 14 – 17 Congres GUTenberg 2001, “Le documentau XXIe Siecle”, Metz, France.For information, visit http://

www.gutenberg.eu.org/manif/gut2001/.

Jun 4 – 8 Rare Book School Summer Session,University of Virginia, Charlottesville,Virginia. A series of one-weekcourses on topics concerning rarebooks, manuscripts, the history ofbooks and printing, and specialcollections. For information, visithttp://www.virginia.edu/oldbooks.

306 TUGboat, Volume 21 (2000), No. 3

Calendar

Jun 6 – 8 Society for Scholarly Publishing,

23rd annual meeting, San Francisco,California. For information, visithttp://www.sspnet.org.

Jun 13 – 17 ACH/ALLC 2001: Joint InternationalConference of the Association forComputers and the Humanities, andAssociation for Literary and LinguisticComputing, New York University, NewYork. For information, visit http://www.nyu.edu/its/humanities/ach_allc2001/.

Jul 6 –Aug 18

The Best of the Best: A travelingjuried exhibition of books by membersof the Guild of Book Workers.Columbia College Chicago Center forBook and Paper Arts, Chicago, Illinois.Sites and dates are listed at http://

palimpsest.stanford.edu/byorg/gbw.

Jul 13 – 15 TypeCon 2001, Rochester, New York.For information, visithttp://www.typecon2001.com.

Jul 16 –Aug 10

Rare Book School Summer Session,University of Virginia, Charlottesville,Virginia. A series of one-weekcourses on topics concerning rarebooks, manuscripts, the history ofbooks and printing, and specialcollections. For information, visithttp://www.virginia.edu/oldbooks.

TUG2001

University of Delaware, Newark, Delaware.For information, visit http://www.tug.org/tug2001/.

Aug 6 – 10 Intermediate/Advanced LATEX trainingclass.

Aug 12 – 16 The 22nd annual meeting of the TEXUsers Group, “2001: A TEX Odyssey”.

Aug 12 – 17 Extreme Markup Languages 2001:“There’s Nothing so Practical as aGood Theory”, Montreal, Canada.For information, visithttp://www.gca.org.

Status as of 1 December 2000

For additional information on TUG-sponsored events listed above, contact the TUG office(+1 503 223-9994, fax: +1 503 223-3960, e-mail: [email protected]). For events sponsoredby other organizations, please use the contact address provided.

Additional type-related events and news items are listed in the Sans Serif Web pages,at http://www.quixote.com/serif/sans.

Page 158: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Aug 12 – 17 SIGGRAPH 2001, Los Angeles,California. For information, visithttp://www.siggraph.org/s2001/.

Sep 8 WDA’2001: First International Workshopon Web Document Analysis, Seattle,Washington. For information, visithttp://www.csc.liv.ac.uk/~wda2001.

Sep 10 –Oct 26

The Best of the Best: A travelingjuried exhibition of books bymembers of the Guild of BookWorkers. Dartmouth College,Hanover, New Hampshire. Sites anddates are listed at http://

palimpsest.stanford.edu/byorg/gbw.

Sep 17 – 20 XML World 2001, San Francisco,California. For information, visithttp://www.xmlworld.org/.

TUGboat, Volume 21 (2000), No. 3 307

Sep 23 – 27 EuroTEX2001, “TEX and Meta: theGood, the Bad and the Ugly Bits”,Kerkrade, Netherlands. For information,visit http://www.ntg.nl/eurotex/.

Sep 29 29th Annual General Meeting of theDanish TEX Users Group (DK-TUG),Arhus, Denmark. For information, visithttp://sunsite.dk/dk-tug/.

Oct 24 – 26 4th International Conferenceon The Electronic Document,Toulouse, France. For information, visithttp://www.irit.fr/CIDE2001/.

Nov 9 – 10 ASM Symposium on DocumentEngineering, Atlanta, Georgia.For information, visithttp://www.documentengineering.org.

Institutional

Members

American Mathematical Society,Providence, Rhode Island

Center for Computing Services,Bowie, Maryland

CNRS - IDRIS,Orsay, France

College of William & Mary,Department of Computer Science,Williamsburg, Virginia

CSTUG, Praha, Czech Republic

Florida State University,Supercomputer ComputationsResearch, Tallahassee, Florida

Hong Kong University ofScience and Technology,Department of Computer Science,Hong Kong, China

IBM Corporation,T J Watson Research Center,Yorktown, New York

ICC Corporation,Portland, Oregon

Institute for Advanced Study,Princeton, New Jersey

Institute for Defense Analyses,Center for CommunicationsResearch, Princeton, New Jersey

Iowa State University,Computation Center,Ames, Iowa

Kluwer Academic Publishers,Dordrecht, The Netherlands

KTH Royal Institute ofTechnology, Stockholm, Sweden

Marquette University,Department of Mathematics,Statistics and Computer Science,Milwaukee, Wisconsin

Masaryk University,Faculty of Informatics,Brno, Czechoslovakia

Max Planck Institutfur Mathematik,Bonn, Germany

National Institute for Child& Human Development,Bethesda, Maryland

New York University,Academic Computing Facility,New York, New York

Princeton University,Department of Mathematics,Princeton, New Jersey

Space Telescope Science Institute,Baltimore, Maryland

Springer-Verlag Heidelberg,Heidelberg, Germany

Springer-Verlag New York, Inc.,New York, New York

Stanford Linear AcceleratorCenter (SLAC),Stanford, California

Stanford University,Computer Science Department,Stanford, California

Stockholm University,Department of Mathematics,Stockholm, Sweden

University of Canterbury,Computer Services Centre,Christchurch, New Zealand

University College, Cork,Computer Centre,Cork, Ireland

University of Delaware,Computing and Network Services,Newark, Delaware

Universitat Koblenz–Landau,Fachbereich Informatik,Koblenz, Germany

University of Oslo,Institute of Informatics,Blindern, Oslo, Norway

Universita degli Studi di Trieste,Trieste, Italy

Vanderbilt University,Nashville, Tennessee

Vrije Universiteit,Amsterdam, The Netherlands

Page 159: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Miscellaneous Photos∗

Robin Fairbairns

Start of the Banquet

A view down Parks Road

∗ These photos and others scattered throughout the issue

are only a few of the photos kindly donated by Alan Wetmore;

more may be viewed on the TUG web site at http://www.tug.

org/tug2000/Photos/index.html.

University Museum

Tea Break with Kim Roberts centre stage

TUG Board members: (L – R) Phil Taylor, Don De-Land, Robin Laakso (TUG Business Manager, seated),Susan DeMeritt, Judy Johnson, Barbara Beeton,and Kaja Christiansen.

TUGboat, Volume 21 (2000), No. 3 —Proceedings of the 2000 Annual Meeting 305

Page 160: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Benjamin Bayart

(France)

Kaveh Bazargan

Focal Image Ltd (UK)

Nelson Beebe

University of Utah (USA)

Barbara Beeton

American Mathematical Society(USA)

Duncan Bennett

MRC Biostatistics Unit (UK)

Alexander Berdnikov

Institute of Analytical

Instrumentation (Russia)

Berend de Boer

(Netherlands)

Thierry Bouche

Universite de Grenoble I (France)

Johannes Braams

TEXniek (Netherlands)

Klaus Braune

Universitat Karlsruhe (Germany)

W lodzimierz Bzyl

University of Gdansk (Poland)

David Carlisle

NAG/LATEX3 (UK)

Lance Carnes

Personal TEX, Inc. (USA)

Ed Cashin

University of Georgia (USA)

Kaja Christiansen

Aarhus University (Denmark)

Steve Daniels

The Open University (UK)

Donald DeLand

Integre Technical Publishing (USA)

Susan DeMeritt

IDA/CCR La Jolla (USA)

Christine Detig

Net & Publication Consultance(Germany)

Michael Downes

American Mathematical Society(USA)

Gontran Ervynck

K.U. Leuven Campus Kortryk

(Belgium)

Participants at the 21stAnnualTUGMeetingAugust 12–16, 2000,WadhamCollege,Oxford,UK

Robin Fairbairns

University of Cambridge ComputerLaboratory (UK)

Emilio Faro Rivas

Escuela de Telecomunicaciones

(Spain)

Alexey V. Filippov

Institute of Fine Mechanics andOptics (Russia)

Jonathan Fine

(UK)

Peter Flynn

University College, Cork (Ireland)

Andrew Ford

Ford & Mason Ltd (UK)

James Foster

University of Sussex (UK)

Erik Frambach

(The Netherlands)

Walter Gander

Comlab, University of Oxford (UK)

Jeremy Gibbons

Comlab, University of Oxford (UK)

Gurpreet Gill

Lindsay Ross International Limited(UK)

Peter Giunta

Massachusetts Institute of Technology(USA)

Rosa Maria Gomez Flores

STAR AG (Switzerland)

Michel Goossens

CERN (Switzerland)

Steve Grathwohl

Duke University Press (USA)

Hans Hagen

PRAGMA Advanced DocumentEngineering (Netherlands)

Jay Hammond

QMW, University of London(England)

Han The Thanh

Masaryk University (Czech Republic)

Ahmed Hindawi

Hindawi Publishing Corporation(Egypt)

308 TUGboat, Volume 21 (2000), No. 3

Rick Hobbs

Institute of Public Administration(Saudi Arabia)

Alan Hoenig

Knowledge Equity, Inc. (USA)

Mimi Jett

IBM (USA)

Judy Johnson

Personal TEX, Inc. (USA)

Tom Kacvinsky

American Mathematical Society

(USA)

Hirotsugu Kakugawa

(Japan)

NG Kalivas

Westminster School (UK)

Anders Kallstrom

Uppsala University (Sweden)

Jonathan Kew

SIL Intl (UK)

Thomas Koch

Dante e.V. (Germany)

Reinhard Kotucha

(Germany)

Johannes Kuester

typoma (Germany)

Robin Laakso

TEX Users Group (USA)

Klaus Lagally

(Germany)

Olga Lapko

Mir Publishers (Russia)

Michel Lavaud

CNRS (France)

Jenny Levine

Duke University Press (USA)

Bernice Lipkin

(USA)

Irina Makhovaia

Mir Publishers (Russia)

Wendy McKay

California Institute of Technology(USA)

Lothar Meyer-Lerbs

(Germany)

Bruce Miller

NIST (USA)

Page 161: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

Galina V. Mitina

All-Russia Institute of PlantProtection (Russia)

Frank Mittelbach

LATEX3 Project (Germany)

Eddie Mizzi

The Geometric Press (UK)

Patricia Monohon

University of California, San Francisco(USA)

Bacem Moussa

Knowledge Equity, Inc. (USA)

Timothy Murphy

School of Mathematics, TrinityCollege (Ireland)

P. Narayanaswami

Memorial University of Newfoundland(Canada)

Winfried Neugebauer

(Germany)

Dick Nickalls

Nottingham University (UK)

Marina Yu. Nikulina

St. Petersburg Technical University

(Russia)

Heiko Oberdiek

Universitat Freiburg (Germany)

Stephen Oliver

University of Manitoba and AtomicEnergy Canada Ltd (Canada)

Pedro Palao Gostanza

Universidad Complutense de Madrid(Spain)

Simon Pepping

Elsevier Science (Netherlands)

Eoin Phillips

Dublin Institute for Advanced Studies

(Ireland)

Karel Piska

Institute of Physics, Academy ofSciences (Czech Republic)

John Plaice

The University of New South Wales(Australia)

Fabrice Popineau

SUPELEC (France)

Lorna Priest

SIL Intl (USA)

Sebastian Rahtz

Oxford University Computing Services(UK)

David Reynolds

Dublin City University (Ireland)

David Rhead

University of Nottingham (UK)

William Richter

Texas Life Insurance Company (USA)

Kim Roberts

HK Typesetting Ltd (UK)

Volker Schaa

Dante e.V. (Germany)

Andreas Scherer

(Germany)

Martin Schroder

TEX Merchandising (Germany)

Joachim Schrod

Net & Publication Consultance(Germany)

Heidi Sestrich

Carnegie Mellon University (USA)

Alex Sheldrake

Inter.Act Systems UK Ltd (UK)

Karel Skoupy

NTS developer (Czech Republic)

Michael Sofka

Rensselaer Polytechnic Institute(USA)

TUGboat, Volume 21 (2000), No. 3 309

Friedhelm Sowa

Universitat Dusseldorf (Germany)

Vytas Statulevicius

VTeX (Lithuania)

Apostolos Syropoulos

Democritus University of Thrace(Greece)

Philip Taylor

Royal Holloway and Bedford

New College (UK)

Sigitas Tolusis

VTeX (Lithuania)

Paul Topping

Design Science, Inc. (USA)

Ulrik Vieth

(Germany)

Michael Vulis

MicroPress Inc. (USA)

Pawel Walczak

University of Lodz (Poland)

Zofia Walczak

University of Lodz (Poland)

John Was

(UK)

Alan Wetmore

Army Research Laboratory (USA)

Michael Wiedmann

(Germany)

Mark Wilber

Knowledge Equity, Inc. (USA)

Dominik Wujastyk

Wellcome Library, Wellcome Trust(UK)

De-Wei Yin

AEA Technology Engineering

Software Ltd (Canada)

Page 162: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

χwww.software.ibm.com/techexplorer

n

techexplorerHypermedia Browser v3

Live Web Math with Interactivity

IBM Research announcestechexplorer 3, released inconjunction with the MathMLInternational Conference 2000.Special new features include:Interoperability with Mathematica4.1 from Wolfram Research, Inc.;A Macintosh version for both theProfessional and IntroductoryEditions; ActiveX allowstechexplorer to interactively workwithin many Windowsapplications, including MicrosoftIE, Word, and Powerpoint;Support for W3C DOM andMathML standards allowsinteractivity with applets,multi-media resources,animations, and many otherapplications.

Write. . . create. . . collaborate. . .techexplorer makes your browsera scientific publishingenvironment. View LATEX andMathML files; create interactivedocuments with Java applets,video or audio clips, animations,and graphics.

NEW FEATURES:Macintosh platformMathematicaTM connectivityActiveX controlDOM APILATEX-2-techexplorer filter

KEY FEATURES:MathML rendering and

conversionLATEX viewing and editingActiveX controlDOM API functionality and

supportCreate pop-up and pull-down

menusIn-line video and auto-play

audioAMS symbol fontsExpression editorInteract with many tools and

applicationsJava and JavaScript

BROWSERS:Netscape, MS Internet

Explorer, Opera

PLATFORMS:Pro: Windows 95/98/NT,

Macintosh OS 8.6/9Intro: Windows, Mac, Linux,

AIX, Solaris

$29.95 from ibm.com

techexplorer is a plug-in forWeb browsers that allowsusers to have live, interactivemathematics on an HTML orXML page. The Intro Editionis a free LATEX or MathMLreader. The Pro Editionincludes advanced featuresfor truly interactivemathematical collaborationand publishing.

c© International Business Machines 2000

IBM, the IBM logo, are registered trademarks, and techexplorer

Hypermedia Browser is a trademark of IBM Corp.

Windows, NT, Microsoft Word, Excel and Powerpoint are registered

trademarks of Microsoft Corp.

Macintosh is a registered trademark of Apple Computer, Inc.

Mathematica is a registered trademark of Wolfram Research, Inc.

Page 163: TUGBOAT - TeX · TUGBOAT Volume21,Number3/ September2000 2000AnnualMeetingProceedings 155 RobinFairbairns/ Editorial Comments—TUG’2000 157 TUG’2000Program Talks 159 BenjaminBayart

i n t r o d u c i n g

With Synchronicity, your TEX input documents

are reliably and automatically cross-linked,

correlated, or “synchronized” with the finished

TEX typeset pages. Every piece of the finished

product is tied directly to the source code from

which it was generated, and vice-versa. To go

from TEX input directly and exactly to the

corresponding typeset characters, just click.

It’s that simple: just click, and Textures will take

you instantly and precisely to the corresponding

location. And it goes both ways: just click on

any typeset character, and Textures will take you

directly to the TEX code that produced it. No

matter how many input files you have, no

matter what macros you use, Synchronicity will

take you there, instantly and dependably.

T E X T U R E S®

¤ . ‚

A g a i n t h e M a c i n t o s h d e l i v e r s a n e w TEX w i t h a r e vo l u t i o n i n h u m a n i n t e r fa c e .

As computer power has advanced, the

Macintosh has consistently been the leader

in the human and humane connection to

technology, and Textures has consistently

led in bringing ease of use to TEX users.

First with Textures 1.0, the first truly

integrated TEX system. Then with Lightning

Textures, the first truly interactive TEX

system. Now, with Textures 2.0 and

Synchronicity, Blue Sky Research again

delivers a striking advance in TEX

interactivity and productivity.

w i t h s y n c h r o n i c i t y

g e t s y n c h r o n i c i t y

I m p r o v e y o u r p e r f o r m a n c e :

b l u e s k y r e s e a r c h

3 1 7 s w a l d e r s t r e e t

p o r t l a n d , o r 9 7 2 0 4 u s a

8 0 0 6 2 2 8 3 9 8

5 0 3 2 2 2 9 5 7 1

w w w . b l u e s k y . c o m

O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@0M?I@M?g?I40?40MheI@M? ?I@M ?I(R4@@?@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0MI40?@Me?I@?40M?I40MhfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@0?4@0MeI4@@0?@?@MI4@@@0M?I40Mg?I4@0MheI@M?@@@@@@@@@@@@@@0?@MI40MI4@0M??I4@@@@@@@0MI@M?I@M? I40Mf?I@M O2@6?2@@6KO2@@@@@@@@@@@@@@@@@6K??O@Khf?O@KfO26KeO26KO2@6KO2@@@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6KO@K?O@K?O2@@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X?O2@6KfO2@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI@?4@0MI4@0?4@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@0?4@@@@0M?hf?I@M I4@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@0?40MI40?4@@@@@@@@@@@@@0M?I40?40MI4@@@@@0?4@@@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@0MI@?4@@@@@@@0MeI4@@@0M??I4@@@@0MI4@@0?40MI40MfI@?4@@0MeI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0MI4@@@@@0MI4@@@0?4@0M?g?I40?40M?I@M O@K?gO26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@6X?@@@0M?f?I4@0M I@M? ?O@KeO@K?eO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)KO@KO@KeO@KO@KfO@KO2@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?O@?26KO26K?O2@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X@@6K O26KheO2@6K??O2@@6K?O2@@@@@@@@@@@@6KO2@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?@MI4@0M??I@Mg?I@?@M?I40M?hfI4@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@0MeI4@@0Me?I4@0M I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0M?I4@0?4@@@@0MI4@@0?4@@@0M?I@M??I4@0Me?I@?40M??I4@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0MeI4@0?4@0M?fI4@0M?eI4@0M?hf?I@M ?O@K?O2@@@@@6K@@0MhI@M? O@K?f?O2@@@@6?@KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6XO@K?O26KO26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K??O26K??O@K?O26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O@?26KO@Kf?O2@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@0M?I4@0M?I@?40?@Me?I@MgI@M?I@M? ?I4@@)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0M??I4@0MheI@M?I40MeI@M?g?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MeI40?4@0?4@@@@0MI4@@0?4@0M?eI@?4@0MI4@@@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0?4@@@@0MI@Mg?I@?40M?hfI40MhfI@M? O2@6X?@@@@@@@@@@@@0?40MI4@@0M?I@M?I@M?e?I@MI40M I@M? O2@6K?O2@@@@6?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?O2@6KO@K?O@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X?O@K?O26K??O@KeO26K?O2@@6?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K??O26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X?@6?@K? O@K?gO26KeO2@6K?e?O@K?O2@@@@6K?eO2@@@@6KO2@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@0M?f?I4@@0MI4@@0MI4@@@@@@@0?@MI4@@0MI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MI4@0MI4@@@@@@@@@@@@@@0M?e?@@0M? ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@0MI@?4@@@@@@@@@@0?4@@@@@0MI4@0M?I40Mf?I40M?eI@?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@@@@0M?I@M?I40MhfI4@0?40Me?I40?40MhfI4@?@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(?4@@0MI4@@@@@@@0?@MI4@@@0?@?40?40M?fI4@0M?fI@M? O2@@@@@@@?@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0M?I4@@@@@@0MI4@0?@?4@@0Me?I4@@@0MI40?4@@0M??I4@0Mf?I40Y? ?O26KO2@6KO2@@@6K?O2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@?@K?gO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?O2@6KO26Kg?O2@@@@@6?2@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@6K?O2@@@@@@@@@@@@6?2@@6KO2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@0?4@0M??I4@@0MI4@0MI4@@@0?@M?he?I4@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0MI40?40?@MI@M?I4@0?40M?I@MgI4@@0Mf?I@MfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@0?4@@@@@@@@@@@@@@@@@0M?I40M?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@M?I40M?I4@0?4@0?4@@@0?@MI@MeI4@0M?e?I@M?I40M?fI40MhI@M??I@M ?O2@6X@@@@@@@@@@@@@@@0M??I4@@@@@@@0M I@M?hI@M??I@M?I4@0Me?I40M? O2@@@@6KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?@0M? ?O@K O@KO@?@KeO2@@@@@6?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@K?O@?@KO2@@@@@6?@?2@@@@@@@@@@@@@@@@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@K??O2@@@@@@6KO26KO2@@@6?2@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?@?@K O@K??O@KO26KheO26K?O@?2@@@6?@K?O26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?eI40?4@@@@@0Mg?I4@@0M?f?I40M? ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0?4@@@@@@0?4@@@@@@0MI@M?I4@0?40?@Me?I4@0?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@@@@0?4@@@@@@@@@@@@@@@@@@@@@0?4@@0M??I@MeI40M?I@Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?e?I4@0M I40M I40M ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40M?I4@@@@@@@@@@@@@@@@@@@@@0?4@@@0?@MI40Me?I4@@0M? ?I@MgI@M? O@KO2@6KO2@@@6?2@@@@@@@@@@@@@6K??O26KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26K?e?O@Kf?O26?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?O@K?e?O26?2@@6?@KO@K??O2@@@@@@6K?O2@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1??O@KhO2@6K?hfO2@@6KO2@@6KeO@?2@@@@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?@MI@?40?40?40?4@@@0M?e?I@?4@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0M??I@?@MI40MI4@@0MI@M?fI@M?f?I@M ?I4@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?4@@@@@@@@@@0M?eI4@@@@@@@@@@@@@0M??I@MhI40?4@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40?4@0MI4@0?4@@@@@@@0MI4@@@@@@@0?@M?hf?I@?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@0M??I@MI40MI@?@MI4@@0?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@0M?I40?40MhfI40MheI40M ?O2@@@6X@0M? O2@6K??O@KfO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X??O@Kg?O26KO@KhO2@@6?@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@?2@6Kf?O26K??O26K?O2@@6?2@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X??O@KO26KO2@6?2@@@@@6KO2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?@@6K O26K?O@K O@K?f?O26K?O26K?O2@6Ke?O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0MI4@@@0M?I4@0MgI40MI@M?hI4@@@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?e?I4@@@0MI@M??I@M I@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@0Me?I40M?I4@@@@0MI40Me?I4@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0MI4@@@@@@0MI4@@@@@@@0MI@?40?4@@@@0?4@0Mf?I@MgI40Me?I40?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?4@0M??I@?40M??I40M?eI@MI@?4@0MI40MI@M?hf?I@M@@@@0?40M?I@M?f?I40M?I@M?I@?@M? ?O@Kf?O@KeO2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@6X?@@0M ?O@KO26K?O26?2@@6?@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1??O@KO@K? O2@@@@@@@@@6KO@?2@@@@@@@6?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LO26KO@K?heO26?2@6KfO@KO26?2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X??O@K ?O26?2@6K?fO2@@@@@6?2@@6?26?2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?4@@@0MI4@@@0MI4@@@@@@0MI40MI@MI40Mf?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0M?I4@0MI@M?hI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0M?I40M?I@MeI4@@@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0MI4@@0?4@@@@@@@@0?4@@@@@@0MI4@@@0M?fI40M?I@?4@0MI40?40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40?4@@0Me?I40?@?@?40?4@0M?I@MeI@M? ?O@Ke?O26KO2@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?4@@@0MI4@@@@@0MeI@M??I@M?I40M?hI@M? O@K?he?O26K?eO@?26?2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26K?eO26?26K?O2@6?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?O@K?eO26KeO@K?hO@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)XO26K?O@?26?@KO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1O2@6?26?@?2@@@6KO2@@@@@@6?@?2@@@@@@@@@@6?@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@@@@0M?eI4@0M?e?I4@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(MI40MI4@@@@0M?e?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0MI40M?I4@@@@@@@@@@@@0?4@0M?hfI40Mhe?I@?4@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MeI4@@@@@@@0?4@0?4@@0?4@@@0MI40MeI@M?I40Mh?I@M?I40M?fI40Me?I@Me?I@M I4@@@@@@@@@@@@@@@@@L ?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?40MeI4@@@@@@0MI@M?hI@M?eI40?@MhI@M? I4@@@@@@@@@@@@@1 O@K?heO@K?eO2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?I4@@@@@@@@@@ ?O@KhO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1??O)X ?I'@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LO@K?h?O@KfO@KO2@@@6?2@6?26KO@KO2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@K?hfO26KgO@K?eO@K?O@KO26KO@KeO2@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? O@?26K ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? ?O2@@@@@@@@@@@@6K? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M?hfO2@@@@@@@@@@@@@@@@@@@@@@@@6Xhf?I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?@?4@@0MeI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@@@0MfI@M?eI'@@@@@@@@@@@@0YhfO2@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?hfV4@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I40MI@Me?I@M?I4@0MeI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M ?N@@@@@@@@@@0Mhe?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6KhfI4@@@@@@@@@@@??I40M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@0?@MeI@M?I40MeI4@0Y? @@@@@@@@(Mhe?O2@@@@@@@@@(M ?I4@@@@@@@@@@6K?heI'@@@@@@@@5?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0M?I4@0M?I40M?fI40MI4@0M??I@Mhe?I40M? ?J@@@@@@@(Y?h?O2@@@@@@@@@@0Y? I4@@@@@@@@@6X?h?V'@@@@@@@ ?O2@@@6X@@@(?4@@@@0MeI@MI40M??I@M I@M? W&@@@@@@(Yh?W2@@@@@@@0M ?I'@@@@@@@)XheV'@@@@@@1? ?O26K?O@K?O@?@KO2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1@@0Y ?W&@@@@@@(Y?hO&@@@@@@0M V4@@@@@@@)K?h?V'@@@@@@? O@?2@6?2@6KO2@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O&@@@@@@(YhW2@@@@@@(M ?I4@@@@@@@@?hN@@@@@@@@@@@@@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?O26K?O@?26K?O@?2@6K?g?O2@@@@@@@@(Y?g?W&@@@@@@0Y? ?I4@@@@@@?h?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)XO@K?O26?2@@@@@6KeO2@6?2@6KO@KO2@@@@@@@6K?O2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0YhO&@@@@@0M?hfO2@@@@@@@@@@@6K?hf?I'@@@@@6Xh?@@@@@@@@@(MhfI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?hW2@@@@@(M?heO2@@@@@@@@@@@@@@@@@@@6K?heN@@@@@@)X?g?3@@@@@@@@H? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0?4@@@@0M?I@?4@@@@@@0M?I4@0MI@M?I@Mhf?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?g?W&@@@@@0YheO2@@@@@@@0M?I@?4@@@@@@@@@6K?h?@@@@@@@)Xg?V4@@@@@@@ 3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40M?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?hI@M? @@@@@@@@H?gW&@@@@@?h?W2@@@@@0M ?I4@@@@@6XhI4@@@@@1h?I'@@@@@ V4@0MI4@@@0MI4@@@@@@@@@0M?eI4@@@@0MI4@@0MhI@M??I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? 3@@@@@@@g?W&@@@@@@?hO&@@@@0M I4@@@)K?hI'@@@@heN@@@@@L?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@0?4@@@@@@@@@@@@@@@@@0?4@@0M?I4@@@0MeI40Y ?@@@@@@5gW&@@@@(Mg?O2@@@@@0M I4@@@6K?g?V'@@@@@h?@@@@@1?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?40?4@@@0MI40?40?4@@0MI4@@@@@0M?f?I4@@@@0M?hf?I@M ?W&@@@@@@Hg7@@@@@H?g@@@@@@ I'@@@@hV'@@@@L?g?3@@@@@L ?O2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X?@@@@0?4@@0M?gI40M ?I@M ?7@@@@@@5?f?J@@@@@5g?J@@@@@@ ?V4@@@h?V'@@@)Xg?V'@@@@)X? ?O@Kg?O26KO26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?J@@@@@@@H?f?7@@@@@HgW&@@@(M? ?I'@@6X?gN@@@@)X?gN@@@@@)KgO@K?O2@6?26Khf?O2@6KO2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O&@@@@@@5gJ@@@@@5?f?W&@@@(Y V'@@)Xg?3@@@@1?g?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@6KeO2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Hg7@@@@(Y?f?7@@@(Y? ?V'@@)X?f?V'@@@@?g?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LO@?@?@K?e?O2@@@6KeO2@@@6KO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?f?J@@@@(Yg?@@@(Y V'@@1?gV'@@@Lg?@@@@@@@@?e?I4@0?4@@@0Mhe?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?fW&@@@0Y?f?@@@@0Y? ?V'@@Lg?N@@@)X?f?@@@@@@@@? ?I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@)?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Yg7@@(M?g?@@(M? N@@)X?g@@@@1?f?3@@@@@@@? N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?@M I@M?I40?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? ?I@Mh?I@M @@0Yh?@0Y ?@@@1?g3@@@@?f?N@@@@@@@? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I40?4@0M?I4@0?4@@@@@@0M?I4@0?@MhI@M??I@MeI40MI@M?I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?3@@@LgN@@@@?g@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?V'@@)X?f?@@@@Lg@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0?4@@@@@@@@@@@@0?4@@0?4@@0Me?I@?@?4@@@0M N@@@1?f?3@@@)X?f@@@@@@@L O2@@@@@@@@@6?2@@@@6?2@@6?2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?@M?I4@@@@@0MI4@@@@@@@@0MfI40M ?I@M ?@@@@Lf?N@@@@1?f3@@@@@@)X? ?O@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@M ?3@@@1g@@@@@?fN@@@@@@@)KhfO@?@?@KO@KeO2@@@6K?fO2@@6KO@KO@KO2@@@@@@@@6?2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O@KgO@K?heO26KfO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@? ?N@@@@g@@@@@?f?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?O26K?eO@K?fO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5? 3@@@g@@@@@?f?V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X??O@KeO@KO26K?eO26KO@?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y? N@@@g@@@@@? ?I40MI4@0M ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y ?@@@g@@@@@L ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M @@@@@@@@@@@@@@@@@@@@@0Y? ?@@@g@@@@@1 ?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@@@@@@@@0M??I4@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y? @@@@@@@@@@@@@@@@0M ?@@@L?f@@@@@@ ?V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@@@@@@0?4@@@@@@0MfI40MhI40MI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? @@@@@@@@@0M? ?@@@1?f3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y ?W2@@@@@@(M? ?@@@@?fN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@0MI4@@@@@@@@@@0Y? O&@@@@@@0Y O@K?O2@@@@@Lf?@@@@@ ?O26K?O2@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@0MI4@0?4@@@0M?e?I40M??I@?@?4@0MI@MI@?@MfI@M?hfI40M ?@@@@@@@(M O2@@@@@@@@@@@@@)K?eJ@@@@@L? O@?26KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? ?@@@@@@0Y? O2@@@@@@@@@@@@@@@@@6KO&@@@@@)K O@K?O@K?e?O2@@@@6K??O2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O2@@@@@(M?he?O26X? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L??O@KeO2@6K?O2@6K?g?O2@@@@@@@(Yhe?O2@@@,? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)XO@KO26K?gO@K?O@KO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?g?O2@@@@@@0Y? O2@@@@@@@@@@0MgI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0M?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1@@@@@@@6KO26?2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Hh@@@@@@@0M? W2@@@@@@@@0Mhf?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ I'@@@@@@@@@@@@@@0Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0Mg?I4@@0?@M??I4@0?4@@@@0?4@@@0?@M??I4@@@@@@@5?h@@@@0M ?W&@@@@@@@0M ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?V4@@@@@0Me?I@Me3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?4@@@@0MI@?@MfI4@0M? ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? @@@@@(Y?f?W2@@@(M W&@@@@@@@? ?I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? V'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@0MI@MgI4@0MI@MI40MI@M??I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@M??I4@@@@@@@0MI4@@@@0Y ?J@@@@@HgW&@@@0Y? ?W&@@@@@@@@? V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K ?V4@0?40MI40M??I@?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? W&@@@@5?f?O&@@(M? W&@@@@@0M? ?I'@@@@@hfI4@@@@@@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0MfI@M? 7@@@@@H?f@@@@(Y 7@@@@@hfO2@@@@@@6XheN@@@@@L? I4@@@@@@@@@@@@@? O2@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0MI40?@Me?I4@gI40MfI40M @@@@@5g@@@(Y? ?J@@@@@5h?O2@@@@@@@@@@)K?h?@@@@@)X I4@@@@@@@@@@@? O@K?e?O@KfO2@@@@@@@@6KO2@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@0MI40?@MeI@M? @@@@@Hf?J@@@H ?7@@@@@Hg?W2@@@@@@@@@@@@@@@6Xh?@@@@1 ?I'@@@@@@@@@6K ?O2@6?2@6KO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1@M @@@@@?fO&@@5? ?@@@@@5?gO&@@@@@0M?e?I4@@@@)K?g?@@@@@L? V'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O2@@6K?h?O2@@@6?2@@@@@@@6KO2@@@@H? J@@@@@H?f?@@@@(M?h?I4@@@@@g?@@@@@)K ?V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 ?W&@@@@5g?@@@(Yhf?I4@@@L?f?3@@@@@@@@@6K? I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@K?O@K O@KO@Khf?O2@@@@6KO@Ke?O@K?O2@@@@@@6?@KO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H O&@@@@(Yf?@@@@(Y? @@)Xf?N@@@@@@@@@@@@@@@6K?he?V4@@@@@@@@@ ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MI40M?I4@@@0M?f?I40?4@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5? W2@@@@6?2@6KO2@@@@@@H?fJ@@@(Y 3@@)X?f@@@@@@@@@@@@@@@@@@@6X?he@@@@@@@@ I@M?h?I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@@@@@@0M?I40?4@@@@@0?@?@Me?I@Mf?I40?@M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H? ?O&@@@@@@@@@@@@@@@@@@5g7@@(Y? V'@@1?f@@@@@@@@@@@@@@@@@@@@)Khe3@@@@@@@ V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MI4@@@@@0?@M?e?I4@0MI@MI@Me?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@0MI4@@@0Y? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 @@@@@@@@@@@@@@@@@@@@(Yg@@@H ?N@@@?f3@@@@@(Me?I4@@@@@@@@@6KhN@@@@@@@@@ I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y @@@@@@@@@@@@@@@@@@@0Y?g@@@? @@@?fN@@@@@H?f?I4@@@@@@@@@6Xg?@@@@@@@@@L?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@@0?4@@@@@@@0Y W2@@@@@@@@@@@@@0M? @@@?f?@@@@@he?I'@@@@@@)X?gI'@@@@@@1? ?O@?@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@?4@@@@@@@@0?4@@@@@@0MI4@@0?40MI4@@@@@@@0M?I@MeI40M?I40M?h?I@M ?O&@@@@@@@@@@@@0M? @@@?f?@@@@@hfV4@@@@@@)Xg?V'@@@@@@L O@K?gO2@6K??O2@@@@@@@@@@@@@@@@?@?@M?I@M ?W2@@@@@@@@@@0M? @@@?f?@@@@@L?hfI4@@@@@)K?gN@@@@@@)K? O@?@K?O26?2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??7@@@@@@@@@(M? @@@@6KeJ@@@@@)X ?@@@@@@@g?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??@@@@@@@@@0Y 3@@@@@6?&@@@@@@)K?hf?@@@@@@@L?f?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?O2@6?26K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M N@@@@@@@@@@@@@@@@@@@@6K?h?@@@@@)Xg?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1O2@6K?eO2@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y? ?@@@@@@@@@@@@@@@@@@@@@@6K?g?3@@@@@1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y ?I'@@@@@g?V'@@@@@L? @@@@@@@@@@@@@0M?g@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(?4@@@@@0M?e?I4@@@0?4@0MeI4@@0?@?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? I40MfI'@@@@@@@@@0Y? V4@@@@hV'@@@@1? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MI40?40?@MI@MI40?@M?I@MeI@M?e?I40M?he?I(Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M ?N@@@@@@@(M? ?I'@@6X?f?N@@@@@L I@M?I40MeI@M?I4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? ?J@@@@@@@H V'@@)Xg@@@@@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? W&@@@@@@5? ?V'@@)X?f3@@@@@L?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@?@?4@0?4@@@@@0?@M?I4@0MeI40MfI@M?I4@@0M?I@MI4@@@0M? 7@@@@@@(Y? N@@@1?fN@@@@@1? ?O2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@0?4@@@@@@@@@0MI4@@0MI4@0Mhf?I@M ?J@@@@@@@H ?3@@@?fJ@@@@@@? O26KO@KO2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?W&@@@@@@@? ?V'@@@6K?O&@@@@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O&@@@@@@@5? O26K N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y? O2@@@@@@@@@@@@@@@6K? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@6KO@?2@@@@6?2@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y ?O2@@@@@@@@@@@@@@@@@@@@@@6K? ?I40M? ?I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y? ?O2@@@@@@@@@@@@@@@@@@@@@@@@@@6K? V4@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? ?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?4@0?4@0MI@?4@0M??I4@0Me?I40M?hfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y ?W2@@@@@@@@@@@@@@@0MeI4@@@@@@@@@@@@)K ?@@@@@0?4@@@@@@@@@@@@0M??I4@@@@0M??I@MfI4@0MI40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? O&@@@@@@@@0M ?I4@@@@@@@@@6K@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y W2@@@@@@@@0M ?I'@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0?@M??I4@@0M?I4@@@0Y? ?W&@@@@@@@0M V4@@@@@@@L ?O@?2@@@@@@@@@@@0M?I@M?I40?4@@@@@0MI@Me?I@M W&@@@@@@(M ?@@@@@@)X? ?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@M 7@@@@@@0Y? ?@@@@@@@)X O@K? ?O@K?O2@@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@hfO2@@@@@@@@6KheI'@@@@@)X? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O2@@? @@@@@@@@heO2@@@@@@@@@@@@6Kh?V'@@@@@)X 3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@Kf?O2@6Ke?O2@@@6?2@6KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5? @@@@@(M?gW2@@@@@@@0?4@@@@@@@@@6K?gV4@@@@@)X? V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Mf?I@MI@M?gI'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H? @@@@@@0Yg?O&@@@@?hfI'@@@@he@@@@)X I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?V4@@@@@@0?4@0?@?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@?4@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@?g?W2@@@@@@?hf?V4@@@he@@@@@1 I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@L? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?4@@@@@@@@0MI40M?I4@0?@MfI@M?I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M ?@@@@@@@@@@@@@@@@@@@@@@0M? ?J@@@@@?gW&@@(M @@@6X?g3@@@@@ ?I4@@@@@gI'@@@@@@@@)X @@@0M?I40?@Me?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I(Y? ?@@@@@@@@@@0MI4@@@@@@0M? W&@@@@5?f?W&@@@H? @@@@)XgV'@@@@L? ?I'@@@L?f?V4@@@@@@@@)K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? J@@@@@@? 7@@@@@H?fW&@@@@ ?I'@@)X?f?N@@@@1? V'@@)XhI'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y ?W&@@@@@@? @@@@@5g7@@(M? V'@@)Xg@@@@@? ?V'@@)X?g?V'@@@@@@@ O)X?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@0M?I@?4@0?@MI@Mf?I40M? W&@@@@@? ?J@@@@(Yf?J@@@H ?V'@@)X?f3@@@@L N@@@1?hV4@@@@@@@6X? ?O2@@@@@6?26KO26?2@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?7@@@@@5? ?7@@@@H?f?7@@5? N@@@1?fN@@@@)X? ?@@@@Lhe?I'@@@@@)?26?2@6?2@@@6?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@(Y? J@@@@@gJ@@@H? ?3@@@Lf?3@@@@)K ?3@@@)K?heV'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@@@@@(Y ?O&@@@@@f?W&@@5 ?N@@@1f?N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? ?V'@@@@@@6X?g?V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y? O2@@@@@@@@@@@@@5f?7@@@H 3@@@L?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1? V4@@@@@@)K I4@@0MI4@@@@@0?40Me?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?@@@6K?O26?26KO26KO2@@@@@@@@@@@@@@@@@@@@@@6?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H ?W2@@@@@@@@@@@@@@@@Hf?@@@5? N@@@1?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L I'@@@@6X ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI4@@@@@@@@@@@@H?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? O&@@@@@@@@@@@@@@@@5?f?@@@H? ?@@@@?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1 ?V4@@@@)X? ?I@Mh?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?4@@@@0?4@0?40M?I@MI4@@@0M? I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? O2@@@@@@@@@@@@@@@@@0Y?f?@@@ ?@@@@?f?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?I4@@@)X ?I4@0?4@@@@@@0M?eI4@0M?e?I4@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(MeI40Me?I40?40MfI@M? ?@@@@@@@@@0M ?@@@@? ?I'@@)X?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y? J@@@@@@@0M ?@@@@? V'@@1?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0?4@0Y 7@@@@@ ?@@@@? ?N@@@L ?O26X?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@0?40MI4@0M?gI4@0M? I40MeI40M ?J@@@@@5 ?@@@@L 3@@)X? ?O26K?O@K??O2@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@1?W&@@@@(Y ?@@@@)X? N@@@)K O@K? ?O26K?fO26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O&@@@@(Y? ?@@@@@)KhO@K?g?O26K?heO2@@@6KO2@@@@6K? ?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O2@@@@@@@@@@@@@@@@@H ?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K? ?V'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O26KO@?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(? W2@@@@@@@@@@@@@@@@@@5? ?N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? V+M?hI40MI4@0M?hf@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O@KgO@KO2@@@6?@KO@?2@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y? *@@@@@@@@@@@@@@@@@@0Y? 3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H V4@0M? V'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@M?I4@@@@@@@0M?eI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M?I@M?eI40MI40?40M?g?I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? ?V4@@0MI4@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K ?I4@@@@@@@@@@@@@@@@@@@@@@0?4@@@0M?I@?4@@@@@@@0M?I@MI@?@MgI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M I4@@@@@@@@6X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? ?W&@@@@@@@@0M?he@@@@@(M? @@@@@@@)K?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? O&@@@@@@@0M?he?J@@@@0Y @@@@@@@@@6X?@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0M?I40Mf?I@Mh?I40M?h?I40M? W2@@@@@@(M ?7@@@? I'@@@@@@)X ?O@Ke?O@Ke?O26K?O2@@@@6KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?g?I@M ?W&@@@@@@0Y? J@@@@? ?V'@@@@@@1 ?O@Kf?O2@@@@@6K?O@?26?@KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@W&@@@@@@ 7@@? @@@@@@@@@@@@@@6?2@@@@@@@6KO2@@@@@@@@@@@@@@@@@6K?heV'@@@@@@L? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O&@@@@@@@ @@5? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?h?V'@@@@@)X 3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5O@KO@KfO2@@6K?O@K?O2@@@@@0Mhe?O2@@@@@@@@(Y? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K?gV'@@@@@1 V4@@@@@@@@@@@@@0M?fI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@K O@?26?26K?f?O2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Mh?W2@@@@@@@@@@@(Y ?I4@@@@@g?N@@@@@@ ?@@@@@@@@@hfI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?hO&@@@@@@@@@@@0Y? ?I4@@@h3@@@@@@@@@@@6K @@@@@@6Xg?@@@@@@@@@ I@M??I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MeI4@0M?eI@M?g?I4@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? W2@@@@(M @@@6X?fV'@@@@@@@@@@@@@@@6X?he3@@@@@@1hI4@@@@@@ V4@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@0MeI4@0MI40M?e?I@M?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? ?W&@@@@0Y? @@@@1?f?V4@@@@@@@@@@@@@@@)KheV4@@@@@@he?@@@@@L? I4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@heI@M? W&@@@(M? @@@? I4@@@@@@@@@@6Xh?@@@@@@@h?@@@@@1?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 ?W&@@@0Y 3@@@@? I4@@@@@@@)K?g?@@@@@@@L?g?3@@@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@?40M?I40MI@M?f?I4@@@@@@@0Y ?7@@(M V'@@@L I4@@@6X?gI'@@@@)Xg?N@@@@@1 O@K?O2@@@@@@@@@?@M J@@@H? O2@@@@@@@@@@@@6K ?V'@@)X? ?@@@)Xg?V4@@@@1h3@@@@@L? O@?@K??O2@6Ke?O26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??W&@@5 O2@@@@@@@@@@@@@@@@6K N@@@1? ?@@@@)K?h@@@@L?gN@@@@@)Ke?O2@@6KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?W&@@(Y O2@@@@@@@@@@@@@@@@@@@@@@@@6X ?@@@@? I'@@@@h@@@@1?g?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5??O@K ?O&@@@H? O2@@@@@@@@@@@@@@@@@@@@@@@@@@@)K? ?3@@@@@@@@@@@@@@@@@@@6K?g?V'@@@L?g3@@@@Lg?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H??O26K?gO2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 W2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? ?V'@@@@@@@@@@@@@@@@@@@@@hV'@@)XgN@@@@1g?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5@KO@K?fO@K?eO@K??O@KO26Kh?O26?2@6K??O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y ?O&@@@@@@@@@@@@@0Me?I4@@@@@@@@@@@@@)K V4@@@@@@@@@@@@@@@@@@@@h?V'@@)X?f?3@@@@L?f?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@0MI4@@@@@@@@@@@@@0MI4@@0M? ?W2@@@@@@@@@0M I4@@@@@@@@6K V'@@1?f?N@@@@1?f?N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0MI@?4@@0?4@@@@0?@?40MI@M??I40MI40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ W&@@@@@@@0M? I4@@@@@@@@6X ?N@@@?g@@@@@?g@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 ?W&@@@@@@0M? I4@@@@@@@)X? @@@Lg@@@@@?g@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y W&@@@@@@ I'@@@@@@1? 3@@)X?f@@@@@Lg@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y? ?O&@@@@@@@ ?V'@@@@@@L N@@@1?f3@@@@1g@@@@@@@?@MI@M? O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M?h?O2@@@@@@@@@6KheV4@@@@@)X? ?3@@@?fN@@@@@g@@@@@@@L ?O@KeO@K?O2@@@6K?eO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??W2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(YhW2@@@@@@@@@@@@@@@@6XhI'@@@@)X ?N@@@?f?@@@@@g@@@@@@@)K?fO2@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?g?O&@@@@@@@@@@@@@@@@@@)K?g?V'@@@@)K? @@@Lf?@@@@@L?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Yg?O2@@@0MheI4@@@@@@hN@@@@@@6K? @@@1f?3@@@@1?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@?2@@@6X? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0Mg?W2@@@(M I4@@@@h?3@@@@@@@@@@@@@@@@@@@@6X @@@@f?N@@@@@?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@6?@KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)? ?@@@@@@@(M W&@@@(Y? I'@@@6X?f?N@@@@@@@@@@@@@@@@@@@@@)X? @@@@g@@@@@?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@0?@?@?4@@@0M?gI@M??I4@@@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H? J@@@@@@0Y? ?W&@@@0Y ?V4@@@)Xg3@@@@@@@@@@@@@@@@@@@@@1? @@@@g@@@@@?f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?@?4@0?40?@MeI4@@@@@@@@@@@0?4@0M?I40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 ?W&@@@@(M? W&@@(M ?I4@@)X?fV4@@@@@@@@@@@@@@@@@@@@@? @@@@g@@@@5?f@@@@@@@@(MfI@MI@MeI4@0M??I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H ?7@@@@@H ?W&@@(Y? @@1? I4@0M??I@? @@@5g@@@@H?f@@@@@@@(Y?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5? ?@@@@@5? O&@@(Y @@@L @@@Hf?J@@@@g@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@0?@?4@@0?4@@@@@@@@0MI4@0M?fI4@0M?e?I40M?I@M?fI40M I4@0Y? ?W2@@@@@6KO2@@@6?2@@@@@@@@H?fW2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H? 3@@)X? @@@?f?7@@@@g@@@@@@@? O2@@@?@@@@@@@@@@@@@0M?e?I@M?I@MheI@M?eI@M? W&@@@@@@@@@@@@@@@@@@@@@@@5g7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5 V'@@1? @@@?f?@@@@@g@@@@@@@L O@K?he?O@KO@K?f?O26K??O@KO2@@@@@6KO@KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?7@@@@@@@@@@@@@@@@@@@@@@@0Yg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y ?N@@@? @@@?f?@@@@@g@@@@@@@)K?hO2@@@@@6KO2@@6?2@@6KO2@@@@@6KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?@@@@@@@@@@@@@@@@@0?4@0M?h@@@@0MI4@@0?4@@@0?4@@@0MeI@M? @@@? @@@?f?@@@@5g@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?3@@@@@@@@@@@@@@@6?2@@@@@@6K? ?J@@@?fJ@@@@Hg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O2@@@@@@@@ N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K ?7@@5?f7@@@@?g@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5@Ke?O2@6Kf?O2@@6K?O26?@K?O2@@@@@@@6KO2@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K? J@@@H?f@@@@@?g@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K 7@@5g@@@@@?f?J@@@@@@?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@?@MI4@@@0?4@@@@@@@0?4@0M?eI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L? ?V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K @@@Hg@@@@5?f?7@@@@@@e?I40?4@@@0?40MI40MI@M? ?I40M?f?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1? ?I4@@@@@@@@@@@@@@@6X ?J@@@?f?J@@@@H?f?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? I4@@@@@@@@@@@)K? W&@@5?fW&@@@@g?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?g?I@MeI4@0M??I'@@@@@@@@? ?I4@@@@@@@@6K? ?W&@@(Y?f7@@@@5gJ@@@@@@@ ?O2@@Mg?I@M N@@@@@@@@Lf?@@@@@6X ?@@@@@@@@6K? ?7@@@Hg@@@@@Hg7@@@@@@@ ?O@KgO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?3@@@@@@@1f?@@@@@@)K? ?@@@@@@@@@@6X? J@@@5?f?J@@@@5?f?J@@@@@@@@ ?O@KfO2@6?2@6KO2@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?N@@@@@@@@g?@@@@@@@ I4@@@@@@@@1? ?W&@@(Y?f?7@@@@H?f?7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?J@@@@@@@@L?f?3@@@@@@ @@@@@@@@@@@@@@@@@@@@6K I4@@@@@@@? O&@@(YgJ@@@@5gJ@@@@@@@(MI'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?O@K O&@@@@@@@@1?f?N@@@@@@@@6K ?O@Kf?O2@@@@@@@@@6X @@@@@@@@@@@@@@@@@@@@@@@@@6K?heI'@@@@@@@? ?@@@@(Y?f?W&@@@@Hg7@@@@@@(Y??V'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?O26KO26K?fO@K?O26?26K?O2@6KO2@@@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Lg@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X? @@@@@@@@@@@@@@@@@@@@@@@@@@@6K?h?V4@@@@@@? ?@@@(YgW&@@@@5?f?J@@@@@@@HfN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?f?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@6K?h?I4@@@@@6X O2@@@(Y?f?W&@@@@@H?f?7@@@@@@5?f?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@0?4@@@0MI4@@@0?4@0M?I@MI4@@0MeI4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?h@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1 ?I4@@0?@M?f?I4@@@@@@@@@@@@@@?he@@@@@)X? @@@@@@(YgW&@@@@@5gJ@@@@@@@H?f?V+MeI4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Lh@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ I4@@@@@@@@@?he3@@@@@1? @@@@@0Y?g7@@@@@(Yf?W&@@@@@@5@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(?'@@@@@@@)X? I@MI@MI@M?eI@?@M?e?I@Mf@@@@@@f?@@@L? ?I4@@@@@@@6XhN@@@@@@L ?O2@@@@@@@@(M?h@@@@@(Y?f?7@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0Y?N@@@@@@@@)K 3@@@@@f?3@@)X ?I4@@@@@@)X?g?@@@@@@1 ?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Yh@@@@@@(YgJ@@@@@@@5?@@@@0MI4@@@@0?4@@0M?eI@M?fI@M? @@@@@@@@@@6X V'@@@@f?V'@@)X? I'@@@@)KhI'@@@@L? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?he@@@@@(Y?g7@@@@@@@H? ?O@Kf?O@KeO@K??O2@@@@@@@@@@@@6?2@@@@@@@@@?@@@@@@@@@)X? ?N@@@@L?fV'@@)X ?V'@@@@@@?g?V'@@@)X ?J@@@@@@@@@@@@@@@@@0?4@@@@0M ?W2@@@@@@Hg?J@@@@@@@@ O26KhO2@6KO2@6K?O2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?@@@@@@@@@@)K @@@@1?f?V'@@)X? V'@@@@@?hN@@@@1 W&@@(Me?I'@@@@@@(M? O&@@@@@@@?gW&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5@@@@@@@@@@@@@6K? @@@@@?gV'@@)X ?V'@@@@@@?g?3@@@@ 7@@@H?fN@@@@@(Y W2@@@@@@(Mg?W&@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@@6K? ?O@Kh3@@@@?g?V'@@)K? N@@@@@@Lg?N@@@@L? ?J@@@5gJ@@@@@H? ?O&@@@@@@0Y?gW&@@@@@@@0M?fI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@K?f?O@Kf?O2@@@@@@@@@@@6?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gV'@@@@@?gV'@@@@6X ?@@@@@@1h3@@@)X O&@@(Yf?W&@@@@@ O2@@@@@@@@he7@@@@@@@hf@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?f?N@@@@@Lg?V'@@@@)K? ?@@@@@L?gN@@@@1 ?@@@@(Y?f?7@@@@@@ O2@@@@@@@@@@he@@@@@@@5hf3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40M?e?I4@0Mh?I40M??I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?g3@@@@)X?gV4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? ?@@@@@)Xg?@@@@@ ?@@@(YgJ@@@@@@@ O2@@@@@@@@@@0Mh?W2@@@@@@@0YhfV4@@@@@@@@@@0Me?I4@@0MI4@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LgV'@@@@)XheI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1? ?@@@@1g?@@@@@ W2@@@(Y?f?W&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?heW&@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?f?N@@@@@)K?heI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? ?3@@@@L?f?3@@@@L?he?O&@@@0YgW&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?h?O&@@@@@@@5?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?eI@?40M I@M? ?I'@@@@@@@1?g3@@@@@@@ ?N@@@@1?f?N@@@@1?h?O2@@@@?h7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Mhe?W2@@@@@@@@@H?@@@@@@@@@@@@@@@@@@@@@@@@@0M?e?I@M?I@?4@@0M?e?I4@0?@Mf?I@MeI40?@MhI@M?I@M?eI@M?heI@?40M V'@@@@@@@LgV'@@@@@@ @@@@@?g@@@@@?g?O2@@@@@@?h@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?heW&@@@@@@@@@@ ?O2@@??N@@@@@@@1g?V'@@@@@@6K? @@@@@?g@@@@@Lf?@@@@@@@(Mh@@@@@@@@@@@@@0MI4@0MI4@0M? ?O&@@@@@@@@@@@ ?O2@6?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@hV4@@@@@@@6K? @@@@@Lg@@@@@)K?e?@@@@@@0Y?h@@@@@@0M ?O2@@@@@@@@@@@@@ ?O26K?e?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?@@@@@@@@@6X?gI'@@@@@@@6K? 3@@@@1g@@@@@@@@@@@@@0M?h?W2@@@@@(M ?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y??J@@@@@@@@@@)Xg?V4@@@@@@@@@@6K? ?O26?)X? N@@@@@g@@@@@@@@@? W&@@@@@(Y? W2@@@@@@@@@@@@0M?I40?40?4@0MeI'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?O2@6K?O@K?O@KfO2@@@@@@@@@@@@@@@@@@@@@6?&@@@@@@@@@@@)X?g?I4@@@@@@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X W2@?f?@@@@@g@@@@@@@@5?hf?W&@@@@@@H ?O&@@@@@@@@@@@0M ?V'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)XheI'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X? 7@@?f?@@@@@g@@@@@@@@H?hfO&@@@@@@5? O2@@@@@@@@@@@@@@@? N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI4@@@@@@@@@0MeI4@0?40?@?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Mhf?I'@@@@@@@@)X?h?V4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1? @@@?f?@@@@@L?f3@@@@@@@hfO2@@@@@@@@ O2@@@@@@@@@@@@@@@@@? ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0MeI4@@@0M?I4@@0Mh?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M V'@@@@@@@@)XhfI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L @@@?f?@@@@@@?f?@@@@@@5heO2@@@@@@@@@@)KfO2@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H? ?V'@@@@@@@@)K?hfI4@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@)X? @@@?f?3@@@@g7@@@@@@?hO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI4@@@@@@0MI4@ V'@@@@@@@@@6K? ?@@@)X @@@?g@@@@@?f@@@@@@@)X?e?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M?@@@@@@@@@@@@0MeI40MeI40MI40M?I@M ?V'@@@@@@@@@@6K? ?3@@@)X? @@@?f?7@@@@H?f@@@@@@@@)?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y@@@@@@@@@@@@@@@@@(Y ?O2@@M V4@@@@@@@@@@@6K? ?V'@@@)X @@@?f?@@@@@g@@@@@@@@@@@@@@@@@@@@0?4@@@@0M?e?I4@@0?'@@@@e?@@@@@@@@@@@@@@@@(Y? ?O@?@K ?O@KO2@@@@@6KO2@@@@@@@@@?@@@@@@@@@@@@6K? V'@@@1 @@@?f?@@@@@g@@@@@@@@@@@@@@@@(M ?N@@@@g@@@@@@@@@@@@@? ?O@KeO26KeO@KO2@@@@6KO2@6?@K?O@?2@6?2@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?@@@@@@@@@@@@@@@6K ?V'@@@ @@@?f?@@@@@g@@@@@@@@@@@@@@@0Y? @@@5g@@@@@@@@@@@@@)K??O@KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?@@@@@@@@@@@@@@@@@@@6K O@K? V4@@@@6K @@@?fJ@@@@5g@@@@@@@(M? @@@Hf?J@@@@@0MI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?O@K? O@K??O@KhO2@@@6?2@@6KeO@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X?gI'@@@@6K ?J@@@?f7@@@@Hg@@@@@@@H ?J@@5?f?7@@@@ I'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?O@KgO@K?eO2@6K??O2@@@@@@@@@@6K?e?O@KO@KO2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)Xg?V4@@@@@6K ?7@@5?f@@@@@?g@@@@@@@? ?7@@H?f?@@@@@ ?V'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1h?I'@@@@@@@@@@@@@@@@@ J@@(Y?f@@@@@?g@@@@@@@? J@@5gJ@@@@@ N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0M?I@MI@M?I40M?hf?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M? @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@heV4@@@@@@@@@@@@@@@@ 7@@Hg@@@@@?f?J@@@@@@5? ?W&@(Yf?W&@@@@5 ?@M?I4@@@@0Me?I@M?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X? I4@@@@@@@@ @@@?g@@@@5?f?7@@@@@@H? W&@@H?f?7@@@@(Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? I4@0M?fI@M?e?I40M?e?I40M?heI4@@@@@@)K @@5?f?J@@@@H?f?@@@@@@@ ?W&@@5gJ@@@@@H?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@0MI4@@@@@@@@0?4@@@@@@0?4@@@@@@0MI40?40?40M?eI40M I'@@@@@@6K ?W2@@(Y?f?7@@@@g?@@@@@@@ O&@@(Yg7@@@@@?N@@@@@@@@6X W&@@(YgJ@@@@5gJ@@@@@@@ W2@@@(Y?f?J@@@@@@ ?O26K?fO@?@?@KO26KO@?2@@@@@6?2@@@@@@6?2@@@@@@@@@@@@@@@@(?3@@@@@@@@)K? ?W&@@(Y?f?W&@@@@Hf?W&@@@@@@@ ?O&@@@(YgW&@@@@@@ ?O@KeO26?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?N@@@@@@@@@@@6K W&@@@Hg?7@@@@5?f?7@@@@@@@5 ?W2@@@@(Y?g7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?@@@@@@@@@@@@@@6K?he?O)X ?O&@@@5?g?@@@@@H?f?@@@@@@@@H O&@@@@0Yh@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5??O@KO@K?O@K?gO26K ?O26KO2@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X? O2@@@@@(Y?f?@@@@@@5g?@@@@@@@@? O2@@@@@@(Mh@@@@@@@0M?I@MI4@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H??O@K?O26KO26K?O26KeO2@@@6?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K O2@@@@@@0YgJ@@@@@(YgJ@@@@@@@@? O2@@@@@@@0Y?h@@@@@(M? ?I4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Mg?W&@@@@(Y?f?W&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Mh?W2@@@@@(Y @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0MeI4@@0?4@0MeI@M?e?I4@0M ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MheW&@@@@@Hg?7@@@@@@(?4@@@@@@@@@@@@@@@@@@@0MhfO&@@@@@(Y? @?@MheI@?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Mhe?O&@@@@@5?g?@@@@@@@H?hfI@M? W2@@@@@@(Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@@@0?4@@@@0M?I4@0MI4@@@0?@MI40MI4@@@0MeI@M? @@@@@@@(Y?f?@@@@@@@@5 ?W&@@@@@@(Y?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?40MI40?4@@@0?4@@@0M?e?I@MeI40M @@@@@@0Yg?@@@@@@@(Y O&@@@@@@(Y@M ?W2@@@@@@?hJ@@@@@@@H? ?W2@@@@@@@@(Y? O2@@O&@@@@@@@?g?W&@@@@@@@ O&@@@@@@@@@H O26KhO@?26?2@@@@6K?O2@@@@@@@@@@@@@@@@@@@@O2@@@@@@@@(MhW&@@@@@@@@ O26?2@@@@@@@@@@@@? ?O@KheO2@6KO@?2@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O2@@6K? ?O2@@@@@@@@@@@@(Y?g?W&@@@@@@@@@@6KO@?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@K?g?O@?2@@@@6?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0YhW&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5O@KO2@6?2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M?h?W&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?I40Y@@@@6KeO@KO2@@6K??O26?@KO2@@@@@@6?2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0YheO&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0MI4@@@@@@@@@@0MI4@@@@@0?@M?I@MI4@@@@@@@@@0MI4@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MhfW2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?4@@@@@0M??I@Me?I4@@@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M? ?W&@@@@@@@@0MI4@@0?4@@@@@@@@@@@@@0?4@0MI4@@@0?40M??I4@0Mg?I4@0M?I4@0M?I@MI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@0?40M?I4@@0M?I4@@@@@0MI@M?hf?I@?@Mg?I4@@@@@@@@@ O&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I4@0MI4@@@@@@@@0MI4@0MI@?4@@0M?I40Mf?I@MeI@M? I@M? @@@@@@@@L? ?W2@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0M?I40MI4@@@@@0?40MI@MfI@M?f?I@M @@@@@@@@)X O&@@@@@@@@@@@@@@@@@)K? ?O2@@@@@@@@@@@@5 ?O@?@Kf?O2@@@@@6K?O2@@@@@@?@@@@@@@@@6K? ?O2@@@@@@@@@@@@@@H O26KO26K?O@KhO2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@6K?heO2@@@@@@@@@@@@@@@@@@@? O@K?gO26?@Ke?O2@6KO26KeO2@@@@6K?O2@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O@Kf?O@Ke?O@?2@6Ke?O@Khe@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5??O@K O@K??O@Kf?O26KO2@@@6KeO2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y??O@KhO@?26?@KO@?2@@6KO2@6K?O2@@6?@KO2@@@@6KO@?@?2@@6?26K?O26?2@6?2@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?'@@@0?4@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@0M?I40M?fI4@@@@@0MI@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@0?@M?I@?40MhV+M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0?4@0M?I@M?I4@@@@@0?4@0MeI40MI@?@M?eI4@0M?hI@M?eI4@0M?fI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@0?40Me?I40M?I40MfI@MI@MI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@0?4@@0MI4@0?@M?I4@@0MI@?@Me?I4@0MgI@M?@@0?4@@0M?I4@@@0?40Mhf?I40M?eI4@0M?gI@M?eI@M?

O2@? O@?26K?O@Kf?O26KO@KeO2@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@Kh?O2@@@@W2@@6KO@KO2@@6KO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5O26K?O2@@@@6K??O2@6KeO@?26K?O26?2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?O@KheO@?2@6?26KO26?2@@@@@@6K?e?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?O26K ?O@?26KO2@@@6?@?26K?O2@@@@6?2@6?2@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I(Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@0?4@@@@@0M?I4@@@@0M?eI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40Me?I40?4@@@@0MeI4@@@0?4@0M?I@M?g?I@MI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@0MI40MeI4@@0MI@M?I40MI40MfI40MI4@0MI@?4@@@0MfI@M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@0?4@@0?4@0M?I@?40?4@0MeI40M?I4@0Mg?I@?@MeI@M?I@M?@@@@@@@@@@@@@@0M?I4@@@@@0MeI4@0M??I4@@@@@0Me?I4@0M?I@M O26X?O26?@KO@K?O2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)O@K?e?O@KhO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(M?O@K? ?O@KfO@?26KeO2@6?2@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(YO26KO@KO@?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?O26K ?O@KfO@KO@?2@@@6?26K?O26K?O@?2@@@@@@6KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?e?I(Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@0M?I40M?I4@0M?I@MI40M?eI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0?4@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0MI4@@0MI@?@M?f?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I4@0MI@MI4@@@@0?@MI40?40?4@0M?I4@@@@0MI4@0M?I4@0?@MeI4@@@0?@?4@@@@@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?@?4@@0?4@@@@0?4@@@@0M?eI4@0M?hfI40M@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@0?4@@0?40MI4@@0M??I@M?I@M?I@MeI4@0M?I40MeI4@0M?

?O@KfO2@@@@@@@(O26?@KgO26Ke?O@KeO2@@6?2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y?O2@@6K?O@?2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(Y??O2@6K?O@K?O@K?O2@@6K?fO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(YO@K?hfO@K?he?O@Kg?O2@6K?O2@@6?26?@KO@?@KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@@@@@@@@0Y?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@M?I40?40?4@@@0?@MI@?40?@M?gI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MI4@@@@0?@M?f?I4@@@@@@0M?I40MI@?@M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@0?4@@@0?4@0MI4@@0M?I40M?I4@@0Me?I@?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0M?I40?4@@@0?4@@@@@@@0?4@@@@0M??I4@0MgI@M?@@0M

?O26K?hO@?2@6?@?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X??O26?2@6KO26?@?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?O26K? O2@@6?@?2@@6K?O2@@@@@@@@@@@@@@@6KO2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6XO@?@K?O@K?O26?@K?O@KO@?2@6KO2@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?O@KO@KhO@K?O26?2@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?4@0?@?@?4@@@@@0MI@M?I40MI@M?e?I@MhI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@@@@@@@@@@@@@@@@@0?@?40M?I4@@@@@0MeI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?40?4@0MI40Mf?I4@0MeI4@@0M?I@?@M I40M?I4@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0M?I4@0M?I4@@@@@@@@0M?I@Me?I@M?I@MeI4@0?@M?heI40MhI@M?@@@@@@@@@@0Me?I4@@0M?gI4@@@@@0?4@0M?eI@M?hfI@MI@M@0M?e?I@M ?O@KeO2@@@@@@@@6KO26?2@@@@6?2@@@@@@@@@@@6X??O2@@@@@@6K?fO2@6?2@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@Khe?O2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?O2@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@K?e?O2@@6K?O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MI4@@@(M?I40MheI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@0?40?4@@@@@@@0MI4@@@0?@MfI@?4@@@0M?f?I40MI@M ?I(Y@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@0MI4@@@@0MI4@@@@@@@@0?4@@@@@@@@0M?eI@MI40M?e?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@0?4@@0MI@MI40M??I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MfI@?4@@@@@@0M?I40MI@M O@K?e?O2@6XO@K?hO@?2@@6KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)K?O26Kg?O2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6K??O@K?O26KO@K?O26?2@@6KeO2@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O26KO26Kf?O@KO2@@@@6KeO2@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L??O26K?eO26K?O2@@@@6K?eO@KO@KO2@@@@6?2@@6KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40MI4@@@@@0M?I@M?I@M?g?I@MI4@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I@MfI@M?I40?@MgI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@@@@@@@@@0Me?I@MI4@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@0MI4@@@@@@@@@@@@0MI4@@@@@@0M?eI@?40MfI4@0M?heI@M?I@M?f?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0MI4@@@@@@@@@@@@@0?40?4@@0MI40?4@@@@@0Me?I4@0?40M?eI40MhI40MI40M ?I@MeI40MgI@M?@0?@?4@0M?f?I40M?I40M ?O26X?O26Kh?O@K?O@K?O26K?eO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)XO2@@@@@@6K?O2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X??O26K?fO26Ke?O2@@@@@@6KO2@@@@@@@@@@@6?@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)XO26Kg?O2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O2@6KO@?@KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?40?4@@@@@@@@@0?@MI4@@@@)?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0M??I4@@@@@0?4@@@@@0MI40M?I40M?I@M?e?I@MI@M?I@M??I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MI4@@@@@0MI4@0Me?I40M?f?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@0MfI@M?I4@@0M I@M??I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0Me?I40M?I@M??I40MI40M?I4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MI40M?I@Mf?I4@0M@MI4@0MI40M?I40M?I40M? ?O26K?e?O2@6?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X??O2@6KO2@6KO26K?O2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?O@K?O@?2@@@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@6KfO2@@@@@@@6KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@K?eO@K?eO@K?f?O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I40M?I40MI@MI4@@@@@?W26Kg?O26K?O2@@6KeO2@@@@@6?2@@@@@@@@@@@@@@6?2@6KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I@MI40M I@M?7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?4@@@@@@@@@@@@@@@@@@@@@@0?@?40M?I4@@0?4@0?4@0M?fI4@@0?@Me?I40?@M?fI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@0?4@@@@@@@@0MI40?4@@@@@@@@@0?@?4@@@@@@0M??I@?40?40?40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0?4@@@@@@@@0?4@@@@@@0?4@@0?40MI40?4@@0MI4@@0M?I@M?I@M?I40MhI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MI4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MeI40Me?I40?4@@@@0Mf?I@MgI@M?

?O26K?O2@@@@6KO2@@@@@@@@@@@@@@@@@6X??O@KO26Ke?O2@@@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)XO@?@K?hO@K?fO@?@?@K?gO@?2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X??O@K?O2@@@6KeO2@@@@@@@6K?O26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1??O2@6Kg?O26K??O@Kh?O2@@@6KO2@@6KO@?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?@MI4@@@@0?40M I4@??O26?2@@6K?O2@@@@6K?O2@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0M?I@?4@0MI4@@@@@@0M?e?I@?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?4@@0M?f?I4@@@@@0MI4@@@0M?he?I40M?fI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@0MI4@@@@@0?4@@@@0?@?4@@0M?f?I40M?gI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0M?I4@@@@@@0?4@@@@0?@Me?I40M?heI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MgI4@@@@0MI40?@Mf?I40M?@@0MI4@0M? ?O@KfO2@@@@@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X?O@KgO2@6KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O26KO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@KhfO@K?O2@6K?O@KO2@6KO2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1O26KeO2@6K??O@?2@@@@6KO@?@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I40M?I40Me?I4@@@0MI4@@@K O@?2@6?2@6?@?@K??O26?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0M?I40MI40MI40M?I40?4@0M?eI4@@@0M?f?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@0?4@@@@0MI@MI@M?I@?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@@@@@@@@@@@@@0?4@@@0MhfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MI40M?I(Y?eI40Mf?I40M?I@M?I40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?@?4@@@@@@0?4@@@@@@0?4@@0MfI4@0M?eI@MI4@0Mg?I40M?@@@@@@@@0?40?4@@@@@0M?f?I40?4@0M?f?I40M? O2@6?@?@?@KO@KO2@@@@@@@@@@6X?O26K?O@K?O@K??O2@@@@@@6?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@K??O@KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?O26K?O26K?O26K?O2@@@@6?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LO@K?eO@KO@KO2@6K?e?O@KO2@6K?O@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O2@@6K?O2@6K??O26?@?@KO2@6?26?2@6?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40MI4@@@@@@@@0M?fI40MI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@0M??I@M?I40M??I4@0Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0M?I40?@M ?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(MI4@0?4@@@0MI4@@@@0M??I@MfI40?40MI40MI@M?I40M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@0?4@0MI@?4@0MI@?@M??I@?4@0MgI@M?eI40M I(Y?@@0M?I@Mg?I@M I@M? ?O26?2@@@@@@@6K??O@?@Ke?O@K?O26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O2@6?2@6?2@@@@@6K?O2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?O2@6K?O26?26KO@?2@6KeO26?@K?O2@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?O@K?heO26Ke?O26?@KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MI40M??I4@0M I4@@@??O@KeO@K?f?O26KO@KO26KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?gI@M?h?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0?4@@@0?@M?I4@0MI4@0M?eI@M?f?I@MI@M?hfI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0?4@@@0?40?4@@@@@@@@0MI@MI@MI@?40M?I4@0M?fI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MeI@?@M?eI40MeI@?40M?I40M?I40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0MI4@@@@@@@@@@0M I@M?@@@0M?e?I4@0M?I40MI40M?I@M? ?O26?@K?gO26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6XO2@@6KO2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O2@@@6?2@@6KO2@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?O@K?hfO@?@K?O@?@K??O@KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LO2@@@@@6KO2@6KO2@6?2@@@@@6?2@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@0?4@0M?eI40MI4@@0M?I4@@@@@?O@KhO26KgO2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@0M? I@M?W2@6?@KO26?2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@@@0M?I4@@@@@0?@M?7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@?4@@@@@@@@@@@0?40Me?I4@@@@@0?4@0Me?I4@0?@?40MI@MeI4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@0MI40M??I40M??I@M I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MeI4@0?@M?eI@?@?@M??I40?40MI40MheI@?@MI4@0M I@M?@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?@?40M?I4@0M?I@Mh?I40M?eI4@@0M O2@6K?O@?2@@@@6XO@KO2@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1O@?@K?O2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L??O@K?O26?2@6?26?@?@?2@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)X?O@Ke?O26K?O@KO26KO2@6KO2@6K?O2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)O@K?e?O@?26?2@@6?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@0?4@@@@0M?I40MI4@@0M?hI@M?@@@@@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0?4@@@0MI4@@@@@@@0MI4@@@@@@0?@M I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?@MI4@@0MI40M?I40Me?I@MgI@M?e?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@0M?hf?I40MI40M?I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0M?I4@0?4@@@@@@@@@@0?40M??I40MI40M?he?I40M? ?I@M@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MI4@@0?@?@M?I@M

O2@6K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6X?O2@6KO2@@@@6?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1O@K?he?O2@6KeO@?2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L??O@Khe?O2@6KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,??O26K??O@?2@6?2@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?40MI@M?I@?@?@?4@0M ?I40?(Y?O26K O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?@?4@@@@@@@@@0M?eI@M?e?I4@0Mf?I@M@@@6KO2@6K?O26K?e?O2@@6KO2@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MeI4@@@@@@@@0?40MI40?40Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@M?e?I40M?g?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@0MI40?40MI40MI40MeI@M?I@M? I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI4@@0MI4@@@0?4@@@0MI@M?I40MgI@M?e?I@MI@M? ?O2@@@@@@6X?O@KO@?2@@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1??O@KeO2@@@6?2@@6KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O@K O@K?gO2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O26K?g?O2@@6K??O2@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI40MI4@@@@@0M?I40M? I4@??O@KO2@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@M?I4@@0M?I40MeI@?4@0?40MO@K?O@KO@KfO2@@@@@@@@6?@KO26KeO2@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@0M??I@M ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@M?I@M?I4@@0M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@0?4@@@0M?I4@0?40M?I40M?hI@M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0M?I4@@@@@@@@0M?I4@0?@Me?I40M?eI4@@@0M?fI@?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@0MI4@0?4@@@0?@?4@0M??I40?40?@MI4@@0MhI40M ?O2@@@O@K?O@K?eO2@6KO2@6KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L??O@K?O2@@@@@6?2@@6KO2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1??O@Kh?O2@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LO2@6K?eO26K?O2@@6K?O2@@@6KO2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26K?O@K?fO2@6?2@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?e?I@M ?I@M?O26K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0M?hfI@M?I@M?e?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@0MI4@@@@0M?fI4@@0M?I40M?eI@M?I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0MI4@@@0M?f?I4@@@@@@@@@0Me?I@MgI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0?40MI@?4@@@@@@@@@@0MI4@@@@@@@0MI@MI@?40MgI40Mhf?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@0?4@0MI@MI@?4@@@@@@@@0MfI4@@@@@0MI40M? ?I@MhI@M?@@@@@@@@@0M?eI@MI@?40M? ?O2@@6KO@?2@6KO2@@@@@@@@@@@@@@@@@@@6X?hg?O2@6KeO26?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1?hgO@K?f?O@KeO2@@@@6KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?hgO@K?f?O@KfO26?2@6KO2@6?26?@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?hgO@?@?26KO2@@6KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40M?eI40M?I4@@@@?hgO@?2@@6Ke?O26?26K?O26K??O26?26KO2@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?@MI@?4@@0M?I@?4@0M?I40M?eI@M??O26K?O@K?eO26K?O26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@0?4@@@@0MI4@0M?I@MeI@M?e?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MI@?4@@@@@0?40?4@@@0M?I4@@0MI4@0?@M?h?I40M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0MeI40Mh?I@Me?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@0MI4@0MI40M?I40M ?I@M?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@@@@0?4@0?4@@@@@@@@@0M??I@Mg?I@M?I40M?

?O2@6Ke?O2@6KO2@@@@@@6XhfO2@@@@@6K?e?O2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1hfO@K?heO2@@@6?2@@6KO2@@@@@@@@@@6?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@hf?O@KO@K?gO@KO26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@hfO26Ke?O@KO@KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@0?40MfI40MeI4@@0?40M??O@KO@KO@Ke?O@KO2@6KO2@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?40MI4@@@0MI@MeI4@@@0M?I4@@0MheI@M??O@K?O@KO2@@@6K?f?O2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@0?4@@0MI40MI4@@0?40Me?I@MfI4@@0M?I4@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MI40?@?@?40?40M?eI40Mhe?I@Mf?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0?4@0MI4@@@@0?40?4@@@0?40?@MI@?40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@0MI4@@@@@@@0?4@@0MI4@0M I@?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@?40M?I40M?eI4@@0?@?@MI40M ?I@M O26Khf?O2@@@@@he?O26K?heO@?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@heO2@6K?fO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L?hO2@6K?gO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,?hO@K?O@K?O2@6KO26KO@?2@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@0M I(Y?hO@K?gO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@@@@@@@@0?4@@@@@@0?4@0M? ?I@?@M?O@K ?O@Ke?O26?@K?eO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MI@?@MI4@@@0Me?I40M?fI40M@@@6KO26?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0MI4@@@@@0MI4@0?@?4@@@@0?4@0MI40MhI@M?heI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@@@@@@@0M??I@MeI@M?hfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40?40M?I@?@M?I@M?gI40MI@MI4@@@0Me?I@M@@@@@@@@@@0MeI40MfI4@@0?4@@0M??I4@0MfI40M@M ?O@KhO@KO2@6Ke?O2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?g?O@Kg?O@?2@@@6?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Lg?O@Kf?O2@@6?2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,gO2@@6KO2@6?2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Yg?O@KfO26KO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0?@?4@@@@@@@@@@@@0M? ?I@M?O@KfO@K?eO26KeO@K?fO2@@@@@@@@@@@6?2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0MfI4@0?@M?eI4@@@0M?e?I@MO26KeO2@6KO2@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI@MI4@@@@0MI@MgI@M??I@MI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@0?4@@0MeI@MI4@0MheI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0?4@@@0MI4@@@@0M?hfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@0?4@@0?@M??I4@@@@@@@@0M??I4@0MeI4@0M?e?I@M@@0M?I@MeI40MeI@MI40M?I40M O26KO2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@?fO26?26?@K?e?O2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?f?O@KeO@KO2@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?f?O26K?gO26?26K?e?O2@@6?@K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@0?4@@@@?f?O@Khf?O@KO2@6KO2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@@@@@0?4@@@0?4@@@@@@@@@@@0M?O26?26K?O@K?eO26KO2@@@@@@@@@@@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0MI@M?I4@@@0M?O@K?h?O2@@6K?fO@KO@KO2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@0?40MI40?4@@@@@0M??I40M?e?I@Me?I@MfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0?4@@@@@@@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MeI40MeI4@0M?I40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@0?40?@?4@0?40MeI@M?e?I@MI@M?@M?I4@0?4@@0?4@0M?fI@M? O@?2@@fO26Ke?O2@@@@6?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@fO@K?e?O@Kg?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f?O@Ke?O26K?f?O2@6?2@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f?O@K O2@@@6?26KO@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI@MI4@@@@@@0MeI4@0M?I@?@M??I40M?O@K?gO@K? O2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@@@@@@@@@0?40M??I@MfI@M?O26KO@KO26?2@6?2@6?@?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?4@@@@@@@@@@@@@@@@@@@@@@0M?I40M?f?I4@0MhfI@M??O@Khe?O26K?e?O@KeO2@@@6?2@6?2@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@@0?4@@0?4@@0MI4@@@0MI4@0Me?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@MI4@@0?4@@@0MI4@@@@@@0MI40MI4@0MI@M?I4@0Mf?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@0?4@0?4@@@0?4@@@@@@@@@0MI@M??I@?4@0?40M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@0?4@@@@@@@0?40MI40Me?I4@@0M? ?I@M ?O@?2@@@@?e?O@KgO2@@6?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O@KO2@@@@@6KO26?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O@Kg?O@KfO@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0?40?4@0MI@M?eI40Me?I40M?I@M?eI@M?he?O2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@0M?eI@M?f?I40M?I@M?e?I@?@MO@K?h?O@KO26KO@?2@@6K?O2@@6KO2@@6K??O@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0MI40MI4@@0?4@@@0M??I4@@0M??I4@0MO@?26KO26KeO26?2@@6KO26?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@0MI4@@@0M?I4@0M ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0M?I4@@@@@0?40MeI4@0M?e?I@Mf?I@MheI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0MI40Me?I4@0?40?@M?I4@@@@0MI@M?f?I@Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@@@@@@@0?4@@@0?40?@MfI@M??I@MeI40MI4@0M?fI@MI@M@@@0M? ?O2@6?2@@@@@@@@6?2@@@@@@@@@@@@@@@@@?eO@K??O2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O26K?O26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O26K?e?O@?@?2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O@Kh?O26KO26K??O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I@MeI@M?I40MI@?4@@0MI@M??O26K?O@KO@Ke?O2@@@@@@@@@@@@@@@6KO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40M?I4@@@@@@@@@@0?@?@M?I40MeI@?@?@M?O@K?g?O2@@6?2@6?2@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@0MI40?4@@0MI@?40MheI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@0MeI4@@@@@@0MI40M?I@MfI40M?I@MfI40MI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@0?4@@0?4@0MI4@@@@@0MI40?4@@0MI@MI@M?hI@?@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@0MI4@0MI4@@@0M?I@?@M?eI@?4@0MI4@0Mf?I4@0Mh?I@M@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@0?@?4@@@@0?40MI@M?I4@@0M??I@MeI40MeI'@@(?@M?I@M?V40Y? ?O@KfO@?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O@Kf?O@KfO@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O26K?f?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?e?O26K?e?O2@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@?e?O@Kf?O@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0?4@@@@0M?fI4@@@@@0M?eI@M??O@KeO@KO@K?O@KO@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0MI4@@@@@@@@@@@@@@0Me?I4@@0M? I@M??O2@6?2@@@@@6K?O2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@0?40MeI4@0M?f?I@?@?@Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40MeI4@@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0?40?4@0M?I40MI@Me?I@MhI@M?gI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@@@0M?e?I40M??I4@0Me?I@M ?I@M@0?@MI40M?e?I4@0?40M?fI40M ?O26X?e?O2@6?2@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@1?e?O2@@6K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?e?O2@@@@6K?O@K?O26?2@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@(Y?eO@K?hO@K?O@?@KO@?2@@6?@?@?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I40MI@MeI@M?h?I4@0?(Yf?O@?2@6KO@KO26KO26?2@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0MfI4@0M??O@KheO@KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0M??I@Me?I4@@0M?h?I@MO@K?h?O2@6Ke?O26?2@@@6?@?2@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0MI4@0?@M?eI@M?I4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0?4@@0M?f?I@MfI4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0M?I40?4@0Me?I4@0?@?4@0MhfI40M@@@@0?4@@0M?eI@?4@0MI4@@@0Mg?I@MhfI40Me?I40M?

?O26K??O@?26KO26?2@@@@@@@@@@@@@@@@@@@@@@@@fO26?26KO2@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f?O@Kg?O2@6KO2@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@f?O@?26K?h?O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?4@@@0M?hI@M??I@M I@M?h?O@Ke?O@KO@?@?26?2@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@0M?I4@0M?I@M?fI@M?O@K?f?O26?26KO26?@KO@?@K?O26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@0MI4@@@@0M?gI40?@M?O@Khf?O2@@6?26?2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@0?40MeI4@0M?@@@@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@@@0?4@@@@0M?I@?4@0?@M?e?I@MfI@M?e?I@MeI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@0?4@@@@0?4@@0MI@MeI4@@0M?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0?@MI@MeI4@@0Me?I4@0MgI40MgI4@0M?

?O26K?eO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?f?O26KO26KO26K?O2@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?fO@K??O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?fO@K?eO2@6?2@6KO2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?4@0?4@0?@?40M I@M?gO26KeO2@6?26KO2@@6?26?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@MI4@0?4@@@@0Mf?I@?4@0MgI@M??O@?26K?g?O26K?hO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Me?I4@0MI@M?eI@MI40M?O@K?O26KO2@6K?eO2@@6?@K?O2@@@@6KO2@@@@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?@?40MI4@0MI4@@@0MI4@@@0MgI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0MI4@@@@@0MI4@0M?I4@@0M? ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0MeI4@@@@@@@@@@0?@?4@@@@@@@@@0?@Mf?I@Mf?I40M?3@@@@@@@@@@(?4@@@@@@0?@?4@@0M?I4@@@0?40M I@M??I@MV4@0M?eI40Y O26KO@KO2@6?2@@@@@@@@?g?O26?@KO@Kf?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?gO26?2@@@6?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?gO@KO2@6KO2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0?@MhfI@M?fI@?@M?h?O2@@@@@@6K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0MI4@0?4@@@@0M?eI@M?gI@?@M?he?I@M?O@KheO@KO@K?O26?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?40MI@MgI@M??O@K O26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?40MeI40MI4@0M?@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@0MI@M?I@MgI4@0?40M?I@MfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@Me?I4@0?4@0MeI4@@@@@@@@@@@@0?@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40?4@@@0M?I40M?eI@MI@?40MI@MhI@M?I@M?fI@M?

O2@@@@@@@6K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?hO@KO26K?O26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?h?W&? O@K?gO26K?O26KO@?@KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@heW&@? O@K?O@K?O@K?eO26?2@@6KO2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0?4@@@@@@0Me?I@MeI40M?I@MI@?@M?gI40M?O@Kf?O&@@?O2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@0MI4@0?40M?I4@@0M I@?@M?O@K?fO@K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0MI@?4@0MI4@0MI@M?hf?I@MO2@6K?O26?2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@0M?I40M?I40M??I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0MI4@@@@@0?@?@Mf?I@?40M?I@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?40?@M?I4@0M?f?I@?@MhI@M?@@@@@@@0?4@0M?fI@M?I40MeI@M??I40M?h?I@MeI@M?

?O2@@@@@@@@@@@@@@?he?O2@@6K?e?O2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5?heO@K?hO@K?fO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?heO26KO2@@@@@@@@6?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@0?4@@@@@@@0Me?I4@0Me?I4@0MfI@M? ?I@M?O26?@K?O2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0Me?I4@0?@M?I@?@MI40M?O2@6KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0MfI40?@M?I@MI4@0M?eI40MO@K?fO2@@@@6KO2@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@@@@@@0?40MI4@@@0M ?I@M@@@6KO2@@6?2@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@@@@@@@@@0M?I4@0M?I40MI@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@@@@0?4@@@@@@@0MI4@@@0Mh?I4@@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40?40MI@?40MI@M?e?I40M?I@?@M?

?O@KgO2@@@@@6?2@@@@@@@@@@@?hgO2@@@@6?@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?hgO@K?fO2@6K?eO2@6?2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?hgO2@@@6K?O26KO2@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I@MI4@@@@@@@@0MO@K?gO26K?O26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40MI4@0MI40MO@K? ?O2@@@@@@@@@@@@@@6KO26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0?@M?gI@M?eI40MeI@M??O2@@6?2@@6?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@0MI4@0?@M?I4@@@@0MI4@@@0Me?I40MI@MheI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0?@M?I4@@0Me?I40M?I40MfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MI40?4@@@0M??I4@0MgI@M??I40?@M?g?I@M@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@@@@@@@@0MI@?40M@@0M

?O26K??O@KO@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@K?hfO@K??O@?@K?O@KO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@K??O@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0M??I4@@@@@@@@0M??O26K??O@?@Ke?O26K?e?O@?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@0?@?@?@MgI@M?eI40Me?I40M?O@K?e?O@KeO2@6K?eO26KO26KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@0M?I4@0M?fI40MO26KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?40?4@0?@M?e?I40M??O@K?O26KO@KfO26Kf?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MfI@?4@@@0M??I40?4@@@@0MeI4@0?@M?I40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MI4@0MI40MI4@@0M?eI@M?f?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0MI4@0?4@0?40M?he?I40M?

?O2@@@@@@@@?O@K??O2@@@6Ke?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26Kf?O@?2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@K?O@KO26KO@?@KO@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@0?40M?I40MI4@@0M?I@Mhf?I40M?e?I@M?@ ?O@K ?O2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@0MI4@0MI4@@@@0MI@MO@K?eO2@6KO26?@K??O@?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0Me?I4@0M?I4@0?40M?O26Ke?O2@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0M??I40M?I4@0MI4@0?@M@?2@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?4@@@@@@@@0MeI4@@0Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MI4@@@@@0MI40?4@0?@MeI4@0MI4@@@@0MI@Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I40?4@@0M?I@M?gI@MI@M

O@K?g?O2@6?@Ke?O2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@6Ke?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26KgO@K?eO@?2@6?26?2@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0M??O@K ?O@KO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?@M?e?I@MI4@@0MeI@M?f?I@MO26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?40M?W-X? ?O26K?O@?2@@@6?26?2@@@@6?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?4@@0MI4@@0?4@0M I@M?O@KO&@)Kh?O2@@@@@@@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I@MI4@@@@@@@0M? ?I@M?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@0?4@@@@@@0?40Me?I4@@@0?4@0Mf?I@?@M I@M?3@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@MI4@@@0?40?@?40M?I4@@@0MI40M?V4@@@0MI@M

?O26K??O@KO2@@6KO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(?O@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0YO@K?O@?@KO@Kf?O26KO26KO2@@6KO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?4@0?4@0?40MhI@MI@MI@M??O@Ke?O@KO2@@@@@@@@@@6?2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40M?eI4@0M?I@M?e?I40MI40M??O@KO26Kf?O@KO2@@@@@@@@@@6KO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@0MI@M?O@K?O26K?O2@@6?26KO2@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?@M??I40M?fI@M?hfI@M?O26KO2@@@6K??O2@@@6KfO2@@6KO2@6?2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@0?40MI40?40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?4@@@@@@@@@@@@@0MI4@@@@0?4@0M?I40?@?4@@0M?I@?4@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@0M?I@M?

O@K?O2@@@@@@@@@@@@?O2@@@6KO2@6?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H?O@Kg?O2@@6?2@@6?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@?26K?O@K?O@KfO2@@@@@@6?@K?O2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@@0M?gI40Me?I@MI40M?O26KO26KO2@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0?4@0?4@0MeI@M?O@?2@6KO26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I@MI@M?fI@M??I@MI@?@?@?40MO@K?hfO2@@6K?O2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@0?4@@@@@@@@@@@@@@@@@@0M?I4@0M?eI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@0?40?4@@@0?4@@@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?fI4@@@@@@@0M?eI@?@M?e?I@?@M@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@@@@@@0M?e?I4@@@@0M?hI@M?

?O@KO@K?e?O@K?O@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(?O26K?f?O26K?O26KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?O2@@6KO2@6KO2@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M@? ?O@Ke?O@KeO2@@@6KO2@@@@@@@@@6?2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0M?fI4@@0?@M?O2@6KO@?@?2@@@@@@@@@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0M?I40M?I@M?O@?@KO2@@@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0?4@@@@0?4@@0MeI@M?e?I@MI@M?eI4@0M??O@?@Ke?O26?2@6KO2@@@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?@M?I40MeI4@@@@0MfI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@@0MI40?4@@@0?4@0MI40?40?@Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?4@@@@@@@@0Mg?I40M?eI4@@0M@?4@@0M?e?I@MI@M?g?I@M

?O2@@@@6K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(??O2@@@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?O@K?fO26KfO@K?O@?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0?4@@0MI@M?I4@0Me?I40M?g?I@MgI@M??O@K O2@6?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MheI40MO@K?e?O@KfO26KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?40MeI4@@0M?O@Ke?O2@6K?O2@6?2@6KO26KO2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?4@@@@0M?e?I@Mf?I@MO@K?h?O@K?O2@6?@KO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0MI@?4@@@@0?4@0?@?40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI@M?I40Mg?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I40MhfI@M?I@M??I40M?

?O@K?O2@@@@@O@K?hfO2@@@@@6?2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O26Kg?O2@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@O2@@@@@@6?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@@@@0MI40M?I40M?I@M?O2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0M?I@MI4@0M??I4@0M?I@M?O@KO@?@KO2@@@6?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I40Mg?I@Mf?I@MO@K? O@K?eO26?2@6K?O2@6?@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@@@0M?I40?4@@0M?@KO@KO2@@6?2@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@@0MI4@0MI4@@@@@@@@0M?e?I40M?I40MgI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0M?I40MI40?@M@@@@@@@@@@@@@@0M?I4@@@@@@0MI4@0Me?I@MeI4@0M?

?O2@@?O@?@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??O26K?h?O26K?O@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@0MI40MI4@@@@0M?O@K?e?O26KO@KO2@@6KO@?2@@@@@@@@@@@6?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0MI40M?eI@M?e?I40M??I@M?O@KfO@K?h?O@?@K?O@?@?26?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MeI40Mhf?I@M?O@KO@K?g?O2@6K?O2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@0?4@0?@M?I4@@0M?fI40M@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@0?4@0M?gI40MI@M?f?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI40MI4@@@0?4@@@@@0?@M?@@@@@@@@0Me?I40M?e?I@Mg?I40M?I@M?

?@ ?O)X?O@KfO2@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)O@?26K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@0MI4@@@@@@@0MO@KO@KO2@6?@K??O2@6?@?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@@@0M??I@?4@@0M?I4@@@@0M?O@KeO26KO2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@0Mf?I@Mf?I4@@0M?I4@@0MO2@@6K?O@?2@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?4@@0MI40M?eI4@0?4@@@@@@@0M?O@K?O@?2@@6?26?2@6KO2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0MI4@0?40Me?I4@@0MI4@0?4@@0M?@KeO@K?eO2@@6?2@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?@?@MI40?4@@0MeI4@@@@@@0M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@@@@@@@0?40?4@@0M?I@MeI4@0M?

O2@??O26?@KO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O2@@6KO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I4@0?@M?O@KheO@?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I40?40MheI@M?O@K?gO2@6KO@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40?4@@@@@@@@@@0MI@Mg?I@MeI@M?O@K? O@K?eO@KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@0MeI@MI40MI4@0Mhe?I@M?O26K?O2@6?2@@6K?O2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0?4@@@@@@@0MeI40Mf?I@M@@@6?@K?eO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0MI4@@0MeI4@0MI@MI@?@M?I@M?I@M? I40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?hf?I40M?eI@M?@@@0?@M?eI@M?

O@K?O26?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@?O@K?gO26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26?2@6KgO2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?4@@0?@?4@@@0MfI@MI4@0M?O@?@Kf?O@Ke?O2@@6?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0?@?4@@0?4@@@0M?eI@M??O26?2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?@M??I@?40?@M?fI40MO@K? O2@@@6K?O@?2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0M?I40Me?I4@0M?O@KhO26KO26K?O2@@6X?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@MgI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)?@?4@@@@0?4@@@@@@@0M?eI@M?I@?@M?@@@@@@@@@@@@@@0?40?4@@@@@0M??I4@@0M?g?I@M

O@K?O.?O2@6Kf?O2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?O@Ke?O@KgW2@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?fI40M?O@K?O26?26KO2@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?&@@@@@@@@@@@@@@@@@@@0MI@e?I@MgI@M?eI40M?O26K?O@K??O26?26KO2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?4@@0?40M??I40M?eI@M??I@M?O26K?eO2@@@@@@@@@@@@@@@@@@@@@(?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?4@0M? ?I40M??O@K?O2@@@6KO@K??O2@6KO2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0MI40Ye?I4@@@0MI40MfI40M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0M?I4@@@@0M?I40M?fI4@0M?hf?I@M@0?4@@@@@0?40?@MeI@M?

?O@K?O@K?O2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26KhfO26?2@@@@6?2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??I@Mf?I4@0?40M?eI@M?O@KO2@@@@6?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0?4@@@@@@@@@@@@@@@@@@@@@0?40Me?I@MI40MI@M?O26K O@KO26KO26K??O2@@6?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@0?@?4@@0M?I40M?I40MI40M??I@MO@KO26K?fO26K?O2@6?26?26KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@@@0MI40Mg?I40M?e?I@MI40MfI@M??O2@6Kh?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?40M?fI4@0M?eI@MI@MeI40MO2@@6KeO26K?O2@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@0MI40M?I@M?I4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0?4@0?4@0M?heI@M?f?I@M

?O26?@?O@KO@?@?26?2@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@K?eO@?2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MhfI@?@M?O26Kf?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?4@@@@@0Me?I40MI40?40M?O@Kf?O2@6KO@?@?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@0?@MfI@M?I@M??I@M?O@KgO@K?e@@@@eO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@0?@?40MI4@0?4@@@@@0M?I@MI@MI4@@@@0MI@MI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@??@?@@@@@g?@0R+M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?40MI40?@?@MI4@@0M?eI@MI@M

O26?@KeO2@@@@(?f@@@@@@@@@@@@@@@@@@O@K?e?O@Kf?O26?2@@@@6KeO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y??O@K?O2@@@6K?O@KO2@@@6T2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0M?I@M?I4@0MI40M?O26?26?2@@@6K?O2@@@6K?O@?26?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@0R4@@@@@@@@0?40?4@0MfI@M?O@K?f?O2@6KO2@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0M?O@K?fO26K?O26KO26K?O2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@M??I4@0?4@@@0?@MeI40M ?I@M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@0?4@@0?@?@M?f?I@M@@@@@@0?40M?I4@@@0?@M?

O@K?f?O2@@6K??O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M??O@Ke?O26?2@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@0?4@0?4@@@@@0M?I@?@Mhe?I@MO@?2@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?40M?heI@M?eI@M?gI@M??O2@@@@@@@@@@@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I4@@0MeI40MgI@M?he?I40M?O@K?e?@@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?@?4@@@0?40MfI@?40MfI4@0M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@0?4@0M?I@Mf?I@Mhe?I@M@@@@@@@@@@0M?I40M?

?O26KO2@@@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@K?eO2@6?2@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@@@@@@@0?40MI40M?O2@@@6KeO2@6X?f?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@0MI4@@@@@@@@@@@@0MfI@M??I@?@MO2@6K?e?O2@@6K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)?@@@??@@@@0MI40M??I@MhfI@M??I@MO@KO@?@?2@@@6KO2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0MI4@@@@@@0?4@@0MI@MeI@M?I40Mf?I40M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0?4@@@0MI4@@@0M?I@Me?I@M@@@@@@@@@@0MI4@@@@@@0?@Mh?I40M?gI@M?

?O2@O@?@K?g?O2@@6X?e@@@6KO26T2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?O26K?hfO2@@@@6?2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)?e@@@@@@@@0R+?40M?e?I@M?O2@@@@??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0M?I@?4@@0?@?40Me?I40?@M??O@KO@KO2@6Kf?O@K?O2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(?'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@e?@@@@@@@e@0M?h?I@MeI@M?hfI@M?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0Y?V4@@0MI@MI4@@0Mf?I@M@MI4@@@0M?